diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 06ad51a6a..6fa5b4ac3 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -818,11 +818,13 @@ void TextureViewer::UI_UpdateStatusText() bool sintTex = (tex.format.compType == CompType::SInt); if(m_TexDisplay.overlay == DebugOverlay::QuadOverdrawPass || - m_TexDisplay.overlay == DebugOverlay::QuadOverdrawDraw) + m_TexDisplay.overlay == DebugOverlay::QuadOverdrawDraw || + m_TexDisplay.overlay == DebugOverlay::TriangleSizeDraw || + m_TexDisplay.overlay == DebugOverlay::TriangleSizeDraw) { dsv = false; uintTex = false; - sintTex = true; + sintTex = false; } QColor swatchColor; @@ -3451,6 +3453,15 @@ void TextureViewer::on_saveTex_clicked() if(saveDialog.saveOverlayInstead()) { m_SaveConfig.resourceId = overlayTexID; + + if(m_TexDisplay.overlay == DebugOverlay::QuadOverdrawDraw || + m_TexDisplay.overlay == DebugOverlay::QuadOverdrawPass || + m_TexDisplay.overlay == DebugOverlay::TriangleSizeDraw || + m_TexDisplay.overlay == DebugOverlay::TriangleSizePass) + { + m_SaveConfig.comp.blackPoint = 0.0f; + m_SaveConfig.comp.whitePoint = 255.0f; + } } if(res) diff --git a/renderdoc/data/glsl/debuguniforms.h b/renderdoc/data/glsl/debuguniforms.h index 867055072..76939ccf9 100644 --- a/renderdoc/data/glsl/debuguniforms.h +++ b/renderdoc/data/glsl/debuguniforms.h @@ -147,6 +147,24 @@ BINDING(0) uniform TexDisplayUBOData } INST_NAME(texdisplay); +#define HEATMAP_DISABLED 0 +#define HEATMAP_LINEAR 1 +#define HEATMAP_TRISIZE 2 + +#define HEATMAP_RAMPSIZE 22 + +BINDING(1) uniform HeatmapData +{ + int HeatmapMode; + int DummyA; + int DummyB; + int DummyC; + + // must match size of colorRamp on C++ side + vec4 ColorRamp[22]; +} +INST_NAME(heatmap); + BINDING(0) uniform FontUBOData { vec2 TextPosition; diff --git a/renderdoc/data/glsl/quadresolve.frag b/renderdoc/data/glsl/quadresolve.frag index 248d35551..5911486ce 100644 --- a/renderdoc/data/glsl/quadresolve.frag +++ b/renderdoc/data/glsl/quadresolve.frag @@ -33,18 +33,6 @@ layout(binding = 0, r32ui) uniform PRECISION coherent uimage2DArray overdrawImage; -#define NUM_RAMP_COLOURS 128 - -layout(binding = 1) uniform OverdrawRampColors -{ - vec4 colors[NUM_RAMP_COLOURS]; -} ramp; - -vec4 ToColour(uint v) -{ - return ramp.colors[min(v, uint(NUM_RAMP_COLOURS-1))]; -} - layout (location = 0) out vec4 color_out; void main() @@ -55,7 +43,7 @@ void main() for(uint i = 0u; i < 4u; i++) overdraw += imageLoad(overdrawImage, ivec3(quad, i)).x/(i + 1u); - color_out = ToColour(overdraw); + color_out = vec4(overdraw); } //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/renderdoc/data/glsl/texdisplay.frag b/renderdoc/data/glsl/texdisplay.frag index 3fb03fbd0..a3f715e9d 100644 --- a/renderdoc/data/glsl/texdisplay.frag +++ b/renderdoc/data/glsl/texdisplay.frag @@ -153,6 +153,45 @@ void main(void) #endif return; } + + if(heatmap.HeatmapMode != HEATMAP_DISABLED) + { + if(heatmap.HeatmapMode == HEATMAP_LINEAR) + { + // cast the float value to an integer with safe rounding, then return the + int bucket = int(floor(col.x + 0.25f)); + + bucket = max(bucket, 0); + bucket = min(bucket, HEATMAP_RAMPSIZE - 1); + + if(bucket == 0) + discard; + + color_out = heatmap.ColorRamp[bucket]; + return; + } + else if(heatmap.HeatmapMode == HEATMAP_TRISIZE) + { + // uninitialised regions have alpha=0 + if(col.w < 0.5f) + discard; + + float area = max(col.x, 0.001f); + + int bucket = 2 + int( floor(20.0f - 20.1f * (1.0f - exp(-0.4f * area) ) ) ); + + bucket = max(bucket, 0); + bucket = min(bucket, HEATMAP_RAMPSIZE - 1); + + color_out = heatmap.ColorRamp[bucket]; + + return; + } + else + { + // error! invalid heatmap mode + } + } // RGBM encoding if(texdisplay.HDRMul > 0.0f) diff --git a/renderdoc/data/glsl/trisize.frag b/renderdoc/data/glsl/trisize.frag index 7fa8aa991..c0ce0befe 100644 --- a/renderdoc/data/glsl/trisize.frag +++ b/renderdoc/data/glsl/trisize.frag @@ -22,23 +22,11 @@ * THE SOFTWARE. ******************************************************************************/ -#define NUM_RAMP_COLOURS 128 - -layout(binding = 1) uniform OverdrawRampColors -{ - vec4 colors[NUM_RAMP_COLOURS]; -} ramp; - layout (location = 0) in float pixarea; layout (location = 0) out vec4 color_out; void main(void) { - // bucket triangle area - float area = max(pixarea, 0.001f); - - int bucket = 2 + int( floor(20.0f - 20.1f * (1.0f - exp(-0.4f * area) ) ) ); - - color_out = ramp.colors[bucket]; + color_out = vec4(max(pixarea, 0.001f).xxx, 1.0f); } diff --git a/renderdoc/data/hlsl/debugcbuffers.h b/renderdoc/data/hlsl/debugcbuffers.h index 11ba49fb0..a9265a34f 100644 --- a/renderdoc/data/hlsl/debugcbuffers.h +++ b/renderdoc/data/hlsl/debugcbuffers.h @@ -94,6 +94,21 @@ cbuffer DebugPixelCBufferData REG(b0) float3 TextureResolutionPS; }; +#define HEATMAP_DISABLED 0 +#define HEATMAP_LINEAR 1 +#define HEATMAP_TRISIZE 2 + +#define HEATMAP_RAMPSIZE 22 + +cbuffer HeatmapData REG(b1) +{ + int HeatmapMode; + float3 Dummy; + + // must match size of colorRamp on C++ side + float4 ColorRamp[HEATMAP_RAMPSIZE]; +}; + cbuffer HistogramCBufferData REG(b0) { uint HistogramChannels; diff --git a/renderdoc/data/hlsl/debugdisplay.hlsl b/renderdoc/data/hlsl/debugdisplay.hlsl index ab29892a6..61f9d1f30 100644 --- a/renderdoc/data/hlsl/debugdisplay.hlsl +++ b/renderdoc/data/hlsl/debugdisplay.hlsl @@ -109,6 +109,36 @@ float4 RENDERDOC_TexDisplayPS(v2f IN) : SV_Target0 return col; } + if(HeatmapMode) + { + if(HeatmapMode == HEATMAP_LINEAR) + { + // cast the float value to an integer with safe rounding, then return the + int bucket = int(floor(col.x + 0.25f)); + + bucket = max(bucket, 0); + bucket = min(bucket, HEATMAP_RAMPSIZE - 1); + + return ColorRamp[bucket]; + } + else if(HeatmapMode == HEATMAP_TRISIZE) + { + // uninitialised regions have alpha=0 + if(col.w < 0.5f) + return ColorRamp[0]; + + float area = max(col.x, 0.001f); + + int bucket = 2 + int( floor(20.0f - 20.1f * (1.0f - exp(-0.4f * area) ) ) ); + + return ColorRamp[bucket]; + } + else + { + // error! invalid heatmap mode + } + } + // RGBM encoding if(WireframeColour.x > 0.0f) { @@ -306,14 +336,8 @@ float4 RENDERDOC_CheckerboardPS(float4 pos : SV_Position) : SV_Target0 // https://github.com/selfshadow/demos/blob/master/QuadShading/QuadShading.fx //////////////////////////////////////////////////////////////////////////////////////////// -#define NUM_RAMP_COLOURS 128 - RWTexture2DArray overdrawUAV : register(u0); Texture2DArray overdrawSRV : register(t0); -cbuffer overdrawRampCBuf : register(b0) -{ - const float4 overdrawRampColours[NUM_RAMP_COLOURS]; -}; [earlydepthstencil] void RENDERDOC_QuadOverdrawPS(float4 vpos : SV_Position, uint c0 : SV_Coverage) @@ -334,11 +358,6 @@ void RENDERDOC_QuadOverdrawPS(float4 vpos : SV_Position, uint c0 : SV_Coverage) InterlockedAdd(overdrawUAV[quad], 1); } -float4 ToColour(uint v) -{ - return overdrawRampColours[min(v, NUM_RAMP_COLOURS-1)]; -} - float4 RENDERDOC_QOResolvePS(float4 vpos : SV_POSITION) : SV_Target0 { uint2 quad = vpos.xy*0.5; @@ -347,7 +366,7 @@ float4 RENDERDOC_QOResolvePS(float4 vpos : SV_POSITION) : SV_Target0 for(int i = 0; i < 4; i++) overdraw += overdrawSRV[uint3(quad, i)]/(i + 1); - return ToColour(overdraw); + return float(overdraw).xxxx; } //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/renderdoc/data/hlsl/mesh.hlsl b/renderdoc/data/hlsl/mesh.hlsl index e676487b0..7436d1a3b 100644 --- a/renderdoc/data/hlsl/mesh.hlsl +++ b/renderdoc/data/hlsl/mesh.hlsl @@ -96,21 +96,9 @@ void RENDERDOC_TriangleSizeGS(triangle meshV2F input[3], inout TriangleStream 1 || realTexDesc.SampleDesc.Quality > 0) @@ -648,8 +648,6 @@ ResourceId D3D11Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug vertexData.SpriteSize = Vec2f(); ID3D11Buffer *vsBuf = GetDebugManager()->MakeCBuffer(&vertexData, sizeof(DebugVertexCBuffer)); - ID3D11Buffer *psbuf = GetDebugManager()->MakeCBuffer(&overdrawRamp[0].x, sizeof(overdrawRamp)); - float overlayConsts[] = {0.0f, 0.0f, 0.0f, 0.0f}; m_pImmediateContext->ClearRenderTargetView(rtv, overlayConsts); @@ -745,7 +743,6 @@ ResourceId D3D11Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug m_pImmediateContext->IASetInputLayout(m_MeshRender.MeshLayout); m_pImmediateContext->VSSetConstantBuffers(0, 1, &vsBuf); - m_pImmediateContext->PSSetConstantBuffers(0, 1, &psbuf); m_pImmediateContext->GSSetConstantBuffers(0, 1, &gsbuf); m_pImmediateContext->VSSetShader(m_MeshRender.MeshVS, NULL, 0); m_pImmediateContext->GSSetShader(m_Overlay.TriangleSizeGS, NULL, 0); @@ -961,10 +958,6 @@ ResourceId D3D11Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug m_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_pImmediateContext->IASetInputLayout(NULL); - ID3D11Buffer *buf = GetDebugManager()->MakeCBuffer(&overdrawRamp[0].x, sizeof(overdrawRamp)); - - m_pImmediateContext->PSSetConstantBuffers(0, 1, &buf); - m_pImmediateContext->OMSetRenderTargets(1, &rtv, NULL); m_pImmediateContext->OMSetDepthStencilState(NULL, 0); diff --git a/renderdoc/driver/d3d11/d3d11_rendertexture.cpp b/renderdoc/driver/d3d11/d3d11_rendertexture.cpp index 7d3434daf..9b52bc310 100644 --- a/renderdoc/driver/d3d11/d3d11_rendertexture.cpp +++ b/renderdoc/driver/d3d11/d3d11_rendertexture.cpp @@ -421,6 +421,28 @@ bool D3D11Replay::RenderTextureInternal(TextureDisplay cfg, bool blendAlpha) { DebugVertexCBuffer vertexData; DebugPixelCBufferData pixelData; + HeatmapData heatmapData = {}; + + if(cfg.resourceId == m_Overlay.resourceId) + { + if(cfg.overlay == DebugOverlay::QuadOverdrawDraw || cfg.overlay == DebugOverlay::QuadOverdrawPass) + { + heatmapData.HeatmapMode = HEATMAP_LINEAR; + } + else if(cfg.overlay == DebugOverlay::TriangleSizeDraw || + cfg.overlay == DebugOverlay::TriangleSizePass) + { + heatmapData.HeatmapMode = HEATMAP_TRISIZE; + } + + if(heatmapData.HeatmapMode) + { + memcpy(heatmapData.ColorRamp, colorRamp, sizeof(colorRamp)); + + RDCCOMPILE_ASSERT(sizeof(heatmapData.ColorRamp) == sizeof(colorRamp), + "C++ color ramp array is not the same size as the shader array"); + } + } pixelData.AlwaysZero = 0.0f; @@ -712,10 +734,12 @@ bool D3D11Replay::RenderTextureInternal(TextureDisplay cfg, bool blendAlpha) ID3D11Buffer *vsCBuffer = GetDebugManager()->MakeCBuffer(&vertexData, sizeof(DebugVertexCBuffer)); ID3D11Buffer *psCBuffer = GetDebugManager()->MakeCBuffer(&pixelData, sizeof(DebugPixelCBufferData)); + ID3D11Buffer *psHeatCBuffer = GetDebugManager()->MakeCBuffer(&heatmapData, sizeof(HeatmapData)); // can't just clear state because we need to keep things like render targets. { m_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); + m_pImmediateContext->IASetInputLayout(NULL); m_pImmediateContext->VSSetShader(m_General.GenericVS, NULL, 0); m_pImmediateContext->VSSetConstantBuffers(0, 1, &vsCBuffer); @@ -730,6 +754,7 @@ bool D3D11Replay::RenderTextureInternal(TextureDisplay cfg, bool blendAlpha) { m_pImmediateContext->PSSetShader(m_TexRender.TexDisplayPS, NULL, 0); m_pImmediateContext->PSSetConstantBuffers(0, 1, &psCBuffer); + m_pImmediateContext->PSSetConstantBuffers(1, 1, &psHeatCBuffer); } else { diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index cf996c5a2..0b8fd9a61 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -1234,7 +1234,7 @@ void D3D12Replay::GeneralMisc::Init(WrappedID3D12Device *device, D3D12DebugManag pipeDesc.SampleDesc.Count = 1; - pipeDesc.RTVFormats[0] = DXGI_FORMAT_R16G16B16A16_UNORM; + pipeDesc.RTVFormats[0] = DXGI_FORMAT_R16G16B16A16_FLOAT; pipeDesc.PS.BytecodeLength = FixedColPS->GetBufferSize(); pipeDesc.PS.pShaderBytecode = FixedColPS->GetBufferPointer(); @@ -1276,7 +1276,12 @@ void D3D12Replay::TextureRendering::Init(WrappedID3D12Device *device, D3D12Debug { ID3DBlob *root = shaderCache->MakeRootSig({ - cbvParam(D3D12_SHADER_VISIBILITY_VERTEX, 0, 0), cbvParam(D3D12_SHADER_VISIBILITY_PIXEL, 0, 0), + // VS cbuffer + cbvParam(D3D12_SHADER_VISIBILITY_VERTEX, 0, 0), + // normal FS cbuffer + cbvParam(D3D12_SHADER_VISIBILITY_PIXEL, 0, 0), + // heatmap cbuffer + cbvParam(D3D12_SHADER_VISIBILITY_PIXEL, 0, 1), // display SRVs tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 0, 32), // samplers @@ -1429,7 +1434,6 @@ void D3D12Replay::OverlayRendering::Init(WrappedID3D12Device *device, D3D12Debug { ID3DBlob *root = shaderCache->MakeRootSig({ - cbvParam(D3D12_SHADER_VISIBILITY_PIXEL, 0, 0), // quad overdraw results SRV tableParam(D3D12_SHADER_VISIBILITY_PIXEL, D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 0, 1), }); @@ -1470,7 +1474,7 @@ void D3D12Replay::OverlayRendering::Init(WrappedID3D12Device *device, D3D12Debug 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_UNORM; + pipeDesc.RTVFormats[0] = DXGI_FORMAT_R16G16B16A16_FLOAT; pipeDesc.DSVFormat = DXGI_FORMAT_UNKNOWN; pipeDesc.BlendState.RenderTarget[0].BlendEnable = FALSE; pipeDesc.BlendState.RenderTarget[0].SrcBlend = D3D12_BLEND_SRC_ALPHA; diff --git a/renderdoc/driver/d3d12/d3d12_overlay.cpp b/renderdoc/driver/d3d12/d3d12_overlay.cpp index 91374ce70..21d05e97c 100644 --- a/renderdoc/driver/d3d12/d3d12_overlay.cpp +++ b/renderdoc/driver/d3d12/d3d12_overlay.cpp @@ -285,7 +285,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug overlayTexDesc.DepthOrArraySize = 1; overlayTexDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; overlayTexDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; - overlayTexDesc.Format = DXGI_FORMAT_R16G16B16A16_UNORM; + overlayTexDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; overlayTexDesc.Height = resourceDesc.Height; overlayTexDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; overlayTexDesc.MipLevels = 1; @@ -416,7 +416,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug D3D12_RENDER_TARGET_VIEW_DESC rtDesc = {}; rtDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; - rtDesc.Format = DXGI_FORMAT_R16G16B16A16_UNORM; + rtDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; rtDesc.Texture2D.MipSlice = 0; rtDesc.Texture2D.PlaneSlice = 0; @@ -488,7 +488,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug psoDesc.BlendState.RenderTarget[0].RenderTargetWriteMask = 0xf; psoDesc.BlendState.RenderTarget[0].LogicOpEnable = FALSE; RDCEraseEl(psoDesc.RTVFormats.RTFormats); - psoDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_UNORM; + psoDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_FLOAT; psoDesc.RTVFormats.NumRenderTargets = 1; psoDesc.SampleMask = ~0U; psoDesc.SampleDesc.Count = RDCMAX(1U, psoDesc.SampleDesc.Count); @@ -563,7 +563,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug psoDesc.BlendState.RenderTarget[0].RenderTargetWriteMask = 0xf; psoDesc.BlendState.RenderTarget[0].LogicOpEnable = FALSE; RDCEraseEl(psoDesc.RTVFormats.RTFormats); - psoDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_UNORM; + psoDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_FLOAT; psoDesc.RTVFormats.NumRenderTargets = 1; psoDesc.SampleMask = ~0U; psoDesc.SampleDesc.Count = RDCMAX(1U, psoDesc.SampleDesc.Count); @@ -658,7 +658,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug psoDesc.BlendState.RenderTarget[0].RenderTargetWriteMask = 0xf; psoDesc.BlendState.RenderTarget[0].LogicOpEnable = FALSE; RDCEraseEl(psoDesc.RTVFormats.RTFormats); - psoDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_UNORM; + psoDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_FLOAT; psoDesc.RTVFormats.NumRenderTargets = 1; psoDesc.SampleMask = ~0U; psoDesc.SampleDesc.Count = RDCMAX(1U, psoDesc.SampleDesc.Count); @@ -845,7 +845,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug RDCEraseEl(pipeDesc.RTVFormats.RTFormats); pipeDesc.RTVFormats.NumRenderTargets = 1; - pipeDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_UNORM; + pipeDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_FLOAT; pipeDesc.BlendState.RenderTarget[0].BlendEnable = FALSE; pipeDesc.BlendState.RenderTarget[0].SrcBlend = D3D12_BLEND_SRC_ALPHA; pipeDesc.BlendState.RenderTarget[0].DestBlend = D3D12_BLEND_INV_SRC_ALPHA; @@ -908,7 +908,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug list->SetGraphicsRootConstantBufferView( 0, GetDebugManager()->UploadConstants(&vertexData, sizeof(vertexData))); list->SetGraphicsRootConstantBufferView( - 1, GetDebugManager()->UploadConstants(&overdrawRamp[0].x, sizeof(overdrawRamp))); + 1, GetDebugManager()->UploadConstants(&vertexData, sizeof(vertexData))); list->SetGraphicsRootConstantBufferView( 2, GetDebugManager()->UploadConstants(&viewport, sizeof(viewport))); list->SetGraphicsRoot32BitConstants(3, 4, &viewport.x, 0); @@ -1110,9 +1110,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug GetDebugManager()->SetDescriptorHeaps(list, true, false); - list->SetGraphicsRootConstantBufferView( - 0, GetDebugManager()->UploadConstants(&overdrawRamp[0].x, sizeof(overdrawRamp))); - list->SetGraphicsRootDescriptorTable(1, GetDebugManager()->GetGPUHandle(OVERDRAW_SRV)); + list->SetGraphicsRootDescriptorTable(0, GetDebugManager()->GetGPUHandle(OVERDRAW_SRV)); list->DrawInstanced(3, 1, 0, 0); @@ -1172,7 +1170,7 @@ ResourceId D3D12Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug } RDCEraseEl(psoDesc.RTVFormats.RTFormats); - psoDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_UNORM; + psoDesc.RTVFormats.RTFormats[0] = DXGI_FORMAT_R16G16B16A16_FLOAT; psoDesc.RTVFormats.NumRenderTargets = 1; psoDesc.SampleMask = ~0U; psoDesc.SampleDesc.Count = RDCMAX(1U, psoDesc.SampleDesc.Count); diff --git a/renderdoc/driver/d3d12/d3d12_rendertexture.cpp b/renderdoc/driver/d3d12/d3d12_rendertexture.cpp index 60236b55e..b877c4087 100644 --- a/renderdoc/driver/d3d12/d3d12_rendertexture.cpp +++ b/renderdoc/driver/d3d12/d3d12_rendertexture.cpp @@ -315,6 +315,28 @@ bool D3D12Replay::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, Texture DebugVertexCBuffer vertexData; DebugPixelCBufferData pixelData; + HeatmapData heatmapData = {}; + + if(cfg.resourceId == m_Overlay.resourceId) + { + if(cfg.overlay == DebugOverlay::QuadOverdrawDraw || cfg.overlay == DebugOverlay::QuadOverdrawPass) + { + heatmapData.HeatmapMode = HEATMAP_LINEAR; + } + else if(cfg.overlay == DebugOverlay::TriangleSizeDraw || + cfg.overlay == DebugOverlay::TriangleSizePass) + { + heatmapData.HeatmapMode = HEATMAP_TRISIZE; + } + + if(heatmapData.HeatmapMode) + { + memcpy(heatmapData.ColorRamp, colorRamp, sizeof(colorRamp)); + + RDCCOMPILE_ASSERT(sizeof(heatmapData.ColorRamp) == sizeof(colorRamp), + "C++ color ramp array is not the same size as the shader array"); + } + } pixelData.AlwaysZero = 0.0f; @@ -636,8 +658,10 @@ bool D3D12Replay::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, Texture list->SetGraphicsRootConstantBufferView( 0, GetDebugManager()->UploadConstants(&vertexData, sizeof(vertexData))); list->SetGraphicsRootConstantBufferView(1, psCBuf); - list->SetGraphicsRootDescriptorTable(2, GetDebugManager()->GetGPUHandle(FIRST_TEXDISPLAY_SRV)); - list->SetGraphicsRootDescriptorTable(3, GetDebugManager()->GetGPUHandle(FIRST_SAMP)); + list->SetGraphicsRootConstantBufferView( + 2, GetDebugManager()->UploadConstants(&heatmapData, sizeof(heatmapData))); + list->SetGraphicsRootDescriptorTable(3, GetDebugManager()->GetGPUHandle(FIRST_TEXDISPLAY_SRV)); + list->SetGraphicsRootDescriptorTable(4, GetDebugManager()->GetGPUHandle(FIRST_SAMP)); float factor[4] = {1.0f, 1.0f, 1.0f, 1.0f}; list->OMSetBlendFactor(factor); diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index 54ba9bbd5..33f9d8c4e 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -391,7 +391,6 @@ void GLReplay::InitDebugData() RDCCOMPILE_ASSERT(sizeof(TexDisplayUBOData) <= 2048, "UBO too small"); RDCCOMPILE_ASSERT(sizeof(FontUBOData) <= 2048, "UBO too small"); RDCCOMPILE_ASSERT(sizeof(HistogramUBOData) <= 2048, "UBO too small"); - RDCCOMPILE_ASSERT(sizeof(overdrawRamp) <= 2048, "UBO too small"); } DebugData.overlayTexWidth = DebugData.overlayTexHeight = DebugData.overlayTexSamples = 0; diff --git a/renderdoc/driver/gl/gl_overlay.cpp b/renderdoc/driver/gl/gl_overlay.cpp index a16bfc1ea..3414d697c 100644 --- a/renderdoc/driver/gl/gl_overlay.cpp +++ b/renderdoc/driver/gl/gl_overlay.cpp @@ -287,7 +287,7 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, CompType typeHint, DebugOve if(DebugData.overlayTexSamples > 1) { drv.glTextureStorage2DMultisampleEXT(DebugData.overlayTex, texBindingEnum, texDetails.samples, - eGL_RGBA16, texDetails.width, texDetails.height, true); + eGL_RGBA16F, texDetails.width, texDetails.height, true); } else { @@ -845,15 +845,9 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, CompType typeHint, DebugOve *uboptr = uboParams; drv.glUnmapBuffer(eGL_COPY_WRITE_BUFFER); - drv.glBindBuffer(eGL_COPY_WRITE_BUFFER, DebugData.UBOs[1]); - Vec4f *v = (Vec4f *)drv.glMapBufferRange(eGL_COPY_WRITE_BUFFER, 0, sizeof(overdrawRamp), - GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); - memcpy(v, overdrawRamp, sizeof(overdrawRamp)); - drv.glUnmapBuffer(eGL_COPY_WRITE_BUFFER); - drv.glBindBuffer(eGL_COPY_WRITE_BUFFER, DebugData.UBOs[2]); - v = (Vec4f *)drv.glMapBufferRange(eGL_COPY_WRITE_BUFFER, 0, sizeof(Vec4f), - GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); + Vec4f *v = (Vec4f *)drv.glMapBufferRange(eGL_COPY_WRITE_BUFFER, 0, sizeof(Vec4f), + GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); *v = Vec4f(rs.Viewports[0].width, rs.Viewports[0].height); drv.glUnmapBuffer(eGL_COPY_WRITE_BUFFER); @@ -917,7 +911,6 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, CompType typeHint, DebugOve // bind our UBOs drv.glBindBufferBase(eGL_UNIFORM_BUFFER, 0, DebugData.UBOs[0]); - drv.glBindBufferBase(eGL_UNIFORM_BUFFER, 1, DebugData.UBOs[1]); drv.glBindBufferBase(eGL_UNIFORM_BUFFER, 2, DebugData.UBOs[2]); GLenum att = eGL_DEPTH_ATTACHMENT; @@ -1423,13 +1416,6 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, CompType typeHint, DebugOve drv.glUseProgram(DebugData.quadoverdrawResolveProg); drv.glBindProgramPipeline(0); - drv.glBindBufferBase(eGL_UNIFORM_BUFFER, 1, DebugData.UBOs[0]); - - Vec4f *v = (Vec4f *)drv.glMapBufferRange(eGL_UNIFORM_BUFFER, 0, sizeof(overdrawRamp), - GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); - memcpy(v, overdrawRamp, sizeof(overdrawRamp)); - drv.glUnmapBuffer(eGL_UNIFORM_BUFFER); - // modify our fbo to attach the overlay texture instead drv.glBindFramebuffer(eGL_FRAMEBUFFER, replacefbo); drv.glFramebufferTexture2D(eGL_FRAMEBUFFER, eGL_COLOR_ATTACHMENT0, eGL_TEXTURE_2D, @@ -1479,5 +1465,8 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, CompType typeHint, DebugOve rs.ApplyState(m_pDriver); - return m_pDriver->GetResourceManager()->GetID(TextureRes(ctx, DebugData.overlayTex)); + DebugData.overlayTexId = + m_pDriver->GetResourceManager()->GetID(TextureRes(ctx, DebugData.overlayTex)); + + return DebugData.overlayTexId; } diff --git a/renderdoc/driver/gl/gl_rendertexture.cpp b/renderdoc/driver/gl/gl_rendertexture.cpp index 656f53ba3..7cf685039 100644 --- a/renderdoc/driver/gl/gl_rendertexture.cpp +++ b/renderdoc/driver/gl/gl_rendertexture.cpp @@ -376,6 +376,40 @@ bool GLReplay::RenderTextureInternal(TextureDisplay cfg, int flags) drv.glUnmapBuffer(eGL_UNIFORM_BUFFER); + HeatmapData heatmapData = {}; + + if(cfg.resourceId == DebugData.overlayTexId) + { + if(cfg.overlay == DebugOverlay::QuadOverdrawDraw || cfg.overlay == DebugOverlay::QuadOverdrawPass) + { + heatmapData.HeatmapMode = HEATMAP_LINEAR; + } + else if(cfg.overlay == DebugOverlay::TriangleSizeDraw || + cfg.overlay == DebugOverlay::TriangleSizePass) + { + heatmapData.HeatmapMode = HEATMAP_TRISIZE; + } + + if(heatmapData.HeatmapMode) + { + memcpy(heatmapData.ColorRamp, colorRamp, sizeof(colorRamp)); + + RDCCOMPILE_ASSERT(sizeof(heatmapData.ColorRamp) == sizeof(colorRamp), + "C++ color ramp array is not the same size as the shader array"); + } + } + + drv.glBindBufferBase(eGL_UNIFORM_BUFFER, 1, DebugData.UBOs[1]); + + { + HeatmapData *ptr = (HeatmapData *)drv.glMapBufferRange( + eGL_UNIFORM_BUFFER, 0, sizeof(HeatmapData), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); + + memcpy(ptr, &heatmapData, sizeof(heatmapData)); + + drv.glUnmapBuffer(eGL_UNIFORM_BUFFER); + } + if(cfg.rawOutput || !blendAlpha) { drv.glDisable(eGL_BLEND); diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 640f3b3f3..292102c07 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -359,6 +359,7 @@ private: GLuint quadoverdrawFragShader; GLuint quadoverdrawResolveProg; + ResourceId overlayTexId; GLuint overlayTex; GLuint overlayFBO; GLuint overlayProg; diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 3a6f1cf1a..e45859eab 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -1520,6 +1520,7 @@ void VulkanReplay::TextureRendering::Init(WrappedVulkan *driver, VkDescriptorPoo CREATE_OBJECT(DescSetLayout, { {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_ALL, NULL}, + {1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_ALL, NULL}, {6, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, NULL}, {7, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, NULL}, {8, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, NULL}, @@ -1547,6 +1548,9 @@ void VulkanReplay::TextureRendering::Init(WrappedVulkan *driver, VkDescriptorPoo UBO.Create(driver, driver->GetDev(), 128, 10, 0); RDCCOMPILE_ASSERT(sizeof(TexDisplayUBOData) <= 128, "tex display size"); + HeatmapUBO.Create(driver, driver->GetDev(), 512, 10, 0); + RDCCOMPILE_ASSERT(sizeof(HeatmapData) <= 512, "tex display size"); + { VkRenderPass SRGBA8RP = VK_NULL_HANDLE; VkRenderPass RGBA16RP = VK_NULL_HANDLE; @@ -1794,6 +1798,7 @@ void VulkanReplay::TextureRendering::Destroy(WrappedVulkan *driver) driver->vkDestroyPipeline(driver->GetDev(), F16PipelineGreenOnly, NULL); driver->vkDestroyPipeline(driver->GetDev(), F32PipelineGreenOnly, NULL); UBO.Destroy(); + HeatmapUBO.Destroy(); driver->vkDestroySampler(driver->GetDev(), LinearSampler, NULL); @@ -1818,13 +1823,11 @@ void VulkanReplay::OverlayRendering::Init(WrappedVulkan *driver, VkDescriptorPoo CREATE_OBJECT(m_QuadDescSetLayout, { {0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_ALL, NULL}, - {1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, NULL}, }); CREATE_OBJECT(m_TriSizeDescSetLayout, { {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_ALL, NULL}, - {1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, NULL}, {2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1, VK_SHADER_STAGE_ALL, NULL}, }); @@ -1903,28 +1906,16 @@ void VulkanReplay::OverlayRendering::Init(WrappedVulkan *driver, VkDescriptorPoo RDCASSERTEQUAL((uint32_t)driver->GetDeviceProps().limits.framebufferColorSampleCounts, samplesHandled); - OverdrawRampUBO.Create(driver, driver->GetDev(), 2048, 1, 0); // no ring needed, fixed data - RDCCOMPILE_ASSERT(sizeof(overdrawRamp) <= 2048, "overdraw ramp uniforms size"); - - void *ramp = OverdrawRampUBO.Map(); - memcpy(ramp, overdrawRamp, sizeof(overdrawRamp)); - OverdrawRampUBO.Unmap(); - m_TriSizeUBO.Create(driver, driver->GetDev(), sizeof(Vec4f), 4096, 0); VkDescriptorBufferInfo outlineUBO = {}; VkDescriptorBufferInfo overdrawramp = {}; m_OutlineUBO.FillDescriptor(outlineUBO); - OverdrawRampUBO.FillDescriptor(overdrawramp); VkWriteDescriptorSet writes[] = { {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, NULL, Unwrap(m_OutlineDescSet), 0, 0, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, NULL, &outlineUBO, NULL}, - {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, NULL, Unwrap(m_QuadDescSet), 1, 0, 1, - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, NULL, &overdrawramp, NULL}, - {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, NULL, Unwrap(m_TriSizeDescSet), 1, 0, 1, - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, NULL, &overdrawramp, NULL}, }; VkDevice dev = driver->GetDev(); @@ -1943,8 +1934,6 @@ void VulkanReplay::OverlayRendering::Destroy(WrappedVulkan *driver) driver->vkDestroyFramebuffer(driver->GetDev(), NoDepthFB, NULL); driver->vkDestroyRenderPass(driver->GetDev(), NoDepthRP, NULL); - OverdrawRampUBO.Destroy(); - driver->vkDestroyDescriptorSetLayout(driver->GetDev(), m_QuadDescSetLayout, NULL); driver->vkDestroyPipelineLayout(driver->GetDev(), m_QuadResolvePipeLayout, NULL); for(size_t i = 0; i < ARRAY_COUNT(m_QuadResolvePipeline); i++) diff --git a/renderdoc/driver/vulkan/vk_rendertexture.cpp b/renderdoc/driver/vulkan/vk_rendertexture.cpp index 44d913577..eab4a1cd9 100644 --- a/renderdoc/driver/vulkan/vk_rendertexture.cpp +++ b/renderdoc/driver/vulkan/vk_rendertexture.cpp @@ -317,6 +317,37 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn m_TexRender.UBO.Unmap(); + HeatmapData heatmapData = {}; + + if(cfg.resourceId == GetResID(m_Overlay.Image)) + { + if(cfg.overlay == DebugOverlay::QuadOverdrawDraw || cfg.overlay == DebugOverlay::QuadOverdrawPass) + { + heatmapData.HeatmapMode = HEATMAP_LINEAR; + } + else if(cfg.overlay == DebugOverlay::TriangleSizeDraw || + cfg.overlay == DebugOverlay::TriangleSizePass) + { + heatmapData.HeatmapMode = HEATMAP_TRISIZE; + } + + if(heatmapData.HeatmapMode) + { + memcpy(heatmapData.ColorRamp, colorRamp, sizeof(colorRamp)); + + RDCCOMPILE_ASSERT(sizeof(heatmapData.ColorRamp) == sizeof(colorRamp), + "C++ color ramp array is not the same size as the shader array"); + } + } + + uint32_t heatUboOffs = 0; + + { + HeatmapData *ptr = (HeatmapData *)m_TexRender.HeatmapUBO.Map(&heatUboOffs); + memcpy(ptr, &heatmapData, sizeof(HeatmapData)); + m_TexRender.HeatmapUBO.Unmap(); + } + VkDescriptorImageInfo imdesc = {0}; imdesc.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; imdesc.imageView = Unwrap(liveImView); @@ -326,14 +357,17 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn VkDescriptorSet descset = m_TexRender.GetDescSet(); - VkDescriptorBufferInfo ubodesc = {0}; + VkDescriptorBufferInfo ubodesc = {}, heatubodesc = {}; m_TexRender.UBO.FillDescriptor(ubodesc); + m_TexRender.HeatmapUBO.FillDescriptor(heatubodesc); VkWriteDescriptorSet writeSet[] = { {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, NULL, Unwrap(descset), descSetBinding, 0, 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &imdesc, NULL, NULL}, {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, NULL, Unwrap(descset), 0, 0, 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, NULL, &ubodesc, NULL}, + {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, NULL, Unwrap(descset), 1, 0, 1, + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, NULL, &heatubodesc, NULL}, }; vector writeSets; @@ -433,9 +467,11 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn pipe = m_TexRender.BlendPipeline; } + uint32_t offsets[] = {uboOffs, heatUboOffs}; + vt->CmdBindPipeline(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, Unwrap(pipe)); vt->CmdBindDescriptorSets(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, - Unwrap(m_TexRender.PipeLayout), 0, 1, UnwrapPtr(descset), 1, &uboOffs); + Unwrap(m_TexRender.PipeLayout), 0, 1, UnwrapPtr(descset), 2, offsets); VkViewport viewport = {(float)rpbegin.renderArea.offset.x, (float)rpbegin.renderArea.offset.y, @@ -449,10 +485,9 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, VkRenderPassBeginIn if(m_pDriver->GetDriverVersion().QualcommLeakingUBOOffsets()) { - uboOffs = 0; + offsets[0] = offsets[1] = 0; vt->CmdBindDescriptorSets(Unwrap(cmd), VK_PIPELINE_BIND_POINT_GRAPHICS, - Unwrap(m_TexRender.PipeLayout), 0, 1, UnwrapPtr(descset), 1, - &uboOffs); + Unwrap(m_TexRender.PipeLayout), 0, 1, UnwrapPtr(descset), 2, offsets); } vt->CmdEndRenderPass(Unwrap(cmd)); diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index 563edefa5..4884950f5 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -452,6 +452,7 @@ private: VkPipeline F16PipelineGreenOnly = VK_NULL_HANDLE; VkPipeline F32PipelineGreenOnly = VK_NULL_HANDLE; GPUBuffer UBO; + GPUBuffer HeatmapUBO; // ring buffered to allow multiple texture renders between flushes VkDescriptorSet DescSet[16] = {VK_NULL_HANDLE}; @@ -488,8 +489,6 @@ private: VkFramebuffer NoDepthFB = VK_NULL_HANDLE; VkRenderPass NoDepthRP = VK_NULL_HANDLE; - GPUBuffer OverdrawRampUBO; - VkDescriptorSetLayout m_QuadDescSetLayout = VK_NULL_HANDLE; VkDescriptorSet m_QuadDescSet = VK_NULL_HANDLE; VkPipelineLayout m_QuadResolvePipeLayout = VK_NULL_HANDLE; diff --git a/renderdoc/maths/matrix.cpp b/renderdoc/maths/matrix.cpp index 3dd756898..4e14a5ca0 100644 --- a/renderdoc/maths/matrix.cpp +++ b/renderdoc/maths/matrix.cpp @@ -31,74 +31,6 @@ #include "quat.h" #include "vec.h" -// colour ramp from http://www.ncl.ucar.edu/Document/Graphics/ColorTables/GMT_wysiwyg.shtml -const Vec4f overdrawRamp[128] = { - Vec4f(0.000000f, 0.000000f, 0.000000f, 0.0f), Vec4f(0.250980f, 0.000000f, 0.250980f, 1.0f), - Vec4f(0.250980f, 0.000000f, 0.752941f, 1.0f), Vec4f(0.000000f, 0.250980f, 1.000000f, 1.0f), - Vec4f(0.000000f, 0.501961f, 1.000000f, 1.0f), Vec4f(0.000000f, 0.627451f, 1.000000f, 1.0f), - Vec4f(0.250980f, 0.752941f, 1.000000f, 1.0f), Vec4f(0.250980f, 0.878431f, 1.000000f, 1.0f), - Vec4f(0.250980f, 1.000000f, 1.000000f, 1.0f), Vec4f(0.250980f, 1.000000f, 0.752941f, 1.0f), - Vec4f(0.250980f, 1.000000f, 0.250980f, 1.0f), Vec4f(0.501961f, 1.000000f, 0.250980f, 1.0f), - Vec4f(0.752941f, 1.000000f, 0.250980f, 1.0f), Vec4f(1.000000f, 1.000000f, 0.250980f, 1.0f), - Vec4f(1.000000f, 0.878431f, 0.250980f, 1.0f), Vec4f(1.000000f, 0.627451f, 0.250980f, 1.0f), - Vec4f(1.000000f, 0.376471f, 0.250980f, 1.0f), Vec4f(1.000000f, 0.125490f, 0.250980f, 1.0f), - Vec4f(1.000000f, 0.376471f, 0.752941f, 1.0f), Vec4f(1.000000f, 0.627451f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.878431f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.878600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.878700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.878800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.878900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.879000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.879100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.879200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.879300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.879400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.879500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.879600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.879700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.879800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.879900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.880000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.880100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.880200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.880300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.880400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.880500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.880600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.880700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.880800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.880900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.881000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.881100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.881200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.881300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.881400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.881500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.881600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.881700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.881800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.881900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.882000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.882100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.882200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.882300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.882400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.882500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.882600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.882700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.882800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.882900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.883000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.883100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.883200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.883300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.883400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.883500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.883600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.883700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.883800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.883900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.884000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.884100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.884200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.884300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.884400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.884500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.884600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.884700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.884800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.884900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.885000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.885100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.885200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.885300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.885400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.885500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.885600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.885700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.885800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.885900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.886000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.886100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.886200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.886300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.886400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.886500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.886600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.886700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.886800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.886900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.887000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.887100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.887200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.887300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.887400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.887500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.887600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.887700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.887800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.887900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.888000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.888100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.888200f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.888300f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.888400f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.888500f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.888600f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.888700f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.888800f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.888900f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.889000f, 1.000000f, 1.0f), - Vec4f(1.000000f, 0.889100f, 1.000000f, 1.0f), Vec4f(1.000000f, 0.889200f, 1.000000f, 1.0f), -}; - static inline size_t matIdx(const size_t x, const size_t y) { return x + y * 4; diff --git a/renderdoc/maths/vec.h b/renderdoc/maths/vec.h index 63474c18a..bb6023a31 100644 --- a/renderdoc/maths/vec.h +++ b/renderdoc/maths/vec.h @@ -73,8 +73,6 @@ struct Vec4f float x, y, z, w; }; -extern const Vec4f overdrawRamp[128]; - inline Vec3f operator*(const Vec3f &a, const float b) { return Vec3f(a.x * b, a.y * b, a.z * b); diff --git a/renderdoc/replay/replay_driver.cpp b/renderdoc/replay/replay_driver.cpp index eb9483055..af0146722 100644 --- a/renderdoc/replay/replay_driver.cpp +++ b/renderdoc/replay/replay_driver.cpp @@ -814,3 +814,18 @@ bool HighlightCache::FetchHighlightPositions(const MeshDisplay &cfg, FloatVector return valid; } + +// colour ramp from http://www.ncl.ucar.edu/Document/Graphics/ColorTables/GMT_wysiwyg.shtml +const Vec4f colorRamp[22] = { + Vec4f(0.000000f, 0.000000f, 0.000000f, 0.0f), Vec4f(0.250980f, 0.000000f, 0.250980f, 1.0f), + Vec4f(0.250980f, 0.000000f, 0.752941f, 1.0f), Vec4f(0.000000f, 0.250980f, 1.000000f, 1.0f), + Vec4f(0.000000f, 0.501961f, 1.000000f, 1.0f), Vec4f(0.000000f, 0.627451f, 1.000000f, 1.0f), + Vec4f(0.250980f, 0.752941f, 1.000000f, 1.0f), Vec4f(0.250980f, 0.878431f, 1.000000f, 1.0f), + Vec4f(0.250980f, 1.000000f, 1.000000f, 1.0f), Vec4f(0.250980f, 1.000000f, 0.752941f, 1.0f), + Vec4f(0.250980f, 1.000000f, 0.250980f, 1.0f), Vec4f(0.501961f, 1.000000f, 0.250980f, 1.0f), + Vec4f(0.752941f, 1.000000f, 0.250980f, 1.0f), Vec4f(1.000000f, 1.000000f, 0.250980f, 1.0f), + Vec4f(1.000000f, 0.878431f, 0.250980f, 1.0f), Vec4f(1.000000f, 0.627451f, 0.250980f, 1.0f), + Vec4f(1.000000f, 0.376471f, 0.250980f, 1.0f), Vec4f(1.000000f, 0.125490f, 0.250980f, 1.0f), + Vec4f(1.000000f, 0.376471f, 0.752941f, 1.0f), Vec4f(1.000000f, 0.627451f, 1.000000f, 1.0f), + Vec4f(1.000000f, 0.878431f, 1.000000f, 1.0f), Vec4f(1.000000f, 1.000000f, 1.000000f, 1.0f), +}; diff --git a/renderdoc/replay/replay_driver.h b/renderdoc/replay/replay_driver.h index 5545a5433..eb8783723 100644 --- a/renderdoc/replay/replay_driver.h +++ b/renderdoc/replay/replay_driver.h @@ -262,4 +262,6 @@ struct HighlightCache FloatVector InterpretVertex(const byte *data, uint32_t vert, const MeshDisplay &cfg, const byte *end, bool useidx, bool &valid); -}; \ No newline at end of file +}; + +extern const Vec4f colorRamp[22]; \ No newline at end of file diff --git a/renderdoc/replay/replay_output.cpp b/renderdoc/replay/replay_output.cpp index d547a7bae..97f6f8cff 100644 --- a/renderdoc/replay/replay_output.cpp +++ b/renderdoc/replay/replay_output.cpp @@ -380,8 +380,6 @@ PixelValue ReplayOutput::PickPixel(ResourceId tex, bool customShader, uint32_t x if(tex == ResourceId()) return ret; - bool decodeRamp = false; - CompType typeHint = m_RenderData.texDisplay.typeHint; if(customShader && m_RenderData.texDisplay.customShaderId != ResourceId() && @@ -390,13 +388,14 @@ PixelValue ReplayOutput::PickPixel(ResourceId tex, bool customShader, uint32_t x tex = m_CustomShaderResourceId; typeHint = CompType::Typeless; } + + // for 'heatmap' type overlays, pick from the overlay texture if((m_RenderData.texDisplay.overlay == DebugOverlay::QuadOverdrawDraw || m_RenderData.texDisplay.overlay == DebugOverlay::QuadOverdrawPass || m_RenderData.texDisplay.overlay == DebugOverlay::TriangleSizeDraw || m_RenderData.texDisplay.overlay == DebugOverlay::TriangleSizePass) && m_OverlayResourceId != ResourceId()) { - decodeRamp = true; tex = m_OverlayResourceId; typeHint = CompType::Typeless; } @@ -404,38 +403,6 @@ PixelValue ReplayOutput::PickPixel(ResourceId tex, bool customShader, uint32_t x m_pDevice->PickPixel(m_pDevice->GetLiveID(tex), x, y, sliceFace, mip, sample, typeHint, ret.floatValue); - if(decodeRamp) - { - for(size_t c = 0; c < ARRAY_COUNT(overdrawRamp); c++) - { - if(fabs(ret.floatValue[0] - overdrawRamp[c].x) < 0.00005f && - fabs(ret.floatValue[1] - overdrawRamp[c].y) < 0.00005f && - fabs(ret.floatValue[2] - overdrawRamp[c].z) < 0.00005f) - { - ret.intValue[0] = (int32_t)c; - ret.intValue[1] = 0; - ret.intValue[2] = 0; - ret.intValue[3] = 0; - break; - } - } - - // decode back into approximate pixel size area - if(m_RenderData.texDisplay.overlay == DebugOverlay::TriangleSizePass || - m_RenderData.texDisplay.overlay == DebugOverlay::TriangleSizeDraw) - { - float bucket = (float)ret.intValue[0]; - - // decode bucket into approximate triangle area - if(bucket <= 0.5f) - ret.floatValue[0] = 0.0f; - else if(bucket < 2.0f) - ret.floatValue[0] = 16.0f; - else - ret.floatValue[0] = -2.5f * logf(1.0f + (bucket - 22.0f) / 20.1f); - } - } - return ret; }