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:
parent
9ea3947df9
commit
740d3a6b51
@ -849,12 +849,12 @@ void QRhiD3D12::setGraphicsPipeline(QRhiCommandBuffer *cb, QRhiGraphicsPipeline
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QRhiD3D12::visitUniformBuffer(QD3D12Stage s,
|
void QD3D12CommandBuffer::visitUniformBuffer(QD3D12Stage s,
|
||||||
const QRhiShaderResourceBinding::Data::UniformBufferData &d,
|
const QRhiShaderResourceBinding::Data::UniformBufferData &d,
|
||||||
int,
|
int,
|
||||||
int binding,
|
int binding,
|
||||||
int dynamicOffsetCount,
|
int dynamicOffsetCount,
|
||||||
const QRhiCommandBuffer::DynamicOffset *dynamicOffsets)
|
const QRhiCommandBuffer::DynamicOffset *dynamicOffsets)
|
||||||
{
|
{
|
||||||
QD3D12Buffer *bufD = QRHI_RES(QD3D12Buffer, d.buf);
|
QD3D12Buffer *bufD = QRHI_RES(QD3D12Buffer, d.buf);
|
||||||
quint32 offset = d.offset;
|
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,
|
void QD3D12CommandBuffer::visitTexture(QD3D12Stage s,
|
||||||
const QRhiShaderResourceBinding::TextureAndSampler &d,
|
const QRhiShaderResourceBinding::TextureAndSampler &d,
|
||||||
int)
|
int)
|
||||||
{
|
{
|
||||||
QD3D12Texture *texD = QRHI_RES(QD3D12Texture, d.tex);
|
QD3D12Texture *texD = QRHI_RES(QD3D12Texture, d.tex);
|
||||||
visitorData.srvs[s].append(texD->srv);
|
visitorData.srvs[s].append(texD->srv);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QRhiD3D12::visitSampler(QD3D12Stage s,
|
void QD3D12CommandBuffer::visitSampler(QD3D12Stage s,
|
||||||
const QRhiShaderResourceBinding::TextureAndSampler &d,
|
const QRhiShaderResourceBinding::TextureAndSampler &d,
|
||||||
int)
|
int)
|
||||||
{
|
{
|
||||||
QD3D12Sampler *samplerD = QRHI_RES(QD3D12Sampler, d.sampler);
|
QD3D12Sampler *samplerD = QRHI_RES(QD3D12Sampler, d.sampler);
|
||||||
visitorData.samplers[s].append(samplerD->lookupOrCreateShaderVisibleDescriptor());
|
visitorData.samplers[s].append(samplerD->lookupOrCreateShaderVisibleDescriptor());
|
||||||
}
|
}
|
||||||
|
|
||||||
void QRhiD3D12::visitStorageBuffer(QD3D12Stage s,
|
void QD3D12CommandBuffer::visitStorageBuffer(QD3D12Stage s,
|
||||||
const QRhiShaderResourceBinding::Data::StorageBufferData &d,
|
const QRhiShaderResourceBinding::Data::StorageBufferData &d,
|
||||||
QD3D12ShaderResourceVisitor::StorageOp,
|
QD3D12ShaderResourceVisitor::StorageOp,
|
||||||
int)
|
int)
|
||||||
{
|
{
|
||||||
QD3D12Buffer *bufD = QRHI_RES(QD3D12Buffer, d.buf);
|
QD3D12Buffer *bufD = QRHI_RES(QD3D12Buffer, d.buf);
|
||||||
// SPIRV-Cross generated HLSL uses RWByteAddressBuffer
|
// SPIRV-Cross generated HLSL uses RWByteAddressBuffer
|
||||||
@ -902,10 +903,10 @@ void QRhiD3D12::visitStorageBuffer(QD3D12Stage s,
|
|||||||
visitorData.uavs[s].append({ bufD->handles[0], uavDesc });
|
visitorData.uavs[s].append({ bufD->handles[0], uavDesc });
|
||||||
}
|
}
|
||||||
|
|
||||||
void QRhiD3D12::visitStorageImage(QD3D12Stage s,
|
void QD3D12CommandBuffer::visitStorageImage(QD3D12Stage s,
|
||||||
const QRhiShaderResourceBinding::Data::StorageImageData &d,
|
const QRhiShaderResourceBinding::Data::StorageImageData &d,
|
||||||
QD3D12ShaderResourceVisitor::StorageOp,
|
QD3D12ShaderResourceVisitor::StorageOp,
|
||||||
int)
|
int)
|
||||||
{
|
{
|
||||||
QD3D12Texture *texD = QRHI_RES(QD3D12Texture, d.tex);
|
QD3D12Texture *texD = QRHI_RES(QD3D12Texture, d.tex);
|
||||||
const bool isCube = texD->m_flags.testFlag(QRhiTexture::CubeMap);
|
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);
|
QD3D12ShaderResourceVisitor visitor(srbD, stageData, gfxPsD ? 5 : 1);
|
||||||
|
|
||||||
|
QD3D12CommandBuffer::VisitorData &visitorData(cbD->visitorData);
|
||||||
visitorData = {};
|
visitorData = {};
|
||||||
|
|
||||||
using namespace std::placeholders;
|
using namespace std::placeholders;
|
||||||
visitor.uniformBuffer = std::bind(&QRhiD3D12::visitUniformBuffer, this, _1, _2, _3, _4, dynamicOffsetCount, dynamicOffsets);
|
visitor.uniformBuffer = std::bind(&QD3D12CommandBuffer::visitUniformBuffer, cbD, _1, _2, _3, _4, dynamicOffsetCount, dynamicOffsets);
|
||||||
visitor.texture = std::bind(&QRhiD3D12::visitTexture, this, _1, _2, _3);
|
visitor.texture = std::bind(&QD3D12CommandBuffer::visitTexture, cbD, _1, _2, _3);
|
||||||
visitor.sampler = std::bind(&QRhiD3D12::visitSampler, this, _1, _2, _3);
|
visitor.sampler = std::bind(&QD3D12CommandBuffer::visitSampler, cbD, _1, _2, _3);
|
||||||
visitor.storageBuffer = std::bind(&QRhiD3D12::visitStorageBuffer, this, _1, _2, _3, _4);
|
visitor.storageBuffer = std::bind(&QD3D12CommandBuffer::visitStorageBuffer, cbD, _1, _2, _3, _4);
|
||||||
visitor.storageImage = std::bind(&QRhiD3D12::visitStorageImage, this, _1, _2, _3, _4);
|
visitor.storageImage = std::bind(&QD3D12CommandBuffer::visitStorageImage, cbD, _1, _2, _3, _4);
|
||||||
|
|
||||||
visitor.visit();
|
visitor.visit();
|
||||||
|
|
||||||
|
@ -687,6 +687,7 @@ struct QD3D12Buffer : public QRhiBuffer
|
|||||||
};
|
};
|
||||||
QVarLengthArray<HostWrite, 16> pendingHostWrites[QD3D12_FRAMES_IN_FLIGHT];
|
QVarLengthArray<HostWrite, 16> pendingHostWrites[QD3D12_FRAMES_IN_FLIGHT];
|
||||||
friend class QRhiD3D12;
|
friend class QRhiD3D12;
|
||||||
|
friend struct QD3D12CommandBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct QD3D12RenderBuffer : public QRhiRenderBuffer
|
struct QD3D12RenderBuffer : public QRhiRenderBuffer
|
||||||
@ -734,6 +735,7 @@ struct QD3D12Texture : public QRhiTexture
|
|||||||
DXGI_SAMPLE_DESC sampleDesc;
|
DXGI_SAMPLE_DESC sampleDesc;
|
||||||
uint generation = 0;
|
uint generation = 0;
|
||||||
friend class QRhiD3D12;
|
friend class QRhiD3D12;
|
||||||
|
friend struct QD3D12CommandBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct QD3D12Sampler : public QRhiSampler
|
struct QD3D12Sampler : public QRhiSampler
|
||||||
@ -963,6 +965,35 @@ struct QD3D12CommandBuffer : public QRhiCommandBuffer
|
|||||||
|
|
||||||
// global
|
// global
|
||||||
double lastGpuTime = 0;
|
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
|
struct QD3D12SwapChain : public QRhiSwapChain
|
||||||
@ -1202,34 +1233,6 @@ public:
|
|||||||
bool offscreenActive = false;
|
bool offscreenActive = false;
|
||||||
QD3D12CommandBuffer *offscreenCb[QD3D12_FRAMES_IN_FLIGHT] = {};
|
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 {
|
struct {
|
||||||
bool multiView = false;
|
bool multiView = false;
|
||||||
} caps;
|
} caps;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user