1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-27 04:54:15 +01:00

[d3d11] Refactor BindUnorderedAccessView

We won't do lazy bindings for UAVs, but at least bring this function
in line with the rest of the binding functions.
This commit is contained in:
Philip Rebohle 2025-02-19 13:11:26 +01:00 committed by Philip Rebohle
parent b0d881046f
commit 771f14c466
2 changed files with 32 additions and 61 deletions

View File

@ -2158,9 +2158,6 @@ namespace dxvk {
return; return;
// Unbind previously bound conflicting UAVs // Unbind previously bound conflicting UAVs
uint32_t uavSlotId = computeUavBinding (DxbcProgramType::ComputeShader, 0);
uint32_t ctrSlotId = computeUavCounterBinding(DxbcProgramType::ComputeShader, 0);
int32_t uavId = m_state.uav.mask.findNext(0); int32_t uavId = m_state.uav.mask.findNext(0);
while (uavId >= 0) { while (uavId >= 0) {
@ -2172,9 +2169,7 @@ namespace dxvk {
m_state.uav.views[uavId] = nullptr; m_state.uav.views[uavId] = nullptr;
m_state.uav.mask.clr(uavId); m_state.uav.mask.clr(uavId);
BindUnorderedAccessView<DxbcProgramType::ComputeShader>( BindUnorderedAccessView(DxbcProgramType::ComputeShader, uavId, nullptr, ~0u);
uavSlotId + uavId, nullptr,
ctrSlotId + uavId, ~0u);
} }
} }
@ -2193,10 +2188,7 @@ namespace dxvk {
m_state.uav.views[StartSlot + i] = uav; m_state.uav.views[StartSlot + i] = uav;
m_state.uav.mask.set(StartSlot + i, uav != nullptr); m_state.uav.mask.set(StartSlot + i, uav != nullptr);
BindUnorderedAccessView<DxbcProgramType::ComputeShader>( BindUnorderedAccessView(DxbcProgramType::ComputeShader, StartSlot + i, uav, ctr);
uavSlotId + StartSlot + i, uav,
ctrSlotId + StartSlot + i, ctr);
ResolveCsSrvHazards(uav); ResolveCsSrvHazards(uav);
} }
} }
@ -3923,25 +3915,28 @@ namespace dxvk {
template<typename ContextType> template<typename ContextType>
template<DxbcProgramType ShaderStage>
void D3D11CommonContext<ContextType>::BindUnorderedAccessView( void D3D11CommonContext<ContextType>::BindUnorderedAccessView(
UINT UavSlot, DxbcProgramType ShaderStage,
UINT Slot,
D3D11UnorderedAccessView* pUav, D3D11UnorderedAccessView* pUav,
UINT CtrSlot,
UINT Counter) { UINT Counter) {
uint32_t uavSlotId = computeUavBinding(ShaderStage, Slot);
uint32_t ctrSlotId = computeUavCounterBinding(ShaderStage, Slot);
VkShaderStageFlags stages = ShaderStage == DxbcProgramType::ComputeShader
? VK_SHADER_STAGE_COMPUTE_BIT
: VK_SHADER_STAGE_ALL_GRAPHICS;
if (pUav) { if (pUav) {
if (pUav->GetViewInfo().Dimension == D3D11_RESOURCE_DIMENSION_BUFFER) { if (pUav->GetViewInfo().Dimension == D3D11_RESOURCE_DIMENSION_BUFFER) {
EmitCs([ EmitCs([
cUavSlotId = UavSlot, cUavSlotId = uavSlotId,
cCtrSlotId = CtrSlot, cCtrSlotId = ctrSlotId,
cStages = stages,
cBufferView = pUav->GetBufferView(), cBufferView = pUav->GetBufferView(),
cCounterView = pUav->GetCounterView(), cCounterView = pUav->GetCounterView(),
cCounterValue = Counter cCounterValue = Counter
] (DxvkContext* ctx) mutable { ] (DxvkContext* ctx) mutable {
VkShaderStageFlags stages = ShaderStage == DxbcProgramType::ComputeShader
? VK_SHADER_STAGE_COMPUTE_BIT
: VK_SHADER_STAGE_ALL_GRAPHICS;
if (cCounterView != nullptr && cCounterValue != ~0u) { if (cCounterView != nullptr && cCounterValue != ~0u) {
DxvkBufferSlice counterSlice(cCounterView); DxvkBufferSlice counterSlice(cCounterView);
@ -3952,37 +3947,31 @@ namespace dxvk {
&cCounterValue); &cCounterValue);
} }
ctx->bindResourceBufferView(stages, cUavSlotId, ctx->bindResourceBufferView(cStages, cUavSlotId,
Forwarder::move(cBufferView)); Forwarder::move(cBufferView));
ctx->bindResourceBufferView(stages, cCtrSlotId, ctx->bindResourceBufferView(cStages, cCtrSlotId,
Forwarder::move(cCounterView)); Forwarder::move(cCounterView));
}); });
} else { } else {
EmitCs([ EmitCs([
cUavSlotId = UavSlot, cUavSlotId = uavSlotId,
cCtrSlotId = CtrSlot, cCtrSlotId = ctrSlotId,
cStages = stages,
cImageView = pUav->GetImageView() cImageView = pUav->GetImageView()
] (DxvkContext* ctx) mutable { ] (DxvkContext* ctx) mutable {
VkShaderStageFlags stages = ShaderStage == DxbcProgramType::ComputeShader ctx->bindResourceImageView(cStages, cUavSlotId,
? VK_SHADER_STAGE_COMPUTE_BIT
: VK_SHADER_STAGE_ALL_GRAPHICS;
ctx->bindResourceImageView(stages, cUavSlotId,
Forwarder::move(cImageView)); Forwarder::move(cImageView));
ctx->bindResourceBufferView(stages, cCtrSlotId, nullptr); ctx->bindResourceBufferView(cStages, cCtrSlotId, nullptr);
}); });
} }
} else { } else {
EmitCs([ EmitCs([
cUavSlotId = UavSlot, cUavSlotId = uavSlotId,
cCtrSlotId = CtrSlot cCtrSlotId = ctrSlotId,
cStages = stages
] (DxvkContext* ctx) { ] (DxvkContext* ctx) {
VkShaderStageFlags stages = ShaderStage == DxbcProgramType::ComputeShader ctx->bindResourceImageView(cStages, cUavSlotId, nullptr);
? VK_SHADER_STAGE_COMPUTE_BIT ctx->bindResourceBufferView(cStages, cCtrSlotId, nullptr);
: VK_SHADER_STAGE_ALL_GRAPHICS;
ctx->bindResourceImageView(stages, cUavSlotId, nullptr);
ctx->bindResourceBufferView(stages, cCtrSlotId, nullptr);
}); });
} }
} }
@ -4845,16 +4834,11 @@ namespace dxvk {
if (!pView || !pView->HasBindFlag(D3D11_BIND_UNORDERED_ACCESS)) if (!pView || !pView->HasBindFlag(D3D11_BIND_UNORDERED_ACCESS))
return; return;
uint32_t uavSlotId = computeUavBinding (DxbcProgramType::PixelShader, 0);
uint32_t ctrSlotId = computeUavCounterBinding(DxbcProgramType::PixelShader, 0);
for (uint32_t i = 0; i < m_state.om.maxUav; i++) { for (uint32_t i = 0; i < m_state.om.maxUav; i++) {
if (CheckViewOverlap(pView, m_state.om.uavs[i].ptr())) { if (CheckViewOverlap(pView, m_state.om.uavs[i].ptr())) {
m_state.om.uavs[i] = nullptr; m_state.om.uavs[i] = nullptr;
BindUnorderedAccessView<DxbcProgramType::PixelShader>( BindUnorderedAccessView(DxbcProgramType::PixelShader, i, nullptr, ~0u);
uavSlotId + i, nullptr,
ctrSlotId + i, ~0u);
} }
} }
} }
@ -4967,14 +4951,8 @@ namespace dxvk {
? m_state.uav.maxCount ? m_state.uav.maxCount
: m_state.om.maxUav; : m_state.om.maxUav;
uint32_t uavSlotId = computeUavBinding(Stage, 0); for (uint32_t i = 0; i < maxCount; i++)
uint32_t ctrSlotId = computeUavCounterBinding(Stage, 0); BindUnorderedAccessView(Stage, i, views[i].ptr(), ~0u);
for (uint32_t i = 0; i < maxCount; i++) {
BindUnorderedAccessView<Stage>(
uavSlotId + i, views[i].ptr(),
ctrSlotId + i, ~0u);
}
} }
@ -5191,9 +5169,6 @@ namespace dxvk {
} }
if (unlikely(NumUAVs || m_state.om.maxUav)) { if (unlikely(NumUAVs || m_state.om.maxUav)) {
uint32_t uavSlotId = computeUavBinding (DxbcProgramType::PixelShader, 0);
uint32_t ctrSlotId = computeUavCounterBinding(DxbcProgramType::PixelShader, 0);
if (likely(NumUAVs != D3D11_KEEP_UNORDERED_ACCESS_VIEWS)) { if (likely(NumUAVs != D3D11_KEEP_UNORDERED_ACCESS_VIEWS)) {
uint32_t newMaxUav = NumUAVs ? UAVStartSlot + NumUAVs : 0; uint32_t newMaxUav = NumUAVs ? UAVStartSlot + NumUAVs : 0;
uint32_t oldMaxUav = std::exchange(m_state.om.maxUav, newMaxUav); uint32_t oldMaxUav = std::exchange(m_state.om.maxUav, newMaxUav);
@ -5210,10 +5185,7 @@ namespace dxvk {
if (m_state.om.uavs[i] != uav || ctr != ~0u) { if (m_state.om.uavs[i] != uav || ctr != ~0u) {
m_state.om.uavs[i] = uav; m_state.om.uavs[i] = uav;
BindUnorderedAccessView<DxbcProgramType::PixelShader>( BindUnorderedAccessView(DxbcProgramType::PixelShader, i, uav, ctr);
uavSlotId + i, uav,
ctrSlotId + i, ctr);
ResolveOmSrvHazards(uav); ResolveOmSrvHazards(uav);
if (NumRTVs == D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL) if (NumRTVs == D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL)

View File

@ -896,11 +896,10 @@ namespace dxvk {
UINT Slot, UINT Slot,
D3D11ShaderResourceView* pResource); D3D11ShaderResourceView* pResource);
template<DxbcProgramType ShaderStage>
void BindUnorderedAccessView( void BindUnorderedAccessView(
UINT UavSlot, DxbcProgramType ShaderStage,
UINT Slot,
D3D11UnorderedAccessView* pUav, D3D11UnorderedAccessView* pUav,
UINT CtrSlot,
UINT Counter); UINT Counter);
VkClearValue ConvertColorValue( VkClearValue ConvertColorValue(