From 7ff8a9520515dc36b3d0c982e430dd1af6b55ada Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 20 Mar 2020 13:16:01 +0000 Subject: [PATCH] Don't end stream-out queries twice --- renderdoc/driver/d3d11/d3d11_context.cpp | 7 +++-- renderdoc/driver/d3d11/d3d11_context_wrap.cpp | 28 +++++++++++++------ util/test/demos/d3d11/d3d11_stream_out.cpp | 28 +++++++++++++++++-- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index d855f2303..103117204 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -318,8 +318,11 @@ bool WrappedID3D11DeviceContext::Serialise_BeginCaptureFrame(SerialiserType &ser { ResourceId id = GetIDForResource(buf); - m_pRealContext->End(m_StreamOutCounters[id].query); - m_StreamOutCounters[id].running = false; + if(m_StreamOutCounters[id].running) + { + m_pRealContext->End(m_StreamOutCounters[id].query); + m_StreamOutCounters[id].running = false; + } restart[b] = true; } diff --git a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp index b34bc441e..eb6e6e7cc 100644 --- a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp @@ -2212,8 +2212,11 @@ bool WrappedID3D11DeviceContext::Serialise_SOSetTargets(SerialiserType &ser, UIN { ResourceId id = GetIDForResource(buf); - m_pRealContext->End(m_StreamOutCounters[id].query); - m_StreamOutCounters[id].running = false; + if(m_StreamOutCounters[id].running) + { + m_pRealContext->End(m_StreamOutCounters[id].query); + m_StreamOutCounters[id].running = false; + } } } @@ -2318,8 +2321,11 @@ void WrappedID3D11DeviceContext::SOSetTargets(UINT NumBuffers, ID3D11Buffer *con { ResourceId id = GetIDForResource(buf); - m_pRealContext->End(m_StreamOutCounters[id].query); - m_StreamOutCounters[id].running = false; + if(m_StreamOutCounters[id].running) + { + m_pRealContext->End(m_StreamOutCounters[id].query); + m_StreamOutCounters[id].running = false; + } } } @@ -6447,8 +6453,11 @@ bool WrappedID3D11DeviceContext::Serialise_ClearState(SerialiserType &ser) { ResourceId id = GetIDForResource(buf); - m_pRealContext->End(m_StreamOutCounters[id].query); - m_StreamOutCounters[id].running = false; + if(m_StreamOutCounters[id].running) + { + m_pRealContext->End(m_StreamOutCounters[id].query); + m_StreamOutCounters[id].running = false; + } } } @@ -6488,8 +6497,11 @@ void WrappedID3D11DeviceContext::ClearState() { ResourceId id = GetIDForResource(buf); - m_pRealContext->End(m_StreamOutCounters[id].query); - m_StreamOutCounters[id].running = false; + if(m_StreamOutCounters[id].running) + { + m_pRealContext->End(m_StreamOutCounters[id].query); + m_StreamOutCounters[id].running = false; + } } } diff --git a/util/test/demos/d3d11/d3d11_stream_out.cpp b/util/test/demos/d3d11/d3d11_stream_out.cpp index be1b8cb42..e9bed620c 100644 --- a/util/test/demos/d3d11/d3d11_stream_out.cpp +++ b/util/test/demos/d3d11/d3d11_stream_out.cpp @@ -165,9 +165,7 @@ RD_TEST(D3D11_Stream_Out, D3D11GraphicsTest) IASetVertexBuffer(vb, sizeof(DefaultA2V), 0); ctx->IASetInputLayout(defaultLayout); - // draw with streamout and clear state - ctx->SOSetTargets(2, bufs, offs); - ctx->DrawInstanced(3, 2, 0, 0); + // check that we can clear state after unbinding ctx->ClearState(); ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); @@ -181,10 +179,34 @@ RD_TEST(D3D11_Stream_Out, D3D11GraphicsTest) RSSetViewport({screenWidth / 4.0f, 0.0f, (float)screenWidth / 4.0f, (float)screenHeight / 4.0f, 0.0f, 1.0f}); + ctx->IASetVertexBuffers(0, 2, emptyBuf, &strides[0], offs); + IASetVertexBuffer(vb, sizeof(DefaultA2V), 0); + ctx->IASetInputLayout(defaultLayout); + + // draw with streamout and clear state + ctx->SOSetTargets(2, bufs, offs); + ctx->DrawInstanced(3, 2, 0, 0); + ctx->ClearState(); + + ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + + ctx->VSSetShader(vs, NULL, 0); + ctx->GSSetShader(gs, NULL, 0); + ctx->PSSetShader(ps, NULL, 0); + + ctx->OMSetRenderTargets(1, &bbRTV.GetInterfacePtr(), NULL); + + RSSetViewport({(screenWidth * 2.0f) / 4.0f, 0.0f, (float)screenWidth / 4.0f, + (float)screenHeight / 4.0f, 0.0f, 1.0f}); + ctx->IASetVertexBuffers(0, 2, bufs, &strides[0], offs); ctx->IASetInputLayout(streamoutLayout); ctx->DrawAuto(); + // leave stream-out buffers bound at the end of the frame + ctx->ClearState(); + ctx->SOSetTargets(2, bufs, offs); + Present(); }