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:
parent
ffd8d3e6b9
commit
44ae4e183e
@ -4005,11 +4005,11 @@ void QRhiBuffer::endFullDynamicBufferUpdateForCurrentFrame()
|
||||
/*!
|
||||
\internal
|
||||
*/
|
||||
void QRhiBuffer::fullDynamicBufferUpdateForCurrentFrame(const void *data)
|
||||
void QRhiBuffer::fullDynamicBufferUpdateForCurrentFrame(const void *data, quint32 size)
|
||||
{
|
||||
char *p = beginFullDynamicBufferUpdateForCurrentFrame();
|
||||
if (p) {
|
||||
memcpy(p, data, m_size);
|
||||
memcpy(p, data, size > 0 ? size : m_size);
|
||||
endFullDynamicBufferUpdateForCurrentFrame();
|
||||
}
|
||||
}
|
||||
|
@ -881,7 +881,7 @@ public:
|
||||
|
||||
virtual char *beginFullDynamicBufferUpdateForCurrentFrame();
|
||||
virtual void endFullDynamicBufferUpdateForCurrentFrame();
|
||||
virtual void fullDynamicBufferUpdateForCurrentFrame(const void *data);
|
||||
virtual void fullDynamicBufferUpdateForCurrentFrame(const void *data, quint32 size = 0);
|
||||
|
||||
protected:
|
||||
QRhiBuffer(QRhiImplementation *rhi, Type type_, UsageFlags usage_, quint32 size_);
|
||||
|
@ -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)) {
|
||||
QRHI_RES_RHI(QRhiGles2);
|
||||
rhiD->f->glBindBuffer(targetForDataOps, buffer);
|
||||
rhiD->f->glBufferSubData(targetForDataOps, 0, m_size, bufferData);
|
||||
rhiD->f->glBufferSubData(targetForDataOps, 0, copySize, bufferData);
|
||||
} else {
|
||||
memcpy(data.data(), bufferData, m_size);
|
||||
memcpy(data.data(), bufferData, copySize);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ struct QGles2Buffer : public QRhiBuffer
|
||||
QRhiBuffer::NativeBuffer nativeBuffer() override;
|
||||
char *beginFullDynamicBufferUpdateForCurrentFrame() override;
|
||||
void endFullDynamicBufferUpdateForCurrentFrame() override;
|
||||
void fullDynamicBufferUpdateForCurrentFrame(const void *data) override;
|
||||
void fullDynamicBufferUpdateForCurrentFrame(const void *data, quint32 size) override;
|
||||
|
||||
quint32 nonZeroSize = 0;
|
||||
GLuint buffer = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user