(360) Add some FBO reiniting logic

This commit is contained in:
twinaphex 2012-11-20 15:44:44 +01:00
parent c3db8e8c8f
commit 881e440ea6
3 changed files with 130 additions and 99 deletions

View File

@ -474,7 +474,11 @@ HRESULT CRetroArchSettings::OnNotifyPress( HXUIOBJ hObjPressed, int & bHandled
case SETTING_SCALE_ENABLED:
g_settings.video.render_to_texture = !g_settings.video.render_to_texture;
m_settingslist.SetText(SETTING_SCALE_ENABLED, g_settings.video.render_to_texture ? L"Custom Scaling/Dual Shaders: ON" : L"Custom Scaling/Dual Shaders: OFF");
device_ptr->ctx_driver->set_fbo(g_settings.video.render_to_texture);
if(g_settings.video.render_to_texture)
device_ptr->ctx_driver->set_fbo(FBO_INIT);
else
device_ptr->ctx_driver->set_fbo(FBO_DEINIT);
break;
case SETTING_ZIP_EXTRACT:
if(g_extern.file_state.zip_extract_mode < ZIP_EXTRACT_TO_CACHE_DIR)
@ -536,7 +540,7 @@ HRESULT CRetroArchSettings::OnControlNavigate(XUIMessageControlNavigate *pContro
if((g_settings.video.fbo.scale_x > MIN_SCALING_FACTOR))
{
rarch_settings_change(S_SCALE_FACTOR_DECREMENT);
//xdk360_gfx_init_fbo(vid);
device_ptr->ctx_driver->set_fbo(FBO_REINIT);
rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer));
m_settingslist.SetText(SETTING_SCALE_FACTOR, strw_buffer);
}
@ -559,7 +563,10 @@ HRESULT CRetroArchSettings::OnControlNavigate(XUIMessageControlNavigate *pContro
case SETTING_SCALE_ENABLED:
g_settings.video.render_to_texture = !g_settings.video.render_to_texture;
m_settingslist.SetText(SETTING_SCALE_ENABLED, g_settings.video.render_to_texture ? L"Custom Scaling/Dual Shaders: ON" : L"Custom Scaling/Dual Shaders: OFF");
device_ptr->ctx_driver->set_fbo(g_settings.video.render_to_texture);
if(g_settings.video.render_to_texture)
device_ptr->ctx_driver->set_fbo(FBO_INIT);
else
device_ptr->ctx_driver->set_fbo(FBO_DEINIT);
break;
default:
break;
@ -601,7 +608,7 @@ HRESULT CRetroArchSettings::OnControlNavigate(XUIMessageControlNavigate *pContro
if((g_settings.video.fbo.scale_x < MAX_SCALING_FACTOR))
{
rarch_settings_change(S_SCALE_FACTOR_INCREMENT);
//xdk360_gfx_init_fbo(vid);
device_ptr->ctx_driver->set_fbo(FBO_REINIT);
rarch_settings_create_menu_item_label_w(strw_buffer, S_LBL_SCALE_FACTOR, sizeof(strw_buffer));
m_settingslist.SetText(SETTING_SCALE_FACTOR, strw_buffer);
}
@ -624,7 +631,11 @@ HRESULT CRetroArchSettings::OnControlNavigate(XUIMessageControlNavigate *pContro
case SETTING_SCALE_ENABLED:
g_settings.video.render_to_texture = !g_settings.video.render_to_texture;
m_settingslist.SetText(SETTING_SCALE_ENABLED, g_settings.video.render_to_texture ? L"Custom Scaling/Dual Shaders: ON" : L"Custom Scaling/Dual Shaders: OFF");
device_ptr->ctx_driver->set_fbo(g_settings.video.render_to_texture);
if(g_settings.video.render_to_texture)
device_ptr->ctx_driver->set_fbo(FBO_INIT);
else
device_ptr->ctx_driver->set_fbo(FBO_DEINIT);
break;
default:
break;

View File

@ -458,13 +458,22 @@ static void gfx_ctx_xdk_input_driver(const input_driver_t **input, void **input_
static void gfx_ctx_xdk_set_filtering(unsigned index, bool set_smooth) { }
static void gfx_ctx_xdk_set_fbo(unsigned enable)
static void gfx_ctx_xdk_set_fbo(unsigned mode)
{
#ifdef HAVE_FBO
/* TODO: implement properly */
xdk_d3d_video_t *device_ptr = (xdk_d3d_video_t*)driver.video_data;
device_ptr->fbo_inited = enable;
switch(mode)
{
case FBO_DEINIT:
xdk_d3d_deinit_fbo(device_ptr);
break;
case FBO_REINIT:
case FBO_INIT:
xdk_d3d_init_fbo(device_ptr);
break;
}
#endif
}

View File

@ -145,7 +145,7 @@ static void xdk_d3d_free(void * data)
{
#ifdef RARCH_CONSOLE
if (driver.video_data)
return;
return;
#endif
xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data;
@ -208,10 +208,10 @@ static void xdk_d3d_set_viewport(bool force_full)
if(g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
{
delta = (desired_aspect / device_aspect - 1.0) / 2.0 + 0.5;
m_viewport_x_temp = g_extern.console.screen.viewports.custom_vp.x;
m_viewport_y_temp = g_extern.console.screen.viewports.custom_vp.y;
m_viewport_width_temp = g_extern.console.screen.viewports.custom_vp.width;
m_viewport_height_temp = g_extern.console.screen.viewports.custom_vp.height;
m_viewport_x_temp = g_extern.console.screen.viewports.custom_vp.x;
m_viewport_y_temp = g_extern.console.screen.viewports.custom_vp.y;
m_viewport_width_temp = g_extern.console.screen.viewports.custom_vp.width;
m_viewport_height_temp = g_extern.console.screen.viewports.custom_vp.height;
}
else if (device_aspect > desired_aspect)
{
@ -261,7 +261,7 @@ static void xdk_d3d_set_rotation(void * data, unsigned orientation)
{
case ORIENTATION_NORMAL:
angle = M_PI * 0 / 180;
break;
break;
case ORIENTATION_FLIPPED_ROTATED:
angle = M_PI * 90 / 180;
break;
@ -288,22 +288,32 @@ static void xdk_d3d_set_rotation(void * data, unsigned orientation)
}
#ifdef HAVE_FBO
void xdk_d3d_deinit_fbo(xdk_d3d_video_t *d3d)
{
if (d3d->fbo_inited)
{
if (d3d->lpTexture_ot)
{
d3d->lpTexture_ot->Release();
d3d->lpTexture_ot = NULL;
}
if (d3d->lpSurface)
{
d3d->lpSurface->Release();
d3d->lpSurface = NULL;
}
d3d->fbo_inited = false;
}
}
static void xdk_d3d_init_fbo(xdk_d3d_video_t *d3d)
{
if(!g_settings.video.render_to_texture)
return;
if (d3d->lpTexture_ot)
{
d3d->lpTexture_ot->Release();
d3d->lpTexture_ot = NULL;
}
if (d3d->lpSurface)
{
d3d->lpSurface->Release();
d3d->lpSurface = NULL;
}
xdk_d3d_deinit_fbo(d3d);
d3d->d3d_render_device->CreateTexture(d3d->tex_w * g_settings.video.fbo.scale_x, d3d->tex_h * g_settings.video.fbo.scale_y,
1, 0, g_extern.console.screen.gamma_correction ? ( D3DFORMAT )MAKESRGBFMT( D3DFMT_A8R8G8B8 ) : D3DFMT_A8R8G8B8,
@ -311,32 +321,33 @@ static void xdk_d3d_init_fbo(xdk_d3d_video_t *d3d)
d3d->d3d_render_device->CreateRenderTarget(d3d->tex_w * g_settings.video.fbo.scale_x, d3d->tex_h * g_settings.video.fbo.scale_y,
g_extern.console.screen.gamma_correction ? ( D3DFORMAT )MAKESRGBFMT( D3DFMT_A8R8G8B8 ) : D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE,
0, 0, &d3d->lpSurface, NULL);
0, 0, &d3d->lpSurface, NULL);
d3d->lpTexture_ot_as16srgb = *d3d->lpTexture_ot;
xdk_convert_texture_to_as16_srgb(d3d->lpTexture);
xdk_convert_texture_to_as16_srgb(&d3d->lpTexture_ot_as16srgb);
d3d->fbo_inited = 1;
d3d->fbo_inited = true;
}
#endif
void xdk_d3d_generate_pp(D3DPRESENT_PARAMETERS *d3dpp, const video_info_t *video)
{
xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data;
memset(d3dpp, 0, sizeof(*d3dpp));
xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data;
d3d->texture_fmt = video->rgb32 ? D3DFMT_A8R8G8B8 : D3DFMT_LIN_R5G6B5;
d3d->base_size = video->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t);
memset(d3dpp, 0, sizeof(*d3dpp));
unsigned width, height;
d3d->ctx_driver->get_video_size(&width, &height);
d3d->texture_fmt = video->rgb32 ? D3DFMT_A8R8G8B8 : D3DFMT_LIN_R5G6B5;
d3d->base_size = video->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t);
unsigned width, height;
d3d->ctx_driver->get_video_size(&width, &height);
d3dpp->BackBufferWidth = d3d->win_width = width;
d3dpp->BackBufferHeight = d3d->win_height = height;
#if defined(_XBOX1)
// Get the "video mode"
// Get the "video mode"
DWORD video_mode = XGetVideoFlags();
// Check if we are able to use progressive mode
@ -359,13 +370,13 @@ void xdk_d3d_generate_pp(D3DPRESENT_PARAMETERS *d3dpp, const video_info_t *video
if(video_mode & XC_VIDEO_FLAGS_HDTV_480p)
d3dpp->Flags = D3DPRESENTFLAG_PROGRESSIVE;
else if(video_mode & XC_VIDEO_FLAGS_HDTV_720p)
d3dpp->Flags = D3DPRESENTFLAG_PROGRESSIVE;
d3dpp->Flags = D3DPRESENTFLAG_PROGRESSIVE;
else if(video_mode & XC_VIDEO_FLAGS_HDTV_1080i)
d3dpp->Flags = D3DPRESENTFLAG_INTERLACED;
d3dpp->Flags = D3DPRESENTFLAG_INTERLACED;
}
if(g_extern.console.rmenu.state.rmenu_widescreen.enable)
d3dpp->Flags |= D3DPRESENTFLAG_WIDESCREEN;
d3dpp->Flags |= D3DPRESENTFLAG_WIDESCREEN;
d3dpp->BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp->FullScreen_PresentationInterval = d3d->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
@ -395,39 +406,39 @@ void xdk_d3d_generate_pp(D3DPRESENT_PARAMETERS *d3dpp, const video_info_t *video
static void xdk_d3d_init_textures(xdk_d3d_video_t *d3d, const video_info_t *video)
{
D3DPRESENT_PARAMETERS d3dpp;
D3DVIEWPORT vp = {0};
xdk_d3d_generate_pp(&d3dpp, video);
D3DPRESENT_PARAMETERS d3dpp;
D3DVIEWPORT vp = {0};
xdk_d3d_generate_pp(&d3dpp, video);
d3d->texture_fmt = video->rgb32 ? D3DFMT_LIN_A8R8G8B8 : D3DFMT_LIN_R5G6B5;
d3d->base_size = video->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t);
d3d->texture_fmt = video->rgb32 ? D3DFMT_LIN_A8R8G8B8 : D3DFMT_LIN_R5G6B5;
d3d->base_size = video->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t);
if (d3d->lpTexture)
{
d3d->lpTexture->Release();
d3d->lpTexture = NULL;
}
d3d->d3d_render_device->CreateTexture(d3d->tex_w, d3d->tex_h, 1, 0, d3d->texture_fmt,
0, &d3d->lpTexture
d3d->d3d_render_device->CreateTexture(d3d->tex_w, d3d->tex_h, 1, 0, d3d->texture_fmt,
0, &d3d->lpTexture
#ifdef _XBOX360
, NULL
, NULL
#endif
);
D3DLOCKED_RECT d3dlr;
d3d->lpTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);
memset(d3dlr.pBits, 0, d3d->tex_w * d3dlr.Pitch);
d3d->lpTexture->UnlockRect(0);
d3d->last_width = d3d->tex_w;
d3d->last_height = d3d->tex_h;
);
D3DLOCKED_RECT d3dlr;
d3d->lpTexture->LockRect(0, &d3dlr, NULL, D3DLOCK_NOSYSLOCK);
memset(d3dlr.pBits, 0, d3d->tex_w * d3dlr.Pitch);
d3d->lpTexture->UnlockRect(0);
d3d->last_width = d3d->tex_w;
d3d->last_height = d3d->tex_h;
#if defined(_XBOX1)
d3d->d3d_render_device->SetRenderState(D3DRS_LIGHTING, FALSE);
#elif defined(_XBOX360)
d3d->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET,
0xff000000, 1.0f, 0);
0xff000000, 1.0f, 0);
#endif
vp.Width = d3d->win_width;
vp.Height = d3d->win_height;
@ -448,42 +459,42 @@ static void xdk_d3d_init_textures(xdk_d3d_video_t *d3d, const video_info_t *vide
static void xdk_d3d_reinit_textures(xdk_d3d_video_t *d3d, const video_info_t *video)
{
unsigned old_base_size = d3d->base_size;
unsigned old_width = d3d->tex_w;
unsigned old_height = d3d->tex_h;
d3d->texture_fmt = video->rgb32 ? D3DFMT_LIN_A8R8G8B8 : D3DFMT_LIN_R5G6B5;
d3d->base_size = video->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t);
unsigned old_base_size = d3d->base_size;
unsigned old_width = d3d->tex_w;
unsigned old_height = d3d->tex_h;
d3d->texture_fmt = video->rgb32 ? D3DFMT_LIN_A8R8G8B8 : D3DFMT_LIN_R5G6B5;
d3d->base_size = video->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t);
//FIXME - temporary hack
d3d->tex_w = d3d->tex_h = 512;
//FIXME - temporary hack
d3d->tex_w = d3d->tex_h = 512;
if (old_base_size != d3d->base_size || old_width != d3d->tex_w || old_height != d3d->tex_h)
{
RARCH_LOG("Reinitializing textures (%u x %u @ %u bpp)\n", d3d->tex_w,
d3d->tex_h, d3d->base_size * CHAR_BIT);
if (old_base_size != d3d->base_size || old_width != d3d->tex_w || old_height != d3d->tex_h)
{
RARCH_LOG("Reinitializing textures (%u x %u @ %u bpp)\n", d3d->tex_w,
d3d->tex_h, d3d->base_size * CHAR_BIT);
xdk_d3d_init_textures(d3d, video);
xdk_d3d_init_textures(d3d, video);
#ifdef HAVE_FBO
if (d3d->tex_w > old_width || d3d->tex_h > old_height)
{
RARCH_LOG("Reiniting FBO.\n");
xdk_d3d_init_fbo(d3d);
}
if (d3d->tex_w > old_width || d3d->tex_h > old_height)
{
RARCH_LOG("Reiniting FBO.\n");
xdk_d3d_init_fbo(d3d);
}
#endif
}
else
RARCH_LOG("Reinitializing textures skipped.\n");
}
else
RARCH_LOG("Reinitializing textures skipped.\n");
}
static void *xdk_d3d_init(const video_info_t *video, const input_driver_t **input, void **input_data)
{
if (driver.video_data)
{
xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data;
// Reinitialize textures as we might have changed pixel formats.
xdk_d3d_reinit_textures(d3d, video);
return driver.video_data;
xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)driver.video_data;
// Reinitialize textures as we might have changed pixel formats.
xdk_d3d_reinit_textures(d3d, video);
return driver.video_data;
}
//we'll just use driver.video_data throughout here because it needs to
@ -506,12 +517,12 @@ static void *xdk_d3d_init(const video_info_t *video, const input_driver_t **inpu
#endif
if (d3d->ctx_driver)
{
D3DPRESENT_PARAMETERS d3dpp;
xdk_d3d_generate_pp(&d3dpp, video);
d3d->d3d_device->CreateDevice(0, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &d3d->d3d_render_device);
d3d->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET, 0xff000000, 1.0f, 0);
D3DPRESENT_PARAMETERS d3dpp;
xdk_d3d_generate_pp(&d3dpp, video);
d3d->d3d_device->CreateDevice(0, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp, &d3d->d3d_render_device);
d3d->d3d_render_device->Clear(0, NULL, D3DCLEAR_TARGET, 0xff000000, 1.0f, 0);
}
else
{
@ -536,7 +547,7 @@ static void *xdk_d3d_init(const video_info_t *video, const input_driver_t **inpu
d3d->d3d_render_device->SetTransform(D3DTS_VIEW, &mat);
d3d->d3d_render_device->CreateVertexBuffer(4 * sizeof(DrawVerticeFormats),
D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &d3d->vertex_buf);
D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &d3d->vertex_buf);
const DrawVerticeFormats init_verts[] = {
{ -1.0f, -1.0f, 1.0f, 0.0f, 1.0f },
@ -553,7 +564,7 @@ static void *xdk_d3d_init(const video_info_t *video, const input_driver_t **inpu
d3d->d3d_render_device->SetVertexShader(D3DFVF_XYZ | D3DFVF_TEX1);
#elif defined(_XBOX360)
d3d->d3d_render_device->CreateVertexBuffer(4 * sizeof(DrawVerticeFormats),
0, 0, 0, &d3d->vertex_buf, NULL);
0, 0, 0, &d3d->vertex_buf, NULL);
static const DrawVerticeFormats init_verts[] = {
{ -1.0f, -1.0f, 0.0f, 1.0f },
@ -561,7 +572,7 @@ static void *xdk_d3d_init(const video_info_t *video, const input_driver_t **inpu
{ -1.0f, 1.0f, 0.0f, 0.0f },
{ 1.0f, 1.0f, 1.0f, 0.0f },
};
void *verts_ptr;
d3d->vertex_buf->Lock(0, 0, &verts_ptr, 0);
memcpy(verts_ptr, init_verts, sizeof(init_verts));
@ -586,9 +597,9 @@ static void *xdk_d3d_init(const video_info_t *video, const input_driver_t **inpu
if (!hlsl_shader_init())
{
RARCH_ERR("Shader init failed.\n");
d3d->ctx_driver->destroy();
free(d3d);
return NULL;
d3d->ctx_driver->destroy();
free(d3d);
return NULL;
}
RARCH_LOG("D3D: Loaded %u program(s).\n", d3d_hlsl_num());
@ -750,8 +761,8 @@ static bool xdk_d3d_frame(void *data, const void *frame,
d3d->d3d_render_device->SetVertexDeclaration(d3d->v_decl);
d3d->d3d_render_device->SetStreamSource(0, d3d->vertex_buf,
0,
sizeof(DrawVerticeFormats));
0,
sizeof(DrawVerticeFormats));
d3d->d3d_render_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
#endif
@ -760,7 +771,7 @@ static bool xdk_d3d_frame(void *data, const void *frame,
if(d3d->fbo_inited)
{
d3d->d3d_render_device->Resolve(D3DRESOLVE_RENDERTARGET0, NULL, d3d->lpTexture_ot,
NULL, 0, 0, NULL, 0, 0, NULL);
NULL, 0, 0, NULL, 0, 0, NULL);
d3d->d3d_render_device->SetRenderTarget(0, pRenderTarget0);
pRenderTarget0->Release();
@ -779,8 +790,8 @@ static bool xdk_d3d_frame(void *data, const void *frame,
d3d->d3d_render_device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_BORDER);
d3d->d3d_render_device->SetVertexDeclaration(d3d->v_decl);
d3d->d3d_render_device->SetStreamSource(0, d3d->vertex_buf,
0,
sizeof(DrawVerticeFormats));
0,
sizeof(DrawVerticeFormats));
d3d->d3d_render_device->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
}
#endif
@ -805,7 +816,7 @@ static bool xdk_d3d_frame(void *data, const void *frame,
#elif defined(_XBOX360)
if (msg && !menu_enabled)
{
xdk_render_msg(d3d, msg);
xdk_render_msg(d3d, msg);
}
#endif
@ -849,7 +860,7 @@ static void xdk_d3d_start(void)
video_info.input_scale = 2;
video_info.fullscreen = true;
if(g_settings.video.force_16bit)
video_info.rgb32 = false;
video_info.rgb32 = false;
driver.video_data = xdk_d3d_init(&video_info, NULL, NULL);