111class QOpenGLBufferPrivate
114 QOpenGLBufferPrivate(QOpenGLBuffer::Type t)
118 usagePattern(QOpenGLBuffer::StaticDraw),
119 actualUsagePattern(QOpenGLBuffer::StaticDraw),
125 QOpenGLBuffer::Type type;
126 QOpenGLSharedResourceGuard *guard;
127 QOpenGLBuffer::UsagePattern usagePattern;
128 QOpenGLBuffer::UsagePattern actualUsagePattern;
129 QOpenGLExtensions *funcs;
282bool QOpenGLBuffer::create()
285 if (d->guard && d->guard->id())
287 QOpenGLContext *ctx = QOpenGLContext::currentContext();
290 d->funcs =
new QOpenGLExtensions(ctx);
292 d->funcs->glGenBuffers(1, &bufferId);
297 d->guard =
new QOpenGLSharedResourceGuard(ctx, bufferId, freeBufferFunc);
341bool QOpenGLBuffer::read(
int offset,
void *data,
int count)
343#if !QT_CONFIG(opengles2)
345 if (!d->funcs->hasOpenGLFeature(QOpenGLFunctions::Buffers) || !d->guard->id())
349 GLenum error = d->funcs->glGetError();
350 if (error == GL_NO_ERROR)
352 if (error == GL_CONTEXT_LOST)
355 d->funcs->glGetBufferSubData(d->type, offset, count, data);
356 return d->funcs->glGetError() == GL_NO_ERROR;
539void *QOpenGLBuffer::map(QOpenGLBuffer::Access access)
544 qWarning(
"QOpenGLBuffer::map(): buffer not created");
546 if (!d->guard || !d->guard->id())
548 if (d->funcs->hasOpenGLExtension(QOpenGLExtensions::MapBufferRange)) {
549 QOpenGLBuffer::RangeAccessFlags rangeAccess;
551 case QOpenGLBuffer::ReadOnly:
552 rangeAccess = QOpenGLBuffer::RangeRead;
554 case QOpenGLBuffer::WriteOnly:
555 rangeAccess = QOpenGLBuffer::RangeWrite;
557 case QOpenGLBuffer::ReadWrite:
558 rangeAccess = QOpenGLBuffer::RangeRead | QOpenGLBuffer::RangeWrite;
561 return d->funcs->glMapBufferRange(d->type, 0, size(), rangeAccess);
563 return d->funcs->glMapBuffer(d->type, access);
580void *QOpenGLBuffer::mapRange(
int offset,
int count, QOpenGLBuffer::RangeAccessFlags access)
585 qWarning(
"QOpenGLBuffer::mapRange(): buffer not created");
587 if (!d->guard || !d->guard->id())
589 return d->funcs->glMapBufferRange(d->type, offset, count, access);