diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index 3a7973902..da8d82d4b 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -203,6 +203,8 @@ D3D12DebugManager::D3D12DebugManager(WrappedID3D12Device *wrapper) m_PickVB = NULL; m_PickSize = 0; + m_CustomShaderTex = NULL; + { D3D12_RESOURCE_DESC soBufDesc; soBufDesc.Alignment = 0; @@ -566,7 +568,6 @@ D3D12DebugManager::D3D12DebugManager(WrappedID3D12Device *wrapper) displayhlsl += GetEmbeddedResource(debugcommon_hlsl); displayhlsl += GetEmbeddedResource(debugdisplay_hlsl); - ID3DBlob *GenericVS = NULL; ID3DBlob *FullscreenVS = NULL; ID3DBlob *TexDisplayPS = NULL; ID3DBlob *CheckerboardPS = NULL; @@ -574,7 +575,7 @@ D3D12DebugManager::D3D12DebugManager(WrappedID3D12Device *wrapper) ID3DBlob *QOResolvePS = NULL; GetShaderBlob(displayhlsl.c_str(), "RENDERDOC_DebugVS", D3DCOMPILE_WARNINGS_ARE_ERRORS, "vs_5_0", - &GenericVS); + &m_GenericVS); GetShaderBlob(displayhlsl.c_str(), "RENDERDOC_FullscreenVS", D3DCOMPILE_WARNINGS_ARE_ERRORS, "vs_5_0", &FullscreenVS); GetShaderBlob(displayhlsl.c_str(), "RENDERDOC_TexDisplayPS", D3DCOMPILE_WARNINGS_ARE_ERRORS, @@ -586,7 +587,7 @@ D3D12DebugManager::D3D12DebugManager(WrappedID3D12Device *wrapper) GetShaderBlob(displayhlsl.c_str(), "RENDERDOC_QOResolvePS", D3DCOMPILE_WARNINGS_ARE_ERRORS, "ps_5_0", &QOResolvePS); - RDCASSERT(GenericVS); + RDCASSERT(m_GenericVS); RDCASSERT(FullscreenVS); RDCASSERT(TexDisplayPS); RDCASSERT(CheckerboardPS); @@ -594,8 +595,8 @@ D3D12DebugManager::D3D12DebugManager(WrappedID3D12Device *wrapper) RDCASSERT(QOResolvePS); pipeDesc.pRootSignature = m_TexDisplayRootSig; - pipeDesc.VS.BytecodeLength = GenericVS->GetBufferSize(); - pipeDesc.VS.pShaderBytecode = GenericVS->GetBufferPointer(); + pipeDesc.VS.BytecodeLength = m_GenericVS->GetBufferSize(); + pipeDesc.VS.pShaderBytecode = m_GenericVS->GetBufferPointer(); pipeDesc.PS.BytecodeLength = TexDisplayPS->GetBufferSize(); pipeDesc.PS.pShaderBytecode = TexDisplayPS->GetBufferPointer(); pipeDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID; @@ -837,7 +838,6 @@ D3D12DebugManager::D3D12DebugManager(WrappedID3D12Device *wrapper) } SAFE_RELEASE(FullscreenVS); - SAFE_RELEASE(GenericVS); SAFE_RELEASE(TexDisplayPS); SAFE_RELEASE(OutlinePS); SAFE_RELEASE(QOResolvePS); @@ -1326,6 +1326,7 @@ D3D12DebugManager::~D3D12DebugManager() SAFE_RELEASE(m_TexDisplayLinearPipe); SAFE_RELEASE(m_TexDisplayF32Pipe); SAFE_RELEASE(m_TexDisplayRootSig); + SAFE_RELEASE(m_GenericVS); SAFE_RELEASE(m_CBOnlyRootSig); SAFE_RELEASE(m_CheckerboardPipe); @@ -1343,6 +1344,8 @@ D3D12DebugManager::~D3D12DebugManager() SAFE_RELEASE(m_PickResultBuf); SAFE_RELEASE(m_PickVB); + SAFE_RELEASE(m_CustomShaderTex); + SAFE_RELEASE(m_SOBuffer); SAFE_RELEASE(m_SOStagingBuffer); @@ -2962,7 +2965,7 @@ void D3D12DebugManager::BuildShader(string source, string entry, const uint32_t byteCode.BytecodeLength = blob->GetBufferSize(); byteCode.pShaderBytecode = blob->GetBufferPointer(); - WrappedID3D12Shader *sh = WrappedID3D12PipelineState::AddShader(byteCode, m_WrappedDevice, NULL); + WrappedID3D12Shader *sh = WrappedID3D12Shader::AddShader(byteCode, m_WrappedDevice, NULL); SAFE_RELEASE(blob); @@ -6726,6 +6729,100 @@ struct QuadOverdrawCallback : public D3D12DrawcallCallback D3D12RenderState m_PrevState; }; +ResourceId D3D12DebugManager::ApplyCustomShader(ResourceId shader, ResourceId texid, uint32_t mip, + uint32_t arrayIdx, uint32_t sampleIdx, + FormatComponentType typeHint) +{ + ID3D12Resource *resource = WrappedID3D12Resource::GetList()[texid]; + + if(resource == NULL) + return ResourceId(); + + D3D12_RESOURCE_DESC resDesc = resource->GetDesc(); + + resDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; + resDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + resDesc.Alignment = 0; + resDesc.DepthOrArraySize = 1; + resDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; + resDesc.MipLevels = (UINT16)CalcNumMips((int)resDesc.Width, (int)resDesc.Height, 1); + resDesc.SampleDesc.Count = 1; + resDesc.SampleDesc.Quality = 0; + resDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; + + D3D12_RESOURCE_DESC customTexDesc = {}; + + if(m_CustomShaderTex) + customTexDesc = m_CustomShaderTex->GetDesc(); + + if(customTexDesc.Width != resDesc.Width || customTexDesc.Height != resDesc.Height) + { + SAFE_RELEASE(m_CustomShaderTex); + + D3D12_HEAP_PROPERTIES heapProps; + heapProps.Type = D3D12_HEAP_TYPE_DEFAULT; + heapProps.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + heapProps.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + heapProps.CreationNodeMask = 1; + heapProps.VisibleNodeMask = 1; + + HRESULT hr = m_WrappedDevice->CreateCommittedResource( + &heapProps, D3D12_HEAP_FLAG_NONE, &resDesc, D3D12_RESOURCE_STATE_RENDER_TARGET, NULL, + __uuidof(ID3D12Resource), (void **)&m_CustomShaderTex); + RDCASSERTEQUAL(hr, S_OK); + + if(m_CustomShaderTex) + m_CustomShaderResourceId = GetResID(m_CustomShaderTex); + else + m_CustomShaderResourceId = ResourceId(); + } + + if(m_CustomShaderResourceId == ResourceId()) + return m_CustomShaderResourceId; + + D3D12_RENDER_TARGET_VIEW_DESC rtvDesc = {}; + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; + rtvDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; + rtvDesc.Texture2D.MipSlice = mip; + + m_WrappedDevice->CreateRenderTargetView(m_CustomShaderTex, &rtvDesc, + GetCPUHandle(CUSTOM_SHADER_RTV)); + + ID3D12GraphicsCommandList *list = m_WrappedDevice->GetNewList(); + + float clr[] = {0.0f, 0.0f, 0.0f, 0.0f}; + list->ClearRenderTargetView(GetCPUHandle(CUSTOM_SHADER_RTV), clr, 0, NULL); + + list->Close(); + + TextureDisplay disp; + disp.Red = disp.Green = disp.Blue = disp.Alpha = true; + disp.FlipY = false; + disp.offx = 0.0f; + disp.offy = 0.0f; + disp.CustomShader = shader; + disp.texid = texid; + disp.typeHint = typeHint; + disp.lightBackgroundColour = disp.darkBackgroundColour = FloatVector(0, 0, 0, 0); + disp.HDRMul = -1.0f; + disp.linearDisplayAsGamma = false; + disp.mip = mip; + disp.sampleIdx = sampleIdx; + disp.overlay = eTexOverlay_None; + disp.rangemin = 0.0f; + disp.rangemax = 1.0f; + disp.rawoutput = false; + disp.scale = 1.0f; + disp.sliceFace = arrayIdx; + + SetOutputDimensions(RDCMAX(1U, (UINT)resDesc.Width >> mip), RDCMAX(1U, resDesc.Height >> mip), + resDesc.Format); + + RenderTextureInternal(GetCPUHandle(CUSTOM_SHADER_RTV), disp, true); + + return m_CustomShaderResourceId; +} + ResourceId D3D12DebugManager::RenderOverlay(ResourceId texid, FormatComponentType typeHint, TextureDisplayOverlay overlay, uint32_t eventID, const vector &passEvents) @@ -7720,6 +7817,11 @@ ResourceId D3D12DebugManager::RenderOverlay(ResourceId texid, FormatComponentTyp bool D3D12DebugManager::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, TextureDisplay cfg, bool blendAlpha) { + ID3D12Resource *resource = WrappedID3D12Resource::GetList()[cfg.texid]; + + if(resource == NULL) + return false; + DebugVertexCBuffer vertexData; DebugPixelCBufferData pixelData; @@ -7761,7 +7863,6 @@ bool D3D12DebugManager::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, T pixelData.FlipY = cfg.FlipY ? 1 : 0; - ID3D12Resource *resource = WrappedID3D12Resource::GetList()[cfg.texid]; D3D12_RESOURCE_DESC resourceDesc = resource->GetDesc(); pixelData.SampleIdx = (int)RDCCLAMP(cfg.sampleIdx, 0U, resourceDesc.SampleDesc.Count - 1); @@ -7845,6 +7946,162 @@ bool D3D12DebugManager::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, T if(!IsSRGBFormat(resourceDesc.Format) && cfg.linearDisplayAsGamma) pixelData.OutputDisplayFormat |= TEXDISPLAY_GAMMA_CURVE; + ID3D12PipelineState *customPSO = NULL; + + D3D12_GPU_VIRTUAL_ADDRESS psCBuf = 0; + + if(cfg.CustomShader != ResourceId()) + { + WrappedID3D12Shader *shader = + m_WrappedDevice->GetResourceManager()->GetCurrentAs(cfg.CustomShader); + + if(shader == NULL) + return false; + + D3D12_GRAPHICS_PIPELINE_STATE_DESC pipeDesc = {}; + pipeDesc.pRootSignature = m_TexDisplayRootSig; + pipeDesc.VS.BytecodeLength = m_GenericVS->GetBufferSize(); + pipeDesc.VS.pShaderBytecode = m_GenericVS->GetBufferPointer(); + pipeDesc.PS = shader->GetDesc(); + pipeDesc.RasterizerState.FillMode = D3D12_FILL_MODE_SOLID; + pipeDesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE; + pipeDesc.SampleMask = 0xFFFFFFFF; + pipeDesc.SampleDesc.Count = 1; + pipeDesc.IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED; + pipeDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + pipeDesc.NumRenderTargets = 1; + pipeDesc.RTVFormats[0] = DXGI_FORMAT_R16G16B16A16_FLOAT; + pipeDesc.DSVFormat = DXGI_FORMAT_UNKNOWN; + pipeDesc.BlendState.RenderTarget[0].BlendEnable = TRUE; + pipeDesc.BlendState.RenderTarget[0].SrcBlend = D3D12_BLEND_SRC_ALPHA; + pipeDesc.BlendState.RenderTarget[0].DestBlend = D3D12_BLEND_INV_SRC_ALPHA; + pipeDesc.BlendState.RenderTarget[0].BlendOp = D3D12_BLEND_OP_ADD; + pipeDesc.BlendState.RenderTarget[0].SrcBlendAlpha = D3D12_BLEND_SRC_ALPHA; + pipeDesc.BlendState.RenderTarget[0].DestBlendAlpha = D3D12_BLEND_INV_SRC_ALPHA; + pipeDesc.BlendState.RenderTarget[0].BlendOpAlpha = D3D12_BLEND_OP_ADD; + pipeDesc.BlendState.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; + + HRESULT hr = m_WrappedDevice->CreateGraphicsPipelineState( + &pipeDesc, __uuidof(ID3D12PipelineState), (void **)&customPSO); + if(FAILED(hr)) + return false; + + DXBC::DXBCFile *dxbc = shader->GetDXBC(); + + RDCASSERT(dxbc); + RDCASSERT(dxbc->m_Type == D3D11_ShaderType_Pixel); + + for(size_t i = 0; i < dxbc->m_CBuffers.size(); i++) + { + const DXBC::CBuffer &cbuf = dxbc->m_CBuffers[i]; + if(cbuf.name == "$Globals") + { + float *cbufData = new float[cbuf.descriptor.byteSize / sizeof(float) + 1]; + byte *byteData = (byte *)cbufData; + + for(size_t v = 0; v < cbuf.variables.size(); v++) + { + const DXBC::CBufferVariable &var = cbuf.variables[v]; + + if(var.name == "RENDERDOC_TexDim") + { + if(var.type.descriptor.rows == 1 && var.type.descriptor.cols == 4 && + var.type.descriptor.type == DXBC::VARTYPE_UINT) + { + uint32_t *d = (uint32_t *)(byteData + var.descriptor.offset); + + d[0] = (uint32_t)resourceDesc.Width; + d[1] = resourceDesc.Height; + d[2] = resourceDesc.DepthOrArraySize; + d[3] = resourceDesc.MipLevels; + if(resourceDesc.MipLevels == 0) + d[3] = CalcNumMips( + d[1], d[2], + resourceDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? d[3] : 1); + } + else + { + RDCWARN("Custom shader: Variable recognised but type wrong, expected uint4: %s", + var.name.c_str()); + } + } + else if(var.name == "RENDERDOC_SelectedMip") + { + if(var.type.descriptor.rows == 1 && var.type.descriptor.cols == 1 && + var.type.descriptor.type == DXBC::VARTYPE_UINT) + { + uint32_t *d = (uint32_t *)(byteData + var.descriptor.offset); + + d[0] = cfg.mip; + } + else + { + RDCWARN("Custom shader: Variable recognised but type wrong, expected uint: %s", + var.name.c_str()); + } + } + else if(var.name == "RENDERDOC_SelectedSliceFace") + { + if(var.type.descriptor.rows == 1 && var.type.descriptor.cols == 1 && + var.type.descriptor.type == DXBC::VARTYPE_UINT) + { + uint32_t *d = (uint32_t *)(byteData + var.descriptor.offset); + + d[0] = cfg.sliceFace; + } + else + { + RDCWARN("Custom shader: Variable recognised but type wrong, expected uint: %s", + var.name.c_str()); + } + } + else if(var.name == "RENDERDOC_SelectedSample") + { + if(var.type.descriptor.rows == 1 && var.type.descriptor.cols == 1 && + var.type.descriptor.type == DXBC::VARTYPE_INT) + { + int32_t *d = (int32_t *)(byteData + var.descriptor.offset); + + d[0] = cfg.sampleIdx; + } + else + { + RDCWARN("Custom shader: Variable recognised but type wrong, expected int: %s", + var.name.c_str()); + } + } + else if(var.name == "RENDERDOC_TextureType") + { + if(var.type.descriptor.rows == 1 && var.type.descriptor.cols == 1 && + var.type.descriptor.type == DXBC::VARTYPE_UINT) + { + uint32_t *d = (uint32_t *)(byteData + var.descriptor.offset); + + d[0] = resType; + } + else + { + RDCWARN("Custom shader: Variable recognised but type wrong, expected uint: %s", + var.name.c_str()); + } + } + else + { + RDCWARN("Custom shader: Variable not recognised: %s", var.name.c_str()); + } + } + + psCBuf = UploadConstants(cbufData, cbuf.descriptor.byteSize); + + SAFE_DELETE_ARRAY(cbufData); + } + } + } + else + { + psCBuf = UploadConstants(&pixelData, sizeof(pixelData)); + } + { ID3D12GraphicsCommandList *list = m_WrappedDevice->GetNewList(); @@ -7861,7 +8118,11 @@ bool D3D12DebugManager::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, T list->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - if(cfg.rawoutput || !blendAlpha || cfg.CustomShader != ResourceId()) + if(customPSO) + { + list->SetPipelineState(customPSO); + } + else if(cfg.rawoutput || !blendAlpha || cfg.CustomShader != ResourceId()) { if(m_BBFmtIdx == RGBA32_BACKBUFFER) list->SetPipelineState(m_TexDisplayF32Pipe); @@ -7882,7 +8143,7 @@ bool D3D12DebugManager::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, T list->SetDescriptorHeaps(2, heaps); list->SetGraphicsRootConstantBufferView(0, UploadConstants(&vertexData, sizeof(vertexData))); - list->SetGraphicsRootConstantBufferView(1, UploadConstants(&pixelData, sizeof(pixelData))); + list->SetGraphicsRootConstantBufferView(1, psCBuf); list->SetGraphicsRootDescriptorTable(2, cbvsrvuavHeap->GetGPUDescriptorHandleForHeapStart()); list->SetGraphicsRootDescriptorTable(3, samplerHeap->GetGPUDescriptorHandleForHeapStart()); @@ -7902,6 +8163,8 @@ bool D3D12DebugManager::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, T m_WrappedDevice->ExecuteLists(); m_WrappedDevice->FlushLists(); + + SAFE_RELEASE(customPSO); } return true; diff --git a/renderdoc/driver/d3d12/d3d12_debug.h b/renderdoc/driver/d3d12/d3d12_debug.h index 0008dbffe..20cc339d3 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.h +++ b/renderdoc/driver/d3d12/d3d12_debug.h @@ -86,6 +86,8 @@ public: ResourceId RenderOverlay(ResourceId texid, FormatComponentType typeHint, TextureDisplayOverlay overlay, uint32_t eventID, const vector &passEvents); + ResourceId ApplyCustomShader(ResourceId shader, ResourceId texid, uint32_t mip, uint32_t arrayIdx, + uint32_t sampleIdx, FormatComponentType typeHint); void PickPixel(ResourceId texture, uint32_t x, uint32_t y, uint32_t sliceFace, uint32_t mip, uint32_t sample, FormatComponentType typeHint, float pixel[4]); @@ -250,6 +252,7 @@ private: ID3D12PipelineState *m_TexDisplayLinearPipe; ID3D12PipelineState *m_TexDisplayF32Pipe; ID3D12PipelineState *m_TexDisplayBlendPipe; + ID3DBlob *m_GenericVS; ID3D12RootSignature *m_TexDisplayRootSig; @@ -393,6 +396,9 @@ private: map m_PostVSData; map m_PostVSAlias; + ID3D12Resource *m_CustomShaderTex; + ResourceId m_CustomShaderResourceId; + // simple cache for when we need buffer data for highlighting // vertices, typical use will be lots of vertices in the same // mesh, not jumping back and forth much between meshes. diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index fdd42ad48..ce307ab76 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -272,8 +272,7 @@ bool WrappedID3D12Device::Serialise_CreateGraphicsPipelineState( if(shaders[i]->BytecodeLength == 0) shaders[i]->pShaderBytecode = NULL; else - shaders[i]->pShaderBytecode = - WrappedID3D12PipelineState::AddShader(*shaders[i], this, wrapped); + shaders[i]->pShaderBytecode = WrappedID3D12Shader::AddShader(*shaders[i], this, wrapped); } GetResourceManager()->AddLiveResource(Pipe, ret); @@ -334,8 +333,7 @@ HRESULT WrappedID3D12Device::CreateGraphicsPipelineState(const D3D12_GRAPHICS_PI if(shaders[i]->BytecodeLength == 0) shaders[i]->pShaderBytecode = NULL; else - shaders[i]->pShaderBytecode = - WrappedID3D12PipelineState::AddShader(*shaders[i], this, NULL); + shaders[i]->pShaderBytecode = WrappedID3D12Shader::AddShader(*shaders[i], this, NULL); } } @@ -374,7 +372,7 @@ bool WrappedID3D12Device::Serialise_CreateComputePipelineState( (ID3D12RootSignature *)GetResourceManager()->GetWrapper(wrapped->compute->pRootSignature); wrapped->compute->CS.pShaderBytecode = - WrappedID3D12PipelineState::AddShader(wrapped->compute->CS, this, wrapped); + WrappedID3D12Shader::AddShader(wrapped->compute->CS, this, wrapped); GetResourceManager()->AddLiveResource(Pipe, ret); } @@ -425,7 +423,7 @@ HRESULT WrappedID3D12Device::CreateComputePipelineState(const D3D12_COMPUTE_PIPE wrapped->compute = new D3D12_COMPUTE_PIPELINE_STATE_DESC(*pDesc); wrapped->compute->CS.pShaderBytecode = - WrappedID3D12PipelineState::AddShader(wrapped->compute->CS, this, NULL); + WrappedID3D12Shader::AddShader(wrapped->compute->CS, this, NULL); } *ppPipelineState = (ID3D12PipelineState *)wrapped; diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index dedffd567..f067894cc 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -1646,13 +1646,22 @@ byte *D3D12Replay::GetTextureData(ResourceId tex, uint32_t arrayIdx, uint32_t mi return m_pDevice->GetDebugManager()->GetTextureData(tex, arrayIdx, mip, params, dataSize); } -#pragma region not yet implemented - void D3D12Replay::BuildCustomShader(string source, string entry, const uint32_t compileFlags, ShaderStageType type, ResourceId *id, string *errors) { + m_pDevice->GetDebugManager()->BuildShader(source, entry, compileFlags, type, id, errors); } +ResourceId D3D12Replay::ApplyCustomShader(ResourceId shader, ResourceId texid, uint32_t mip, + uint32_t arrayIdx, uint32_t sampleIdx, + FormatComponentType typeHint) +{ + return m_pDevice->GetDebugManager()->ApplyCustomShader(shader, texid, mip, arrayIdx, sampleIdx, + typeHint); +} + +#pragma region not yet implemented + vector D3D12Replay::PixelHistory(vector events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx, @@ -1678,13 +1687,6 @@ ShaderDebugTrace D3D12Replay::DebugThread(uint32_t eventID, uint32_t groupid[3], return ShaderDebugTrace(); } -ResourceId D3D12Replay::ApplyCustomShader(ResourceId shader, ResourceId texid, uint32_t mip, - uint32_t arrayIdx, uint32_t sampleIdx, - FormatComponentType typeHint) -{ - return ResourceId(); -} - ResourceId D3D12Replay::CreateProxyTexture(const FetchTexture &templateTex) { return ResourceId(); diff --git a/renderdoc/driver/d3d12/d3d12_resources.cpp b/renderdoc/driver/d3d12/d3d12_resources.cpp index 5b82cdeac..928f17aaa 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.cpp +++ b/renderdoc/driver/d3d12/d3d12_resources.cpp @@ -29,7 +29,7 @@ GPUAddressRangeTracker WrappedID3D12Resource::m_Addresses; std::map *WrappedID3D12Resource::m_List = NULL; -std::map WrappedID3D12PipelineState::m_Shaders; +std::map WrappedID3D12Shader::m_Shaders; const GUID RENDERDOC_ID3D12ShaderGUID_ShaderDebugMagicValue = RENDERDOC_ShaderDebugMagicValue_struct; diff --git a/renderdoc/driver/d3d12/d3d12_resources.h b/renderdoc/driver/d3d12/d3d12_resources.h index aa854d98b..3cb8a62b1 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.h +++ b/renderdoc/driver/d3d12/d3d12_resources.h @@ -506,11 +506,38 @@ public: virtual ~ShaderEntry() { + m_Shaders.erase(m_Key); m_Bytecode.clear(); SAFE_DELETE(m_DXBCFile); Shutdown(); } + static ShaderEntry *AddShader(const D3D12_SHADER_BYTECODE &byteCode, + WrappedID3D12Device *device, WrappedID3D12PipelineState *pipeline) + { + DXBCKey key(byteCode); + ShaderEntry *shader = m_Shaders[key]; + + if(shader == NULL) + shader = m_Shaders[key] = new ShaderEntry(byteCode, device); + else + shader->AddRef(); + + if(pipeline && + std::find(shader->m_Pipes.begin(), shader->m_Pipes.end(), pipeline) == shader->m_Pipes.end()) + shader->m_Pipes.push_back(pipeline); + + return shader; + } + + static void ReleaseShader(ShaderEntry *shader) + { + if(shader == NULL) + return; + + shader->Release(); + } + DXBCKey GetKey() { return m_Key; } void SetDebugInfoPath(vector *searchPaths, const std::string &path) { @@ -568,6 +595,8 @@ public: DXBC::DXBCFile *m_DXBCFile; ShaderReflection m_Details; ShaderBindpointMapping m_Mapping; + + static map m_Shaders; }; enum @@ -628,35 +657,6 @@ public: return ret; } - static ShaderEntry *AddShader(const D3D12_SHADER_BYTECODE &byteCode, WrappedID3D12Device *device, - WrappedID3D12PipelineState *pipeline) - { - DXBCKey key(byteCode); - ShaderEntry *shader = m_Shaders[key]; - - if(shader == NULL) - shader = m_Shaders[key] = new ShaderEntry(byteCode, device); - else - shader->AddRef(); - - if(pipeline && - std::find(shader->m_Pipes.begin(), shader->m_Pipes.end(), pipeline) == shader->m_Pipes.end()) - shader->m_Pipes.push_back(pipeline); - - return shader; - } - - static void ReleaseShader(ShaderEntry *shader) - { - if(shader == NULL) - return; - - DXBCKey key = shader->GetKey(); - - if(shader->Release() == 0) - m_Shaders.erase(key); - } - WrappedID3D12PipelineState(ID3D12PipelineState *real, WrappedID3D12Device *device) : WrappedDeviceChild12(real, device) { @@ -669,18 +669,18 @@ public: if(graphics) { - ReleaseShader(VS()); - ReleaseShader(HS()); - ReleaseShader(DS()); - ReleaseShader(GS()); - ReleaseShader(PS()); + ShaderEntry::ReleaseShader(VS()); + ShaderEntry::ReleaseShader(HS()); + ShaderEntry::ReleaseShader(DS()); + ShaderEntry::ReleaseShader(GS()); + ShaderEntry::ReleaseShader(PS()); SAFE_DELETE(graphics); } if(compute) { - ReleaseShader(CS()); + ShaderEntry::ReleaseShader(CS()); SAFE_DELETE(compute); } @@ -693,9 +693,6 @@ public: { return m_pReal->GetCachedBlob(ppBlob); } - -private: - static map m_Shaders; }; typedef WrappedID3D12PipelineState::ShaderEntry WrappedID3D12Shader; diff --git a/renderdocui/Windows/TextureViewer.cs b/renderdocui/Windows/TextureViewer.cs index 3b5ed0ff1..cbdf94cae 100644 --- a/renderdocui/Windows/TextureViewer.cs +++ b/renderdocui/Windows/TextureViewer.cs @@ -906,7 +906,7 @@ namespace renderdocui.Windows string src = ""; - if (m_Core.APIProps.pipelineType == GraphicsAPI.D3D11) + if (m_Core.APIProps.pipelineType.IsD3D()) { src = String.Format( "float4 main(float4 pos : SV_Position, float4 uv : TEXCOORD0) : SV_Target0{0}" +