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:
parent
b0d881046f
commit
771f14c466
@ -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)
|
||||||
|
@ -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(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user