diff --git a/renderdoc/driver/d3d12/d3d12_common.h b/renderdoc/driver/d3d12/d3d12_common.h index 148a78438..1c4d6a9d5 100644 --- a/renderdoc/driver/d3d12/d3d12_common.h +++ b/renderdoc/driver/d3d12/d3d12_common.h @@ -171,6 +171,7 @@ struct D3D12RootSignature struct D3D12CommandSignature { + bool graphics; UINT ByteStride; vector arguments; }; diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index e6d4fb3c2..2759d53bf 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -1345,6 +1345,22 @@ bool WrappedID3D12Device::Serialise_CreateCommandSignature(Serialiser *localSeri wrapped->sig.arguments.insert(wrapped->sig.arguments.begin(), desc.pArgumentDescs, desc.pArgumentDescs + desc.NumArgumentDescs); + wrapped->sig.graphics = true; + + // From MSDN, command signatures are either graphics or compute so just search for dispatches: + // "A given command signature is either a draw or a compute command signature. If a command + // signature contains a drawing operation, then it is a graphics command signature. Otherwise, + // the command signature must contain a dispatch operation, and it is a compute command + // signature." + for(uint32_t i = 0; i < desc.NumArgumentDescs; i++) + { + if(desc.pArgumentDescs[i].Type == D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH) + { + wrapped->sig.graphics = false; + break; + } + } + ret = wrapped; GetResourceManager()->AddLiveResource(CommandSig, ret);