104class QOpenGLBufferPrivate
107 QOpenGLBufferPrivate(QOpenGLBuffer::Type t)
111 usagePattern(QOpenGLBuffer::StaticDraw),
112 actualUsagePattern(QOpenGLBuffer::StaticDraw),
118 QOpenGLBuffer::Type type;
119 QOpenGLSharedResourceGuard *guard;
120 QOpenGLBuffer::UsagePattern usagePattern;
121 QOpenGLBuffer::UsagePattern actualUsagePattern;
122 QOpenGLExtensions *funcs;
275bool QOpenGLBuffer::create()
278 if (d->guard && d->guard->id())
280 QOpenGLContext *ctx = QOpenGLContext::currentContext();
283 d->funcs =
new QOpenGLExtensions(ctx);
285 d->funcs->glGenBuffers(1, &bufferId);
290 d->guard =
new QOpenGLSharedResourceGuard(ctx, bufferId, freeBufferFunc);
334bool QOpenGLBuffer::read(
int offset,
void *data,
int count)
336#if !QT_CONFIG(opengles2)
338 if (!d->funcs->hasOpenGLFeature(QOpenGLFunctions::Buffers) || !d->guard->id())
342 GLenum error = d->funcs->glGetError();
343 if (error == GL_NO_ERROR)
345 if (error == GL_CONTEXT_LOST)
348 d->funcs->glGetBufferSubData(d->type, offset, count, data);
349 return d->funcs->glGetError() == GL_NO_ERROR;
532void *QOpenGLBuffer::map(QOpenGLBuffer::Access access)
537 qWarning(
"QOpenGLBuffer::map(): buffer not created");
539 if (!d->guard || !d->guard->id())
541 if (d->funcs->hasOpenGLExtension(QOpenGLExtensions::MapBufferRange)) {
542 QOpenGLBuffer::RangeAccessFlags rangeAccess;
544 case QOpenGLBuffer::ReadOnly:
545 rangeAccess = QOpenGLBuffer::RangeRead;
547 case QOpenGLBuffer::WriteOnly:
548 rangeAccess = QOpenGLBuffer::RangeWrite;
550 case QOpenGLBuffer::ReadWrite:
551 rangeAccess = QOpenGLBuffer::RangeRead | QOpenGLBuffer::RangeWrite;
554 return d->funcs->glMapBufferRange(d->type, 0, size(), rangeAccess);
556 return d->funcs->glMapBuffer(d->type, access);
573void *QOpenGLBuffer::mapRange(
int offset,
int count, QOpenGLBuffer::RangeAccessFlags access)
578 qWarning(
"QOpenGLBuffer::mapRange(): buffer not created");
580 if (!d->guard || !d->guard->id())
582 return d->funcs->glMapBufferRange(d->type, offset, count, access);