Properly detect the max texture size when using QOpenGLPaintDevice.
authorJocelyn Turcotte <jocelyn.turcotte@nokia.com>
Tue, 3 Jul 2012 14:36:30 +0000 (16:36 +0200)
committerQt by Nokia <qt-info@nokia.com>
Wed, 4 Jul 2012 16:00:41 +0000 (18:00 +0200)
The value is currently hard-coded to 1024, this is a problem since
any image painted with a size higher that this will be scaled down before
being uploaded.

This patch copies the implementation from QGLContext which works correctly.

Change-Id: Ia2bda60cf21d9adf13c91cea4854a2b20e4041f2
Reviewed-by: Kim M. Kalland <kim.kalland@nokia.com>
src/gui/kernel/qopenglcontext.cpp
src/gui/kernel/qopenglcontext_p.h

index c8662ff..c860446 100644 (file)
@@ -161,6 +161,40 @@ void QOpenGLContextPrivate::setCurrentContext(QOpenGLContext *context)
     threadContext->context = context;
 }
 
+int QOpenGLContextPrivate::maxTextureSize()
+{
+    if (max_texture_size != -1)
+        return max_texture_size;
+
+    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
+
+#if defined(QT_OPENGL_ES)
+    return max_texture_size;
+#else
+    GLenum proxy = GL_PROXY_TEXTURE_2D;
+
+    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);
+    if (size == 0) {
+        return max_texture_size;
+    }
+    do {
+        size = next;
+        next = size * 2;
+
+        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);
+    } while (next > size);
+
+    max_texture_size = size;
+    return max_texture_size;
+#endif
+}
+
 /*!
     Returns the last context which called makeCurrent in the current thread,
     or 0, if no context is current.
index d5c4d6c..5f3dee1 100644 (file)
@@ -189,6 +189,7 @@ public:
         , surface(0)
         , functions(0)
         , current_fbo(0)
+        , max_texture_size(-1)
         , workaround_brokenFBOReadBack(false)
         , workaround_brokenTexSubImage(false)
         , active_engine(0)
@@ -213,6 +214,7 @@ public:
     QOpenGLFunctions *functions;
 
     GLuint current_fbo;
+    GLint max_texture_size;
 
     bool workaround_brokenFBOReadBack;
     bool workaround_brokenTexSubImage;
@@ -221,7 +223,7 @@ public:
 
     static void setCurrentContext(QOpenGLContext *context);
 
-    int maxTextureSize() const { return 1024; }
+    int maxTextureSize();
 
 #if !defined(QT_NO_DEBUG)
     static bool toggleMakeCurrentTracker(QOpenGLContext *context, bool value)