in renderdoc/driver/d3d12/d3d12_commands.cpp [693:1068]
bool WrappedID3D12CommandQueue::ProcessChunk(ReadSerialiser &ser, D3D12Chunk chunk)
{
m_Cmd.m_AddedAction = false;
bool ret = false;
switch(chunk)
{
case D3D12Chunk::Device_CreateConstantBufferView:
case D3D12Chunk::Device_CreateShaderResourceView:
case D3D12Chunk::Device_CreateUnorderedAccessView:
case D3D12Chunk::Device_CreateRenderTargetView:
case D3D12Chunk::Device_CreateDepthStencilView:
case D3D12Chunk::Device_CreateSampler:
case D3D12Chunk::Device_CreateSampler2:
ret = m_pDevice->Serialise_DynamicDescriptorWrite(ser, NULL);
break;
case D3D12Chunk::Device_CopyDescriptors:
case D3D12Chunk::Device_CopyDescriptorsSimple:
ret = m_pDevice->Serialise_DynamicDescriptorCopies(ser, rdcarray<DynamicDescriptorCopy>());
break;
case D3D12Chunk::Queue_ExecuteCommandLists:
ret = Serialise_ExecuteCommandLists(ser, 0, NULL);
break;
case D3D12Chunk::Queue_Signal: ret = Serialise_Signal(ser, NULL, 0); break;
case D3D12Chunk::Queue_Wait: ret = Serialise_Wait(ser, NULL, 0); break;
case D3D12Chunk::Queue_UpdateTileMappings:
ret = Serialise_UpdateTileMappings(ser, NULL, 0, NULL, NULL, NULL, 0, NULL, NULL, NULL,
D3D12_TILE_MAPPING_FLAGS(0));
break;
case D3D12Chunk::Queue_CopyTileMappings:
ret =
Serialise_CopyTileMappings(ser, NULL, NULL, NULL, NULL, NULL, D3D12_TILE_MAPPING_FLAGS(0));
break;
case D3D12Chunk::Queue_BeginEvent: ret = Serialise_BeginEvent(ser, 0, NULL, 0); break;
case D3D12Chunk::Queue_SetMarker: ret = Serialise_SetMarker(ser, 0, NULL, 0); break;
case D3D12Chunk::Queue_EndEvent: ret = Serialise_EndEvent(ser); break;
case D3D12Chunk::List_Close: ret = m_ReplayList->Serialise_Close(ser); break;
case D3D12Chunk::List_Reset: ret = m_ReplayList->Serialise_Reset(ser, NULL, NULL); break;
case D3D12Chunk::List_ResourceBarrier:
ret = m_ReplayList->Serialise_ResourceBarrier(ser, 0, NULL);
break;
case D3D12Chunk::List_BeginQuery:
ret = m_ReplayList->Serialise_BeginQuery(ser, NULL, D3D12_QUERY_TYPE(0), 0);
break;
case D3D12Chunk::List_EndQuery:
ret = m_ReplayList->Serialise_EndQuery(ser, NULL, D3D12_QUERY_TYPE(0), 0);
break;
case D3D12Chunk::List_ResolveQueryData:
ret = m_ReplayList->Serialise_ResolveQueryData(ser, NULL, D3D12_QUERY_TYPE(0), 0, 0, NULL, 0);
break;
case D3D12Chunk::List_SetPredication:
ret = m_ReplayList->Serialise_SetPredication(ser, NULL, 0, D3D12_PREDICATION_OP(0));
break;
case D3D12Chunk::List_DrawIndexedInstanced:
ret = m_ReplayList->Serialise_DrawIndexedInstanced(ser, 0, 0, 0, 0, 0);
break;
case D3D12Chunk::List_DrawInstanced:
ret = m_ReplayList->Serialise_DrawInstanced(ser, 0, 0, 0, 0);
break;
case D3D12Chunk::List_Dispatch: ret = m_ReplayList->Serialise_Dispatch(ser, 0, 0, 0); break;
case D3D12Chunk::List_ExecuteIndirect:
ret = m_ReplayList->Serialise_ExecuteIndirect(ser, NULL, 0, NULL, 0, NULL, 0);
break;
case D3D12Chunk::List_ExecuteBundle:
ret = m_ReplayList->Serialise_ExecuteBundle(ser, NULL);
break;
case D3D12Chunk::List_CopyBufferRegion:
ret = m_ReplayList->Serialise_CopyBufferRegion(ser, NULL, 0, NULL, 0, 0);
break;
case D3D12Chunk::List_CopyTextureRegion:
ret = m_ReplayList->Serialise_CopyTextureRegion(ser, NULL, 0, 0, 0, NULL, NULL);
break;
case D3D12Chunk::List_CopyResource:
ret = m_ReplayList->Serialise_CopyResource(ser, NULL, NULL);
break;
case D3D12Chunk::List_ResolveSubresource:
ret = m_ReplayList->Serialise_ResolveSubresource(ser, NULL, 0, NULL, 0, DXGI_FORMAT_UNKNOWN);
break;
case D3D12Chunk::List_ClearRenderTargetView:
ret = m_ReplayList->Serialise_ClearRenderTargetView(ser, D3D12_CPU_DESCRIPTOR_HANDLE(),
(FLOAT *)NULL, 0, NULL);
break;
case D3D12Chunk::List_ClearDepthStencilView:
ret = m_ReplayList->Serialise_ClearDepthStencilView(ser, D3D12_CPU_DESCRIPTOR_HANDLE(),
D3D12_CLEAR_FLAGS(0), 0.0f, 0, 0, NULL);
break;
case D3D12Chunk::List_ClearUnorderedAccessViewUint:
ret = m_ReplayList->Serialise_ClearUnorderedAccessViewUint(
ser, D3D12_GPU_DESCRIPTOR_HANDLE(), D3D12_CPU_DESCRIPTOR_HANDLE(), NULL, NULL, 0, NULL);
break;
case D3D12Chunk::List_ClearUnorderedAccessViewFloat:
ret = m_ReplayList->Serialise_ClearUnorderedAccessViewFloat(
ser, D3D12_GPU_DESCRIPTOR_HANDLE(), D3D12_CPU_DESCRIPTOR_HANDLE(), NULL, NULL, 0, NULL);
break;
case D3D12Chunk::List_DiscardResource:
ret = m_ReplayList->Serialise_DiscardResource(ser, NULL, NULL);
break;
case D3D12Chunk::List_IASetPrimitiveTopology:
ret = m_ReplayList->Serialise_IASetPrimitiveTopology(ser, D3D_PRIMITIVE_TOPOLOGY_UNDEFINED);
break;
case D3D12Chunk::List_IASetIndexBuffer:
ret = m_ReplayList->Serialise_IASetIndexBuffer(ser, NULL);
break;
case D3D12Chunk::List_IASetVertexBuffers:
ret = m_ReplayList->Serialise_IASetVertexBuffers(ser, 0, 0, NULL);
break;
case D3D12Chunk::List_SOSetTargets:
ret = m_ReplayList->Serialise_SOSetTargets(ser, 0, 0, NULL);
break;
case D3D12Chunk::List_RSSetViewports:
ret = m_ReplayList->Serialise_RSSetViewports(ser, 0, NULL);
break;
case D3D12Chunk::List_RSSetScissorRects:
ret = m_ReplayList->Serialise_RSSetScissorRects(ser, 0, NULL);
break;
case D3D12Chunk::List_SetPipelineState:
ret = m_ReplayList->Serialise_SetPipelineState(ser, NULL);
break;
case D3D12Chunk::List_SetDescriptorHeaps:
ret = m_ReplayList->Serialise_SetDescriptorHeaps(ser, 0, NULL);
break;
case D3D12Chunk::List_OMSetRenderTargets:
ret = m_ReplayList->Serialise_OMSetRenderTargets(ser, 0, NULL, FALSE, NULL);
break;
case D3D12Chunk::List_OMSetStencilRef:
ret = m_ReplayList->Serialise_OMSetStencilRef(ser, 0);
break;
case D3D12Chunk::List_OMSetBlendFactor:
ret = m_ReplayList->Serialise_OMSetBlendFactor(ser, NULL);
break;
case D3D12Chunk::List_SetGraphicsRootDescriptorTable:
ret = m_ReplayList->Serialise_SetGraphicsRootDescriptorTable(ser, 0,
D3D12_GPU_DESCRIPTOR_HANDLE());
break;
case D3D12Chunk::List_SetGraphicsRootSignature:
ret = m_ReplayList->Serialise_SetGraphicsRootSignature(ser, NULL);
break;
case D3D12Chunk::List_SetGraphicsRoot32BitConstant:
ret = m_ReplayList->Serialise_SetGraphicsRoot32BitConstant(ser, 0, 0, 0);
break;
case D3D12Chunk::List_SetGraphicsRoot32BitConstants:
ret = m_ReplayList->Serialise_SetGraphicsRoot32BitConstants(ser, 0, 0, NULL, 0);
break;
case D3D12Chunk::List_SetGraphicsRootConstantBufferView:
ret = m_ReplayList->Serialise_SetGraphicsRootConstantBufferView(ser, 0,
D3D12_GPU_VIRTUAL_ADDRESS());
break;
case D3D12Chunk::List_SetGraphicsRootShaderResourceView:
ret = m_ReplayList->Serialise_SetGraphicsRootShaderResourceView(ser, 0,
D3D12_GPU_VIRTUAL_ADDRESS());
break;
case D3D12Chunk::List_SetGraphicsRootUnorderedAccessView:
ret = m_ReplayList->Serialise_SetGraphicsRootUnorderedAccessView(ser, 0,
D3D12_GPU_VIRTUAL_ADDRESS());
break;
case D3D12Chunk::List_SetComputeRootDescriptorTable:
ret = m_ReplayList->Serialise_SetComputeRootDescriptorTable(ser, 0,
D3D12_GPU_DESCRIPTOR_HANDLE());
break;
case D3D12Chunk::List_SetComputeRootSignature:
ret = m_ReplayList->Serialise_SetComputeRootSignature(ser, NULL);
break;
case D3D12Chunk::List_SetComputeRoot32BitConstant:
ret = m_ReplayList->Serialise_SetComputeRoot32BitConstant(ser, 0, 0, 0);
break;
case D3D12Chunk::List_SetComputeRoot32BitConstants:
ret = m_ReplayList->Serialise_SetComputeRoot32BitConstants(ser, 0, 0, NULL, 0);
break;
case D3D12Chunk::List_SetComputeRootConstantBufferView:
ret = m_ReplayList->Serialise_SetComputeRootConstantBufferView(ser, 0,
D3D12_GPU_VIRTUAL_ADDRESS());
break;
case D3D12Chunk::List_SetComputeRootShaderResourceView:
ret = m_ReplayList->Serialise_SetComputeRootShaderResourceView(ser, 0,
D3D12_GPU_VIRTUAL_ADDRESS());
break;
case D3D12Chunk::List_SetComputeRootUnorderedAccessView:
ret = m_ReplayList->Serialise_SetComputeRootUnorderedAccessView(ser, 0,
D3D12_GPU_VIRTUAL_ADDRESS());
break;
case D3D12Chunk::List_CopyTiles:
ret = m_ReplayList->Serialise_CopyTiles(ser, NULL, NULL, NULL, NULL, 0,
D3D12_TILE_COPY_FLAGS(0));
break;
case D3D12Chunk::List_AtomicCopyBufferUINT:
ret = m_ReplayList->Serialise_AtomicCopyBufferUINT(ser, NULL, 0, NULL, 0, 0, NULL, NULL);
break;
case D3D12Chunk::List_AtomicCopyBufferUINT64:
ret = m_ReplayList->Serialise_AtomicCopyBufferUINT64(ser, NULL, 0, NULL, 0, 0, NULL, NULL);
break;
case D3D12Chunk::List_OMSetDepthBounds:
ret = m_ReplayList->Serialise_OMSetDepthBounds(ser, 0.0f, 0.0f);
break;
case D3D12Chunk::List_ResolveSubresourceRegion:
ret = m_ReplayList->Serialise_ResolveSubresourceRegion(
ser, NULL, 0, 0, 0, NULL, 0, NULL, DXGI_FORMAT_UNKNOWN, D3D12_RESOLVE_MODE_DECOMPRESS);
break;
case D3D12Chunk::List_SetSamplePositions:
ret = m_ReplayList->Serialise_SetSamplePositions(ser, 0, NULL, NULL);
break;
case D3D12Chunk::List_SetViewInstanceMask:
ret = m_ReplayList->Serialise_SetViewInstanceMask(ser, 0);
break;
case D3D12Chunk::List_WriteBufferImmediate:
ret = m_ReplayList->Serialise_WriteBufferImmediate(ser, 0, NULL, NULL);
break;
case D3D12Chunk::List_BeginRenderPass:
ret = m_ReplayList->Serialise_BeginRenderPass(ser, 0, NULL, NULL, D3D12_RENDER_PASS_FLAG_NONE);
break;
case D3D12Chunk::List_EndRenderPass: ret = m_ReplayList->Serialise_EndRenderPass(ser); break;
case D3D12Chunk::List_RSSetShadingRate:
ret = m_ReplayList->Serialise_RSSetShadingRate(ser, D3D12_SHADING_RATE_1X1, NULL);
break;
case D3D12Chunk::List_RSSetShadingRateImage:
ret = m_ReplayList->Serialise_RSSetShadingRateImage(ser, NULL);
break;
case D3D12Chunk::List_OMSetFrontAndBackStencilRef:
ret = m_ReplayList->Serialise_OMSetFrontAndBackStencilRef(ser, 0, 0);
break;
case D3D12Chunk::List_RSSetDepthBias:
ret = m_ReplayList->Serialise_RSSetDepthBias(ser, 0.0f, 0.0f, 0.0f);
break;
case D3D12Chunk::List_IASetIndexBufferStripCutValue:
ret = m_ReplayList->Serialise_IASetIndexBufferStripCutValue(
ser, D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED);
break;
case D3D12Chunk::List_Barrier: ret = m_ReplayList->Serialise_Barrier(ser, 0, NULL); break;
case D3D12Chunk::List_DispatchMesh:
ret = m_ReplayList->Serialise_DispatchMesh(ser, 0, 0, 0);
break;
case D3D12Chunk::PushMarker: ret = m_ReplayList->Serialise_BeginEvent(ser, 0, NULL, 0); break;
case D3D12Chunk::PopMarker: ret = m_ReplayList->Serialise_EndEvent(ser); break;
case D3D12Chunk::SetMarker: ret = m_ReplayList->Serialise_SetMarker(ser, 0, NULL, 0); break;
case D3D12Chunk::CoherentMapWrite:
case D3D12Chunk::Resource_Unmap:
ret = m_pDevice->Serialise_MapDataWrite(ser, NULL, 0, NULL, D3D12_RANGE(), false);
break;
case D3D12Chunk::Resource_WriteToSubresource:
ret = m_pDevice->Serialise_WriteToSubresource(ser, NULL, 0, NULL, NULL, 0, 0);
break;
case D3D12Chunk::List_IndirectSubCommand:
// this is a fake chunk generated at runtime as part of indirect draws.
// Just in case it gets exported and imported, completely ignore it.
return true;
case D3D12Chunk::Swapchain_Present: ret = m_pDevice->Serialise_Present(ser, NULL, 0, 0); break;
case D3D12Chunk::List_ClearState: ret = m_ReplayList->Serialise_ClearState(ser, NULL); break;
case D3D12Chunk::List_BuildRaytracingAccelerationStructure:
ret = m_ReplayList->Serialise_BuildRaytracingAccelerationStructure(ser, NULL, 0, NULL);
break;
case D3D12Chunk::List_CopyRaytracingAccelerationStructure:
ret = m_ReplayList->Serialise_CopyRaytracingAccelerationStructure(
ser, D3D12_GPU_VIRTUAL_ADDRESS(), D3D12_GPU_VIRTUAL_ADDRESS(),
D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_CLONE);
break;
case D3D12Chunk::List_EmitRaytracingAccelerationStructurePostbuildInfo:
ret = m_ReplayList->Serialise_EmitRaytracingAccelerationStructurePostbuildInfo(ser, NULL, 0,
NULL);
break;
case D3D12Chunk::List_DispatchRays:
ret = m_ReplayList->Serialise_DispatchRays(ser, NULL);
break;
case D3D12Chunk::List_SetPipelineState1:
ret = m_ReplayList->Serialise_SetPipelineState1(ser, NULL);
break;
// in order to get a warning if we miss a case, we explicitly handle the device creation chunks
// here. If we actually encounter one it's an error (we shouldn't see these inside the captured
// frame itself)
case D3D12Chunk::Device_CreateCommandQueue:
case D3D12Chunk::Device_CreateCommandAllocator:
case D3D12Chunk::Device_CreateCommandList:
case D3D12Chunk::Device_CreateGraphicsPipeline:
case D3D12Chunk::Device_CreateComputePipeline:
case D3D12Chunk::Device_CreateDescriptorHeap:
case D3D12Chunk::Device_CreateRootSignature:
case D3D12Chunk::Device_CreateCommandSignature:
case D3D12Chunk::Device_CreateHeap:
case D3D12Chunk::Device_CreateCommittedResource:
case D3D12Chunk::Device_CreatePlacedResource:
case D3D12Chunk::Device_CreateReservedResource:
case D3D12Chunk::Device_CreateQueryHeap:
case D3D12Chunk::Device_CreateFence:
case D3D12Chunk::SetName:
case D3D12Chunk::SetShaderDebugPath:
case D3D12Chunk::CreateSwapBuffer:
case D3D12Chunk::Device_CreatePipelineState:
case D3D12Chunk::Device_CreateHeapFromAddress:
case D3D12Chunk::Device_CreateHeapFromFileMapping:
case D3D12Chunk::Device_OpenSharedHandle:
case D3D12Chunk::Device_CreateCommandList1:
case D3D12Chunk::Device_CreateCommittedResource1:
case D3D12Chunk::Device_CreateHeap1:
case D3D12Chunk::Device_ExternalDXGIResource:
case D3D12Chunk::CompatDevice_CreateSharedResource:
case D3D12Chunk::CompatDevice_CreateSharedHeap:
case D3D12Chunk::SetShaderExtUAV:
case D3D12Chunk::Device_CreateCommittedResource2:
case D3D12Chunk::Device_CreatePlacedResource1:
case D3D12Chunk::Device_CreateCommandQueue1:
case D3D12Chunk::Device_CreateCommittedResource3:
case D3D12Chunk::Device_CreatePlacedResource2:
case D3D12Chunk::Device_CreateReservedResource1:
case D3D12Chunk::Device_CreateReservedResource2:
case D3D12Chunk::Device_CreateStateObject:
case D3D12Chunk::Device_AddToStateObject:
case D3D12Chunk::CreateAS:
RDCERR("Unexpected chunk while processing frame: %s", ToStr(chunk).c_str());
return false;
// no explicit default so that we have compiler warnings if a chunk isn't explicitly handled.
case D3D12Chunk::Max: break;
}
{
SystemChunk system = (SystemChunk)chunk;
if(system == SystemChunk::CaptureEnd)
{
SERIALISE_ELEMENT_LOCAL(PresentedImage, ResourceId()).TypedAs("ID3D12Resource *"_lit);
SERIALISE_CHECK_READ_ERRORS();
if(PresentedImage != ResourceId())
m_Cmd.m_LastPresentedImage = PresentedImage;
if(IsLoading(m_State) && m_Cmd.m_LastChunk != D3D12Chunk::Swapchain_Present)
{
m_Cmd.AddEvent();
ActionDescription action;
action.customName = "End of Capture";
action.flags |= ActionFlags::Present;
action.copyDestination = m_Cmd.m_LastPresentedImage;
m_Cmd.AddAction(action);
}
ret = true;
}
else if(!ret)
{
RDCERR("Chunk failed to serialise: %s", ToStr(chunk).c_str());
return false;
}
}
if(IsLoading(m_State))
{
if(chunk == D3D12Chunk::List_Reset || chunk == D3D12Chunk::List_Close)
{
// don't add these events - they will be handled when inserted in-line into queue submit
}
else if(chunk == D3D12Chunk::Queue_EndEvent)
{
// also ignore, this just pops the action stack
}
else
{
if(!m_Cmd.m_AddedAction)
m_Cmd.AddEvent();
}
}
m_Cmd.m_AddedAction = false;
return ret;
}