diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 1b53c7913..cf225619f 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -1002,14 +1002,14 @@ void WrappedID3D12GraphicsCommandList::OMSetRenderTargets( { D3D12Descriptor *desc = GetWrapped(pRenderTargetDescriptors[i]); m_ListRecord->MarkResourceFrameReferenced(desc->nonsamp.heap->GetResourceID(), eFrameRef_Read); - m_ListRecord->MarkResourceFrameReferenced(GetResID(desc->nonsamp.resource), eFrameRef_Read); + m_ListRecord->MarkResourceFrameReferenced(GetResID(desc->nonsamp.resource), eFrameRef_Write); } if(pDepthStencilDescriptor) { D3D12Descriptor *desc = GetWrapped(*pDepthStencilDescriptor); m_ListRecord->MarkResourceFrameReferenced(desc->nonsamp.heap->GetResourceID(), eFrameRef_Read); - m_ListRecord->MarkResourceFrameReferenced(GetResID(desc->nonsamp.resource), eFrameRef_Read); + m_ListRecord->MarkResourceFrameReferenced(GetResID(desc->nonsamp.resource), eFrameRef_Write); } } } @@ -2406,22 +2406,204 @@ void WrappedID3D12GraphicsCommandList::ClearRenderTargetView( } } +bool WrappedID3D12GraphicsCommandList::Serialise_ClearUnorderedAccessViewUint( + D3D12_GPU_DESCRIPTOR_HANDLE ViewGPUHandleInCurrentHeap, D3D12_CPU_DESCRIPTOR_HANDLE ViewCPUHandle, + ID3D12Resource *pResource, const UINT Values[4], UINT NumRects, const D3D12_RECT *pRects) +{ + SERIALISE_ELEMENT(ResourceId, CommandList, GetResourceID()); + SERIALISE_ELEMENT(PortableHandle, gpuhandle, ToPortableHandle(ViewGPUHandleInCurrentHeap)); + SERIALISE_ELEMENT(PortableHandle, cpuhandle, ToPortableHandle(ViewCPUHandle)); + SERIALISE_ELEMENT(ResourceId, res, GetResID(pResource)); + + if(m_State < WRITING) + m_Cmd->m_LastCmdListID = CommandList; + + UINT vals[4] = {0}; + + if(m_State >= WRITING) + memcpy(vals, Values, sizeof(UINT) * 4); + + m_pSerialiser->SerialisePODArray<4>("Values", vals); + + SERIALISE_ELEMENT(UINT, num, NumRects); + SERIALISE_ELEMENT_ARR(D3D12_RECT, rects, pRects, num); + + if(m_State == EXECUTING) + { + ViewGPUHandleInCurrentHeap = GPUHandleFromPortableHandle(GetResourceManager(), gpuhandle); + ViewCPUHandle = CPUHandleFromPortableHandle(GetResourceManager(), cpuhandle); + pResource = GetResourceManager()->GetLiveAs(res); + + if(m_Cmd->ShouldRerecordCmd(CommandList) && m_Cmd->InRerecordRange(CommandList)) + { + Unwrap(m_Cmd->RerecordCmdList(CommandList)) + ->ClearUnorderedAccessViewUint(ViewGPUHandleInCurrentHeap, ViewCPUHandle, + Unwrap(pResource), vals, num, rects); + } + } + else if(m_State == READING) + { + ViewGPUHandleInCurrentHeap = GPUHandleFromPortableHandle(GetResourceManager(), gpuhandle); + ViewCPUHandle = CPUHandleFromPortableHandle(GetResourceManager(), cpuhandle); + pResource = GetResourceManager()->GetLiveAs(res); + + GetList(CommandList) + ->ClearUnorderedAccessViewUint(ViewGPUHandleInCurrentHeap, ViewCPUHandle, Unwrap(pResource), + vals, num, rects); + + const string desc = m_pSerialiser->GetDebugStr(); + + { + m_Cmd->AddEvent(CLEAR_UAV_INT, desc); + string name = "ClearUnorderedAccessViewUint(" + ToStr::Get(vals[0]) + "," + + ToStr::Get(vals[1]) + "," + ToStr::Get(vals[2]) + "," + ToStr::Get(vals[3]) + + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_Clear; + + m_Cmd->AddDrawcall(draw, true); + + D3D12DrawcallTreeNode &drawNode = m_Cmd->GetDrawcallStack().back()->children.back(); + + drawNode.resourceUsage.push_back( + std::make_pair(GetResID(pResource), EventUsage(drawNode.draw.eventID, eUsage_Clear))); + } + } + + SAFE_DELETE_ARRAY(rects); + + return true; +} + void WrappedID3D12GraphicsCommandList::ClearUnorderedAccessViewUint( D3D12_GPU_DESCRIPTOR_HANDLE ViewGPUHandleInCurrentHeap, D3D12_CPU_DESCRIPTOR_HANDLE ViewCPUHandle, ID3D12Resource *pResource, const UINT Values[4], UINT NumRects, const D3D12_RECT *pRects) { - D3D12NOTIMP(__PRETTY_FUNCTION_SIGNATURE__); m_pReal->ClearUnorderedAccessViewUint(Unwrap(ViewGPUHandleInCurrentHeap), Unwrap(ViewCPUHandle), Unwrap(pResource), Values, NumRects, pRects); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(CLEAR_UAV_INT); + Serialise_ClearUnorderedAccessViewUint(ViewGPUHandleInCurrentHeap, ViewCPUHandle, pResource, + Values, NumRects, pRects); + + m_ListRecord->AddChunk(scope.Get()); + + { + D3D12Descriptor *desc = GetWrapped(ViewGPUHandleInCurrentHeap); + m_ListRecord->MarkResourceFrameReferenced(desc->nonsamp.heap->GetResourceID(), eFrameRef_Read); + m_ListRecord->MarkResourceFrameReferenced(GetResID(desc->nonsamp.resource), eFrameRef_Write); + + desc = GetWrapped(ViewCPUHandle); + m_ListRecord->MarkResourceFrameReferenced(desc->nonsamp.heap->GetResourceID(), eFrameRef_Read); + m_ListRecord->MarkResourceFrameReferenced(GetResID(desc->nonsamp.resource), eFrameRef_Write); + + m_ListRecord->MarkResourceFrameReferenced(GetResID(pResource), eFrameRef_Write); + } + } +} + +bool WrappedID3D12GraphicsCommandList::Serialise_ClearUnorderedAccessViewFloat( + D3D12_GPU_DESCRIPTOR_HANDLE ViewGPUHandleInCurrentHeap, D3D12_CPU_DESCRIPTOR_HANDLE ViewCPUHandle, + ID3D12Resource *pResource, const FLOAT Values[4], UINT NumRects, const D3D12_RECT *pRects) +{ + SERIALISE_ELEMENT(ResourceId, CommandList, GetResourceID()); + SERIALISE_ELEMENT(PortableHandle, gpuhandle, ToPortableHandle(ViewGPUHandleInCurrentHeap)); + SERIALISE_ELEMENT(PortableHandle, cpuhandle, ToPortableHandle(ViewCPUHandle)); + SERIALISE_ELEMENT(ResourceId, res, GetResID(pResource)); + + if(m_State < WRITING) + m_Cmd->m_LastCmdListID = CommandList; + + FLOAT vals[4] = {0}; + + if(m_State >= WRITING) + memcpy(vals, Values, sizeof(FLOAT) * 4); + + m_pSerialiser->SerialisePODArray<4>("Values", vals); + + SERIALISE_ELEMENT(UINT, num, NumRects); + SERIALISE_ELEMENT_ARR(D3D12_RECT, rects, pRects, num); + + if(m_State == EXECUTING) + { + ViewGPUHandleInCurrentHeap = GPUHandleFromPortableHandle(GetResourceManager(), gpuhandle); + ViewCPUHandle = CPUHandleFromPortableHandle(GetResourceManager(), cpuhandle); + pResource = GetResourceManager()->GetLiveAs(res); + + if(m_Cmd->ShouldRerecordCmd(CommandList) && m_Cmd->InRerecordRange(CommandList)) + { + Unwrap(m_Cmd->RerecordCmdList(CommandList)) + ->ClearUnorderedAccessViewFloat(ViewGPUHandleInCurrentHeap, ViewCPUHandle, + Unwrap(pResource), vals, num, rects); + } + } + else if(m_State == READING) + { + ViewGPUHandleInCurrentHeap = GPUHandleFromPortableHandle(GetResourceManager(), gpuhandle); + ViewCPUHandle = CPUHandleFromPortableHandle(GetResourceManager(), cpuhandle); + pResource = GetResourceManager()->GetLiveAs(res); + + GetList(CommandList) + ->ClearUnorderedAccessViewFloat(ViewGPUHandleInCurrentHeap, ViewCPUHandle, + Unwrap(pResource), vals, num, rects); + + const string desc = m_pSerialiser->GetDebugStr(); + + { + m_Cmd->AddEvent(CLEAR_UAV_INT, desc); + string name = "ClearUnorderedAccessViewFloat(" + ToStr::Get(vals[0]) + "," + + ToStr::Get(vals[1]) + "," + ToStr::Get(vals[2]) + "," + ToStr::Get(vals[3]) + + ")"; + + FetchDrawcall draw; + draw.name = name; + draw.flags |= eDraw_Clear; + + m_Cmd->AddDrawcall(draw, true); + + D3D12DrawcallTreeNode &drawNode = m_Cmd->GetDrawcallStack().back()->children.back(); + + drawNode.resourceUsage.push_back( + std::make_pair(GetResID(pResource), EventUsage(drawNode.draw.eventID, eUsage_Clear))); + } + } + + SAFE_DELETE_ARRAY(rects); + + return true; } void WrappedID3D12GraphicsCommandList::ClearUnorderedAccessViewFloat( D3D12_GPU_DESCRIPTOR_HANDLE ViewGPUHandleInCurrentHeap, D3D12_CPU_DESCRIPTOR_HANDLE ViewCPUHandle, ID3D12Resource *pResource, const FLOAT Values[4], UINT NumRects, const D3D12_RECT *pRects) { - D3D12NOTIMP(__PRETTY_FUNCTION_SIGNATURE__); m_pReal->ClearUnorderedAccessViewFloat(Unwrap(ViewGPUHandleInCurrentHeap), Unwrap(ViewCPUHandle), Unwrap(pResource), Values, NumRects, pRects); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(CLEAR_UAV_FLOAT); + Serialise_ClearUnorderedAccessViewFloat(ViewGPUHandleInCurrentHeap, ViewCPUHandle, pResource, + Values, NumRects, pRects); + + m_ListRecord->AddChunk(scope.Get()); + + { + D3D12Descriptor *desc = GetWrapped(ViewGPUHandleInCurrentHeap); + m_ListRecord->MarkResourceFrameReferenced(desc->nonsamp.heap->GetResourceID(), eFrameRef_Read); + m_ListRecord->MarkResourceFrameReferenced(GetResID(desc->nonsamp.resource), eFrameRef_Write); + + desc = GetWrapped(ViewCPUHandle); + m_ListRecord->MarkResourceFrameReferenced(desc->nonsamp.heap->GetResourceID(), eFrameRef_Read); + m_ListRecord->MarkResourceFrameReferenced(GetResID(desc->nonsamp.resource), eFrameRef_Write); + + m_ListRecord->MarkResourceFrameReferenced(GetResID(pResource), eFrameRef_Write); + } + } } void WrappedID3D12GraphicsCommandList::DiscardResource(ID3D12Resource *pResource, diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 0ff8113f9..8792bcf3c 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -280,6 +280,14 @@ void WrappedID3D12CommandQueue::ProcessChunk(uint64_t offset, D3D12ChunkType chu m_ReplayList->Serialise_ClearDepthStencilView(D3D12_CPU_DESCRIPTOR_HANDLE(), D3D12_CLEAR_FLAGS(0), 0.0f, 0, 0, NULL); break; + case CLEAR_UAV_INT: + m_ReplayList->Serialise_ClearUnorderedAccessViewUint( + D3D12_GPU_DESCRIPTOR_HANDLE(), D3D12_CPU_DESCRIPTOR_HANDLE(), NULL, NULL, 0, NULL); + break; + case CLEAR_UAV_FLOAT: + m_ReplayList->Serialise_ClearUnorderedAccessViewFloat( + D3D12_GPU_DESCRIPTOR_HANDLE(), D3D12_CPU_DESCRIPTOR_HANDLE(), NULL, NULL, 0, NULL); + break; case SET_TOPOLOGY: m_ReplayList->Serialise_IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_UNDEFINED); diff --git a/renderdoc/driver/d3d12/d3d12_common.h b/renderdoc/driver/d3d12/d3d12_common.h index 8196ec50a..a75b9d511 100644 --- a/renderdoc/driver/d3d12/d3d12_common.h +++ b/renderdoc/driver/d3d12/d3d12_common.h @@ -256,6 +256,8 @@ void Serialiser::Serialise(const char *name, D3D12Descriptor &el); \ D3D12_CHUNK_MACRO(CLEAR_RTV, "ID3D12GraphicsCommandList::ClearRenderTargetView") \ D3D12_CHUNK_MACRO(CLEAR_DSV, "ID3D12GraphicsCommandList::ClearDepthStencilView") \ + D3D12_CHUNK_MACRO(CLEAR_UAV_INT, "ID3D12GraphicsCommandList::ClearUnorderedAccessViewUint") \ + D3D12_CHUNK_MACRO(CLEAR_UAV_FLOAT, "ID3D12GraphicsCommandList::ClearUnorderedAccessViewFloat") \ \ D3D12_CHUNK_MACRO(SET_TOPOLOGY, "ID3D12GraphicsCommandList::IASetPrimitiveTopology") \ D3D12_CHUNK_MACRO(SET_IBUFFER, "ID3D12GraphicsCommandList::IASetIndexBuffer") \