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
|
\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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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_);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user