diff --git a/src/gui/rhi/qrhi.cpp b/src/gui/rhi/qrhi.cpp index b9cf0a1a364..228fc91ce31 100644 --- a/src/gui/rhi/qrhi.cpp +++ b/src/gui/rhi/qrhi.cpp @@ -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; } /*! diff --git a/src/gui/rhi/qrhi_p.h b/src/gui/rhi/qrhi_p.h index c2a09b7edf7..1f05b7da8a4 100644 --- a/src/gui/rhi/qrhi_p.h +++ b/src/gui/rhi/qrhi_p.h @@ -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 m_bindings; + QVarLengthArray m_bindings; uint m_layoutDescHash = 0; - QVarLengthArray m_layoutDesc; + QVarLengthArray m_layoutDesc; friend class QRhiImplementation; #ifndef QT_NO_DEBUG_STREAM friend Q_GUI_EXPORT QDebug operator<<(QDebug, const QRhiShaderResourceBindings &);