summaryrefslogtreecommitdiffstats
path: root/src/gui/rhi/qrhigles2.cpp
diff options
context:
space:
mode:
authorRobert Löhning <robert.loehning@qt.io>2021-05-12 22:58:07 +0200
committerRobert Löhning <robert.loehning@qt.io>2021-06-08 21:27:41 +0200
commit9b625ec89dd796f7eff16aedef6aa23b6319a58d (patch)
tree71f7d010e221f8e65beed9f0aa60e3ef0295de17 /src/gui/rhi/qrhigles2.cpp
parent7661fdce0a1a502b1d2f6a89b0d89234b12aabb9 (diff)
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>
Diffstat (limited to 'src/gui/rhi/qrhigles2.cpp')
-rw-r--r--src/gui/rhi/qrhigles2.cpp23
1 files changed, 10 insertions, 13 deletions
diff --git a/src/gui/rhi/qrhigles2.cpp b/src/gui/rhi/qrhigles2.cpp
index a703c4bc9a..05465e40cc 100644
--- a/src/gui/rhi/qrhigles2.cpp
+++ b/src/gui/rhi/qrhigles2.cpp
@@ -1940,7 +1940,7 @@ void QRhiGles2::enqueueResourceUpdates(QRhiCommandBuffer *cb, QRhiResourceUpdate
QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, u.buf);
Q_ASSERT(bufD->m_type == QRhiBuffer::Dynamic);
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 {
trackedBufferBarrier(cbD, bufD, QGles2Buffer::AccessUpdate);
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(u.offset + u.data.size() <= bufD->m_size);
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 {
trackedBufferBarrier(cbD, bufD, QGles2Buffer::AccessUpdate);
QGles2CommandBuffer::Command &cmd(cbD->commands.get());
@@ -1971,7 +1971,7 @@ void QRhiGles2::enqueueResourceUpdates(QRhiCommandBuffer *cb, QRhiResourceUpdate
QGles2Buffer *bufD = QRHI_RES(QGles2Buffer, u.buf);
if (bufD->m_usage.testFlag(QRhiBuffer::UniformBuffer)) {
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)
u.result->completed();
} else {
@@ -3220,7 +3220,7 @@ void QRhiGles2::bindShaderResources(QGles2CommandBuffer *cbD,
}
}
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)) {
if (uniform.binding == b->binding) {
// in a uniform buffer everything is at least 4 byte aligned
@@ -4245,9 +4245,7 @@ QGles2Buffer::~QGles2Buffer()
void QGles2Buffer::destroy()
{
- delete[] data;
- data = nullptr;
-
+ data.clear();
if (!buffer)
return;
@@ -4279,8 +4277,7 @@ bool QGles2Buffer::create()
qWarning("Uniform buffer: multiple usages specified, this is not supported by the OpenGL backend");
return false;
}
- delete[] data;
- data = new char[nonZeroSize];
+ data.resize(nonZeroSize);
QRHI_PROF_F(newBuffer(this, uint(nonZeroSize), 0, 1));
return true;
}
@@ -4324,11 +4321,11 @@ char *QGles2Buffer::beginFullDynamicBufferUpdateForCurrentFrame()
GL_MAP_READ_BIT | GL_MAP_WRITE_BIT));
} else {
// Need some storage for the data, use the otherwise unused 'data' member.
- if (!data)
- data = new char[nonZeroSize];
+ if (data.isEmpty())
+ data.resize(nonZeroSize);
}
}
- return data;
+ return data.data();
}
void QGles2Buffer::endFullDynamicBufferUpdateForCurrentFrame()
@@ -4338,7 +4335,7 @@ void QGles2Buffer::endFullDynamicBufferUpdateForCurrentFrame()
if (rhiD->caps.properMapBuffer)
rhiD->f->glUnmapBuffer(targetForDataOps);
else
- rhiD->f->glBufferSubData(targetForDataOps, 0, nonZeroSize, data);
+ rhiD->f->glBufferSubData(targetForDataOps, 0, nonZeroSize, data.data());
}
}