105class QOpenGLBufferPrivate
108 QOpenGLBufferPrivate(QOpenGLBuffer::Type t)
112 usagePattern(QOpenGLBuffer::StaticDraw),
113 actualUsagePattern(QOpenGLBuffer::StaticDraw),
119 QOpenGLBuffer::Type type;
120 QOpenGLSharedResourceGuard *guard;
121 QOpenGLBuffer::UsagePattern usagePattern;
122 QOpenGLBuffer::UsagePattern actualUsagePattern;
123 QOpenGLExtensions *funcs;
276bool QOpenGLBuffer::create()
279 if (d->guard && d->guard->id())
281 QOpenGLContext *ctx = QOpenGLContext::currentContext();
284 d->funcs =
new QOpenGLExtensions(ctx);
286 d->funcs->glGenBuffers(1, &bufferId);
291 d->guard =
new QOpenGLSharedResourceGuard(ctx, bufferId, freeBufferFunc);
335bool QOpenGLBuffer::read(
int offset,
void *data,
int count)
337#if !QT_CONFIG(opengles2)
339 if (!d->funcs->hasOpenGLFeature(QOpenGLFunctions::Buffers) || !d->guard->id())
343 GLenum error = d->funcs->glGetError();
344 if (error == GL_NO_ERROR)
346 if (error == GL_CONTEXT_LOST)
349 d->funcs->glGetBufferSubData(d->type, offset, count, data);
350 return d->funcs->glGetError() == GL_NO_ERROR;
533void *QOpenGLBuffer::map(QOpenGLBuffer::Access access)
538 qWarning(
"QOpenGLBuffer::map(): buffer not created");
540 if (!d->guard || !d->guard->id())
542 if (d->funcs->hasOpenGLExtension(QOpenGLExtensions::MapBufferRange)) {
543 QOpenGLBuffer::RangeAccessFlags rangeAccess;
545 case QOpenGLBuffer::ReadOnly:
546 rangeAccess = QOpenGLBuffer::RangeRead;
548 case QOpenGLBuffer::WriteOnly:
549 rangeAccess = QOpenGLBuffer::RangeWrite;
551 case QOpenGLBuffer::ReadWrite:
552 rangeAccess = QOpenGLBuffer::RangeRead | QOpenGLBuffer::RangeWrite;
555 return d->funcs->glMapBufferRange(d->type, 0, size(), rangeAccess);
557 return d->funcs->glMapBuffer(d->type, access);
574void *QOpenGLBuffer::mapRange(
int offset,
int count, QOpenGLBuffer::RangeAccessFlags access)
579 qWarning(
"QOpenGLBuffer::mapRange(): buffer not created");
581 if (!d->guard || !d->guard->id())
583 return d->funcs->glMapBufferRange(d->type, offset, count, access);