rhi: Use QByteArray for storing data in QGles2Buffer
Mainly to avoid leaking memory again. A possible reduction of memory allocations would be a welcome side effect. This reverts parts of 89f7389494c6fc917f189150e06ed1fcfaa238e8. Change-Id: I65a7529f532175967a4e408450aa55549b77d7e4 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
This commit is contained in:
parent
7661fdce0a
commit
9b625ec89d
@ -1940,7 +1940,7 @@ void QRhiGles2::enqueueResourceUpdates(QRhiCommandBuffer *cb, QRhiResourceUpdate
|
|||||||
QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, u.buf);
|
QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, u.buf);
|
||||||
Q_ASSERT(bufD->m_type == QRhiBuffer::Dynamic);
|
Q_ASSERT(bufD->m_type == QRhiBuffer::Dynamic);
|
||||||
if (bufD->m_usage.testFlag(QRhiBuffer::UniformBuffer)) {
|
if (bufD->m_usage.testFlag(QRhiBuffer::UniformBuffer)) {
|
||||||
memcpy(bufD->data + u.offset, u.data.constData(), size_t(u.data.size()));
|
memcpy(bufD->data.data() + u.offset, u.data.constData(), size_t(u.data.size()));
|
||||||
} else {
|
} else {
|
||||||
trackedBufferBarrier(cbD, bufD, QGles2Buffer::AccessUpdate);
|
trackedBufferBarrier(cbD, bufD, QGles2Buffer::AccessUpdate);
|
||||||
QGles2CommandBuffer::Command &cmd(cbD->commands.get());
|
QGles2CommandBuffer::Command &cmd(cbD->commands.get());
|
||||||
@ -1956,7 +1956,7 @@ void QRhiGles2::enqueueResourceUpdates(QRhiCommandBuffer *cb, QRhiResourceUpdate
|
|||||||
Q_ASSERT(bufD->m_type != QRhiBuffer::Dynamic);
|
Q_ASSERT(bufD->m_type != QRhiBuffer::Dynamic);
|
||||||
Q_ASSERT(u.offset + u.data.size() <= bufD->m_size);
|
Q_ASSERT(u.offset + u.data.size() <= bufD->m_size);
|
||||||
if (bufD->m_usage.testFlag(QRhiBuffer::UniformBuffer)) {
|
if (bufD->m_usage.testFlag(QRhiBuffer::UniformBuffer)) {
|
||||||
memcpy(bufD->data + u.offset, u.data.constData(), size_t(u.data.size()));
|
memcpy(bufD->data.data() + u.offset, u.data.constData(), size_t(u.data.size()));
|
||||||
} else {
|
} else {
|
||||||
trackedBufferBarrier(cbD, bufD, QGles2Buffer::AccessUpdate);
|
trackedBufferBarrier(cbD, bufD, QGles2Buffer::AccessUpdate);
|
||||||
QGles2CommandBuffer::Command &cmd(cbD->commands.get());
|
QGles2CommandBuffer::Command &cmd(cbD->commands.get());
|
||||||
@ -1971,7 +1971,7 @@ void QRhiGles2::enqueueResourceUpdates(QRhiCommandBuffer *cb, QRhiResourceUpdate
|
|||||||
QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, u.buf);
|
QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, u.buf);
|
||||||
if (bufD->m_usage.testFlag(QRhiBuffer::UniformBuffer)) {
|
if (bufD->m_usage.testFlag(QRhiBuffer::UniformBuffer)) {
|
||||||
u.result->data.resize(u.readSize);
|
u.result->data.resize(u.readSize);
|
||||||
memcpy(u.result->data.data(), bufD->data + u.offset, size_t(u.readSize));
|
memcpy(u.result->data.data(), bufD->data.constData() + u.offset, size_t(u.readSize));
|
||||||
if (u.result->completed)
|
if (u.result->completed)
|
||||||
u.result->completed();
|
u.result->completed();
|
||||||
} else {
|
} else {
|
||||||
@ -3220,7 +3220,7 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, b->u.ubuf.buf);
|
QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, b->u.ubuf.buf);
|
||||||
const char *bufView = bufD->data + viewOffset;
|
const char *bufView = bufD->data.constData() + viewOffset;
|
||||||
for (const QGles2UniformDescription &uniform : qAsConst(uniforms)) {
|
for (const QGles2UniformDescription &uniform : qAsConst(uniforms)) {
|
||||||
if (uniform.binding == b->binding) {
|
if (uniform.binding == b->binding) {
|
||||||
// in a uniform buffer everything is at least 4 byte aligned
|
// in a uniform buffer everything is at least 4 byte aligned
|
||||||
@ -4245,9 +4245,7 @@ QGles2Buffer::~QGles2Buffer()
|
|||||||
|
|
||||||
void QGles2Buffer::destroy()
|
void QGles2Buffer::destroy()
|
||||||
{
|
{
|
||||||
delete[] data;
|
data.clear();
|
||||||
data = nullptr;
|
|
||||||
|
|
||||||
if (!buffer)
|
if (!buffer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -4279,8 +4277,7 @@ bool QGles2Buffer::create()
|
|||||||
qWarning("Uniform buffer: multiple usages specified, this is not supported by the OpenGL backend");
|
qWarning("Uniform buffer: multiple usages specified, this is not supported by the OpenGL backend");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
delete[] data;
|
data.resize(nonZeroSize);
|
||||||
data = new char[nonZeroSize];
|
|
||||||
QRHI_PROF_F(newBuffer(this, uint(nonZeroSize), 0, 1));
|
QRHI_PROF_F(newBuffer(this, uint(nonZeroSize), 0, 1));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -4324,11 +4321,11 @@ char *QGles2Buffer::beginFullDynamicBufferUpdateForCurrentFrame()
|
|||||||
GL_MAP_READ_BIT | GL_MAP_WRITE_BIT));
|
GL_MAP_READ_BIT | GL_MAP_WRITE_BIT));
|
||||||
} else {
|
} else {
|
||||||
// Need some storage for the data, use the otherwise unused 'data' member.
|
// Need some storage for the data, use the otherwise unused 'data' member.
|
||||||
if (!data)
|
if (data.isEmpty())
|
||||||
data = new char[nonZeroSize];
|
data.resize(nonZeroSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return data;
|
return data.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QGles2Buffer::endFullDynamicBufferUpdateForCurrentFrame()
|
void QGles2Buffer::endFullDynamicBufferUpdateForCurrentFrame()
|
||||||
@ -4338,7 +4335,7 @@ void QGles2Buffer::endFullDynamicBufferUpdateForCurrentFrame()
|
|||||||
if (rhiD->caps.properMapBuffer)
|
if (rhiD->caps.properMapBuffer)
|
||||||
rhiD->f->glUnmapBuffer(targetForDataOps);
|
rhiD->f->glUnmapBuffer(targetForDataOps);
|
||||||
else
|
else
|
||||||
rhiD->f->glBufferSubData(targetForDataOps, 0, nonZeroSize, data);
|
rhiD->f->glBufferSubData(targetForDataOps, 0, nonZeroSize, data.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#include "qrhi_p_p.h"
|
#include "qrhi_p_p.h"
|
||||||
#include "qshaderdescription_p.h"
|
#include "qshaderdescription_p.h"
|
||||||
#include <qopengl.h>
|
#include <qopengl.h>
|
||||||
|
#include <QByteArray>
|
||||||
#include <QSurface>
|
#include <QSurface>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
@ -74,7 +75,7 @@ struct QGles2Buffer : public QRhiBuffer
|
|||||||
int nonZeroSize = 0;
|
int nonZeroSize = 0;
|
||||||
GLuint buffer = 0;
|
GLuint buffer = 0;
|
||||||
GLenum targetForDataOps;
|
GLenum targetForDataOps;
|
||||||
char *data = nullptr;
|
QByteArray data;
|
||||||
enum Access {
|
enum Access {
|
||||||
AccessNone,
|
AccessNone,
|
||||||
AccessVertex,
|
AccessVertex,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user