rhi: d3d11: Do not ignore storage buffer offset in the UAV

Change-Id: If6ef0345903b71adfc7b5633f1abcead9ca07c72
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
(cherry picked from commit bf6cc9a4e2825ecc1b64955dd6341a8ec758dacc)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Laszlo Agocs 2023-01-21 19:21:35 +01:00 committed by Qt Cherry-pick Bot
parent ea51c14fac
commit b6b218c680
2 changed files with 14 additions and 12 deletions

View File

@ -2324,7 +2324,7 @@ void QRhiD3D11::updateShaderResourceBindings(QD3D11ShaderResourceBindings *srbD,
if (b->stage.testFlag(QRhiShaderResourceBinding::ComputeStage)) { if (b->stage.testFlag(QRhiShaderResourceBinding::ComputeStage)) {
QPair<int, int> nativeBinding = mapBinding(b->binding, RBM_COMPUTE, nativeResourceBindingMaps); QPair<int, int> nativeBinding = mapBinding(b->binding, RBM_COMPUTE, nativeResourceBindingMaps);
if (nativeBinding.first >= 0) { if (nativeBinding.first >= 0) {
ID3D11UnorderedAccessView *uav = bufD->unorderedAccessView(); ID3D11UnorderedAccessView *uav = bufD->unorderedAccessView(b->u.sbuf.offset);
if (uav) if (uav)
res[RBM_COMPUTE].uavs.append({ nativeBinding.first, uav }); res[RBM_COMPUTE].uavs.append({ nativeBinding.first, uav });
} }
@ -2808,10 +2808,9 @@ void QD3D11Buffer::destroy()
delete[] dynBuf; delete[] dynBuf;
dynBuf = nullptr; dynBuf = nullptr;
if (uav) { for (auto it = uavs.begin(), end = uavs.end(); it != end; ++it)
uav->Release(); it.value()->Release();
uav = nullptr; uavs.clear();
}
QRHI_RES_RHI(QRhiD3D11); QRHI_RES_RHI(QRhiD3D11);
if (rhiD) if (rhiD)
@ -2913,20 +2912,22 @@ void QD3D11Buffer::endFullDynamicBufferUpdateForCurrentFrame()
rhiD->context->Unmap(buffer, 0); rhiD->context->Unmap(buffer, 0);
} }
ID3D11UnorderedAccessView *QD3D11Buffer::unorderedAccessView() ID3D11UnorderedAccessView *QD3D11Buffer::unorderedAccessView(quint32 offset)
{ {
if (uav) auto it = uavs.find(offset);
return uav; if (it != uavs.end())
return it.value();
// SPIRV-Cross generated HLSL uses RWByteAddressBuffer // SPIRV-Cross generated HLSL uses RWByteAddressBuffer
D3D11_UNORDERED_ACCESS_VIEW_DESC desc = {}; D3D11_UNORDERED_ACCESS_VIEW_DESC desc = {};
desc.Format = DXGI_FORMAT_R32_TYPELESS; desc.Format = DXGI_FORMAT_R32_TYPELESS;
desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;
desc.Buffer.FirstElement = 0; desc.Buffer.FirstElement = offset / 4u;
desc.Buffer.NumElements = aligned(m_size, 4u) / 4; desc.Buffer.NumElements = aligned(m_size - offset, 4u) / 4u;
desc.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_RAW; desc.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_RAW;
QRHI_RES_RHI(QRhiD3D11); QRHI_RES_RHI(QRhiD3D11);
ID3D11UnorderedAccessView *uav = nullptr;
HRESULT hr = rhiD->dev->CreateUnorderedAccessView(buffer, &desc, &uav); HRESULT hr = rhiD->dev->CreateUnorderedAccessView(buffer, &desc, &uav);
if (FAILED(hr)) { if (FAILED(hr)) {
qWarning("Failed to create UAV: %s", qWarning("Failed to create UAV: %s",
@ -2934,6 +2935,7 @@ ID3D11UnorderedAccessView *QD3D11Buffer::unorderedAccessView()
return nullptr; return nullptr;
} }
uavs[offset] = uav;
return uav; return uav;
} }

View File

@ -36,12 +36,12 @@ struct QD3D11Buffer : public QRhiBuffer
char *beginFullDynamicBufferUpdateForCurrentFrame() override; char *beginFullDynamicBufferUpdateForCurrentFrame() override;
void endFullDynamicBufferUpdateForCurrentFrame() override; void endFullDynamicBufferUpdateForCurrentFrame() override;
ID3D11UnorderedAccessView *unorderedAccessView(); ID3D11UnorderedAccessView *unorderedAccessView(quint32 offset);
ID3D11Buffer *buffer = nullptr; ID3D11Buffer *buffer = nullptr;
char *dynBuf = nullptr; char *dynBuf = nullptr;
bool hasPendingDynamicUpdates = false; bool hasPendingDynamicUpdates = false;
ID3D11UnorderedAccessView *uav = nullptr; QHash<quint32, ID3D11UnorderedAccessView *> uavs;
uint generation = 0; uint generation = 0;
friend class QRhiD3D11; friend class QRhiD3D11;
}; };