diff --git a/360/frontend-xdk/menu.cpp b/360/frontend-xdk/menu.cpp index f330933845..585b4deb41 100644 --- a/360/frontend-xdk/menu.cpp +++ b/360/frontend-xdk/menu.cpp @@ -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; diff --git a/gfx/context/xdk_ctx.c b/gfx/context/xdk_ctx.c index dfb782a0bb..c8332f90ec 100644 --- a/gfx/context/xdk_ctx.c +++ b/gfx/context/xdk_ctx.c @@ -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 } diff --git a/xdk/xdk_d3d.cpp b/xdk/xdk_d3d.cpp index f126fe9791..30a5df9be1 100644 --- a/xdk/xdk_d3d.cpp +++ b/xdk/xdk_d3d.cpp @@ -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);