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:
parent
ea51c14fac
commit
b6b218c680
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user