Browse Source

Example: DirectX9: Backup and restore all state

Trezanik 9 years ago
parent
commit
790275eae2
1 changed files with 7 additions and 13 deletions
  1. 7 13
      examples/directx9_example/imgui_impl_dx9.cpp

+ 7 - 13
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)