From 4b60073e81bf1be3777a929591e0fad99c118b3d Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 20 Feb 2017 22:15:41 +0000 Subject: [PATCH] Workaround for nvidia driver bug - demote IMMUTABLE buffers to DEFAULT --- renderdoc/driver/d3d11/d3d11_device_wrap.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp index 3ff58e473..081e121b4 100644 --- a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp @@ -49,6 +49,17 @@ bool WrappedID3D11Device::Serialise_CreateBuffer(const D3D11_BUFFER_DESC *pDesc, if(m_State >= WRITING || GetLogVersion() >= 0x000007) m_pSerialiser->AlignNextBuffer(32); + // work around an nvidia driver bug, if a buffer is created as IMMUTABLE then it + // can't be CopySubresourceRegion'd with a box offset, the data that's read is + // wrong. + if(m_State < WRITING && Descriptor.Usage == D3D11_USAGE_IMMUTABLE) + { + Descriptor.Usage = D3D11_USAGE_DEFAULT; + // paranoid - I don't know what requirements might change, so set some sane default + if(Descriptor.BindFlags == 0) + Descriptor.BindFlags = D3D11_BIND_VERTEX_BUFFER; + } + SERIALISE_ELEMENT_BUF(byte *, InitialData, pInitialData->pSysMem, Descriptor.ByteWidth); uint64_t offs = m_pSerialiser->GetOffset() - Descriptor.ByteWidth;