diff --git a/renderdoc/data/glsl/texdisplay.frag b/renderdoc/data/glsl/texdisplay.frag index 2bd9b629b..e02405f21 100644 --- a/renderdoc/data/glsl/texdisplay.frag +++ b/renderdoc/data/glsl/texdisplay.frag @@ -100,9 +100,11 @@ void main(void) vec4 pre_range_col = col; col = ((col - RangeMinimum)*InverseRangeSize); - - col = mix(vec4(0,0,0,1), col, Channels); - pre_range_col = mix(vec4(0,0,0,1), pre_range_col, Channels); + + if(Channels.x < 0.5f) col.x = pre_range_col.x = 0.0f; + if(Channels.y < 0.5f) col.y = pre_range_col.y = 0.0f; + if(Channels.z < 0.5f) col.z = pre_range_col.z = 0.0f; + if(Channels.w < 0.5f) col.w = pre_range_col.w = 1.0f; // show nans, infs and negatives if((OutputDisplayFormat & TEXDISPLAY_NANS) > 0) diff --git a/renderdoc/data/hlsl/debugcbuffers.h b/renderdoc/data/hlsl/debugcbuffers.h index b522a2b5a..9712bd1f3 100644 --- a/renderdoc/data/hlsl/debugcbuffers.h +++ b/renderdoc/data/hlsl/debugcbuffers.h @@ -87,7 +87,7 @@ cbuffer DebugPixelCBufferData REG(b0) float Slice; float ScalePS; int SampleIdx; - int Padding; + float AlwaysZero; int RawOutput; float3 TextureResolutionPS; diff --git a/renderdoc/data/hlsl/debugdisplay.hlsl b/renderdoc/data/hlsl/debugdisplay.hlsl index 9e5b34c8a..d160cb172 100644 --- a/renderdoc/data/hlsl/debugdisplay.hlsl +++ b/renderdoc/data/hlsl/debugdisplay.hlsl @@ -120,8 +120,13 @@ float4 RENDERDOC_TexDisplayPS(v2f IN) : SV_Target0 col = ((col - RangeMinimum)*InverseRangeSize); - col = lerp(float4(0,0,0,1), col, Channels); - pre_range_col = lerp(float4(0,0,0,1), pre_range_col, Channels); + // workaround for D3DCompiler bug. For some reason it assumes texture samples can + // never come back as NaN, so involving a cbuffer value like this here ensures + // the below isnan()s don't get optimised out. + if(Channels.x < 0.5f) col.x = pre_range_col.x = AlwaysZero; + if(Channels.y < 0.5f) col.y = pre_range_col.y = AlwaysZero; + if(Channels.z < 0.5f) col.z = pre_range_col.z = AlwaysZero; + if(Channels.w < 0.5f) col.w = pre_range_col.w = 1.0f-AlwaysZero; // show nans, infs and negatives if(OutputDisplayFormat & TEXDISPLAY_NANS) diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index 937e7396f..259efc3ff 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -3301,6 +3301,8 @@ bool D3D11DebugManager::RenderTexture(TextureDisplay cfg, bool blendAlpha) DebugVertexCBuffer vertexData; DebugPixelCBufferData pixelData; + pixelData.AlwaysZero = 0.0f; + float x = cfg.offx; float y = cfg.offy; @@ -3690,6 +3692,8 @@ void D3D11DebugManager::RenderCheckerboard(Vec3f light, Vec3f dark) DebugPixelCBufferData pixelData; + pixelData.AlwaysZero = 0.0f; + pixelData.Channels = Vec4f(light.x, light.y, light.z, 0.0f); pixelData.WireframeColour = dark; @@ -4597,6 +4601,8 @@ void D3D11DebugManager::RenderMesh(uint32_t frameID, uint32_t eventID, const vec DebugPixelCBufferData pixelData; + pixelData.AlwaysZero = 0.0f; + pixelData.OutputDisplayFormat = MESHDISPLAY_SOLID; pixelData.WireframeColour = Vec3f(0.0f, 0.0f, 0.0f); FillCBuffer(m_DebugRender.GenericPSCBuffer, (float *)&pixelData, sizeof(DebugPixelCBufferData));