diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2023-10-24 21:29:44 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2023-11-17 20:06:33 +0200 |
commit | 740d3a6b51e72812b78fc3e609478203ecacc903 (patch) | |
tree | 450e99cbbb9c8d82e8e1afa6c6488e9ef4bf49c0 | |
parent | 9ea3947df91fb113568cf08a7d5b7a87eda24de0 (diff) |
rhi: d3d12: Move the setSR visitor logic and data to the command buffer
More logical than throwing it in the main rhi backend object.
In addition, holding on to the generated data from the last
setShaderResources() per command buffer has great value if/when
more granular resource updating is introduced at some point.
Change-Id: I26887423cf66b27995ec92ae9965d99a40267066
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Kristoffer Skau <kristoffer.skau@qt.io>
Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r-- | src/gui/rhi/qrhid3d12.cpp | 54 | ||||
-rw-r--r-- | src/gui/rhi/qrhid3d12_p.h | 59 |
2 files changed, 59 insertions, 54 deletions
diff --git a/src/gui/rhi/qrhid3d12.cpp b/src/gui/rhi/qrhid3d12.cpp index febe5364e6..5846ea189d 100644 --- a/src/gui/rhi/qrhid3d12.cpp +++ b/src/gui/rhi/qrhid3d12.cpp @@ -849,12 +849,12 @@ void QRhiD3D12::setGraphicsPipeline(QRhiCommandBuffer *cb, QRhiGraphicsPipeline } } -void QRhiD3D12::visitUniformBuffer(QD3D12Stage s, - const QRhiShaderResourceBinding::Data::UniformBufferData &d, - int, - int binding, - int dynamicOffsetCount, - const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) +void QD3D12CommandBuffer::visitUniformBuffer(QD3D12Stage s, + const QRhiShaderResourceBinding::Data::UniformBufferData &d, + int, + int binding, + int dynamicOffsetCount, + const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) { QD3D12Buffer *bufD = QRHI_RES(QD3D12Buffer, d.buf); quint32 offset = d.offset; @@ -867,29 +867,30 @@ void QRhiD3D12::visitUniformBuffer(QD3D12Stage s, } } } - visitorData.cbufs[s].append({ bufD->handles[currentFrameSlot], offset }); + QRHI_RES_RHI(QRhiD3D12); + visitorData.cbufs[s].append({ bufD->handles[rhiD->currentFrameSlot], offset }); } -void QRhiD3D12::visitTexture(QD3D12Stage s, - const QRhiShaderResourceBinding::TextureAndSampler &d, - int) +void QD3D12CommandBuffer::visitTexture(QD3D12Stage s, + const QRhiShaderResourceBinding::TextureAndSampler &d, + int) { QD3D12Texture *texD = QRHI_RES(QD3D12Texture, d.tex); visitorData.srvs[s].append(texD->srv); } -void QRhiD3D12::visitSampler(QD3D12Stage s, - const QRhiShaderResourceBinding::TextureAndSampler &d, - int) +void QD3D12CommandBuffer::visitSampler(QD3D12Stage s, + const QRhiShaderResourceBinding::TextureAndSampler &d, + int) { QD3D12Sampler *samplerD = QRHI_RES(QD3D12Sampler, d.sampler); visitorData.samplers[s].append(samplerD->lookupOrCreateShaderVisibleDescriptor()); } -void QRhiD3D12::visitStorageBuffer(QD3D12Stage s, - const QRhiShaderResourceBinding::Data::StorageBufferData &d, - QD3D12ShaderResourceVisitor::StorageOp, - int) +void QD3D12CommandBuffer::visitStorageBuffer(QD3D12Stage s, + const QRhiShaderResourceBinding::Data::StorageBufferData &d, + QD3D12ShaderResourceVisitor::StorageOp, + int) { QD3D12Buffer *bufD = QRHI_RES(QD3D12Buffer, d.buf); // SPIRV-Cross generated HLSL uses RWByteAddressBuffer @@ -902,10 +903,10 @@ void QRhiD3D12::visitStorageBuffer(QD3D12Stage s, visitorData.uavs[s].append({ bufD->handles[0], uavDesc }); } -void QRhiD3D12::visitStorageImage(QD3D12Stage s, - const QRhiShaderResourceBinding::Data::StorageImageData &d, - QD3D12ShaderResourceVisitor::StorageOp, - int) +void QD3D12CommandBuffer::visitStorageImage(QD3D12Stage s, + const QRhiShaderResourceBinding::Data::StorageImageData &d, + QD3D12ShaderResourceVisitor::StorageOp, + int) { QD3D12Texture *texD = QRHI_RES(QD3D12Texture, d.tex); const bool isCube = texD->m_flags.testFlag(QRhiTexture::CubeMap); @@ -1064,14 +1065,15 @@ void QRhiD3D12::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBind QD3D12ShaderResourceVisitor visitor(srbD, stageData, gfxPsD ? 5 : 1); + QD3D12CommandBuffer::VisitorData &visitorData(cbD->visitorData); visitorData = {}; using namespace std::placeholders; - visitor.uniformBuffer = std::bind(&QRhiD3D12::visitUniformBuffer, this, _1, _2, _3, _4, dynamicOffsetCount, dynamicOffsets); - visitor.texture = std::bind(&QRhiD3D12::visitTexture, this, _1, _2, _3); - visitor.sampler = std::bind(&QRhiD3D12::visitSampler, this, _1, _2, _3); - visitor.storageBuffer = std::bind(&QRhiD3D12::visitStorageBuffer, this, _1, _2, _3, _4); - visitor.storageImage = std::bind(&QRhiD3D12::visitStorageImage, this, _1, _2, _3, _4); + visitor.uniformBuffer = std::bind(&QD3D12CommandBuffer::visitUniformBuffer, cbD, _1, _2, _3, _4, dynamicOffsetCount, dynamicOffsets); + visitor.texture = std::bind(&QD3D12CommandBuffer::visitTexture, cbD, _1, _2, _3); + visitor.sampler = std::bind(&QD3D12CommandBuffer::visitSampler, cbD, _1, _2, _3); + visitor.storageBuffer = std::bind(&QD3D12CommandBuffer::visitStorageBuffer, cbD, _1, _2, _3, _4); + visitor.storageImage = std::bind(&QD3D12CommandBuffer::visitStorageImage, cbD, _1, _2, _3, _4); visitor.visit(); diff --git a/src/gui/rhi/qrhid3d12_p.h b/src/gui/rhi/qrhid3d12_p.h index e4bf9a1fde..15567de542 100644 --- a/src/gui/rhi/qrhid3d12_p.h +++ b/src/gui/rhi/qrhid3d12_p.h @@ -687,6 +687,7 @@ struct QD3D12Buffer : public QRhiBuffer }; QVarLengthArray<HostWrite, 16> pendingHostWrites[QD3D12_FRAMES_IN_FLIGHT]; friend class QRhiD3D12; + friend struct QD3D12CommandBuffer; }; struct QD3D12RenderBuffer : public QRhiRenderBuffer @@ -734,6 +735,7 @@ struct QD3D12Texture : public QRhiTexture DXGI_SAMPLE_DESC sampleDesc; uint generation = 0; friend class QRhiD3D12; + friend struct QD3D12CommandBuffer; }; struct QD3D12Sampler : public QRhiSampler @@ -963,6 +965,35 @@ struct QD3D12CommandBuffer : public QRhiCommandBuffer // global double lastGpuTime = 0; + + // per-setShaderResources + struct VisitorData { + QVarLengthArray<QPair<QD3D12ObjectHandle, quint32>, 4> cbufs[6]; + QVarLengthArray<QD3D12Descriptor, 8> srvs[6]; + QVarLengthArray<QD3D12Descriptor, 8> samplers[6]; + QVarLengthArray<QPair<QD3D12ObjectHandle, D3D12_UNORDERED_ACCESS_VIEW_DESC>, 4> uavs[6]; + } visitorData; + + void visitUniformBuffer(QD3D12Stage s, + const QRhiShaderResourceBinding::Data::UniformBufferData &d, + int shaderRegister, + int binding, + int dynamicOffsetCount, + const QRhiCommandBuffer::DynamicOffset *dynamicOffsets); + void visitTexture(QD3D12Stage s, + const QRhiShaderResourceBinding::TextureAndSampler &d, + int shaderRegister); + void visitSampler(QD3D12Stage s, + const QRhiShaderResourceBinding::TextureAndSampler &d, + int shaderRegister); + void visitStorageBuffer(QD3D12Stage s, + const QRhiShaderResourceBinding::Data::StorageBufferData &d, + QD3D12ShaderResourceVisitor::StorageOp op, + int shaderRegister); + void visitStorageImage(QD3D12Stage s, + const QRhiShaderResourceBinding::Data::StorageImageData &d, + QD3D12ShaderResourceVisitor::StorageOp op, + int shaderRegister); }; struct QD3D12SwapChain : public QRhiSwapChain @@ -1202,34 +1233,6 @@ public: bool offscreenActive = false; QD3D12CommandBuffer *offscreenCb[QD3D12_FRAMES_IN_FLIGHT] = {}; - struct VisitorData { - QVarLengthArray<QPair<QD3D12ObjectHandle, quint32>, 4> cbufs[6]; - QVarLengthArray<QD3D12Descriptor, 8> srvs[6]; - QVarLengthArray<QD3D12Descriptor, 8> samplers[6]; - QVarLengthArray<QPair<QD3D12ObjectHandle, D3D12_UNORDERED_ACCESS_VIEW_DESC>, 4> uavs[6]; - } visitorData; - - void visitUniformBuffer(QD3D12Stage s, - const QRhiShaderResourceBinding::Data::UniformBufferData &d, - int shaderRegister, - int binding, - int dynamicOffsetCount, - const QRhiCommandBuffer::DynamicOffset *dynamicOffsets); - void visitTexture(QD3D12Stage s, - const QRhiShaderResourceBinding::TextureAndSampler &d, - int shaderRegister); - void visitSampler(QD3D12Stage s, - const QRhiShaderResourceBinding::TextureAndSampler &d, - int shaderRegister); - void visitStorageBuffer(QD3D12Stage s, - const QRhiShaderResourceBinding::Data::StorageBufferData &d, - QD3D12ShaderResourceVisitor::StorageOp op, - int shaderRegister); - void visitStorageImage(QD3D12Stage s, - const QRhiShaderResourceBinding::Data::StorageImageData &d, - QD3D12ShaderResourceVisitor::StorageOp op, - int shaderRegister); - struct { bool multiView = false; } caps; |