From 4c24dcecde7350445762577ec5dba29133b7e9ba Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 18 Nov 2016 12:32:31 +0100 Subject: [PATCH] Add typedef for shader data struct and utility accessors in pipeline --- renderdoc/driver/d3d12/d3d12_debug.cpp | 3 +- renderdoc/driver/d3d12/d3d12_replay.cpp | 30 ++--- renderdoc/driver/d3d12/d3d12_resources.cpp | 11 +- renderdoc/driver/d3d12/d3d12_resources.h | 122 ++++++++++----------- 4 files changed, 79 insertions(+), 87 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index ee62206a7..5d5af2bc0 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -2337,8 +2337,7 @@ void D3D12DebugManager::BuildShader(string source, string entry, const uint32_t byteCode.BytecodeLength = blob->GetBufferSize(); byteCode.pShaderBytecode = blob->GetBufferPointer(); - WrappedID3D12PipelineState::ShaderEntry *sh = - WrappedID3D12PipelineState::AddShader(byteCode, m_WrappedDevice, NULL); + WrappedID3D12Shader *sh = WrappedID3D12PipelineState::AddShader(byteCode, m_WrappedDevice, NULL); SAFE_RELEASE(blob); diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 5f39852ad..23f324219 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -240,8 +240,8 @@ FetchTexture D3D12Replay::GetTexture(ResourceId id) ShaderReflection *D3D12Replay::GetShader(ResourceId shader, string entryPoint) { - WrappedID3D12PipelineState::ShaderEntry *sh = - m_pDevice->GetResourceManager()->GetCurrentAs(shader); + WrappedID3D12Shader *sh = + m_pDevice->GetResourceManager()->GetCurrentAs(shader); if(sh) return &sh->GetDetails(); @@ -944,8 +944,7 @@ void D3D12Replay::MakePipelineState() if(pipe && pipe->IsCompute()) { - WrappedID3D12PipelineState::ShaderEntry *sh = - (WrappedID3D12PipelineState::ShaderEntry *)pipe->compute->CS.pShaderBytecode; + WrappedID3D12Shader *sh = (WrappedID3D12Shader *)pipe->compute->CS.pShaderBytecode; state.m_CS.Shader = sh->GetResourceID(); state.m_CS.stage = eShaderStage_Compute; @@ -975,8 +974,7 @@ void D3D12Replay::MakePipelineState() dst.stage = (ShaderStageType)stage; - WrappedID3D12PipelineState::ShaderEntry *sh = - (WrappedID3D12PipelineState::ShaderEntry *)src.pShaderBytecode; + WrappedID3D12Shader *sh = (WrappedID3D12Shader *)src.pShaderBytecode; if(sh) { @@ -1331,13 +1329,13 @@ void D3D12Replay::FillCBufferVariables(ResourceId shader, string entryPoint, uin ID3D12DeviceChild *res = m_pDevice->GetResourceManager()->GetCurrentResource(shader); - if(!WrappedID3D12PipelineState::ShaderEntry::IsAlloc(res)) + if(!WrappedID3D12Shader::IsAlloc(res)) { RDCERR("Shader ID %llu does not correspond to a known fake shader", shader); return; } - WrappedID3D12PipelineState::ShaderEntry *sh = (WrappedID3D12PipelineState::ShaderEntry *)res; + WrappedID3D12Shader *sh = (WrappedID3D12Shader *)res; DXBC::DXBCFile *dxbc = sh->GetDXBC(); const ShaderBindpointMapping &bindMap = sh->GetMapping(); @@ -1498,10 +1496,9 @@ void D3D12Replay::ReplaceResource(ResourceId from, ResourceId to) { ID3D12DeviceChild *resource = rm->GetLiveResource(from); - if(WrappedID3D12PipelineState::ShaderEntry::IsAlloc(resource)) + if(WrappedID3D12Shader::IsAlloc(resource)) { - WrappedID3D12PipelineState::ShaderEntry *sh = - (WrappedID3D12PipelineState::ShaderEntry *)resource; + WrappedID3D12Shader *sh = (WrappedID3D12Shader *)resource; for(size_t i = 0; i < sh->m_Pipes.size(); i++) { @@ -1511,8 +1508,7 @@ void D3D12Replay::ReplaceResource(ResourceId from, ResourceId to) ID3D12PipelineState *replpipe = NULL; - D3D12_SHADER_BYTECODE shDesc = - rm->GetLiveAs(to)->GetDesc(); + D3D12_SHADER_BYTECODE shDesc = rm->GetLiveAs(to)->GetDesc(); if(pipe->graphics) { @@ -1526,8 +1522,7 @@ void D3D12Replay::ReplaceResource(ResourceId from, ResourceId to) { if(shaders[s]->BytecodeLength > 0) { - WrappedID3D12PipelineState::ShaderEntry *stage = - (WrappedID3D12PipelineState::ShaderEntry *)shaders[s]->pShaderBytecode; + WrappedID3D12Shader *stage = (WrappedID3D12Shader *)shaders[s]->pShaderBytecode; if(stage->GetResourceID() == from) *shaders[s] = shDesc; @@ -1568,10 +1563,9 @@ void D3D12Replay::RemoveReplacement(ResourceId id) { ID3D12DeviceChild *resource = rm->GetLiveResource(id); - if(WrappedID3D12PipelineState::ShaderEntry::IsAlloc(resource)) + if(WrappedID3D12Shader::IsAlloc(resource)) { - WrappedID3D12PipelineState::ShaderEntry *sh = - (WrappedID3D12PipelineState::ShaderEntry *)resource; + WrappedID3D12Shader *sh = (WrappedID3D12Shader *)resource; for(size_t i = 0; i < sh->m_Pipes.size(); i++) { diff --git a/renderdoc/driver/d3d12/d3d12_resources.cpp b/renderdoc/driver/d3d12/d3d12_resources.cpp index 012475263..5b82cdeac 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.cpp +++ b/renderdoc/driver/d3d12/d3d12_resources.cpp @@ -29,12 +29,11 @@ GPUAddressRangeTracker WrappedID3D12Resource::m_Addresses; std::map *WrappedID3D12Resource::m_List = NULL; -std::map - WrappedID3D12PipelineState::m_Shaders; +std::map WrappedID3D12PipelineState::m_Shaders; const GUID RENDERDOC_ID3D12ShaderGUID_ShaderDebugMagicValue = RENDERDOC_ShaderDebugMagicValue_struct; -void WrappedID3D12PipelineState::ShaderEntry::TryReplaceOriginalByteCode() +void WrappedID3D12Shader::TryReplaceOriginalByteCode() { if(!DXBC::DXBCFile::CheckForDebugInfo((const void *)&m_Bytecode[0], m_Bytecode.size())) { @@ -145,7 +144,7 @@ void WrappedID3D12PipelineState::ShaderEntry::TryReplaceOriginalByteCode() ALL_D3D12_TYPES; -WRAPPED_POOL_INST(WrappedID3D12PipelineState::ShaderEntry); +WRAPPED_POOL_INST(WrappedID3D12Shader); D3D12ResourceType IdentifyTypeByPtr(ID3D12DeviceChild *ptr) { @@ -181,8 +180,8 @@ TrackedResource12 *GetTracked(ID3D12DeviceChild *ptr) ALL_D3D12_TYPES; - if(WrappedID3D12PipelineState::ShaderEntry::IsAlloc(ptr)) - return (TrackedResource12 *)(WrappedID3D12PipelineState::ShaderEntry *)ptr; + if(WrappedID3D12Shader::IsAlloc(ptr)) + return (TrackedResource12 *)(WrappedID3D12Shader *)ptr; return NULL; } diff --git a/renderdoc/driver/d3d12/d3d12_resources.h b/renderdoc/driver/d3d12/d3d12_resources.h index 1802fb936..aa854d98b 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.h +++ b/renderdoc/driver/d3d12/d3d12_resources.h @@ -453,53 +453,6 @@ public: bool IsGraphics() { return graphics != NULL; } bool IsCompute() { return compute != NULL; } - D3D12_COMPUTE_PIPELINE_STATE_DESC GetComputeDesc() - { - D3D12_COMPUTE_PIPELINE_STATE_DESC ret = *compute; - - ret.CS = ((ShaderEntry *)compute->CS.pShaderBytecode)->GetDesc(); - - return ret; - } - - D3D12_GRAPHICS_PIPELINE_STATE_DESC GetGraphicsDesc() - { - D3D12_GRAPHICS_PIPELINE_STATE_DESC ret = *graphics; - - ShaderEntry *vs = (ShaderEntry *)graphics->VS.pShaderBytecode; - ShaderEntry *hs = (ShaderEntry *)graphics->HS.pShaderBytecode; - ShaderEntry *ds = (ShaderEntry *)graphics->DS.pShaderBytecode; - ShaderEntry *gs = (ShaderEntry *)graphics->GS.pShaderBytecode; - ShaderEntry *ps = (ShaderEntry *)graphics->PS.pShaderBytecode; - - if(vs) - ret.VS = vs->GetDesc(); - else - RDCEraseEl(ret.VS); - - if(hs) - ret.HS = hs->GetDesc(); - else - RDCEraseEl(ret.HS); - - if(ds) - ret.DS = ds->GetDesc(); - else - RDCEraseEl(ret.DS); - - if(gs) - ret.GS = gs->GetDesc(); - else - RDCEraseEl(ret.GS); - - if(ps) - ret.PS = ps->GetDesc(); - else - RDCEraseEl(ret.PS); - - return ret; - } - struct DXBCKey { DXBCKey(const D3D12_SHADER_BYTECODE &byteCode) @@ -622,6 +575,59 @@ public: TypeEnum = Resource_PipelineState, }; + ShaderEntry *VS() { return (ShaderEntry *)graphics->VS.pShaderBytecode; } + ShaderEntry *HS() { return (ShaderEntry *)graphics->HS.pShaderBytecode; } + ShaderEntry *DS() { return (ShaderEntry *)graphics->DS.pShaderBytecode; } + ShaderEntry *GS() { return (ShaderEntry *)graphics->GS.pShaderBytecode; } + ShaderEntry *PS() { return (ShaderEntry *)graphics->PS.pShaderBytecode; } + ShaderEntry *CS() { return (ShaderEntry *)compute->CS.pShaderBytecode; } + D3D12_COMPUTE_PIPELINE_STATE_DESC GetComputeDesc() + { + D3D12_COMPUTE_PIPELINE_STATE_DESC ret = *compute; + + ret.CS = CS()->GetDesc(); + + return ret; + } + + D3D12_GRAPHICS_PIPELINE_STATE_DESC GetGraphicsDesc() + { + D3D12_GRAPHICS_PIPELINE_STATE_DESC ret = *graphics; + + ShaderEntry *vs = VS(); + ShaderEntry *hs = HS(); + ShaderEntry *ds = DS(); + ShaderEntry *gs = GS(); + ShaderEntry *ps = PS(); + + if(vs) + ret.VS = vs->GetDesc(); + else + RDCEraseEl(ret.VS); + + if(hs) + ret.HS = hs->GetDesc(); + else + RDCEraseEl(ret.HS); + + if(ds) + ret.DS = ds->GetDesc(); + else + RDCEraseEl(ret.DS); + + if(gs) + ret.GS = gs->GetDesc(); + else + RDCEraseEl(ret.GS); + + if(ps) + ret.PS = ps->GetDesc(); + else + RDCEraseEl(ret.PS); + + return ret; + } + static ShaderEntry *AddShader(const D3D12_SHADER_BYTECODE &byteCode, WrappedID3D12Device *device, WrappedID3D12PipelineState *pipeline) { @@ -663,26 +669,18 @@ public: if(graphics) { - ShaderEntry *vs = (ShaderEntry *)graphics->VS.pShaderBytecode; - ShaderEntry *hs = (ShaderEntry *)graphics->HS.pShaderBytecode; - ShaderEntry *ds = (ShaderEntry *)graphics->DS.pShaderBytecode; - ShaderEntry *gs = (ShaderEntry *)graphics->GS.pShaderBytecode; - ShaderEntry *ps = (ShaderEntry *)graphics->PS.pShaderBytecode; - - ReleaseShader(vs); - ReleaseShader(hs); - ReleaseShader(ds); - ReleaseShader(gs); - ReleaseShader(ps); + ReleaseShader(VS()); + ReleaseShader(HS()); + ReleaseShader(DS()); + ReleaseShader(GS()); + ReleaseShader(PS()); SAFE_DELETE(graphics); } if(compute) { - ShaderEntry *cs = (ShaderEntry *)compute->CS.pShaderBytecode; - - ReleaseShader(cs); + ReleaseShader(CS()); SAFE_DELETE(compute); } @@ -700,6 +698,8 @@ private: static map m_Shaders; }; +typedef WrappedID3D12PipelineState::ShaderEntry WrappedID3D12Shader; + class WrappedID3D12QueryHeap : public WrappedDeviceChild12 { public: