diff --git a/renderdoc/driver/d3d11/shaders/dxbc_inspect.cpp b/renderdoc/driver/d3d11/shaders/dxbc_inspect.cpp index 8c6cc9b8f..c01cee2ed 100644 --- a/renderdoc/driver/d3d11/shaders/dxbc_inspect.cpp +++ b/renderdoc/driver/d3d11/shaders/dxbc_inspect.cpp @@ -520,9 +520,16 @@ DXBCFile::DXBCFile(const void *ByteCode, size_t ByteCodeLength) m_Resources.reserve(h->resources.count); + // we have to use this map to match up cbuffers to their bind point, as + // it's not guaranteed that the resources and cbuffers will come in the + // same order. However it's possible for two cbuffers to have the same + // name, so in that case we assume they will come in matching order + // and just append _ to subsequent cbuffers with the same name. map cbufferSlots; uint32_t maxCBufferSlot = 0; + set cbuffernames; + for(int32_t i = 0; i < h->resources.count; i++) { RDEFResource *res = (RDEFResource *)(chunkContents + h->resources.offset + i*sizeof(RDEFResource)); @@ -549,13 +556,22 @@ DXBCFile::DXBCFile(const void *ByteCode, size_t ByteCodeLength) if(desc.type == ShaderInputBind::TYPE_CBUFFER) { - cbufferSlots[desc.name] = desc.bindPoint; + string cname = desc.name; + + while(cbuffernames.find(cname) != cbuffernames.end()) + cname += "_"; + + cbuffernames.insert(cname); + + cbufferSlots[cname] = desc.bindPoint; maxCBufferSlot = RDCMAX(maxCBufferSlot, desc.bindPoint); } m_Resources.push_back(desc); } + cbuffernames.clear(); + if(h->cbuffers.count > 0) m_CBuffers.resize(maxCBufferSlot+1); @@ -634,10 +650,17 @@ DXBCFile::DXBCFile(const void *ByteCode, size_t ByteCodeLength) cb.variables.push_back(v); } + string cname = cb.name; + + while(cbuffernames.find(cname) != cbuffernames.end()) + cname += "_"; + + cbuffernames.insert(cname); + if(cb.descriptor.type == CBuffer::Descriptor::TYPE_CBUFFER) { - RDCASSERT(cbufferSlots.find(cb.name) != cbufferSlots.end()); - m_CBuffers[cbufferSlots[cb.name]] = cb; + RDCASSERT(cbufferSlots.find(cname) != cbufferSlots.end()); + m_CBuffers[cbufferSlots[cname]] = cb; } else if(cb.descriptor.type == CBuffer::Descriptor::TYPE_RESOURCE_BIND_INFO) {