From f664e877492e03d5f7296c77034b54334634d7d4 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 3 Aug 2022 20:21:02 +0200 Subject: [PATCH] [d3d11] Move CSSetUnorderedAccessViews to D3D11CommonContext --- src/d3d11/d3d11_context.cpp | 70 ----------------------------- src/d3d11/d3d11_context.h | 11 ----- src/d3d11/d3d11_context_common.cpp | 72 ++++++++++++++++++++++++++++++ src/d3d11/d3d11_context_common.h | 11 +++++ 4 files changed, 83 insertions(+), 81 deletions(-) diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 48f36906c..39f2b1974 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -1284,76 +1284,6 @@ namespace dxvk { } - void STDMETHODCALLTYPE D3D11DeviceContext::CSSetUnorderedAccessViews( - UINT StartSlot, - UINT NumUAVs, - ID3D11UnorderedAccessView* const* ppUnorderedAccessViews, - const UINT* pUAVInitialCounts) { - D3D10DeviceLock lock = LockContext(); - - if (TestRtvUavHazards(0, nullptr, NumUAVs, ppUnorderedAccessViews)) - return; - - // Unbind previously bound conflicting UAVs - uint32_t uavSlotId = computeUavBinding (DxbcProgramType::ComputeShader, 0); - uint32_t ctrSlotId = computeUavCounterBinding(DxbcProgramType::ComputeShader, 0); - - int32_t uavId = m_state.cs.uavMask.findNext(0); - - while (uavId >= 0) { - if (uint32_t(uavId) < StartSlot || uint32_t(uavId) >= StartSlot + NumUAVs) { - for (uint32_t i = 0; i < NumUAVs; i++) { - auto uav = static_cast(ppUnorderedAccessViews[i]); - - if (CheckViewOverlap(uav, m_state.cs.unorderedAccessViews[uavId].ptr())) { - m_state.cs.unorderedAccessViews[uavId] = nullptr; - m_state.cs.uavMask.clr(uavId); - - BindUnorderedAccessView( - uavSlotId + uavId, nullptr, - ctrSlotId + uavId, ~0u); - } - } - - uavId = m_state.cs.uavMask.findNext(uavId + 1); - } else { - uavId = m_state.cs.uavMask.findNext(StartSlot + NumUAVs); - } - } - - // Actually bind the given UAVs - for (uint32_t i = 0; i < NumUAVs; i++) { - auto uav = static_cast(ppUnorderedAccessViews[i]); - auto ctr = pUAVInitialCounts ? pUAVInitialCounts[i] : ~0u; - - if (m_state.cs.unorderedAccessViews[StartSlot + i] != uav || ctr != ~0u) { - m_state.cs.unorderedAccessViews[StartSlot + i] = uav; - m_state.cs.uavMask.set(StartSlot + i, uav != nullptr); - - BindUnorderedAccessView( - uavSlotId + StartSlot + i, uav, - ctrSlotId + StartSlot + i, ctr); - - ResolveCsSrvHazards(uav); - } - } - } - - - void STDMETHODCALLTYPE D3D11DeviceContext::CSGetUnorderedAccessViews( - UINT StartSlot, - UINT NumUAVs, - ID3D11UnorderedAccessView** ppUnorderedAccessViews) { - D3D10DeviceLock lock = LockContext(); - - for (uint32_t i = 0; i < NumUAVs; i++) { - ppUnorderedAccessViews[i] = StartSlot + i < m_state.cs.unorderedAccessViews.size() - ? m_state.cs.unorderedAccessViews[StartSlot + i].ref() - : nullptr; - } - } - - void STDMETHODCALLTYPE D3D11DeviceContext::RSSetState(ID3D11RasterizerState* pRasterizerState) { D3D10DeviceLock lock = LockContext(); diff --git a/src/d3d11/d3d11_context.h b/src/d3d11/d3d11_context.h index bf093c0b0..4cb0ebcb5 100644 --- a/src/d3d11/d3d11_context.h +++ b/src/d3d11/d3d11_context.h @@ -208,17 +208,6 @@ namespace dxvk { ID3D11Buffer* pBufferForArgs, UINT AlignedByteOffsetForArgs); - void STDMETHODCALLTYPE CSSetUnorderedAccessViews( - UINT StartSlot, - UINT NumUAVs, - ID3D11UnorderedAccessView* const* ppUnorderedAccessViews, - const UINT* pUAVInitialCounts); - - void STDMETHODCALLTYPE CSGetUnorderedAccessViews( - UINT StartSlot, - UINT NumUAVs, - ID3D11UnorderedAccessView** ppUnorderedAccessViews); - void STDMETHODCALLTYPE RSSetState( ID3D11RasterizerState* pRasterizerState); diff --git a/src/d3d11/d3d11_context_common.cpp b/src/d3d11/d3d11_context_common.cpp index 832c806c7..996ad3f7f 100644 --- a/src/d3d11/d3d11_context_common.cpp +++ b/src/d3d11/d3d11_context_common.cpp @@ -1085,6 +1085,63 @@ namespace dxvk { } + template + void STDMETHODCALLTYPE D3D11CommonContext::CSSetUnorderedAccessViews( + UINT StartSlot, + UINT NumUAVs, + ID3D11UnorderedAccessView* const* ppUnorderedAccessViews, + const UINT* pUAVInitialCounts) { + D3D10DeviceLock lock = LockContext(); + + if (TestRtvUavHazards(0, nullptr, NumUAVs, ppUnorderedAccessViews)) + return; + + // Unbind previously bound conflicting UAVs + uint32_t uavSlotId = computeUavBinding (DxbcProgramType::ComputeShader, 0); + uint32_t ctrSlotId = computeUavCounterBinding(DxbcProgramType::ComputeShader, 0); + + int32_t uavId = m_state.cs.uavMask.findNext(0); + + while (uavId >= 0) { + if (uint32_t(uavId) < StartSlot || uint32_t(uavId) >= StartSlot + NumUAVs) { + for (uint32_t i = 0; i < NumUAVs; i++) { + auto uav = static_cast(ppUnorderedAccessViews[i]); + + if (CheckViewOverlap(uav, m_state.cs.unorderedAccessViews[uavId].ptr())) { + m_state.cs.unorderedAccessViews[uavId] = nullptr; + m_state.cs.uavMask.clr(uavId); + + BindUnorderedAccessView( + uavSlotId + uavId, nullptr, + ctrSlotId + uavId, ~0u); + } + } + + uavId = m_state.cs.uavMask.findNext(uavId + 1); + } else { + uavId = m_state.cs.uavMask.findNext(StartSlot + NumUAVs); + } + } + + // Actually bind the given UAVs + for (uint32_t i = 0; i < NumUAVs; i++) { + auto uav = static_cast(ppUnorderedAccessViews[i]); + auto ctr = pUAVInitialCounts ? pUAVInitialCounts[i] : ~0u; + + if (m_state.cs.unorderedAccessViews[StartSlot + i] != uav || ctr != ~0u) { + m_state.cs.unorderedAccessViews[StartSlot + i] = uav; + m_state.cs.uavMask.set(StartSlot + i, uav != nullptr); + + BindUnorderedAccessView( + uavSlotId + StartSlot + i, uav, + ctrSlotId + StartSlot + i, ctr); + + ResolveCsSrvHazards(uav); + } + } + } + + template void STDMETHODCALLTYPE D3D11CommonContext::CSGetShader( ID3D11ComputeShader** ppComputeShader, @@ -1157,6 +1214,21 @@ namespace dxvk { } + template + void STDMETHODCALLTYPE D3D11CommonContext::CSGetUnorderedAccessViews( + UINT StartSlot, + UINT NumUAVs, + ID3D11UnorderedAccessView** ppUnorderedAccessViews) { + D3D10DeviceLock lock = LockContext(); + + for (uint32_t i = 0; i < NumUAVs; i++) { + ppUnorderedAccessViews[i] = StartSlot + i < m_state.cs.unorderedAccessViews.size() + ? m_state.cs.unorderedAccessViews[StartSlot + i].ref() + : nullptr; + } + } + + template void STDMETHODCALLTYPE D3D11CommonContext::OMSetRenderTargets( UINT NumViews, diff --git a/src/d3d11/d3d11_context_common.h b/src/d3d11/d3d11_context_common.h index 450218cad..ca7d8de57 100644 --- a/src/d3d11/d3d11_context_common.h +++ b/src/d3d11/d3d11_context_common.h @@ -418,6 +418,12 @@ namespace dxvk { UINT NumSamplers, ID3D11SamplerState* const* ppSamplers); + void STDMETHODCALLTYPE CSSetUnorderedAccessViews( + UINT StartSlot, + UINT NumUAVs, + ID3D11UnorderedAccessView* const* ppUnorderedAccessViews, + const UINT* pUAVInitialCounts); + void STDMETHODCALLTYPE CSGetShader( ID3D11ComputeShader** ppComputeShader, ID3D11ClassInstance** ppClassInstances, @@ -445,6 +451,11 @@ namespace dxvk { UINT NumSamplers, ID3D11SamplerState** ppSamplers); + void STDMETHODCALLTYPE CSGetUnorderedAccessViews( + UINT StartSlot, + UINT NumUAVs, + ID3D11UnorderedAccessView** ppUnorderedAccessViews); + void STDMETHODCALLTYPE OMSetRenderTargets( UINT NumViews, ID3D11RenderTargetView* const* ppRenderTargetViews,