From 2723a9e96ec85ce9fdc4827d7bb75e6d73c991c0 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Wed, 20 May 2026 09:38:07 +0100 Subject: [PATCH] Added D3D12 helper DoesCommandSignatureModifyRootArgs() Moved code out of D3D12 Shader Feedback ready to be used by the D3D12 Overlay code --- renderdoc/driver/d3d12/d3d12_debug.cpp | 17 +++++++++++++++++ renderdoc/driver/d3d12/d3d12_debug.h | 3 +++ .../driver/d3d12/d3d12_shader_feedback.cpp | 16 +--------------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index d07ecd910..0faebd77c 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -3562,3 +3562,20 @@ void AddDebugDescriptorsToRenderState(WrappedID3D12Device *pDevice, D3D12RenderS sig.sigelems[sigElem] = D3D12RenderState::SignatureElement(eRootTable, newHandle.heap, newHandle.index); } + +// Does a command signature modify root arguments i.e. setting root constants, updating bindings. +bool DoesCommandSignatureModifyRootArgs(ID3D12CommandSignature *comSig) +{ + WrappedID3D12CommandSignature *rdComSig = (WrappedID3D12CommandSignature *)comSig; + for(D3D12_INDIRECT_ARGUMENT_DESC &arg : rdComSig->sig.arguments) + { + D3D12_INDIRECT_ARGUMENT_TYPE argType = arg.Type; + if(argType == D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT || + argType == D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT_BUFFER_VIEW || + argType == D3D12_INDIRECT_ARGUMENT_TYPE_SHADER_RESOURCE_VIEW || + argType == D3D12_INDIRECT_ARGUMENT_TYPE_UNORDERED_ACCESS_VIEW || + argType == D3D12_INDIRECT_ARGUMENT_TYPE_INCREMENTING_CONSTANT) + return true; + } + return false; +} diff --git a/renderdoc/driver/d3d12/d3d12_debug.h b/renderdoc/driver/d3d12/d3d12_debug.h index eb97003f4..0469a5529 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.h +++ b/renderdoc/driver/d3d12/d3d12_debug.h @@ -332,3 +332,6 @@ void AddDebugDescriptorsToRenderState(WrappedID3D12Device *pDevice, D3D12RenderS bool compute, const rdcarray &handles, D3D12_DESCRIPTOR_HEAP_TYPE heapType, uint32_t sigElem, std::set &copiedHeaps); + +// Does a command signature modify root arguments i.e. setting root constants, updating bindings. +bool DoesCommandSignatureModifyRootArgs(ID3D12CommandSignature *comSig); diff --git a/renderdoc/driver/d3d12/d3d12_shader_feedback.cpp b/renderdoc/driver/d3d12/d3d12_shader_feedback.cpp index e4c619889..39ab10e84 100644 --- a/renderdoc/driver/d3d12/d3d12_shader_feedback.cpp +++ b/renderdoc/driver/d3d12/d3d12_shader_feedback.cpp @@ -1236,21 +1236,7 @@ struct D3D12StatCallback : public D3D12ActionCallback { // Need to create a new command signature using our modified root signature if the command // signature modifies the root arguments i.e. setting root constants, updating bindings. - bool needNewCommandSig = false; - for(D3D12_INDIRECT_ARGUMENT_DESC &arg : comSig->sig.arguments) - { - D3D12_INDIRECT_ARGUMENT_TYPE argType = arg.Type; - if(argType == D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT || - argType == D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT_BUFFER_VIEW || - argType == D3D12_INDIRECT_ARGUMENT_TYPE_SHADER_RESOURCE_VIEW || - argType == D3D12_INDIRECT_ARGUMENT_TYPE_UNORDERED_ACCESS_VIEW || - argType == D3D12_INDIRECT_ARGUMENT_TYPE_INCREMENTING_CONSTANT) - { - needNewCommandSig = true; - break; - } - } - if(needNewCommandSig) + if(DoesCommandSignatureModifyRootArgs(comSig)) { D3D12_COMMAND_SIGNATURE_DESC comSigDesc; comSigDesc.ByteStride = comSig->sig.ByteStride;