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

View File

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