rhi: Add size param for internal buffer update used by Quick

Because reusing larger buffers for smaller data is very much a thing
in Qt Quick, depending on the scene. It happens rarely for uniform
buffers, for which this feature was originally invented, but when
vertex/index buffers switch over to being Dynamic, this same code
path is hit, and for those, recycling older QRhiBuffers for newer,
smaller data is common.

Change-Id: I41856adf6b8bb5486d05e186d3007f262e7dc987
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
(cherry picked from commit 28469b4dfc039601b898a1cdef873d458fbc19eb)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Laszlo Agocs 2024-10-17 11:36:41 +02:00 committed by Qt Cherry-pick Bot
parent ffd8d3e6b9
commit 44ae4e183e
4 changed files with 8 additions and 7 deletions

View File

@ -4005,11 +4005,11 @@ void QRhiBuffer::endFullDynamicBufferUpdateForCurrentFrame()
/*! /*!
\internal \internal
*/ */
void QRhiBuffer::fullDynamicBufferUpdateForCurrentFrame(const void *data) void QRhiBuffer::fullDynamicBufferUpdateForCurrentFrame(const void *data, quint32 size)
{ {
char *p = beginFullDynamicBufferUpdateForCurrentFrame(); char *p = beginFullDynamicBufferUpdateForCurrentFrame();
if (p) { if (p) {
memcpy(p, data, m_size); memcpy(p, data, size > 0 ? size : m_size);
endFullDynamicBufferUpdateForCurrentFrame(); endFullDynamicBufferUpdateForCurrentFrame();
} }
} }

View File

@ -881,7 +881,7 @@ public:
virtual char *beginFullDynamicBufferUpdateForCurrentFrame(); virtual char *beginFullDynamicBufferUpdateForCurrentFrame();
virtual void endFullDynamicBufferUpdateForCurrentFrame(); virtual void endFullDynamicBufferUpdateForCurrentFrame();
virtual void fullDynamicBufferUpdateForCurrentFrame(const void *data); virtual void fullDynamicBufferUpdateForCurrentFrame(const void *data, quint32 size = 0);
protected: protected:
QRhiBuffer(QRhiImplementation *rhi, Type type_, UsageFlags usage_, quint32 size_); QRhiBuffer(QRhiImplementation *rhi, Type type_, UsageFlags usage_, quint32 size_);

View File

@ -5356,14 +5356,15 @@ void QGles2Buffer::endFullDynamicBufferUpdateForCurrentFrame()
} }
} }
void QGles2Buffer::fullDynamicBufferUpdateForCurrentFrame(const void *bufferData) void QGles2Buffer::fullDynamicBufferUpdateForCurrentFrame(const void *bufferData, quint32 size)
{ {
const quint32 copySize = size > 0 ? size : m_size;
if (!m_usage.testFlag(UniformBuffer)) { if (!m_usage.testFlag(UniformBuffer)) {
QRHI_RES_RHI(QRhiGles2); QRHI_RES_RHI(QRhiGles2);
rhiD->f->glBindBuffer(targetForDataOps, buffer); rhiD->f->glBindBuffer(targetForDataOps, buffer);
rhiD->f->glBufferSubData(targetForDataOps, 0, m_size, bufferData); rhiD->f->glBufferSubData(targetForDataOps, 0, copySize, bufferData);
} else { } else {
memcpy(data.data(), bufferData, m_size); memcpy(data.data(), bufferData, copySize);
} }
} }

View File

@ -38,7 +38,7 @@ struct QGles2Buffer : public QRhiBuffer
QRhiBuffer::NativeBuffer nativeBuffer() override; QRhiBuffer::NativeBuffer nativeBuffer() override;
char *beginFullDynamicBufferUpdateForCurrentFrame() override; char *beginFullDynamicBufferUpdateForCurrentFrame() override;
void endFullDynamicBufferUpdateForCurrentFrame() override; void endFullDynamicBufferUpdateForCurrentFrame() override;
void fullDynamicBufferUpdateForCurrentFrame(const void *data) override; void fullDynamicBufferUpdateForCurrentFrame(const void *data, quint32 size) override;
quint32 nonZeroSize = 0; quint32 nonZeroSize = 0;
GLuint buffer = 0; GLuint buffer = 0;