diff options
Diffstat (limited to 'src/opengl/qgl.cpp')
-rw-r--r-- | src/opengl/qgl.cpp | 284 |
1 files changed, 161 insertions, 123 deletions
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index 3cfdcc549c..f4bf8fd68b 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -70,6 +70,10 @@ #include "qlibrary.h" #include <qmutex.h> +#ifndef QT_OPENGL_ES_2 +#include <qopenglfunctions_1_1.h> +#endif + // #define QT_GL_CONTEXT_RESOURCE_DEBUG QT_BEGIN_NAMESPACE @@ -107,6 +111,7 @@ bool qgl_hasExtension(QOpenGLExtensions::OpenGLExtension extension) } QOpenGLExtensions::OpenGLExtensions extensions; + /* Returns the GL extensions for the current QOpenGLContext. If there is no current QOpenGLContext, a default context will be created and the extensions @@ -121,6 +126,20 @@ QOpenGLExtensions* qgl_extensions() return 0; } +QOpenGLFunctions *qgl_functions() +{ + return qgl_extensions(); // QOpenGLExtensions is just a subclass of QOpenGLFunctions +} + +#ifndef QT_OPENGL_ES_2 +QOpenGLFunctions_1_1 *qgl1_functions() +{ + QOpenGLFunctions_1_1 *f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_1_1>(); + f->initializeOpenGLFunctions(); + return f; +} +#endif + struct QGLThreadContext { ~QGLThreadContext() { if (context) @@ -1355,7 +1374,7 @@ QGLFormat::OpenGLVersionFlags QGLFormat::openGLVersionFlags() } } - QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION)))); + QString versionString(QLatin1String(reinterpret_cast<const char*>(qgl_functions()->glGetString(GL_VERSION)))); OpenGLVersionFlags versionFlags = qOpenGLVersionFlagsFromString(versionString); if (currentCtx) { currentCtx->d_func()->version_flags_cached = true; @@ -1687,7 +1706,7 @@ QImage qt_gl_read_frame_buffer(const QSize &size, bool alpha_format, bool includ return QImage(); int w = size.width(); int h = size.height(); - glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); + qgl_functions()->glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); convertFromGLImage(img, w, h, alpha_format, include_alpha); return img; } @@ -1701,8 +1720,8 @@ QImage qt_gl_read_texture(const QSize &size, bool alpha_format, bool include_alp int h = size.height(); #ifndef QT_OPENGL_ES if (!QOpenGLContext::currentContext()->isES()) { - //### glGetTexImage not in GL ES 2.0, need to do something else here! - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); + + qgl1_functions()->glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); } #endif // QT_OPENGL_ES convertFromGLImage(img, w, h, alpha_format, include_alpha); @@ -2193,7 +2212,7 @@ QGLTexture *QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G q->deleteTexture(texture->id); texture = 0; } else { - glBindTexture(target, texture->id); + qgl_functions()->glBindTexture(target, texture->id); return texture; } } @@ -2245,6 +2264,7 @@ QGLTexture* QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G const qint64 key, QGLContext::BindOptions options) { Q_Q(QGLContext); + QOpenGLFunctions *funcs = qgl_functions(); #ifdef QGL_BIND_TEXTURE_DEBUG printf("QGLContextPrivate::bindTexture(), imageSize=(%d,%d), internalFormat =0x%x, options=%x, key=%llx\n", @@ -2255,7 +2275,7 @@ QGLTexture* QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G #ifndef QT_NO_DEBUG // Reset the gl error stack...git - while (glGetError() != GL_NO_ERROR) ; + while (funcs->glGetError() != GL_NO_ERROR) ; #endif // Scale the pixmap if needed. GL textures needs to have the @@ -2280,9 +2300,9 @@ QGLTexture* QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G GLuint filtering = options & QGLContext::LinearFilteringBindOption ? GL_LINEAR : GL_NEAREST; GLuint tx_id; - glGenTextures(1, &tx_id); - glBindTexture(target, tx_id); - glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filtering); + funcs->glGenTextures(1, &tx_id); + funcs->glBindTexture(target, tx_id); + funcs->glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filtering); QOpenGLContext *ctx = QOpenGLContext::currentContext(); bool genMipmap = !ctx->isES(); @@ -2293,23 +2313,23 @@ QGLTexture* QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G { #if !defined(QT_OPENGL_ES_2) if (genMipmap) { - glHint(GL_GENERATE_MIPMAP_HINT_SGIS, GL_NICEST); - glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); + funcs->glHint(GL_GENERATE_MIPMAP_HINT_SGIS, GL_NICEST); + funcs->glTexParameteri(target, GL_GENERATE_MIPMAP_SGIS, GL_TRUE); } else { - glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); + funcs->glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); genMipmap = true; } #else - glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); + funcs->glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); genMipmap = true; #endif - glTexParameteri(target, GL_TEXTURE_MIN_FILTER, options & QGLContext::LinearFilteringBindOption - ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST); + funcs->glTexParameteri(target, GL_TEXTURE_MIN_FILTER, options & QGLContext::LinearFilteringBindOption + ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST); #ifdef QGL_BIND_TEXTURE_DEBUG printf(" - generating mipmaps (%d ms)\n", time.elapsed()); #endif } else { - glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filtering); + funcs->glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filtering); } QImage::Format target_format = img.format(); @@ -2438,12 +2458,12 @@ QGLTexture* QGLContextPrivate::bindTexture(const QImage &image, GLenum target, G #endif const QImage &constRef = img; // to avoid detach in bits()... - glTexImage2D(target, 0, internalFormat, img.width(), img.height(), 0, externalFormat, - pixel_type, constRef.bits()); + funcs->glTexImage2D(target, 0, internalFormat, img.width(), img.height(), 0, externalFormat, + pixel_type, constRef.bits()); if (genMipmap && ctx->isES()) q->functions()->glGenerateMipmap(target); #ifndef QT_NO_DEBUG - GLenum error = glGetError(); + GLenum error = funcs->glGetError(); if (error != GL_NO_ERROR) { qWarning(" - texture upload failed, error code 0x%x, enum: %d (%x)\n", error, target, target); } @@ -2491,7 +2511,7 @@ QGLTexture *QGLContextPrivate::bindTexture(const QPixmap &pixmap, GLenum target, q->deleteTexture(texture->id); texture = 0; } else { - glBindTexture(target, texture->id); + qgl_functions()->glBindTexture(target, texture->id); return texture; } } @@ -2520,7 +2540,8 @@ int QGLContextPrivate::maxTextureSize() if (max_texture_size != -1) return max_texture_size; - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); + QOpenGLFunctions *funcs = qgl_functions(); + funcs->glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); #ifndef QT_OPENGL_ES Q_Q(QGLContext); @@ -2529,8 +2550,9 @@ int QGLContextPrivate::maxTextureSize() GLint size; GLint next = 64; - glTexImage2D(proxy, 0, GL_RGBA, next, next, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &size); + funcs->glTexImage2D(proxy, 0, GL_RGBA, next, next, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions(); + gl1funcs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &size); if (size == 0) { return max_texture_size; } @@ -2540,8 +2562,8 @@ int QGLContextPrivate::maxTextureSize() if (next > max_texture_size) break; - glTexImage2D(proxy, 0, GL_RGBA, next, next, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &next); + funcs->glTexImage2D(proxy, 0, GL_RGBA, next, next, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + gl1funcs->glGetTexLevelParameteriv(proxy, 0, GL_TEXTURE_WIDTH, &next); } while (next > size); max_texture_size = size; @@ -2658,7 +2680,7 @@ void QGLContext::deleteTexture(GLuint id) { if (QGLTextureCache::instance()->remove(this, id)) return; - glDeleteTextures(1, &id); + qgl_functions()->glDeleteTextures(1, &id); } void qt_add_rect_to_array(const QRectF &r, GLfloat *array) @@ -2694,6 +2716,7 @@ void qt_add_texcoords_to_array(qreal x1, qreal y1, qreal x2, qreal y2, GLfloat * static void qDrawTextureRect(const QRectF &target, GLint textureWidth, GLint textureHeight, GLenum textureTarget) { + QOpenGLFunctions *funcs = qgl_functions(); GLfloat tx = 1.0f; GLfloat ty = 1.0f; @@ -2704,8 +2727,9 @@ static void qDrawTextureRect(const QRectF &target, GLint textureWidth, GLint tex #else if (textureTarget != GL_TEXTURE_2D && !QOpenGLContext::currentContext()->isES()) { if (textureWidth == -1 || textureHeight == -1) { - glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_WIDTH, &textureWidth); - glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_HEIGHT, &textureHeight); + QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions(); + gl1funcs->glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_WIDTH, &textureWidth); + gl1funcs->glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_HEIGHT, &textureHeight); } tx = GLfloat(textureWidth); @@ -2720,15 +2744,16 @@ static void qDrawTextureRect(const QRectF &target, GLint textureWidth, GLint tex GLfloat vertexArray[4*2]; qt_add_rect_to_array(target, vertexArray); - glVertexPointer(2, GL_FLOAT, 0, vertexArray); - glTexCoordPointer(2, GL_FLOAT, 0, texCoordArray); + QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions(); + gl1funcs->glVertexPointer(2, GL_FLOAT, 0, vertexArray); + gl1funcs->glTexCoordPointer(2, GL_FLOAT, 0, texCoordArray); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + gl1funcs->glEnableClientState(GL_VERTEX_ARRAY); + gl1funcs->glEnableClientState(GL_TEXTURE_COORD_ARRAY); + funcs->glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); + gl1funcs->glDisableClientState(GL_VERTEX_ARRAY); + gl1funcs->glDisableClientState(GL_TEXTURE_COORD_ARRAY); } #endif // !QT_OPENGL_ES_2 @@ -2769,6 +2794,7 @@ void QGLContext::drawTexture(const QRectF &target, GLuint textureId, GLenum text #endif #ifndef QT_OPENGL_ES_2 + QOpenGLFunctions *funcs = qgl_functions(); if (!contextHandle()->isES()) { #ifdef QT_OPENGL_ES if (textureTarget != GL_TEXTURE_2D) { @@ -2776,22 +2802,22 @@ void QGLContext::drawTexture(const QRectF &target, GLuint textureId, GLenum text return; } #else - const bool wasEnabled = glIsEnabled(GL_TEXTURE_2D); + const bool wasEnabled = funcs->glIsEnabled(GL_TEXTURE_2D); GLint oldTexture; - glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTexture); + funcs->glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTexture); #endif - glEnable(textureTarget); - glBindTexture(textureTarget, textureId); + funcs->glEnable(textureTarget); + funcs->glBindTexture(textureTarget, textureId); qDrawTextureRect(target, -1, -1, textureTarget); #ifdef QT_OPENGL_ES - glDisable(textureTarget); + funcs->glDisable(textureTarget); #else if (!wasEnabled) - glDisable(textureTarget); - glBindTexture(textureTarget, oldTexture); + funcs->glDisable(textureTarget); + funcs->glBindTexture(textureTarget, oldTexture); #endif return; } @@ -2832,18 +2858,20 @@ void QGLContext::drawTexture(const QPointF &point, GLuint textureId, GLenum text Q_UNUSED(textureTarget); #else if (!contextHandle()->isES()) { - const bool wasEnabled = glIsEnabled(GL_TEXTURE_2D); + QOpenGLFunctions *funcs = qgl_functions(); + const bool wasEnabled = funcs->glIsEnabled(GL_TEXTURE_2D); GLint oldTexture; - glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTexture); + funcs->glGetIntegerv(GL_TEXTURE_BINDING_2D, &oldTexture); - glEnable(textureTarget); - glBindTexture(textureTarget, textureId); + funcs->glEnable(textureTarget); + funcs->glBindTexture(textureTarget, textureId); GLint textureWidth; GLint textureHeight; - glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_WIDTH, &textureWidth); - glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_HEIGHT, &textureHeight); + QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions(); + gl1funcs->glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_WIDTH, &textureWidth); + gl1funcs->glGetTexLevelParameteriv(textureTarget, 0, GL_TEXTURE_HEIGHT, &textureHeight); if (d_ptr->active_engine && d_ptr->active_engine->type() == QPaintEngine::OpenGL2) { @@ -2860,8 +2888,8 @@ void QGLContext::drawTexture(const QPointF &point, GLuint textureId, GLenum text qDrawTextureRect(QRectF(point, QSizeF(textureWidth, textureHeight)), textureWidth, textureHeight, textureTarget); if (!wasEnabled) - glDisable(textureTarget); - glBindTexture(textureTarget, oldTexture); + funcs->glDisable(textureTarget); + funcs->glBindTexture(textureTarget, oldTexture); return; } #endif @@ -3909,7 +3937,7 @@ void QGLWidget::initializeGL() void QGLWidget::paintGL() { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + qgl_functions()->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } @@ -4136,7 +4164,7 @@ void QGLWidget::glDraw() makeCurrent(); #ifndef QT_OPENGL_ES if (d->glcx->deviceIsPixmap() && !d->glcx->contextHandle()->isES()) - glDrawBuffer(GL_FRONT); + qgl1_functions()->glDrawBuffer(GL_FRONT); #endif QSize readback_target_size = d->glcx->d_ptr->readback_target_size; if (!d->glcx->initialized()) { @@ -4158,7 +4186,7 @@ void QGLWidget::glDraw() if (d->autoSwap) swapBuffers(); } else { - glFlush(); + qgl_functions()->glFlush(); } } @@ -4176,20 +4204,20 @@ void QGLWidget::qglColor(const QColor& c) const { #if !defined(QT_OPENGL_ES_2) #ifdef QT_OPENGL_ES - glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF()); + qgl_functions()->glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF()); #else Q_D(const QGLWidget); const QGLContext *ctx = QGLContext::currentContext(); if (ctx && !ctx->contextHandle()->isES()) { if (ctx->format().rgba()) - glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF()); + qgl1_functions()->glColor4f(c.redF(), c.greenF(), c.blueF(), c.alphaF()); else if (!d->cmap.isEmpty()) { // QGLColormap in use? int i = d->cmap.find(c.rgb()); if (i < 0) i = d->cmap.findNearest(c.rgb()); - glIndexi(i); + qgl1_functions()->glIndexi(i); } else - glIndexi(ctx->colorIndex(c)); + qgl1_functions()->glIndexi(ctx->colorIndex(c)); } #endif //QT_OPENGL_ES #else @@ -4208,23 +4236,23 @@ void QGLWidget::qglColor(const QColor& c) const void QGLWidget::qglClearColor(const QColor& c) const { #ifdef QT_OPENGL_ES - glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF()); + qgl_functions()->glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF()); #else Q_D(const QGLWidget); const QGLContext *ctx = QGLContext::currentContext(); if (ctx && !ctx->contextHandle()->isES()) { if (ctx->format().rgba()) - glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF()); + qgl_functions()->glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF()); else if (!d->cmap.isEmpty()) { // QGLColormap in use? int i = d->cmap.find(c.rgb()); if (i < 0) i = d->cmap.findNearest(c.rgb()); - glClearIndex(i); + qgl1_functions()->glClearIndex(i); } else { - glClearIndex(ctx->colorIndex(c)); + qgl1_functions()->glClearIndex(ctx->colorIndex(c)); } } else { - glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF()); + qgl_functions()->glClearColor(c.redF(), c.greenF(), c.blueF(), c.alphaF()); } #endif } @@ -4307,42 +4335,47 @@ QImage QGLWidget::convertToGLFormat(const QImage& img) static void qt_save_gl_state() { - glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); - glPushAttrib(GL_ALL_ATTRIB_BITS); - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - glLoadIdentity(); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - - glShadeModel(GL_FLAT); - glDisable(GL_CULL_FACE); - glDisable(GL_LIGHTING); - glDisable(GL_STENCIL_TEST); - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + QOpenGLFunctions *funcs = qgl_functions(); + QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions(); + + gl1funcs->glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + gl1funcs->glPushAttrib(GL_ALL_ATTRIB_BITS); + gl1funcs->glMatrixMode(GL_TEXTURE); + gl1funcs->glPushMatrix(); + gl1funcs->glLoadIdentity(); + gl1funcs->glMatrixMode(GL_PROJECTION); + gl1funcs->glPushMatrix(); + gl1funcs->glMatrixMode(GL_MODELVIEW); + gl1funcs->glPushMatrix(); + + gl1funcs->glShadeModel(GL_FLAT); + funcs->glDisable(GL_CULL_FACE); + funcs->glDisable(GL_LIGHTING); + funcs->glDisable(GL_STENCIL_TEST); + funcs->glDisable(GL_DEPTH_TEST); + funcs->glEnable(GL_BLEND); + funcs->glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } static void qt_restore_gl_state() { - glMatrixMode(GL_TEXTURE); - glPopMatrix(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - glPopAttrib(); - glPopClientAttrib(); + QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions(); + + gl1funcs->glMatrixMode(GL_TEXTURE); + gl1funcs->glPopMatrix(); + gl1funcs->glMatrixMode(GL_PROJECTION); + gl1funcs->glPopMatrix(); + gl1funcs->glMatrixMode(GL_MODELVIEW); + gl1funcs->glPopMatrix(); + gl1funcs->glPopAttrib(); + gl1funcs->glPopClientAttrib(); } static void qt_gl_draw_text(QPainter *p, int x, int y, const QString &str, const QFont &font) { GLfloat color[4]; - glGetFloatv(GL_CURRENT_COLOR, &color[0]); + qgl_functions()->glGetFloatv(GL_CURRENT_COLOR, &color[0]); QColor col; col.setRgbF(color[0], color[1], color[2],color[3]); @@ -4392,10 +4425,11 @@ void QGLWidget::renderText(int x, int y, const QString &str, const QFont &font) if (str.isEmpty() || !isValid()) return; + QOpenGLFunctions *funcs = qgl_functions(); GLint view[4]; - bool use_scissor_testing = glIsEnabled(GL_SCISSOR_TEST); + bool use_scissor_testing = funcs->glIsEnabled(GL_SCISSOR_TEST); if (!use_scissor_testing) - glGetIntegerv(GL_VIEWPORT, &view[0]); + funcs->glGetIntegerv(GL_VIEWPORT, &view[0]); int width = d->glcx->device()->width(); int height = d->glcx->device()->height(); bool auto_swap = autoBufferSwap(); @@ -4410,8 +4444,8 @@ void QGLWidget::renderText(int x, int y, const QString &str, const QFont &font) reuse_painter = true; p = engine->painter(); - glDisable(GL_DEPTH_TEST); - glViewport(0, 0, width, height); + funcs->glDisable(GL_DEPTH_TEST); + funcs->glViewport(0, 0, width, height); } else { setAutoBufferSwap(false); // disable glClear() as a result of QPainter::begin() @@ -4423,11 +4457,11 @@ void QGLWidget::renderText(int x, int y, const QString &str, const QFont &font) if (!use_scissor_testing && viewport != rect()) { // if the user hasn't set a scissor box, we set one that // covers the current viewport - glScissor(view[0], view[1], view[2], view[3]); - glEnable(GL_SCISSOR_TEST); + funcs->glScissor(view[0], view[1], view[2], view[3]); + funcs->glEnable(GL_SCISSOR_TEST); } else if (use_scissor_testing) { // use the scissor box set by the user - glEnable(GL_SCISSOR_TEST); + funcs->glEnable(GL_SCISSOR_TEST); } qt_gl_draw_text(p, x, y, str, font); @@ -4482,15 +4516,17 @@ void QGLWidget::renderText(double x, double y, double z, const QString &str, con if (str.isEmpty() || !isValid()) return; + QOpenGLFunctions *funcs = qgl_functions(); bool auto_swap = autoBufferSwap(); int width = d->glcx->device()->width(); int height = d->glcx->device()->height(); GLdouble model[4 * 4], proj[4 * 4]; GLint view[4]; - glGetDoublev(GL_MODELVIEW_MATRIX, &model[0]); - glGetDoublev(GL_PROJECTION_MATRIX, &proj[0]); - glGetIntegerv(GL_VIEWPORT, &view[0]); + QOpenGLFunctions_1_1 *gl1funcs = qgl1_functions(); + gl1funcs->glGetDoublev(GL_MODELVIEW_MATRIX, &model[0]); + gl1funcs->glGetDoublev(GL_PROJECTION_MATRIX, &proj[0]); + funcs->glGetIntegerv(GL_VIEWPORT, &view[0]); GLdouble win_x = 0, win_y = 0, win_z = 0; qgluProject(x, y, z, &model[0], &proj[0], &view[0], &win_x, &win_y, &win_z); @@ -4500,8 +4536,8 @@ void QGLWidget::renderText(double x, double y, double z, const QString &str, con QPainter *p; bool reuse_painter = false; - bool use_depth_testing = glIsEnabled(GL_DEPTH_TEST); - bool use_scissor_testing = glIsEnabled(GL_SCISSOR_TEST); + bool use_depth_testing = funcs->glIsEnabled(GL_DEPTH_TEST); + bool use_scissor_testing = funcs->glIsEnabled(GL_SCISSOR_TEST); qt_save_gl_state(); @@ -4517,16 +4553,16 @@ void QGLWidget::renderText(double x, double y, double z, const QString &str, con QRect viewport(view[0], view[1], view[2], view[3]); if (!use_scissor_testing && viewport != rect()) { - glScissor(view[0], view[1], view[2], view[3]); - glEnable(GL_SCISSOR_TEST); + funcs->glScissor(view[0], view[1], view[2], view[3]); + funcs->glEnable(GL_SCISSOR_TEST); } else if (use_scissor_testing) { - glEnable(GL_SCISSOR_TEST); + funcs->glEnable(GL_SCISSOR_TEST); } - glViewport(0, 0, width, height); - glAlphaFunc(GL_GREATER, 0.0); - glEnable(GL_ALPHA_TEST); + funcs->glViewport(0, 0, width, height); + gl1funcs->glAlphaFunc(GL_GREATER, 0.0); + funcs->glEnable(GL_ALPHA_TEST); if (use_depth_testing) - glEnable(GL_DEPTH_TEST); + funcs->glEnable(GL_DEPTH_TEST); // The only option in Qt 5 is the shader-based OpenGL 2 paint engine. // Setting fixed pipeline transformations is futile. Instead, pass the @@ -4964,10 +5000,11 @@ QSize QGLTexture::bindCompressedTextureDDS(const char *buf, int len) const GLubyte *pixels = reinterpret_cast<const GLubyte *>(buf + ddsHeader->dwSize + 4); - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + QOpenGLFunctions *funcs = qgl_functions(); + funcs->glGenTextures(1, &id); + funcs->glBindTexture(GL_TEXTURE_2D, id); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); int size; int offset = 0; @@ -5060,23 +5097,24 @@ QSize QGLTexture::bindCompressedTexturePVR(const char *buf, int len) } // Create the texture. - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glGenTextures(1, &id); - glBindTexture(GL_TEXTURE_2D, id); + QOpenGLFunctions *funcs = qgl_functions(); + funcs->glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + funcs->glGenTextures(1, &id); + funcs->glBindTexture(GL_TEXTURE_2D, id); if (pvrHeader->mipMapCount) { if ((options & QGLContext::LinearFilteringBindOption) != 0) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); } else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); } } else if ((options & QGLContext::LinearFilteringBindOption) != 0) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + funcs->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); } // Load the compressed mipmap levels. @@ -5102,7 +5140,7 @@ QSize QGLTexture::bindCompressedTexturePVR(const char *buf, int len) } // Restore the default pixel alignment for later texture uploads. - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); + funcs->glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // Set the invert flag for the texture. The "vertical flip" // flag in PVR is the opposite sense to our sense of inversion. |