diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index d2cf4331f..93104c977 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -3857,6 +3857,37 @@ void WrappedID3D12GraphicsCommandList::FinaliseExecuteIndirectEvents(BakedCmdLis break; } + case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_RAYS: + { + D3D12_DISPATCH_RAYS_DESC *args = (D3D12_DISPATCH_RAYS_DESC *)data; + data += sizeof(D3D12_DISPATCH_RAYS_DESC); + + curAction.dispatchDimension[0] = args->Width; + curAction.dispatchDimension[1] = args->Height; + curAction.dispatchDimension[2] = args->Depth; + curAction.flags |= ActionFlags::DispatchRay | ActionFlags::Indirect; + curAction.customName = + StringFormat::Fmt("[%u] arg%u: IndirectDispatchRays(<%u, %u, %u>)", i, a, + curAction.dispatchDimension[0], curAction.dispatchDimension[1], + curAction.dispatchDimension[2]); + + fakeChunk->name = curAction.customName; + + structuriser.Serialise("ArgumentData"_lit, *args).Important(); + + // if this is the first action of the indirect, we could have picked up previous + // non-indirect events in this action, so the EID will be higher than we expect. Just + // assign the action's EID + eid = curAction.eventId; + + m_Cmd->AddUsage(state, actions[idx]); + + // advance + idx++; + eid++; + + break; + } case D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT: { size_t argSize = sizeof(uint32_t) * arg.Constant.Num32BitValuesToSet; @@ -4282,6 +4313,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect( { case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH: case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH: + case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_RAYS: case D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED: case D3D12_INDIRECT_ARGUMENT_TYPE_DRAW: { diff --git a/renderdoc/driver/d3d12/d3d12_common.cpp b/renderdoc/driver/d3d12/d3d12_common.cpp index be988a6f2..f4e1af4bb 100644 --- a/renderdoc/driver/d3d12/d3d12_common.cpp +++ b/renderdoc/driver/d3d12/d3d12_common.cpp @@ -799,6 +799,7 @@ uint32_t ArgumentTypeByteSize(const D3D12_INDIRECT_ARGUMENT_DESC &arg) case D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED: return sizeof(D3D12_DRAW_INDEXED_ARGUMENTS); case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH: return sizeof(D3D12_DISPATCH_ARGUMENTS); case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH: return sizeof(D3D12_DISPATCH_MESH_ARGUMENTS); + case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_RAYS: return sizeof(D3D12_DISPATCH_RAYS_DESC); case D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT: return sizeof(uint32_t) * arg.Constant.Num32BitValuesToSet; case D3D12_INDIRECT_ARGUMENT_TYPE_VERTEX_BUFFER_VIEW: return sizeof(D3D12_VERTEX_BUFFER_VIEW); diff --git a/renderdoc/driver/d3d12/d3d12_common.h b/renderdoc/driver/d3d12/d3d12_common.h index 7f42891ab..51e49f264 100644 --- a/renderdoc/driver/d3d12/d3d12_common.h +++ b/renderdoc/driver/d3d12/d3d12_common.h @@ -554,6 +554,7 @@ DECLARE_REFLECTION_STRUCT(D3D12RootSignature); struct D3D12CommandSignature { bool graphics = true; + bool raytraced = false; UINT ByteStride = 0; UINT PackedByteSize = 0; rdcarray arguments; diff --git a/renderdoc/driver/d3d12/d3d12_debug.cpp b/renderdoc/driver/d3d12/d3d12_debug.cpp index 4443529e8..9395636ab 100644 --- a/renderdoc/driver/d3d12/d3d12_debug.cpp +++ b/renderdoc/driver/d3d12/d3d12_debug.cpp @@ -1041,6 +1041,11 @@ rdcpair D3D12DebugManager::PatchExecuteIndirect( offset += sizeof(D3D12_DISPATCH_MESH_ARGUMENTS); break; } + case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_RAYS: + { + offset += sizeof(D3D12_DISPATCH_RAYS_DESC); + break; + } case D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT: { offset += sizeof(uint32_t) * arg.Constant.Num32BitValuesToSet; diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index 0bed5d594..ff372474f 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -1851,6 +1851,12 @@ bool WrappedID3D12Device::Serialise_CreateCommandSignature(SerialiserType &ser, wrapped->sig.PackedByteSize += sizeof(D3D12_DISPATCH_MESH_ARGUMENTS); break; } + case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_RAYS: + { + wrapped->sig.PackedByteSize += sizeof(D3D12_DISPATCH_RAYS_DESC); + wrapped->sig.raytraced = true; + break; + } case D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT: { wrapped->sig.PackedByteSize += @@ -1947,6 +1953,10 @@ HRESULT WrappedID3D12Device::CreateCommandSignature(const D3D12_COMMAND_SIGNATUR GetResourceManager()->AddLiveResource(wrapped->GetResourceID(), wrapped); } + if(pDesc->pArgumentDescs[pDesc->NumArgumentDescs - 1].Type == + D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_RAYS) + wrapped->sig.raytraced = true; + *ppvCommandSignature = (ID3D12CommandSignature *)wrapped; } else diff --git a/renderdoc/driver/d3d12/d3d12_state.cpp b/renderdoc/driver/d3d12/d3d12_state.cpp index d6911f638..44d6d0375 100644 --- a/renderdoc/driver/d3d12/d3d12_state.cpp +++ b/renderdoc/driver/d3d12/d3d12_state.cpp @@ -92,7 +92,8 @@ void D3D12RenderState::ResolvePendingIndirectState(WrappedID3D12Device *device) case D3D12_INDIRECT_ARGUMENT_TYPE_DRAW: case D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED: case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH: - case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH: break; + case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_MESH: + case D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH_RAYS: break; case D3D12_INDIRECT_ARGUMENT_TYPE_CONSTANT: { size_t argSize = sizeof(uint32_t) * arg.Constant.Num32BitValuesToSet;