mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-07 23:31:13 +00:00
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:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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)]
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -359,6 +359,7 @@ private:
|
||||
GLuint quadoverdrawFragShader;
|
||||
GLuint quadoverdrawResolveProg;
|
||||
|
||||
ResourceId overlayTexId;
|
||||
GLuint overlayTex;
|
||||
GLuint overlayFBO;
|
||||
GLuint overlayProg;
|
||||
|
||||
@@ -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++)
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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),
|
||||
};
|
||||
|
||||
@@ -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];
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user