rhi: Include resource count in srb layout compatibility checks

Relevant for Vulkan, given that descriptorCount is part of
VkDescriptorSetLayoutBinding, meaning two srbs with arrays of
SampledTextures should only be reported as compatible if the
array size matches.

Also reduces the prealloc size for the VLAs. For Qt Quick even a
lower number would be sufficient, but we still keep the number
something fairly high in order to play nice with Quick3D.

Pick-to: 6.2
Change-Id: Id92b7c09b051ebe54b1fa2bf4ba78950fe60ba27
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
This commit is contained in:
Laszlo Agocs 2021-09-01 12:26:39 +02:00
parent aac1858920
commit 6cdf95a970
2 changed files with 13 additions and 6 deletions

View File

@ -3044,9 +3044,11 @@ void QRhiImplementation::updateLayoutDesc(QRhiShaderResourceBindings *srb)
srb->m_layoutDesc.clear();
for (const QRhiShaderResourceBinding &b : qAsConst(srb->m_bindings)) {
const QRhiShaderResourceBinding::Data *d = b.data();
// must match QRhiShaderResourceBinding::isLayoutCompatible()
srb->m_layoutDescHash ^= uint(d->binding) ^ uint(d->stage) ^ uint(d->type);
srb->m_layoutDesc << uint(d->binding) << uint(d->stage) << uint(d->type);
// the logic must match QRhiShaderResourceBinding::isLayoutCompatible()
const int count = d->type == QRhiShaderResourceBinding::SampledTexture ? d->u.stex.count : 1;
// the number of entries here should match LAYOUT_DESC_FIELD_COUNT
srb->m_layoutDescHash ^= uint(d->binding) ^ uint(d->stage) ^ uint(d->type) ^ uint(count);
srb->m_layoutDesc << uint(d->binding) << uint(d->stage) << uint(d->type) << uint(count);
}
}
@ -3110,7 +3112,10 @@ void QRhiImplementation::updateLayoutDesc(QRhiShaderResourceBindings *srb)
*/
bool QRhiShaderResourceBinding::isLayoutCompatible(const QRhiShaderResourceBinding &other) const
{
return d.binding == other.d.binding && d.stage == other.d.stage && d.type == other.d.type;
// i.e. everything that goes into a VkDescriptorSetLayoutBinding must match
const int thisCount = d.type == QRhiShaderResourceBinding::SampledTexture ? d.u.stex.count : 1;
const int otherCount = other.d.type == QRhiShaderResourceBinding::SampledTexture ? other.d.u.stex.count : 1;
return d.binding == other.d.binding && d.stage == other.d.stage && d.type == other.d.type && thisCount == otherCount;
}
/*!

View File

@ -1040,10 +1040,12 @@ public:
virtual bool create() = 0;
protected:
static const int BINDING_PREALLOC = 12;
static const int LAYOUT_DESC_FIELD_COUNT = 4;
QRhiShaderResourceBindings(QRhiImplementation *rhi);
QVarLengthArray<QRhiShaderResourceBinding, 16> m_bindings;
QVarLengthArray<QRhiShaderResourceBinding, BINDING_PREALLOC> m_bindings;
uint m_layoutDescHash = 0;
QVarLengthArray<uint, 16 * 3> m_layoutDesc;
QVarLengthArray<uint, BINDING_PREALLOC * LAYOUT_DESC_FIELD_COUNT> m_layoutDesc;
friend class QRhiImplementation;
#ifndef QT_NO_DEBUG_STREAM
friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiShaderResourceBindings &);