static inline void xdk_d3d_draw_texture(void *data) { xdk_d3d_video_t *d3d = (xdk_d3d_video_t*)data; #if defined(HAVE_RMENU_XUI) menu_iterate_xui(); #elif defined(HAVE_RMENU) menu_texture->x = 0; menu_texture->y = 0; if (d3d->rgui_texture_enable) { d3d->d3d_render_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); d3d->d3d_render_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); d3d->d3d_render_device->SetRenderState(D3DRS_ALPHABLENDENABLE, true); texture_image_render(menu_texture, menu_texture->x, menu_texture->y, 640, 480, true); d3d->d3d_render_device->SetRenderState(D3DRS_ALPHABLENDENABLE, false); } #ifdef HAVE_MENU_PANEL if ((menu_panel->x != 0) || (menu_panel->y != 0)) { texture_image_render(menu_panel, menu_panel->x, menu_panel->y, 610, 20, false); menu_panel->x = 0; menu_panel->y = 0; } #endif #endif }
static bool d3d_frame(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, const char *msg) { d3d_video_t *d3d = (d3d_video_t*)data; if (!frame) return true; RARCH_PERFORMANCE_INIT(d3d_frame); RARCH_PERFORMANCE_START(d3d_frame); // We cannot recover in fullscreen. if (d3d->needs_restore && IsIconic(d3d->hWnd)) return true; if (d3d->needs_restore && !d3d_restore(d3d)) { RARCH_ERR("[D3D]: Failed to restore.\n"); return false; } if (d3d->should_resize) { d3d_calculate_rect(d3d, d3d->screen_width, d3d->screen_height, d3d->video_info.force_aspect, g_extern.system.aspect_ratio); renderchain_set_final_viewport(d3d->chain, &d3d->final_viewport); d3d_recompute_pass_sizes(d3d); d3d->should_resize = false; } // render_chain() only clears out viewport, clear out everything. D3DVIEWPORT screen_vp; screen_vp.X = 0; screen_vp.Y = 0; screen_vp.MinZ = 0; screen_vp.MaxZ = 1; screen_vp.Width = d3d->screen_width; screen_vp.Height = d3d->screen_height; d3d->dev->SetViewport(&screen_vp); d3d->dev->Clear(0, 0, D3DCLEAR_TARGET, 0, 1, 0); // Insert black frame first, so we can screenshot, etc. if (g_settings.video.black_frame_insertion) { if (d3d->dev->Present(NULL, NULL, NULL, NULL) != D3D_OK) { RARCH_ERR("[D3D]: Present() failed.\n"); d3d->needs_restore = true; return true; } d3d->dev->Clear(0, 0, D3DCLEAR_TARGET, 0, 1, 0); } if (!renderchain_render(d3d->chain, frame, width, height, pitch, d3d->dev_rotation)) { RARCH_ERR("[D3D]: Failed to render scene.\n"); return false; } if (d3d->font_ctx && d3d->font_ctx->render_msg) { font_params_t font_parms = {0}; #ifdef _XBOX #if defined(_XBOX1) float msg_width = 60; float msg_height = 365; #elif defined(_XBOX360) float msg_width = (g_extern.lifecycle_state & (1ULL << MODE_MENU_HD)) ? 160 : 100; float msg_height = 120; #endif font_parms.x = msg_width; font_parms.y = msg_height; font_parms.scale = 21; #endif d3d->font_ctx->render_msg(d3d, msg, &font_parms); } #ifdef HAVE_MENU if (d3d->rgui && d3d->rgui->enabled) d3d_overlay_render(d3d, d3d->rgui); #endif #ifdef HAVE_OVERLAY if (d3d->overlays_enabled) { for (unsigned i = 0; i < d3d->overlays.size(); i++) d3d_overlay_render(d3d, &d3d->overlays[i]); } #endif RARCH_PERFORMANCE_STOP(d3d_frame); #ifdef HAVE_MENU #ifdef HAVE_RMENU_XUI if (g_extern.lifecycle_state & (1ULL << MODE_MENU)) menu_iterate_xui(); #endif #endif if (d3d && d3d->ctx_driver && d3d->ctx_driver->update_window_title) d3d->ctx_driver->update_window_title(d3d); if (d3d && d3d->ctx_driver && d3d->ctx_driver->swap_buffers) d3d->ctx_driver->swap_buffers(d3d); return true; }