diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 28078d514..5a6da3b3f 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -449,6 +449,11 @@ WrappedID3D11Device::~WrappedID3D11Device() m_DeviceRecord->Delete(GetResourceManager()); } + for(auto it = m_LayoutShaders.begin(); it != m_LayoutShaders.end(); ++it) + SAFE_DELETE(it->second); + m_LayoutShaders.clear(); + m_LayoutDescs.clear(); + m_ResourceManager->Shutdown(); SAFE_DELETE(m_ResourceManager); @@ -459,11 +464,6 @@ WrappedID3D11Device::~WrappedID3D11Device() SAFE_DELETE(m_pSerialiser); SAFE_DELETE(m_pDebugSerialiser); - - for(auto it=m_LayoutDXBC.begin(); it != m_LayoutDXBC.end(); ++it) - SAFE_DELETE(it->second); - m_LayoutDXBC.clear(); - m_LayoutDescs.clear(); if(RenderDoc::Inst().GetCrashHandler()) RenderDoc::Inst().GetCrashHandler()->UnregisterMemoryRegion(this); diff --git a/renderdoc/driver/d3d11/d3d11_device.h b/renderdoc/driver/d3d11/d3d11_device.h index 97dff3310..4b4967653 100644 --- a/renderdoc/driver/d3d11/d3d11_device.h +++ b/renderdoc/driver/d3d11/d3d11_device.h @@ -76,6 +76,7 @@ struct D3D11InitParams : public RDCInitParams }; class WrappedID3D11Device; +class WrappedShader; // We can pass through all calls to ID3D11Debug without intercepting, this // struct isonly here so that we can intercept QueryInterface calls to return @@ -245,7 +246,7 @@ private: set m_DeferredContexts; map > m_LayoutDescs; - map m_LayoutDXBC; + map m_LayoutShaders; ResourceId m_ReplayDefCtx; uint32_t m_FirstDefEv; @@ -308,7 +309,6 @@ public: void AddDebugMessage(DebugMessage msg) { if(m_State < WRITING) m_DebugMessages.push_back(msg); } void AddDebugMessage(DebugMessageCategory c, DebugMessageSeverity sv, DebugMessageSource src, std::string d); const vector &GetLayoutDesc(ID3D11InputLayout *layout) { return m_LayoutDescs[layout]; } - ShaderReflection *GetLayoutDXBC(ID3D11InputLayout *layout) { return m_LayoutDXBC[layout]; } void ReleaseSwapchainResources(IDXGISwapChain *swap); diff --git a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp index a3d6d508a..622593f0c 100644 --- a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp @@ -1127,15 +1127,8 @@ bool WrappedID3D11Device::Serialise_CreateInputLayout( vector descvec(layouts, layouts+NumElems); m_LayoutDescs[ret] = descvec; - m_LayoutDXBC[ret] = NULL; if(BytecodeLen > 0 && ShaderBytecode) - { - DXBC::DXBCFile *dxbc = new DXBC::DXBCFile(ShaderBytecode, BytecodeLen); - - m_LayoutDXBC[ret] = MakeShaderReflection(dxbc); - - delete dxbc; - } + m_LayoutShaders[ret] = new WrappedShader(GetIDForResource(ret), new DXBC::DXBCFile(ShaderBytecode, BytecodeLen)); SAFE_DELETE_ARRAY(ShaderBytecode); } diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 916c20715..499f60be6 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -447,8 +447,10 @@ D3D11PipelineState D3D11Replay::MakePipelineState() { const vector &vec = m_pDevice->GetLayoutDesc(rs->IA.Layout); - ret.m_IA.layout = rm->GetOriginalID(GetIDForResource(rs->IA.Layout)); - ret.m_IA.Bytecode = m_pDevice->GetLayoutDXBC(rs->IA.Layout); + ResourceId layoutId = GetIDForResource(rs->IA.Layout); + + ret.m_IA.layout = rm->GetOriginalID(layoutId); + ret.m_IA.Bytecode = GetShader(layoutId); create_array_uninit(ret.m_IA.layouts, vec.size());