From 8897a1295a88f6664ac036cfda42ebe52ae7a897 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 25 Aug 2016 16:20:42 +0200 Subject: [PATCH] Handle parameters to SOSetTargets being NULL, use defaults. Refs #338 * It seems like actually ppSOTargets can only be NULL if NumBuffers is 0, but the D3D runtime will happily accept a null pOffsets and just act as if it's full of -1 (which means append) --- renderdoc/driver/d3d11/d3d11_context_wrap.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp index f7bfe2d87..0b31a00eb 100644 --- a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp @@ -2172,13 +2172,19 @@ bool WrappedID3D11DeviceContext::Serialise_SOSetTargets(UINT NumBuffers_, { SERIALISE_ELEMENT(uint32_t, NumBuffers, NumBuffers_); - SERIALISE_ELEMENT_ARR(uint32_t, Offsets, pOffsets, NumBuffers); + UINT DefaultOffsets[] = { + ~0U, ~0U, ~0U, ~0U, ~0U, ~0U, ~0U, ~0U, + }; + RDCCOMPILE_ASSERT(ARRAY_COUNT(DefaultOffsets) >= D3D11_SO_STREAM_COUNT, + "Insufficiently sized array of default offsets"); + + SERIALISE_ELEMENT_ARR(uint32_t, Offsets, pOffsets ? pOffsets : DefaultOffsets, NumBuffers); ID3D11Buffer **Buffers = new ID3D11Buffer *[NumBuffers]; for(UINT i = 0; i < NumBuffers; i++) { - SERIALISE_ELEMENT(ResourceId, id, GetIDForResource(ppSOTargets[i])); + SERIALISE_ELEMENT(ResourceId, id, ppSOTargets ? GetIDForResource(ppSOTargets[i]) : ResourceId()); if(m_State <= EXECUTING && m_pDevice->GetResourceManager()->HasLiveResource(id)) Buffers[i] = (ID3D11Buffer *)m_pDevice->GetResourceManager()->GetLiveResource(id); @@ -2280,8 +2286,9 @@ void WrappedID3D11DeviceContext::SOSetTargets(UINT NumBuffers, ID3D11Buffer *con for(UINT b = 0; b < NumBuffers; b++) { - setbufs[b] = ppSOTargets[b]; - setoffs[b] = pOffsets[b]; + setbufs[b] = ppSOTargets ? ppSOTargets[b] : NULL; + // passing NULL for pOffsets seems to act like -1 => append + setoffs[b] = pOffsets ? pOffsets[b] : ~0U; } // end stream-out queries for outgoing targets