From 790275eae234bcaef1c94dcc6d54ab6090671f68 Mon Sep 17 00:00:00 2001 From: Trezanik Date: Mon, 16 May 2016 01:02:09 +0100 Subject: [PATCH] Example: DirectX9: Backup and restore all state --- examples/directx9_example/imgui_impl_dx9.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/examples/directx9_example/imgui_impl_dx9.cpp b/examples/directx9_example/imgui_impl_dx9.cpp index 3db8c8c9..ba67d026 100644 --- a/examples/directx9_example/imgui_impl_dx9.cpp +++ b/examples/directx9_example/imgui_impl_dx9.cpp @@ -58,14 +58,10 @@ void ImGui_ImplDX9_RenderDrawLists(ImDrawData* draw_data) return; } - // Backup some DX9 state (not all!) - // FIXME: Backup/restore everything else - D3DRENDERSTATETYPE last_render_state_to_backup[] = { D3DRS_CULLMODE, D3DRS_LIGHTING, D3DRS_ZENABLE, D3DRS_ALPHABLENDENABLE, D3DRS_ALPHATESTENABLE, D3DRS_BLENDOP, D3DRS_SRCBLEND, D3DRS_DESTBLEND, D3DRS_SCISSORTESTENABLE }; - DWORD last_render_state_values[ARRAYSIZE(last_render_state_to_backup)] = { 0 }; - IDirect3DPixelShader9* last_ps; g_pd3dDevice->GetPixelShader( &last_ps ); - IDirect3DVertexShader9* last_vs; g_pd3dDevice->GetVertexShader( &last_vs ); - for (int n = 0; n < ARRAYSIZE(last_render_state_to_backup); n++) - g_pd3dDevice->GetRenderState(last_render_state_to_backup[n], &last_render_state_values[n]); + // Backup the DX9 state + IDirect3DStateBlock9* d3d9_state_block = NULL; + if ( g_pd3dDevice->CreateStateBlock(D3DSBT_ALL, &d3d9_state_block) < 0 ) + return; // Copy and convert all vertices into a single contiguous buffer CUSTOMVERTEX* vtx_dst; @@ -161,11 +157,9 @@ void ImGui_ImplDX9_RenderDrawLists(ImDrawData* draw_data) vtx_offset += cmd_list->VtxBuffer.size(); } - // Restore some modified DX9 state (not all!) - g_pd3dDevice->SetPixelShader( last_ps ); - g_pd3dDevice->SetVertexShader( last_vs ); - for (int n = 0; n < ARRAYSIZE(last_render_state_to_backup); n++) - g_pd3dDevice->SetRenderState(last_render_state_to_backup[n], last_render_state_values[n]); + // Restore the DX9 state + d3d9_state_block->Apply(); + d3d9_state_block->Release(); } IMGUI_API LRESULT ImGui_ImplDX9_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam)