Refactor heatmap for quad overdraw/triangle size to be applied late

* Instead of baking these into the overlay texture and trying to decode them
  afterwards, we instead write a grayscale 16F value into the overlay texture,
  and add a special decode display mode that will use the heatmap and bucketing
  provided.
* This means that saving these overlay textures now saves grayscale. When saving
  to an 8-bit format, we remap to 0-255 so that greater than 1.0 values are
  mapped lower.
This commit is contained in:
baldurk
2018-11-01 12:23:12 +00:00
parent 4e48bd09c9
commit 57caf01394
25 changed files with 297 additions and 227 deletions
+13 -2
View File
@@ -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)
+18
View File
@@ -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;
+1 -13
View File
@@ -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);
}
////////////////////////////////////////////////////////////////////////////////////////////
+39
View File
@@ -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)
+1 -13
View File
@@ -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);
}
+15
View File
@@ -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;
+31 -12
View File
@@ -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<uint> overdrawUAV : register(u0);
Texture2DArray<uint> 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;
}
////////////////////////////////////////////////////////////////////////////////////////////
+1 -13
View File
@@ -96,21 +96,9 @@ void RENDERDOC_TriangleSizeGS(triangle meshV2F input[3], inout TriangleStream<tr
TriStream.RestartStrip();
}
#define NUM_RAMP_COLOURS 128
cbuffer triangleRampCBuf : register(b0)
{
const float4 overdrawRampColours[NUM_RAMP_COLOURS];
};
float4 RENDERDOC_TriangleSizePS(triSizeV2F IN) : SV_Target0
{
// bucket triangle area
float area = max(IN.pixarea, 0.001f);
int bucket = 2 + int( floor(20.0f - 20.1f * (1.0f - exp(-0.4f * area) ) ) );
return overdrawRampColours[bucket];
return float4(max(IN.pixarea, 0.001f).xxx, 1.0f);
}
[maxvertexcount(3)]
+2 -9
View File
@@ -51,7 +51,7 @@ ResourceId D3D11Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug
D3D11_TEXTURE2D_DESC realTexDesc;
realTexDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
realTexDesc.Usage = D3D11_USAGE_DEFAULT;
realTexDesc.Format = DXGI_FORMAT_R16G16B16A16_UNORM;
realTexDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
realTexDesc.ArraySize = 1;
realTexDesc.MipLevels = 1;
realTexDesc.CPUAccessFlags = 0;
@@ -145,7 +145,7 @@ ResourceId D3D11Replay::RenderOverlay(ResourceId texid, CompType typeHint, Debug
D3D11_RENDER_TARGET_VIEW_DESC rtDesc;
rtDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
rtDesc.Format = DXGI_FORMAT_R16G16B16A16_UNORM;
rtDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
rtDesc.Texture2D.MipSlice = 0;
if(realTexDesc.SampleDesc.Count > 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);
@@ -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
{
+8 -4
View File
@@ -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;
+9 -11
View File
@@ -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);
+26 -2
View File
@@ -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);
-1
View File
@@ -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;
+7 -18
View File
@@ -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;
}
+34
View File
@@ -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);
+1
View File
@@ -359,6 +359,7 @@ private:
GLuint quadoverdrawFragShader;
GLuint quadoverdrawResolveProg;
ResourceId overlayTexId;
GLuint overlayTex;
GLuint overlayFBO;
GLuint overlayProg;
+5 -16
View File
@@ -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++)
+40 -5
View File
@@ -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<VkWriteDescriptorSet> 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));
+1 -2
View File
@@ -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;
-68
View File
@@ -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;
-2
View File
@@ -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);
+15
View File
@@ -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),
};
+3 -1
View File
@@ -262,4 +262,6 @@ struct HighlightCache
FloatVector InterpretVertex(const byte *data, uint32_t vert, const MeshDisplay &cfg,
const byte *end, bool useidx, bool &valid);
};
};
extern const Vec4f colorRamp[22];
+2 -35
View File
@@ -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;
}