summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@nokia.com>2012-07-03 16:36:30 +0200
committerQt by Nokia <qt-info@nokia.com>2012-07-04 18:00:41 +0200
commite78b3e80e6f9310ca82ba1a1f1a59b2166ac872e (patch)
tree6344a30625036aaa8d603033b4beb72ac193633f
parent3709d8dc52ca152ff584a04fda60a7968835f4c2 (diff)
Properly detect the max texture size when using QOpenGLPaintDevice.
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>
-rw-r--r--src/gui/kernel/qopenglcontext.cpp34
-rw-r--r--src/gui/kernel/qopenglcontext_p.h4
2 files changed, 37 insertions, 1 deletions
diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp
index c8662ffac5..c8604462ab 100644
--- a/src/gui/kernel/qopenglcontext.cpp
+++ b/src/gui/kernel/qopenglcontext.cpp
@@ -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.
diff --git a/src/gui/kernel/qopenglcontext_p.h b/src/gui/kernel/qopenglcontext_p.h
index d5c4d6c762..5f3dee1e51 100644
--- a/src/gui/kernel/qopenglcontext_p.h
+++ b/src/gui/kernel/qopenglcontext_p.h
@@ -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)