diff --git a/renderdoc/data/hlsl/debugdisplay.hlsl b/renderdoc/data/hlsl/debugdisplay.hlsl index fd3646207..122af3604 100644 --- a/renderdoc/data/hlsl/debugdisplay.hlsl +++ b/renderdoc/data/hlsl/debugdisplay.hlsl @@ -388,3 +388,23 @@ float4 RENDERDOC_QOResolvePS(float4 vpos : SV_POSITION) : SV_Target0 // http://blog.selfshadow.com/2012/11/12/counting-quads/ // https://github.com/selfshadow/demos/blob/master/QuadShading/QuadShading.fx //////////////////////////////////////////////////////////////////////////////////////////// + +cbuffer cb0 : register(b0) { uint2 src_coord; uint2 padding0; }; +cbuffer cb1 : register(b1) { uint2 dst_coord; uint copy_stencil; uint padding1; }; +Texture2D depth_src : register(t0); +Texture2D stencil_src : register(t1); +RWTexture2D depth_out : register(u0); + +[numthreads(1, 1, 1)] +void RENDERDOC_PixelHistoryUnused() +{ + depth_out[dst_coord.xy].rg = float2(-1.0f, -1.0f); +} + +[numthreads(1, 1, 1)] +void RENDERDOC_PixelHistoryCopyDepthStencil() +{ + depth_out[dst_coord.xy].rg = float2( + depth_src[src_coord.xy].r, + copy_stencil > 0 ? (float)stencil_src[src_coord.xy].g : -1.0f); +} diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index da1e07da6..c1e476820 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -3025,44 +3025,12 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect copyStencilSRVDesc.Texture2D.MipLevels = 1; copyStencilSRVDesc.Texture2D.MostDetailedMip = 0; - string unusedDepthHLSL = - "cbuffer cb0 : register(b0) { uint2 src_coord; uint2 padding0; };\n" \ - "cbuffer cb1 : register(b1) { uint2 dst_coord; uint copy_stencil; uint padding1; };\n" \ - "Texture2D depth_src : register(t0);\n" \ - "Texture2D stencil_src : register(t1);\n" \ - "RWTexture2D depth_out : register(u0);\n" \ - "\n" \ - "[numthreads(1, 1, 1)]\n" \ - "void main()\n"; - - string copyDepthStencilHLSL = unusedDepthHLSL; - - unusedDepthHLSL += "{ depth_out[dst_coord.xy].rg = float2(-1.0f, -1.0f); }"; - copyDepthStencilHLSL += - "{ depth_out[dst_coord.xy].rg = float2(" \ - "depth_src[src_coord.xy].r, " \ - "copy_stencil > 0 ? (float)stencil_src[src_coord.xy].g : -1.0f); }"; - - ID3D11ComputeShader *unusedDepthCS = MakeCShader(unusedDepthHLSL.c_str(), "main", "cs_5_0"); - ID3D11ComputeShader *copyDepthStencilCS = MakeCShader(copyDepthStencilHLSL.c_str(), "main", "cs_5_0"); - ID3D11Buffer *srcxyCBuf = NULL; - ID3D11Buffer *storexyCBuf = NULL; - uint32_t srcxyData[4] = { x, y, 0, 0 }; - D3D11_BUFFER_DESC cbufDesc = { - sizeof(uint32_t)*4, - D3D11_USAGE_DEFAULT, - D3D11_BIND_CONSTANT_BUFFER, - 0, - 0, - 0 - }; - D3D11_SUBRESOURCE_DATA data = { srcxyData, sizeof(uint32_t)*4, sizeof(uint32_t)*4 }; - - m_pDevice->CreateBuffer(&cbufDesc, &data, &srcxyCBuf); - m_pDevice->CreateBuffer(&cbufDesc, NULL, &storexyCBuf); + + ID3D11Buffer *srcxyCBuf = MakeCBuffer((float *)srcxyData, sizeof(srcxyData)); + ID3D11Buffer *storexyCBuf = MakeCBuffer((float *)srcxyData, sizeof(srcxyData)); // so we do: // per sample: orig depth --copy--> depthCopyXXX (created/upsized on demand) --CS pixel copy--> pixstoreDepth @@ -3123,36 +3091,6 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect for(size_t i=0; i < ARRAY_COUNT(testQueries); i++) m_pDevice->CreateQuery(&occlDesc, &testQueries[i]); - D3D11_BLEND_DESC nopBlendStateDesc = {0}; // no blending enabled anywhere, 0 write mask - ID3D11BlendState *nopBlendState = NULL; - m_pDevice->CreateBlendState(&nopBlendStateDesc, &nopBlendState); - - D3D11_DEPTH_STENCIL_DESC nopDSStateDesc = { // no tests enabled, no writing enabled - FALSE, // DepthEnable; - D3D11_DEPTH_WRITE_MASK_ZERO, // DepthWriteMask; - D3D11_COMPARISON_ALWAYS, // DepthFunc; - FALSE, // StencilEnable; - 0, // StencilReadMask; - 0, // StencilWriteMask; - { D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_COMPARISON_ALWAYS }, // FrontFace; - { D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_COMPARISON_ALWAYS }, // BackFace; - }; - ID3D11DepthStencilState *nopDSState = NULL; - m_pDevice->CreateDepthStencilState(&nopDSStateDesc, &nopDSState); - - D3D11_DEPTH_STENCIL_DESC allpassDSStateDesc = { // tests enabled to trivially pass, writing enabled - TRUE, // DepthEnable; - D3D11_DEPTH_WRITE_MASK_ALL, // DepthWriteMask; - D3D11_COMPARISON_ALWAYS, // DepthFunc; - TRUE, // StencilEnable; - 0xff, // StencilReadMask; - 0xff, // StencilWriteMask; - { D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_COMPARISON_ALWAYS }, // FrontFace; - { D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_COMPARISON_ALWAYS }, // BackFace; - }; - ID3D11DepthStencilState *allpassDSState = NULL; - m_pDevice->CreateDepthStencilState(&allpassDSStateDesc, &allpassDSState); - m_WrappedDevice->ReplayLog(frameID, 0, events[0], eReplay_WithoutDraw); D3D11_VIEWPORT viewport = { (float)x, (float)y, 10.0f, 10.0f, 0.0f, 1.0f }; // 1x1 viewport of our destination pixel @@ -3327,8 +3265,8 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(nopBlendState, blendFactor, curSample); - m_pImmediateContext->OMSetDepthStencilState(nopDSState, stencilRef); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.NopDepthState, stencilRef); for(UINT i=0; i < curNumViews; i++) { @@ -3501,7 +3439,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect if(copyDepthSRV) m_pImmediateContext->CSSetShaderResources(0, 1, copyDepthSRV); if(copyStencilSRV) m_pImmediateContext->CSSetShaderResources(1, 1, copyStencilSRV); - m_pImmediateContext->CSSetShader(depthBound ? copyDepthStencilCS : unusedDepthCS, NULL, 0); + m_pImmediateContext->CSSetShader(depthBound ? m_DebugRender.PixelHistoryDepthCopyCS : m_DebugRender.PixelHistoryUnusedCS, NULL, 0); m_pImmediateContext->Dispatch(1, 1, 1); m_pImmediateContext->CSSetShader(curCS, curCSInst, curCSNumInst); @@ -3578,7 +3516,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect if(copyDepthSRV) m_pImmediateContext->CSSetShaderResources(0, 1, copyDepthSRV); if(copyStencilSRV) m_pImmediateContext->CSSetShaderResources(1, 1, copyStencilSRV); - m_pImmediateContext->CSSetShader(depthBound ? copyDepthStencilCS : unusedDepthCS, NULL, 0); + m_pImmediateContext->CSSetShader(depthBound ? m_DebugRender.PixelHistoryDepthCopyCS : m_DebugRender.PixelHistoryUnusedCS, NULL, 0); m_pImmediateContext->Dispatch(1, 1, 1); m_pImmediateContext->CSSetShader(curCS, curCSInst, curCSNumInst); @@ -3901,8 +3839,8 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i], eReplay_WithoutDraw); - m_pImmediateContext->OMSetBlendState(nopBlendState, blendFactor, curSample); - m_pImmediateContext->OMSetDepthStencilState(allpassDSState, stencilRef); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -3928,8 +3866,8 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i], eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(nopBlendState, blendFactor, curSample); - m_pImmediateContext->OMSetDepthStencilState(allpassDSState, stencilRef); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -3955,8 +3893,8 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i], eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(nopBlendState, blendFactor, curSample); - m_pImmediateContext->OMSetDepthStencilState(allpassDSState, stencilRef); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -4007,8 +3945,8 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i], eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(nopBlendState, blendFactor, curSample); - m_pImmediateContext->OMSetDepthStencilState(allpassDSState, stencilRef); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetDepthStencilState(m_DebugRender.AllPassDepthState, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumScissors, intersectScissors); @@ -4037,15 +3975,17 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect dsd.StencilEnable = TRUE; dsd.StencilReadMask = 0xff; dsd.StencilWriteMask = 0xff; - dsd.FrontFace = allpassDSStateDesc.FrontFace; - dsd.BackFace = allpassDSStateDesc.BackFace; + dsd.FrontFace.StencilDepthFailOp = dsd.FrontFace.StencilFailOp = dsd.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; + dsd.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; + dsd.BackFace.StencilDepthFailOp = dsd.BackFace.StencilFailOp = dsd.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; + dsd.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; m_pDevice->CreateDepthStencilState(&dsd, &newDS); m_WrappedDevice->ReplayLog(frameID, 0, events[i], eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(nopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); m_pImmediateContext->OMSetDepthStencilState(newDS, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -4077,7 +4017,7 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect m_WrappedDevice->ReplayLog(frameID, 0, events[i], eReplay_WithoutDraw); m_pImmediateContext->PSSetShader(m_DebugRender.OverlayPS, NULL, 0); - m_pImmediateContext->OMSetBlendState(nopBlendState, blendFactor, curSample); + m_pImmediateContext->OMSetBlendState(m_DebugRender.NopBlendState, blendFactor, curSample); m_pImmediateContext->OMSetDepthStencilState(newDS, stencilRef); m_pImmediateContext->RSSetState(newRS); m_pImmediateContext->RSSetScissorRects(curNumViews, newScissors); @@ -4201,9 +4141,6 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect for(size_t i=0; i < ARRAY_COUNT(testQueries); i++) SAFE_RELEASE(testQueries[i]); - SAFE_RELEASE(nopBlendState); - SAFE_RELEASE(nopDSState); - SAFE_RELEASE(pixstore); SAFE_RELEASE(pixstoreDepthReadback); @@ -4224,10 +4161,5 @@ vector D3D11DebugManager::PixelHistory(uint32_t frameID, vect SAFE_RELEASE(depthCopyD16); SAFE_RELEASE(depthCopyD16_DepthSRV); - SAFE_RELEASE(unusedDepthCS); - SAFE_RELEASE(copyDepthStencilCS); - SAFE_RELEASE(srcxyCBuf); - SAFE_RELEASE(storexyCBuf); - return history; } diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index 0e3140d5a..823a1d628 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -783,6 +783,9 @@ bool D3D11DebugManager::InitDebugRendering() m_DebugRender.QuadOverdrawPS = MakePShader(displayhlsl.c_str(), "RENDERDOC_QuadOverdrawPS", "ps_5_0"); m_DebugRender.QOResolvePS = MakePShader(displayhlsl.c_str(), "RENDERDOC_QOResolvePS", "ps_5_0"); + + m_DebugRender.PixelHistoryUnusedCS = MakeCShader(displayhlsl.c_str(), "RENDERDOC_PixelHistoryUnused", "cs_5_0"); + m_DebugRender.PixelHistoryDepthCopyCS = MakeCShader(displayhlsl.c_str(), "RENDERDOC_PixelHistoryCopyDepthStencil", "cs_5_0"); string multisamplehlsl = GetEmbeddedResource(multisample_hlsl); @@ -852,6 +855,16 @@ bool D3D11DebugManager::InitDebugRendering() { RDCERR("Failed to create default blendstate %08x", hr); } + + blendDesc.RenderTarget[0].BlendEnable = FALSE; + blendDesc.RenderTarget[0].RenderTargetWriteMask = 0; + + hr = m_pDevice->CreateBlendState(&blendDesc, &m_DebugRender.NopBlendState); + + if(FAILED(hr)) + { + RDCERR("Failed to create nop blendstate %08x", hr); + } D3D11_RASTERIZER_DESC rastDesc; RDCEraseEl(rastDesc); @@ -923,6 +936,28 @@ bool D3D11DebugManager::InitDebugRendering() { RDCERR("Failed to create less-equal depthstencilstate %08x", hr); } + + desc.DepthFunc = D3D11_COMPARISON_ALWAYS; + desc.StencilEnable = TRUE; + + hr = m_pDevice->CreateDepthStencilState(&desc, &m_DebugRender.AllPassDepthState); + + if(FAILED(hr)) + { + RDCERR("Failed to create always pass depthstencilstate %08x", hr); + } + + desc.DepthEnable = FALSE; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; + desc.StencilReadMask = desc.StencilWriteMask = 0; + desc.StencilEnable = FALSE; + + hr = m_pDevice->CreateDepthStencilState(&desc, &m_DebugRender.NopDepthState); + + if(FAILED(hr)) + { + RDCERR("Failed to create nop depthstencilstate %08x", hr); + } } { diff --git a/renderdoc/driver/d3d11/d3d11_debug.h b/renderdoc/driver/d3d11/d3d11_debug.h index 935fe3b47..944ef06bb 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.h +++ b/renderdoc/driver/d3d11/d3d11_debug.h @@ -359,10 +359,13 @@ class D3D11DebugManager SAFE_RELEASE(OutlineStripVB); SAFE_RELEASE(RastState); SAFE_RELEASE(BlendState); + SAFE_RELEASE(NopBlendState); SAFE_RELEASE(PointSampState); SAFE_RELEASE(LinearSampState); SAFE_RELEASE(NoDepthState); SAFE_RELEASE(LEqualDepthState); + SAFE_RELEASE(NopDepthState); + SAFE_RELEASE(AllPassDepthState); SAFE_RELEASE(GenericLayout); SAFE_RELEASE(GenericHomogLayout); @@ -375,11 +378,24 @@ class D3D11DebugManager SAFE_RELEASE(MeshVS); SAFE_RELEASE(MeshGS); SAFE_RELEASE(MeshPS); + SAFE_RELEASE(FullscreenVS); SAFE_RELEASE(WireframeVS); SAFE_RELEASE(WireframeHomogVS); SAFE_RELEASE(WireframePS); SAFE_RELEASE(OverlayPS); - + + SAFE_RELEASE(CopyMSToArrayPS); + SAFE_RELEASE(CopyArrayToMSPS); + SAFE_RELEASE(FloatCopyMSToArrayPS); + SAFE_RELEASE(FloatCopyArrayToMSPS); + SAFE_RELEASE(DepthCopyMSToArrayPS); + SAFE_RELEASE(DepthCopyArrayToMSPS); + SAFE_RELEASE(PixelHistoryUnusedCS); + SAFE_RELEASE(PixelHistoryDepthCopyCS); + + SAFE_RELEASE(QuadOverdrawPS); + SAFE_RELEASE(QOResolvePS); + SAFE_RELEASE(tileResultBuff); SAFE_RELEASE(resultBuff); SAFE_RELEASE(resultStageBuff); @@ -424,8 +440,8 @@ class D3D11DebugManager ID3D11Buffer *PosBuffer, *OutlineStripVB; ID3D11RasterizerState *RastState; ID3D11SamplerState *PointSampState, *LinearSampState; - ID3D11BlendState *BlendState; - ID3D11DepthStencilState *NoDepthState, *LEqualDepthState; + ID3D11BlendState *BlendState, *NopBlendState; + ID3D11DepthStencilState *NoDepthState, *LEqualDepthState, *NopDepthState, *AllPassDepthState; ID3D11InputLayout *GenericLayout, *GenericHomogLayout; ID3D11Buffer *GenericVSCBuffer; @@ -438,6 +454,7 @@ class D3D11DebugManager ID3D11PixelShader *CopyMSToArrayPS, *CopyArrayToMSPS; ID3D11PixelShader *FloatCopyMSToArrayPS, *FloatCopyArrayToMSPS; ID3D11PixelShader *DepthCopyMSToArrayPS, *DepthCopyArrayToMSPS; + ID3D11ComputeShader *PixelHistoryUnusedCS, *PixelHistoryDepthCopyCS; ID3D11PixelShader *QuadOverdrawPS, *QOResolvePS;