Process ray dispatches in indirect argument lists

This commit is contained in:
baldurk
2024-06-13 13:33:06 +01:00
parent e03c17d079
commit 652033dbc9
6 changed files with 51 additions and 1 deletions
@@ -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:
{
+1
View File
@@ -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);
+1
View File
@@ -554,6 +554,7 @@ DECLARE_REFLECTION_STRUCT(D3D12RootSignature);
struct D3D12CommandSignature
{
bool graphics = true;
bool raytraced = false;
UINT ByteStride = 0;
UINT PackedByteSize = 0;
rdcarray<D3D12_INDIRECT_ARGUMENT_DESC> arguments;
+5
View File
@@ -1041,6 +1041,11 @@ rdcpair<ID3D12Resource *, UINT64> 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;
@@ -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
+2 -1
View File
@@ -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;