From 41d39b58cedb00fbba53e5eca09c81d19ad457c2 Mon Sep 17 00:00:00 2001 From: Mikkel Gjoel Date: Wed, 27 Oct 2021 16:47:06 +0200 Subject: [PATCH] Pass range-min/max to ApplyCustomShader Adding rangeminmax to globals, snippet support and updated docs to match Fixes bug in replay_output.cpp, causing a crash due to missing texhandle --- docs/how/how_custom_visualisation.rst | 19 ++++++++ qrenderdoc/Windows/ShaderViewer.cpp | 47 +++++++++++++++++++ qrenderdoc/Windows/ShaderViewer.h | 1 + .../driver/d3d11/d3d11_rendertexture.cpp | 10 ++++ renderdoc/driver/d3d11/d3d11_replay.cpp | 4 +- .../driver/d3d12/d3d12_rendertexture.cpp | 10 ++++ renderdoc/driver/gl/gl_rendertexture.cpp | 8 ++++ renderdoc/driver/vulkan/vk_rendertexture.cpp | 4 ++ renderdoc/replay/replay_output.cpp | 2 +- 9 files changed, 102 insertions(+), 3 deletions(-) diff --git a/docs/how/how_custom_visualisation.rst b/docs/how/how_custom_visualisation.rst index b5ea4e992..1d327ea8a 100644 --- a/docs/how/how_custom_visualisation.rst +++ b/docs/how/how_custom_visualisation.rst @@ -79,6 +79,8 @@ There are several constant parameters available, each detailed below with the va int SelectedSample; uvec4 YUVDownsampleRate; uvec4 YUVAChannels; + float SelectedRangeMin; + float SelectedRangeMax; } RENDERDOC; In this way you can access the properties as ``RENDERDOC.TexDim`` instead of ``RENDERDOC_TexDim``. @@ -156,6 +158,23 @@ This variable will be filled out with the selected multisample sample index as c So for example in a 4x MSAA texture, the valid values are ``0``, ``1``, ``2``, ``3`` to select a sample, or ``-4`` for 'average value'. + +Selected RangeMin, RangeMax +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. highlight:: c++ +.. code:: c++ + + float RENDERDOC_SelectedRangeMin; // hlsl + float RENDERDOC_SelectedRangeMax; // hlsl + + uniform int RENDERDOC_SelectedRangeMin; // glsl + uniform int RENDERDOC_SelectedRangeMax; // glsl + + +These variables will be filled out with the current Minimum and Maximum values for the Range-selector in the Texture Viewer. + + Current texture type ~~~~~~~~~~~~~~~~~~~~ diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index ff94e2cf1..23e478208 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -185,6 +185,7 @@ ShaderViewer::ShaderViewer(ICaptureContext &ctx, QWidget *parent) QAction *mip = new QAction(tr("Selected Mip Global"), this); QAction *slice = new QAction(tr("Selected Array Slice / Cubemap Face Global"), this); QAction *sample = new QAction(tr("Selected Sample Global"), this); + QAction *range = new QAction(tr("Selected TextureViewer Range Global"), this); QAction *type = new QAction(tr("Texture Type Global"), this); QAction *samplers = new QAction(tr("Point && Linear Samplers"), this); QAction *resources = new QAction(tr("Texture Resources"), this); @@ -193,6 +194,7 @@ ShaderViewer::ShaderViewer(ICaptureContext &ctx, QWidget *parent) snippetsMenu->addAction(mip); snippetsMenu->addAction(slice); snippetsMenu->addAction(sample); + snippetsMenu->addAction(range); snippetsMenu->addAction(type); snippetsMenu->addSeparator(); snippetsMenu->addAction(samplers); @@ -202,9 +204,11 @@ ShaderViewer::ShaderViewer(ICaptureContext &ctx, QWidget *parent) QObject::connect(mip, &QAction::triggered, this, &ShaderViewer::snippet_selectedMip); QObject::connect(slice, &QAction::triggered, this, &ShaderViewer::snippet_selectedSlice); QObject::connect(sample, &QAction::triggered, this, &ShaderViewer::snippet_selectedSample); + QObject::connect(range, &QAction::triggered, this, &ShaderViewer::snippet_selectedRange); QObject::connect(type, &QAction::triggered, this, &ShaderViewer::snippet_selectedType); QObject::connect(samplers, &QAction::triggered, this, &ShaderViewer::snippet_samplers); QObject::connect(resources, &QAction::triggered, this, &ShaderViewer::snippet_resources); + QObject::connect(resources, &QAction::triggered, this, &ShaderViewer::snippet_resources); ui->snippets->setMenu(snippetsMenu); } @@ -4363,6 +4367,8 @@ layout(binding = 0, std140) uniform RENDERDOC_Uniforms int SelectedSample; uvec4 YUVDownsampleRate; uvec4 YUVAChannels; + float SelectedRangeMin; + float SelectedRangeMax; } RENDERDOC; #define RENDERDOC_TexDim RENDERDOC.TexDim @@ -4372,6 +4378,8 @@ layout(binding = 0, std140) uniform RENDERDOC_Uniforms #define RENDERDOC_SelectedSample RENDERDOC.SelectedSample #define RENDERDOC_YUVDownsampleRate RENDERDOC.YUVDownsampleRate #define RENDERDOC_YUVAChannels RENDERDOC.YUVAChannels +#define RENDERDOC_SelectedRangeMin RENDERDOC.SelectedRangeMin +#define RENDERDOC_SelectedRangeMax RENDERDOC.SelectedRangeMax )"); } @@ -4387,6 +4395,8 @@ cbuffer RENDERDOC_Constants : register(b0) int RENDERDOC_SelectedSample; uint4 RENDERDOC_YUVDownsampleRate; uint4 RENDERDOC_YUVAChannels; + float RENDERDOC_SelectedRangeMin; + float RENDERDOC_SelectedRangeMax; }; )"); @@ -4541,6 +4551,43 @@ uniform int RENDERDOC_SelectedSample; insertSnippet(text); } +void ShaderViewer::snippet_selectedRange() +{ + ShaderEncoding encoding = currentEncoding(); + GraphicsAPI api = m_Ctx.APIProps().localRenderer; + + QString text; + + if(api == GraphicsAPI::Vulkan) + { + text = vulkanUBO(); + } + else if(encoding == ShaderEncoding::HLSL) + { + text = lit(R"( +// selected range min/max in UI +float RENDERDOC_SelectedRangeMin; +float RENDERDOC_SelectedRangeMax; + +)"); + } + else if(encoding == ShaderEncoding::GLSL) + { + text = lit(R"( +// selected range minmax in UI +float RENDERDOC_SelectedRangeMin; +float RENDERDOC_SelectedRangeMax; + +)"); + } + else if(encoding == ShaderEncoding::SPIRVAsm) + { + text = lit("; Can't insert snippets for SPIR-V ASM"); + } + + insertSnippet(text); +} + void ShaderViewer::snippet_selectedType() { ShaderEncoding encoding = currentEncoding(); diff --git a/qrenderdoc/Windows/ShaderViewer.h b/qrenderdoc/Windows/ShaderViewer.h index cc63a7b34..ba74b738f 100644 --- a/qrenderdoc/Windows/ShaderViewer.h +++ b/qrenderdoc/Windows/ShaderViewer.h @@ -170,6 +170,7 @@ private slots: void snippet_selectedMip(); void snippet_selectedSlice(); void snippet_selectedSample(); + void snippet_selectedRange(); void snippet_selectedType(); void snippet_samplers(); void snippet_resources(); diff --git a/renderdoc/driver/d3d11/d3d11_rendertexture.cpp b/renderdoc/driver/d3d11/d3d11_rendertexture.cpp index d9253eab3..caa47847b 100644 --- a/renderdoc/driver/d3d11/d3d11_rendertexture.cpp +++ b/renderdoc/driver/d3d11/d3d11_rendertexture.cpp @@ -702,6 +702,16 @@ bool D3D11Replay::RenderTextureInternal(TextureDisplay cfg, TexDisplayFlags flag var.name.c_str()); } } + else if(var.name == "RENDERDOC_SelectedRangeMin") + { + float *d = (float *)(byteData + var.offset); + d[0] = cfg.rangeMin; + } + else if(var.name == "RENDERDOC_SelectedRangeMax") + { + float *d = (float *)(byteData + var.offset); + d[0] = cfg.rangeMax; + } else { RDCWARN("Custom shader: Variable not recognised: %s", var.name.c_str()); diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 0591455ff..226b5c3af 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -3515,8 +3515,8 @@ ResourceId D3D11Replay::ApplyCustomShader(TextureDisplay &display) disp.linearDisplayAsGamma = false; disp.subresource = display.subresource; disp.overlay = DebugOverlay::NoOverlay; - disp.rangeMin = 0.0f; - disp.rangeMax = 1.0f; + disp.rangeMin = display.rangeMin; + disp.rangeMax = display.rangeMax; disp.rawOutput = false; disp.scale = 1.0f; diff --git a/renderdoc/driver/d3d12/d3d12_rendertexture.cpp b/renderdoc/driver/d3d12/d3d12_rendertexture.cpp index 0d5a778f5..4b50214e2 100644 --- a/renderdoc/driver/d3d12/d3d12_rendertexture.cpp +++ b/renderdoc/driver/d3d12/d3d12_rendertexture.cpp @@ -648,6 +648,16 @@ bool D3D12Replay::RenderTextureInternal(D3D12_CPU_DESCRIPTOR_HANDLE rtv, Texture d[0] = resType; } + else if(var.name == "RENDERDOC_SelectedRangeMin") + { + float *d = (float *)(byteData + var.offset); + d[0] = cfg.rangeMin; + } + else if(var.name == "RENDERDOC_SelectedRangeMax") + { + float *d = (float *)(byteData + var.offset); + d[0] = cfg.rangeMax; + } else { RDCWARN("Custom shader: Variable recognised but type wrong, expected uint: %s", diff --git a/renderdoc/driver/gl/gl_rendertexture.cpp b/renderdoc/driver/gl/gl_rendertexture.cpp index f821ea328..855fb3995 100644 --- a/renderdoc/driver/gl/gl_rendertexture.cpp +++ b/renderdoc/driver/gl/gl_rendertexture.cpp @@ -424,6 +424,14 @@ bool GLReplay::RenderTextureInternal(TextureDisplay cfg, TexDisplayFlags flags) loc = drv.glGetUniformLocation(customProgram, "RENDERDOC_TextureType"); if(loc >= 0) drv.glProgramUniform1ui(customProgram, loc, resType); + + loc = drv.glGetUniformLocation(customProgram, "RENDERDOC_SelectedRangeMin"); + if(loc >= 0) + drv.glProgramUniform1f(customProgram, loc, cfg.rangeMin); + + loc = drv.glGetUniformLocation(customProgram, "RENDERDOC_SelectedRangeMax"); + if(loc >= 0) + drv.glProgramUniform1f(customProgram, loc, cfg.rangeMax); } } diff --git a/renderdoc/driver/vulkan/vk_rendertexture.cpp b/renderdoc/driver/vulkan/vk_rendertexture.cpp index cc967e365..fb2316512 100644 --- a/renderdoc/driver/vulkan/vk_rendertexture.cpp +++ b/renderdoc/driver/vulkan/vk_rendertexture.cpp @@ -374,6 +374,8 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, const ImageState &i int32_t selectedSample; Vec4u YUVDownsampleRate; Vec4u YUVAChannels; + float selectedRangeMin; + float selectedRangeMax; }; CustomTexDisplayUBOData *customData = (CustomTexDisplayUBOData *)data; @@ -388,6 +390,8 @@ bool VulkanReplay::RenderTextureInternal(TextureDisplay cfg, const ImageState &i customData->texType = (uint32_t)textype; customData->YUVDownsampleRate = YUVDownsampleRate; customData->YUVAChannels = YUVAChannels; + customData->selectedRangeMin = cfg.rangeMin; + customData->selectedRangeMax = cfg.rangeMax; } m_TexRender.UBO.Unmap(); diff --git a/renderdoc/replay/replay_output.cpp b/renderdoc/replay/replay_output.cpp index 5972a6900..7c400ad03 100644 --- a/renderdoc/replay/replay_output.cpp +++ b/renderdoc/replay/replay_output.cpp @@ -755,7 +755,7 @@ void ReplayOutput::DisplayTex() if(m_RenderData.texDisplay.customShaderId != ResourceId()) { - m_CustomShaderResourceId = m_pDevice->ApplyCustomShader(m_RenderData.texDisplay); + m_CustomShaderResourceId = m_pDevice->ApplyCustomShader(texDisplay); m_pController->FatalErrorCheck(); texDisplay.resourceId = m_pDevice->GetLiveID(m_CustomShaderResourceId);