diff --git a/renderdoc/driver/d3d11/d3d11_renderstate.cpp b/renderdoc/driver/d3d11/d3d11_renderstate.cpp index cedcd9e90..ff6a94c42 100644 --- a/renderdoc/driver/d3d11/d3d11_renderstate.cpp +++ b/renderdoc/driver/d3d11/d3d11_renderstate.cpp @@ -104,9 +104,11 @@ void D3D11RenderState::ReleaseRefs() for(UINT i = 0; i < D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; i++) ReleaseRef(IA.VBs[i]); - shader *sh = &VS; + shader *stages[] = {&VS, &HS, &DS, &GS, &PS, &CS}; for(int s = 0; s < 6; s++) { + shader *sh = stages[s]; + ReleaseRef(sh->Shader); for(UINT i = 0; i < D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; i++) @@ -217,9 +219,11 @@ void D3D11RenderState::MarkReferenced(WrappedID3D11DeviceContext *ctx, bool init ctx->MarkResourceReferenced(GetIDForResource(IA.VBs[i]), initial ? eFrameRef_Unknown : eFrameRef_Read); - const shader *sh = &VS; + const shader *stages[] = {&VS, &HS, &DS, &GS, &PS, &CS}; for(int s = 0; s < 6; s++) { + const shader *sh = stages[s]; + ctx->MarkResourceReferenced(GetIDForResource(sh->Shader), initial ? eFrameRef_Unknown : eFrameRef_Read); @@ -419,9 +423,11 @@ void D3D11RenderState::AddRefs() for(UINT i = 0; i < D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT; i++) TakeRef(IA.VBs[i]); - shader *sh = &VS; + shader *stages[] = {&VS, &HS, &DS, &GS, &PS, &CS}; for(int s = 0; s < 6; s++) { + shader *sh = stages[s]; + TakeRef(sh->Shader); for(UINT i = 0; i < D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; i++) @@ -517,9 +523,11 @@ void D3D11RenderState::Serialise(LogState m_State, WrappedID3D11Device *device) #undef MAKE_NAMES - shader *sh = &VS; + shader *stages[] = {&VS, &HS, &DS, &GS, &PS, &CS}; for(int s = 0; s < 6; s++) { + shader *sh = stages[s]; + SERIALISE_ELEMENT(ResourceId, Shader, GetIDForResource(sh->Shader)); if(m_State < WRITING) { @@ -1108,9 +1116,11 @@ void D3D11RenderState::UnbindIUnknownForRead(const ResourceRange &range, bool al } // const char *names[] = { "VS", "DS", "HS", "GS", "PS", "CS" }; - shader *sh = &VS; + shader *stages[] = {&VS, &HS, &DS, &GS, &PS, &CS}; for(int s = 0; s < 6; s++) { + shader *sh = stages[s]; + for(UINT i = 0; i < D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT; i++) { if(range.Intersects(ResourceRange(sh->ConstantBuffers[i]))) diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 0728caf5b..b69fd0620 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -498,15 +498,17 @@ D3D11PipelineState D3D11Replay::MakePipelineState() ///////////////////////////////////////////////// { - D3D11PipelineState::ShaderStage *dstArr = &ret.m_VS; - const D3D11RenderState::shader *srcArr = &rs->VS; + D3D11PipelineState::ShaderStage *dstArr[] = {&ret.m_VS, &ret.m_HS, &ret.m_DS, + &ret.m_GS, &ret.m_PS, &ret.m_CS}; + const D3D11RenderState::shader *srcArr[] = {&rs->VS, &rs->HS, &rs->DS, + &rs->GS, &rs->PS, &rs->CS}; const char *stageNames[] = {"Vertex", "Hull", "Domain", "Geometry", "Pixel", "Compute"}; for(size_t stage = 0; stage < 6; stage++) { - D3D11PipelineState::ShaderStage &dst = dstArr[stage]; - const D3D11RenderState::shader &src = srcArr[stage]; + D3D11PipelineState::ShaderStage &dst = *dstArr[stage]; + const D3D11RenderState::shader &src = *srcArr[stage]; dst.stage = (ShaderStageType)stage; diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index d20644cac..9a1b66c9f 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -1627,25 +1627,37 @@ void ReplayRenderer::FetchPipelineState() m_VulkanPipelineState = m_pDevice->GetVulkanPipelineState(); { - D3D11PipelineState::ShaderStage *stage = &m_D3D11PipelineState.m_VS; + D3D11PipelineState::ShaderStage *stages[] = { + &m_D3D11PipelineState.m_VS, &m_D3D11PipelineState.m_HS, &m_D3D11PipelineState.m_DS, + &m_D3D11PipelineState.m_GS, &m_D3D11PipelineState.m_PS, &m_D3D11PipelineState.m_CS, + }; + for(int i = 0; i < 6; i++) - if(stage[i].Shader != ResourceId()) - stage[i].ShaderDetails = m_pDevice->GetShader(m_pDevice->GetLiveID(stage[i].Shader), ""); + if(stages[i]->Shader != ResourceId()) + stages[i]->ShaderDetails = m_pDevice->GetShader(m_pDevice->GetLiveID(stages[i]->Shader), ""); } { - GLPipelineState::ShaderStage *stage = &m_GLPipelineState.m_VS; + GLPipelineState::ShaderStage *stages[] = { + &m_GLPipelineState.m_VS, &m_GLPipelineState.m_TCS, &m_GLPipelineState.m_TES, + &m_GLPipelineState.m_GS, &m_GLPipelineState.m_FS, &m_GLPipelineState.m_CS, + }; + for(int i = 0; i < 6; i++) - if(stage[i].Shader != ResourceId()) - stage[i].ShaderDetails = m_pDevice->GetShader(m_pDevice->GetLiveID(stage[i].Shader), ""); + if(stages[i]->Shader != ResourceId()) + stages[i]->ShaderDetails = m_pDevice->GetShader(m_pDevice->GetLiveID(stages[i]->Shader), ""); } { - VulkanPipelineState::ShaderStage *stage = &m_VulkanPipelineState.VS; + VulkanPipelineState::ShaderStage *stages[] = { + &m_VulkanPipelineState.VS, &m_VulkanPipelineState.TCS, &m_VulkanPipelineState.TES, + &m_VulkanPipelineState.GS, &m_VulkanPipelineState.FS, &m_VulkanPipelineState.CS, + }; + for(int i = 0; i < 6; i++) - if(stage[i].Shader != ResourceId()) - stage[i].ShaderDetails = - m_pDevice->GetShader(m_pDevice->GetLiveID(stage[i].Shader), stage[i].entryPoint.elems); + if(stages[i]->Shader != ResourceId()) + stages[i]->ShaderDetails = m_pDevice->GetShader(m_pDevice->GetLiveID(stages[i]->Shader), + stages[i]->entryPoint.elems); } }