|
|
@ -116,6 +116,46 @@ void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data) |
|
|
|
g_pd3dDeviceContext->Unmap(g_pVertexConstantBuffer, 0); |
|
|
|
} |
|
|
|
|
|
|
|
// Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!)
|
|
|
|
ID3D11DeviceContext* ctx = g_pd3dDeviceContext; |
|
|
|
struct BACKUP_DX11_STATE |
|
|
|
{ |
|
|
|
UINT ScissorRectsCount, ViewportsCount; |
|
|
|
D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; |
|
|
|
D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; |
|
|
|
ID3D11RasterizerState* RS; |
|
|
|
ID3D11BlendState* BlendState; |
|
|
|
FLOAT BlendFactor[4]; |
|
|
|
UINT SampleMask; |
|
|
|
ID3D11ShaderResourceView* PSShaderResource; |
|
|
|
ID3D11SamplerState* PSSampler; |
|
|
|
ID3D11PixelShader* PS; |
|
|
|
ID3D11VertexShader* VS; |
|
|
|
UINT PSInstancesCount, VSInstancesCount; |
|
|
|
ID3D11ClassInstance* PSInstances[256], *VSInstances[256]; // 256 is max according to PSSetShader documentation
|
|
|
|
D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology; |
|
|
|
ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer; |
|
|
|
UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset; |
|
|
|
DXGI_FORMAT IndexBufferFormat; |
|
|
|
ID3D11InputLayout* InputLayout; |
|
|
|
}; |
|
|
|
BACKUP_DX11_STATE old; |
|
|
|
old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; |
|
|
|
ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects); |
|
|
|
ctx->RSGetViewports(&old.ViewportsCount, old.Viewports); |
|
|
|
ctx->RSGetState(&old.RS); |
|
|
|
ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask); |
|
|
|
ctx->PSGetShaderResources(0, 1, &old.PSShaderResource); |
|
|
|
ctx->PSGetSamplers(0, 1, &old.PSSampler); |
|
|
|
old.PSInstancesCount = old.VSInstancesCount = 256; |
|
|
|
ctx->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount); |
|
|
|
ctx->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount); |
|
|
|
ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer); |
|
|
|
ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology); |
|
|
|
ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset); |
|
|
|
ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); |
|
|
|
ctx->IAGetInputLayout(&old.InputLayout); |
|
|
|
|
|
|
|
// Setup viewport
|
|
|
|
{ |
|
|
|
D3D11_VIEWPORT vp; |
|
|
@ -171,10 +211,22 @@ void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data) |
|
|
|
vtx_offset += cmd_list->VtxBuffer.size(); |
|
|
|
} |
|
|
|
|
|
|
|
// Restore modified state
|
|
|
|
g_pd3dDeviceContext->IASetInputLayout(NULL); |
|
|
|
g_pd3dDeviceContext->PSSetShader(NULL, NULL, 0); |
|
|
|
g_pd3dDeviceContext->VSSetShader(NULL, NULL, 0); |
|
|
|
// Restore modified DX state
|
|
|
|
ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects); |
|
|
|
ctx->RSSetViewports(old.ViewportsCount, old.Viewports); |
|
|
|
ctx->RSSetState(old.RS); if (old.RS) old.RS->Release(); |
|
|
|
ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release(); |
|
|
|
ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release(); |
|
|
|
ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release(); |
|
|
|
ctx->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release(); |
|
|
|
for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release(); |
|
|
|
ctx->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release(); |
|
|
|
ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release(); |
|
|
|
for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release(); |
|
|
|
ctx->IASetPrimitiveTopology(old.PrimitiveTopology); |
|
|
|
ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release(); |
|
|
|
ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release(); |
|
|
|
ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release(); |
|
|
|
} |
|
|
|
|
|
|
|
IMGUI_API LRESULT ImGui_ImplDX11_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam) |
|
|
|