From 707910b647697e8332002fde6c09c2b763bd9805 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 19 Nov 2015 01:33:22 +0100 Subject: [PATCH] Tweak viewport/scissor overlay to be a little clearer --- renderdoc/data/embedded_files.h | 1 + renderdoc/data/glsl/outline.frag | 70 +++++++++++++++++++ renderdoc/data/hlsl/debugdisplay.hlsl | 39 +++++++++++ renderdoc/data/renderdoc.rc | 1 + renderdoc/data/resource.h | 1 + renderdoc/driver/d3d11/d3d11_analyse.cpp | 87 +++++++++++++++++------- renderdoc/driver/d3d11/d3d11_debug.cpp | 1 + renderdoc/driver/d3d11/d3d11_debug.h | 2 + renderdoc/driver/gl/gl_debug.cpp | 46 ++++++++++--- renderdoc/driver/gl/gl_replay.h | 1 + renderdoc/renderdoc.vcxproj | 1 + renderdoc/renderdoc.vcxproj.filters | 3 + 12 files changed, 220 insertions(+), 33 deletions(-) create mode 100644 renderdoc/data/glsl/outline.frag diff --git a/renderdoc/data/embedded_files.h b/renderdoc/data/embedded_files.h index 66e20d002..8a7652dfa 100644 --- a/renderdoc/data/embedded_files.h +++ b/renderdoc/data/embedded_files.h @@ -46,5 +46,6 @@ DECLARE_EMBED(generic_frag); DECLARE_EMBED(text_frag); DECLARE_EMBED(text_vert); DECLARE_EMBED(sourcecodepro_ttf); +DECLARE_EMBED(outline_frag); #undef DECLARE_EMBED diff --git a/renderdoc/data/glsl/outline.frag b/renderdoc/data/glsl/outline.frag new file mode 100644 index 000000000..ab8a5914f --- /dev/null +++ b/renderdoc/data/glsl/outline.frag @@ -0,0 +1,70 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2014 Crytek + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#version 420 core + +layout (location = 0) out vec4 color_out; + +uniform vec4 RENDERDOC_Inner_Color; +uniform vec4 RENDERDOC_Border_Color; +uniform vec4 RENDERDOC_ViewRect; +uniform uint RENDERDOC_Scissor; + +void main(void) +{ + vec4 ret = RENDERDOC_Inner_Color; + + vec2 rectPos = gl_FragCoord.xy - RENDERDOC_ViewRect.xy; + vec2 rectSize = RENDERDOC_ViewRect.zw; + + vec2 ab = mod(rectPos.xy, 32.0f.xx); + + bool checkerVariant = ( + (ab.x < 16 && ab.y < 16) || + (ab.x > 16 && ab.y > 16) + ); + + if(RENDERDOC_Scissor == 0) + { + if(rectPos.x < 3.0f || rectPos.x > rectSize.x - 3.0f || + rectPos.y < 3.0f || rectPos.y > rectSize.y - 3.0f) + { + ret = RENDERDOC_Border_Color; + } + } + else + { + if(rectPos.x < 3.0f || rectPos.x > rectSize.x - 3.0f || + rectPos.y < 3.0f || rectPos.y > rectSize.y - 3.0f) + { + ret = checkerVariant ? vec4(1, 1, 1, 1) : vec4(0, 0, 0, 1); + } + else + { + ret = vec4(0, 0, 0, 0); + } + } + + color_out = ret; +} diff --git a/renderdoc/data/hlsl/debugdisplay.hlsl b/renderdoc/data/hlsl/debugdisplay.hlsl index d160cb172..a551fd6ac 100644 --- a/renderdoc/data/hlsl/debugdisplay.hlsl +++ b/renderdoc/data/hlsl/debugdisplay.hlsl @@ -254,6 +254,45 @@ MultipleOutput RENDERDOC_OverlayPS(float4 IN : SV_Position) return OUT; } +float4 RENDERDOC_OutlinePS(float4 IN : SV_Position) : SV_Target0 +{ + float4 ret = Channels; + + float2 rectPos = IN.xy - float2(RangeMinimum, InverseRangeSize); + float2 rectSize = TextureResolutionPS.xy; + + float2 ab = fmod(rectPos.xy, 32.0.xx); + + bool checkerVariant = ( + (ab.x < 16 && ab.y < 16) || + (ab.x > 16 && ab.y > 16) + ); + + if(OutputDisplayFormat == 0) + { + if(rectPos.x < 3.0f || rectPos.x > rectSize.x - 3.0f || + rectPos.y < 3.0f || rectPos.y > rectSize.y - 3.0f) + { + ret.rgb = WireframeColour.rgb; + ret.a = 1.0f; + } + } + else + { + if(rectPos.x < 3.0f || rectPos.x > rectSize.x - 3.0f || + rectPos.y < 3.0f || rectPos.y > rectSize.y - 3.0f) + { + ret = checkerVariant ? float4(1, 1, 1, 1) : float4(0, 0, 0, 1); + } + else + { + ret = float4(0, 0, 0, 0); + } + } + + return ret; +} + float4 RENDERDOC_CheckerboardPS(float4 IN : SV_Position) : SV_Target0 { float2 ab = fmod(IN.xy, 128.0.xx); diff --git a/renderdoc/data/renderdoc.rc b/renderdoc/data/renderdoc.rc index f0eb2bd71..b25aaf8e3 100644 --- a/renderdoc/data/renderdoc.rc +++ b/renderdoc/data/renderdoc.rc @@ -127,6 +127,7 @@ RESOURCE_mesh_geom TYPE_EMBED "glsl/mesh.geom" RESOURCE_mesh_comp TYPE_EMBED "glsl/mesh.comp" RESOURCE_arraymscopy_comp TYPE_EMBED "glsl/arraymscopy.comp" RESOURCE_quadoverdraw_frag TYPE_EMBED "glsl/quadoverdraw.frag" +RESOURCE_outline_frag TYPE_EMBED "glsl/outline.frag" RESOURCE_sourcecodepro_ttf TYPE_EMBED "sourcecodepro.ttf" diff --git a/renderdoc/data/resource.h b/renderdoc/data/resource.h index 3dd800363..d4bdf59b5 100644 --- a/renderdoc/data/resource.h +++ b/renderdoc/data/resource.h @@ -29,6 +29,7 @@ #define RESOURCE_mesh_comp 215 #define RESOURCE_arraymscopy_comp 216 #define RESOURCE_quadoverdraw_frag 217 +#define RESOURCE_outline_frag 218 #define RESOURCE_sourcecodepro_ttf 301 diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index 8e4f69c54..b9b711290 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -2815,6 +2815,8 @@ void D3D11DebugManager::CreateCustomShaderTex(uint32_t w, uint32_t h) } } +#include "data/hlsl/debugcbuffers.h" + ResourceId D3D11DebugManager::RenderOverlay(ResourceId texid, TextureDisplayOverlay overlay, uint32_t frameID, uint32_t eventID, const vector &passEvents) { TextureShaderDetails details = GetShaderDetails(texid, false); @@ -3127,7 +3129,7 @@ ResourceId D3D11DebugManager::RenderOverlay(ResourceId texid, TextureDisplayOver m_pImmediateContext->HSSetShader(NULL, NULL, 0); m_pImmediateContext->DSSetShader(NULL, NULL, 0); m_pImmediateContext->GSSetShader(NULL, NULL, 0); - m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); + m_pImmediateContext->PSSetShader(m_DebugRender.OutlinePS, NULL, 0); m_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); m_pImmediateContext->IASetInputLayout(NULL); @@ -3158,11 +3160,28 @@ ResourceId D3D11DebugManager::RenderOverlay(ResourceId texid, TextureDisplayOver } m_pImmediateContext->OMSetDepthStencilState(os, 0); + + D3D11_BLEND_DESC blendDesc; + RDCEraseEl(blendDesc); - m_pImmediateContext->OMSetBlendState(NULL, NULL, 0xffffffff); + blendDesc.AlphaToCoverageEnable = FALSE; + blendDesc.IndependentBlendEnable = FALSE; + blendDesc.RenderTarget[0].BlendEnable = TRUE; + blendDesc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + blendDesc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + blendDesc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + blendDesc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + blendDesc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; + blendDesc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + blendDesc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + + ID3D11BlendState *bs = NULL; + hr = m_pDevice->CreateBlendState(&blendDesc, &bs); + + float blendwhite[] = { 1.0f, 1.0f, 1.0f, 1.0f }; + m_pImmediateContext->OMSetBlendState(bs, blendwhite, 0xffffffff); ID3D11RasterizerState *rs = NULL; - ID3D11RasterizerState *rs2 = NULL; { D3D11_RASTERIZER_DESC rdesc; @@ -3183,44 +3202,66 @@ ResourceId D3D11DebugManager::RenderOverlay(ResourceId texid, TextureDisplayOver RDCERR("Failed to create drawcall rast state %08x", hr); return m_OverlayResourceId; } - - rdesc.ScissorEnable = TRUE; - - hr = m_pDevice->CreateRasterizerState(&rdesc, &rs2); - if(FAILED(hr)) - { - RDCERR("Failed to create drawcall rast state %08x", hr); - return m_OverlayResourceId; - } } float clearColour[] = { 0.0f, 0.0f, 0.0f, 0.0f }; m_pImmediateContext->ClearRenderTargetView(rtv, clearColour); - - float overlayConsts[] = { 0.15f, 0.3f, 0.6f, 0.3f }; - ID3D11Buffer *buf = MakeCBuffer(overlayConsts, sizeof(overlayConsts)); - - m_pImmediateContext->PSSetConstantBuffers(1, 1, &buf); m_pImmediateContext->RSSetState(rs); + DebugPixelCBufferData pixelData = {0}; + + UINT dummy = 1; + D3D11_VIEWPORT views[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE] = {0}; + m_pImmediateContext->RSGetViewports(&dummy, views); + + // border colour (dark, 2px, opaque) + pixelData.WireframeColour = Vec3f(0.1f, 0.1f, 0.1f); + // inner colour (light, transparent) + pixelData.Channels = Vec4f(0.2f, 0.2f, 0.9f, 0.7f); + pixelData.OutputDisplayFormat = 0; + pixelData.RangeMinimum = views[0].TopLeftX; + pixelData.InverseRangeSize = views[0].TopLeftY; + pixelData.TextureResolutionPS = Vec3f(views[0].Width, views[0].Height, 0.0f); + + ID3D11Buffer *buf = MakeCBuffer((float *)&pixelData, sizeof(DebugPixelCBufferData)); + + m_pImmediateContext->PSSetConstantBuffers(0, 1, &buf); + m_pImmediateContext->Draw(3, 0); - float overlayConsts2[] = { 0.5f, 0.6f, 0.8f, 0.3f }; - buf = MakeCBuffer(overlayConsts2, sizeof(overlayConsts2)); - if(origdesc.ScissorEnable) { - m_pImmediateContext->PSSetConstantBuffers(1, 1, &buf); + UINT dummy = 1; + D3D11_RECT rects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE] = {0}; + m_pImmediateContext->RSGetScissorRects(&dummy, rects); - m_pImmediateContext->RSSetState(rs2); + D3D11_VIEWPORT scissorview; + + scissorview.TopLeftX = (float)rects[0].left; + scissorview.TopLeftY = (float)rects[0].top; + scissorview.MinDepth = 0.0f; + scissorview.MaxDepth = 1.0f; + scissorview.Width = (float)(rects[0].right - rects[0].left); + scissorview.Height = (float)(rects[0].bottom - rects[0].top); + + m_pImmediateContext->RSSetViewports(1, &scissorview); + + pixelData.OutputDisplayFormat = 1; + pixelData.RangeMinimum = scissorview.TopLeftX; + pixelData.InverseRangeSize = scissorview.TopLeftY; + pixelData.TextureResolutionPS = Vec3f(scissorview.Width, scissorview.Height, 0.0f); + + buf = MakeCBuffer((float *)&pixelData, sizeof(DebugPixelCBufferData)); + + m_pImmediateContext->PSSetConstantBuffers(0, 1, &buf); m_pImmediateContext->Draw(3, 0); } SAFE_RELEASE(os); SAFE_RELEASE(rs); - SAFE_RELEASE(rs2); + SAFE_RELEASE(bs); } else if(overlay == eTexOverlay_Wireframe) { diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index 150e7417d..e7d1a3329 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -827,6 +827,7 @@ bool D3D11DebugManager::InitDebugRendering() m_DebugRender.WireframePS = MakePShader(displayhlsl.c_str(), "RENDERDOC_WireframePS", "ps_4_0"); m_DebugRender.OverlayPS = MakePShader(displayhlsl.c_str(), "RENDERDOC_OverlayPS", "ps_4_0"); m_DebugRender.CheckerboardPS = MakePShader(displayhlsl.c_str(), "RENDERDOC_CheckerboardPS", "ps_4_0"); + m_DebugRender.OutlinePS = MakePShader(displayhlsl.c_str(), "RENDERDOC_OutlinePS", "ps_4_0"); m_DebugRender.QuadOverdrawPS = MakePShader(displayhlsl.c_str(), "RENDERDOC_QuadOverdrawPS", "ps_5_0"); m_DebugRender.QOResolvePS = MakePShader(displayhlsl.c_str(), "RENDERDOC_QOResolvePS", "ps_5_0"); diff --git a/renderdoc/driver/d3d11/d3d11_debug.h b/renderdoc/driver/d3d11/d3d11_debug.h index 3a25160eb..10b4b85d8 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.h +++ b/renderdoc/driver/d3d11/d3d11_debug.h @@ -419,6 +419,7 @@ class D3D11DebugManager SAFE_RELEASE(GenericVS); SAFE_RELEASE(TexDisplayPS); SAFE_RELEASE(CheckerboardPS); + SAFE_RELEASE(OutlinePS); SAFE_RELEASE(MeshVS); SAFE_RELEASE(MeshGS); SAFE_RELEASE(MeshPS); @@ -505,6 +506,7 @@ class D3D11DebugManager ID3D11VertexShader *GenericVS, *WireframeVS, *MeshVS, *WireframeHomogVS, *FullscreenVS; ID3D11GeometryShader *MeshGS; ID3D11PixelShader *TexDisplayPS, *OverlayPS, *WireframePS, *MeshPS, *CheckerboardPS; + ID3D11PixelShader *OutlinePS; ID3D11PixelShader *CopyMSToArrayPS, *CopyArrayToMSPS; ID3D11PixelShader *FloatCopyMSToArrayPS, *FloatCopyArrayToMSPS; ID3D11PixelShader *DepthCopyMSToArrayPS, *DepthCopyArrayToMSPS; diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index e5a278784..08e3ceb54 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -516,6 +516,10 @@ void GLReplay::InitDebugData() gl.glEnableVertexAttribArray(0); DebugData.replayQuadProg = CreateShaderProgram(blitvsSource.c_str(), genericfsSource.c_str()); + + string outlinefsSource = GetEmbeddedResource(outline_frag); + + DebugData.outlineQuadProg = CreateShaderProgram(blitvsSource.c_str(), outlinefsSource.c_str()); MakeCurrentReplayContext(&m_ReplayCtx); @@ -633,6 +637,7 @@ void GLReplay::DeleteDebugData() gl.glDeleteBuffers(1, &DebugData.triHighlightBuffer); gl.glDeleteProgram(DebugData.replayQuadProg); + gl.glDeleteProgram(DebugData.outlineQuadProg); } bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, float *minval, float *maxval) @@ -1869,21 +1874,42 @@ ResourceId GLReplay::RenderOverlay(ResourceId texid, TextureDisplayOverlay overl gl.glClearBufferfv(eGL_COLOR, 0, col); // don't need to use the existing program at all! - gl.glUseProgram(DebugData.replayQuadProg); + gl.glUseProgram(DebugData.outlineQuadProg); gl.glBindProgramPipeline(0); - GLint colLoc = gl.glGetUniformLocation(DebugData.replayQuadProg, "RENDERDOC_GenericFS_Color"); - float viewportConsts[] = { 0.15f, 0.3f, 0.6f, 0.3f }; - gl.glUniform4fv(colLoc, 1, viewportConsts); + gl.glDisablei(eGL_SCISSOR_TEST, 0); + + gl.glViewportIndexedf(0, rs.Viewports[0].x, rs.Viewports[0].y, rs.Viewports[0].width, rs.Viewports[0].height); + + GLint innerLoc = gl.glGetUniformLocation(DebugData.outlineQuadProg, "RENDERDOC_Inner_Color"); + GLint borderLoc = gl.glGetUniformLocation(DebugData.outlineQuadProg, "RENDERDOC_Border_Color"); + GLint rectLoc = gl.glGetUniformLocation(DebugData.outlineQuadProg, "RENDERDOC_ViewRect"); + GLint scissorLoc = gl.glGetUniformLocation(DebugData.outlineQuadProg, "RENDERDOC_Scissor"); + + float innerConsts[] = { 0.2f, 0.2f, 0.9f, 0.7f }; + gl.glUniform4fv(innerLoc, 1, innerConsts); + + float borderConsts[] = { 0.1f, 0.1f, 0.1f, 1.0f }; + gl.glUniform4fv(borderLoc, 1, borderConsts); + + gl.glUniform4fv(rectLoc, 1, (float *)rs.Viewports); + + gl.glUniform1ui(scissorLoc, 0); gl.glDrawArrays(eGL_TRIANGLE_STRIP, 0, 4); - - gl.glEnablei(eGL_SCISSOR_TEST, 0); - - float scissorConsts[] = { 0.5f, 0.6f, 0.8f, 0.3f }; - gl.glUniform4fv(colLoc, 1, scissorConsts); - gl.glDrawArrays(eGL_TRIANGLE_STRIP, 0, 4); + if(rs.Scissors[0].enabled) + { + Vec4f scissor((float)rs.Scissors[0].x, (float)rs.Scissors[0].y, (float)rs.Scissors[0].width, (float)rs.Scissors[0].height); + + gl.glViewportIndexedf(0, scissor.x, scissor.y, scissor.z, scissor.w); + + gl.glUniform4fv(rectLoc, 1, (float *)&scissor); + + gl.glUniform1ui(scissorLoc, 1); + + gl.glDrawArrays(eGL_TRIANGLE_STRIP, 0, 4); + } } else if(overlay == eTexOverlay_Depth || overlay == eTexOverlay_Stencil) { diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index e585c8f27..4fe524858 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -246,6 +246,7 @@ class GLReplay : public IReplayDriver GLuint histogramProgram[64]; // RESTYPE indexed (see debuguniforms.h, 1d/2d/3d etc | uint/sint) src tex -> histogram result buf program GLuint replayQuadProg; + GLuint outlineQuadProg; // program that does a blit of texture from input to output, // no transformation or scaling diff --git a/renderdoc/renderdoc.vcxproj b/renderdoc/renderdoc.vcxproj index 1614b6648..a82d5e16b 100644 --- a/renderdoc/renderdoc.vcxproj +++ b/renderdoc/renderdoc.vcxproj @@ -345,6 +345,7 @@ + diff --git a/renderdoc/renderdoc.vcxproj.filters b/renderdoc/renderdoc.vcxproj.filters index 9d0d69979..05e8ef1b9 100644 --- a/renderdoc/renderdoc.vcxproj.filters +++ b/renderdoc/renderdoc.vcxproj.filters @@ -421,6 +421,9 @@ Resources\glsl + + Resources\glsl +