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>
This commit is contained in:
Laszlo Agocs 2023-10-24 21:29:44 +02:00
parent 9ea3947df9
commit 740d3a6b51
2 changed files with 59 additions and 54 deletions

View File

@ -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();

View File

@ -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;