From b52a4ae5538823fe75a2c277d3522f2c39559697 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 10 Aug 2018 10:24:59 +0100 Subject: [PATCH] Only unwrap command lists at the level we need * This prevents us from accidentally unwrapping at List2 level when List2 might not be available, and we only need List. * If we need higher list levels we can unwrap explicitly, and it's clearer that it needs an availability check. --- renderdoc/driver/d3d12/d3d12_command_list.h | 13 ++-- .../driver/d3d12/d3d12_command_list1_wrap.cpp | 66 +++++++++---------- .../driver/d3d12/d3d12_command_list_wrap.cpp | 12 +++- renderdoc/driver/d3d12/d3d12_commands.cpp | 22 +++++-- 4 files changed, 70 insertions(+), 43 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_command_list.h b/renderdoc/driver/d3d12/d3d12_command_list.h index c4754bf13..99f1abe81 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list.h +++ b/renderdoc/driver/d3d12/d3d12_command_list.h @@ -135,7 +135,9 @@ public: WrappedID3D12Device *GetWrappedDevice() { return m_pDevice; } D3D12ResourceRecord *GetResourceRecord() { return m_ListRecord; } D3D12ResourceRecord *GetCreationRecord() { return m_CreationRecord; } - ID3D12GraphicsCommandList2 *GetCrackedList(); + ID3D12GraphicsCommandList *GetCrackedList(); + ID3D12GraphicsCommandList1 *GetCrackedList1(); + ID3D12GraphicsCommandList2 *GetCrackedList2(); ID3D12GraphicsCommandList2 *GetWrappedCrackedList(); void SetAMDMarkerInterface(IAmdExtD3DCommandListMarker *marker) { m_AMDMarkers = marker; } @@ -449,10 +451,11 @@ ResourceId GetResID(ID3D12GraphicsCommandList1 *obj); template <> ResourceId GetResID(ID3D12GraphicsCommandList2 *obj); -template <> -ID3D12GraphicsCommandList1 *Unwrap(ID3D12GraphicsCommandList1 *obj); -template <> -ID3D12GraphicsCommandList2 *Unwrap(ID3D12GraphicsCommandList2 *obj); +ID3D12GraphicsCommandList *Unwrap(ID3D12GraphicsCommandList1 *obj); +ID3D12GraphicsCommandList *Unwrap(ID3D12GraphicsCommandList2 *obj); + +ID3D12GraphicsCommandList1 *Unwrap1(ID3D12GraphicsCommandList1 *obj); +ID3D12GraphicsCommandList2 *Unwrap2(ID3D12GraphicsCommandList2 *obj); WrappedID3D12GraphicsCommandList2 *GetWrapped(ID3D12GraphicsCommandList1 *obj); WrappedID3D12GraphicsCommandList2 *GetWrapped(ID3D12GraphicsCommandList2 *obj); \ No newline at end of file diff --git a/renderdoc/driver/d3d12/d3d12_command_list1_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list1_wrap.cpp index b48104717..4b4a34108 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list1_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list1_wrap.cpp @@ -65,9 +65,9 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_AtomicCopyBufferUINT( deps[i] = Unwrap(ppDependentResources[i]); ID3D12GraphicsCommandList1 *list = m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID); - Unwrap(list)->AtomicCopyBufferUINT(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), - SrcOffset, Dependencies, deps.data(), - pDependentSubresourceRanges); + Unwrap1(list)->AtomicCopyBufferUINT(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), + SrcOffset, Dependencies, deps.data(), + pDependentSubresourceRanges); } } else @@ -77,12 +77,12 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_AtomicCopyBufferUINT( for(size_t i = 0; i < deps.size(); i++) deps[i] = Unwrap(ppDependentResources[i]); - Unwrap(pCommandList) + Unwrap1(pCommandList) ->AtomicCopyBufferUINT(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), SrcOffset, Dependencies, deps.data(), pDependentSubresourceRanges); - GetCrackedList()->AtomicCopyBufferUINT(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), - SrcOffset, Dependencies, deps.data(), - pDependentSubresourceRanges); + GetCrackedList1()->AtomicCopyBufferUINT(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), + SrcOffset, Dependencies, deps.data(), + pDependentSubresourceRanges); { m_Cmd->AddEvent(); @@ -183,9 +183,9 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_AtomicCopyBufferUINT64( deps[i] = Unwrap(ppDependentResources[i]); ID3D12GraphicsCommandList1 *list = m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID); - Unwrap(list)->AtomicCopyBufferUINT64(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), - SrcOffset, Dependencies, deps.data(), - pDependentSubresourceRanges); + Unwrap1(list)->AtomicCopyBufferUINT64(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), + SrcOffset, Dependencies, deps.data(), + pDependentSubresourceRanges); } } else @@ -195,12 +195,12 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_AtomicCopyBufferUINT64( for(size_t i = 0; i < deps.size(); i++) deps[i] = Unwrap(ppDependentResources[i]); - Unwrap(pCommandList) + Unwrap1(pCommandList) ->AtomicCopyBufferUINT64(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), SrcOffset, Dependencies, deps.data(), pDependentSubresourceRanges); - GetCrackedList()->AtomicCopyBufferUINT64(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), - SrcOffset, Dependencies, deps.data(), - pDependentSubresourceRanges); + GetCrackedList1()->AtomicCopyBufferUINT64(Unwrap(pDstBuffer), DstOffset, Unwrap(pSrcBuffer), + SrcOffset, Dependencies, deps.data(), + pDependentSubresourceRanges); { m_Cmd->AddEvent(); @@ -288,7 +288,7 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_OMSetDepthBounds(SerialiserTyp { if(m_Cmd->InRerecordRange(m_Cmd->m_LastCmdListID)) { - Unwrap(m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID))->OMSetDepthBounds(Min, Max); + Unwrap1(m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID))->OMSetDepthBounds(Min, Max); if(m_Cmd->IsPartialCmdList(m_Cmd->m_LastCmdListID)) { @@ -299,8 +299,8 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_OMSetDepthBounds(SerialiserTyp } else { - Unwrap(pCommandList)->OMSetDepthBounds(Min, Max); - GetCrackedList()->OMSetDepthBounds(Min, Max); + Unwrap1(pCommandList)->OMSetDepthBounds(Min, Max); + GetCrackedList1()->OMSetDepthBounds(Min, Max); m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].state.depthBoundsMin = Min; m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].state.depthBoundsMax = Max; @@ -351,7 +351,7 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_SetSamplePositions( { if(m_Cmd->InRerecordRange(m_Cmd->m_LastCmdListID)) { - Unwrap(m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID)) + Unwrap1(m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID)) ->SetSamplePositions(NumSamplesPerPixel, NumPixels, pSamplePositions); if(m_Cmd->IsPartialCmdList(m_Cmd->m_LastCmdListID)) @@ -369,8 +369,8 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_SetSamplePositions( } else { - Unwrap(pCommandList)->SetSamplePositions(NumSamplesPerPixel, NumPixels, pSamplePositions); - GetCrackedList()->SetSamplePositions(NumSamplesPerPixel, NumPixels, pSamplePositions); + Unwrap1(pCommandList)->SetSamplePositions(NumSamplesPerPixel, NumPixels, pSamplePositions); + GetCrackedList1()->SetSamplePositions(NumSamplesPerPixel, NumPixels, pSamplePositions); { D3D12RenderState &state = m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].state; @@ -438,20 +438,20 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_ResolveSubresourceRegion( if(m_Cmd->InRerecordRange(m_Cmd->m_LastCmdListID)) { ID3D12GraphicsCommandList1 *list = m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID); - Unwrap(list)->ResolveSubresourceRegion(Unwrap(pDstResource), DstSubresource, DstX, DstY, - Unwrap(pSrcResource), SrcSubresource, pSrcRect, - Format, ResolveMode); + Unwrap1(list)->ResolveSubresourceRegion(Unwrap(pDstResource), DstSubresource, DstX, DstY, + Unwrap(pSrcResource), SrcSubresource, pSrcRect, + Format, ResolveMode); } } else { - Unwrap(pCommandList) + Unwrap1(pCommandList) ->ResolveSubresourceRegion(Unwrap(pDstResource), DstSubresource, DstX, DstY, Unwrap(pSrcResource), SrcSubresource, pSrcRect, Format, ResolveMode); - GetCrackedList()->ResolveSubresourceRegion(Unwrap(pDstResource), DstSubresource, DstX, DstY, - Unwrap(pSrcResource), SrcSubresource, pSrcRect, - Format, ResolveMode); + GetCrackedList1()->ResolveSubresourceRegion(Unwrap(pDstResource), DstSubresource, DstX, DstY, + Unwrap(pSrcResource), SrcSubresource, pSrcRect, + Format, ResolveMode); { m_Cmd->AddEvent(); @@ -534,7 +534,7 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_SetViewInstanceMask(Serialiser { if(m_Cmd->InRerecordRange(m_Cmd->m_LastCmdListID)) { - Unwrap(m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID))->SetViewInstanceMask(Mask); + Unwrap1(m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID))->SetViewInstanceMask(Mask); if(m_Cmd->IsPartialCmdList(m_Cmd->m_LastCmdListID)) m_Cmd->m_RenderState.viewInstMask = Mask; @@ -542,8 +542,8 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_SetViewInstanceMask(Serialiser } else { - Unwrap(pCommandList)->SetViewInstanceMask(Mask); - GetCrackedList()->SetViewInstanceMask(Mask); + Unwrap1(pCommandList)->SetViewInstanceMask(Mask); + GetCrackedList1()->SetViewInstanceMask(Mask); m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].state.viewInstMask = Mask; } @@ -596,14 +596,14 @@ bool WrappedID3D12GraphicsCommandList2::Serialise_WriteBufferImmediate( { if(m_Cmd->InRerecordRange(m_Cmd->m_LastCmdListID)) { - Unwrap(m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID)) + Unwrap2(m_Cmd->RerecordCmdList(m_Cmd->m_LastCmdListID)) ->WriteBufferImmediate(Count, pParams, pModes); } } else { - Unwrap(pCommandList)->WriteBufferImmediate(Count, pParams, pModes); - GetCrackedList()->WriteBufferImmediate(Count, pParams, pModes); + Unwrap2(pCommandList)->WriteBufferImmediate(Count, pParams, pModes); + GetCrackedList2()->WriteBufferImmediate(Count, pParams, pModes); } } diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 6ae7ef279..5cebf1b01 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -28,11 +28,21 @@ #include "d3d12_command_queue.h" #include "d3d12_debug.h" -ID3D12GraphicsCommandList2 *WrappedID3D12GraphicsCommandList2::GetCrackedList() +ID3D12GraphicsCommandList *WrappedID3D12GraphicsCommandList2::GetCrackedList() { return Unwrap(m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].crackedLists.back()); } +ID3D12GraphicsCommandList1 *WrappedID3D12GraphicsCommandList2::GetCrackedList1() +{ + return Unwrap1(m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].crackedLists.back()); +} + +ID3D12GraphicsCommandList2 *WrappedID3D12GraphicsCommandList2::GetCrackedList2() +{ + return Unwrap2(m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].crackedLists.back()); +} + ID3D12GraphicsCommandList2 *WrappedID3D12GraphicsCommandList2::GetWrappedCrackedList() { return m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].crackedLists.back(); diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index cc84d4d8b..2f48d8c31 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -40,8 +40,23 @@ ID3D12GraphicsCommandList *Unwrap(ID3D12GraphicsCommandList *obj) return ((WrappedID3D12GraphicsCommandList2 *)obj)->GetReal(); } -template <> -ID3D12GraphicsCommandList1 *Unwrap(ID3D12GraphicsCommandList1 *obj) +ID3D12GraphicsCommandList *Unwrap(ID3D12GraphicsCommandList1 *obj) +{ + if(obj == NULL) + return NULL; + + return ((WrappedID3D12GraphicsCommandList2 *)obj)->GetReal(); +} + +ID3D12GraphicsCommandList *Unwrap(ID3D12GraphicsCommandList2 *obj) +{ + if(obj == NULL) + return NULL; + + return ((WrappedID3D12GraphicsCommandList2 *)obj)->GetReal(); +} + +ID3D12GraphicsCommandList1 *Unwrap1(ID3D12GraphicsCommandList1 *obj) { if(obj == NULL) return NULL; @@ -49,8 +64,7 @@ ID3D12GraphicsCommandList1 *Unwrap(ID3D12GraphicsCommandList1 *obj) return ((WrappedID3D12GraphicsCommandList2 *)obj)->GetReal1(); } -template <> -ID3D12GraphicsCommandList2 *Unwrap(ID3D12GraphicsCommandList2 *obj) +ID3D12GraphicsCommandList2 *Unwrap2(ID3D12GraphicsCommandList2 *obj) { if(obj == NULL) return NULL;