aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/qt4/qt-4.6.0/0943-Fixed-OpenGL-graphicssystem-issues-for-OpenGL-ES-2.0.patch
diff options
context:
space:
mode:
authorKoen Kooi <koen@openembedded.org>2010-01-04 16:38:25 +0100
committerKoen Kooi <koen@openembedded.org>2010-01-05 10:07:58 +0100
commit4a3a725cc558b2841959c84529389c97587eae45 (patch)
tree8985a4997feccd22c565c4ebb6f3b92d9b563570 /recipes/qt4/qt-4.6.0/0943-Fixed-OpenGL-graphicssystem-issues-for-OpenGL-ES-2.0.patch
parent1029524234e0d6da592b946803cbd09b882acf2e (diff)
downloadopenembedded-4a3a725cc558b2841959c84529389c97587eae45.tar.gz
qt 4.6.0: backport a few patches from git, mainly QGL related
Diffstat (limited to 'recipes/qt4/qt-4.6.0/0943-Fixed-OpenGL-graphicssystem-issues-for-OpenGL-ES-2.0.patch')
-rw-r--r--recipes/qt4/qt-4.6.0/0943-Fixed-OpenGL-graphicssystem-issues-for-OpenGL-ES-2.0.patch146
1 files changed, 146 insertions, 0 deletions
diff --git a/recipes/qt4/qt-4.6.0/0943-Fixed-OpenGL-graphicssystem-issues-for-OpenGL-ES-2.0.patch b/recipes/qt4/qt-4.6.0/0943-Fixed-OpenGL-graphicssystem-issues-for-OpenGL-ES-2.0.patch
new file mode 100644
index 0000000000..5ef0b28822
--- /dev/null
+++ b/recipes/qt4/qt-4.6.0/0943-Fixed-OpenGL-graphicssystem-issues-for-OpenGL-ES-2.0.patch
@@ -0,0 +1,146 @@
+From 60be72310c0f9469b3201b250b257473184ccf2a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Samuel=20R=C3=B8dal?= <sroedal@trolltech.com>
+Date: Thu, 3 Dec 2009 11:53:31 +0100
+Subject: [PATCH 0943/1244] Fixed OpenGL graphicssystem issues for OpenGL ES 2.0 platforms.
+
+The format and internal_format parameters to glTexImage2D need to always
+match on OpenGL ES 2.0.
+
+Reviewed-by: Tom Cooksey
+---
+ src/opengl/qgl_p.h | 3 ++-
+ src/opengl/qpixmapdata_gl.cpp | 38 ++++++++++++++++++++++++++++++--------
+ src/opengl/qwindowsurface_gl.cpp | 9 ++++-----
+ 3 files changed, 36 insertions(+), 14 deletions(-)
+
+diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
+index ab72c9c..b2407ba 100644
+--- a/src/opengl/qgl_p.h
++++ b/src/opengl/qgl_p.h
+@@ -518,7 +518,8 @@ bool qt_gl_preferGL2Engine();
+
+ inline GLenum qt_gl_preferredTextureFormat()
+ {
+- return QSysInfo::ByteOrder == QSysInfo::BigEndian ? GL_RGBA : GL_BGRA;
++ return (QGLExtensions::glExtensions & QGLExtensions::BGRATextureFormat) && QSysInfo::ByteOrder == QSysInfo::LittleEndian
++ ? GL_BGRA : GL_RGBA;
+ }
+
+ inline GLenum qt_gl_preferredTextureTarget()
+diff --git a/src/opengl/qpixmapdata_gl.cpp b/src/opengl/qpixmapdata_gl.cpp
+index fb55097..ab17789 100644
+--- a/src/opengl/qpixmapdata_gl.cpp
++++ b/src/opengl/qpixmapdata_gl.cpp
+@@ -321,25 +321,47 @@ void QGLPixmapData::ensureCreated() const
+ QGLShareContextScope ctx(qt_gl_share_widget()->context());
+ m_ctx = ctx;
+
+- const GLenum format = qt_gl_preferredTextureFormat();
++ const GLenum internal_format = m_hasAlpha ? GL_RGBA : GL_RGB;
++#ifdef QT_OPENGL_ES_2
++ const GLenum external_format = internal_format;
++#else
++ const GLenum external_format = qt_gl_preferredTextureFormat();
++#endif
+ const GLenum target = GL_TEXTURE_2D;
+
+ if (!m_texture.id) {
+ glGenTextures(1, &m_texture.id);
+ glBindTexture(target, m_texture.id);
+- GLenum format = m_hasAlpha ? GL_RGBA : GL_RGB;
+- glTexImage2D(target, 0, format, w, h, 0,
+- GL_RGBA, GL_UNSIGNED_BYTE, 0);
++ glTexImage2D(target, 0, internal_format, w, h, 0, external_format, GL_UNSIGNED_BYTE, 0);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ }
+
+ if (!m_source.isNull()) {
+- const QImage tx = ctx->d_func()->convertToGLFormat(m_source, true, format);
++ if (external_format == GL_RGB) {
++ QImage tx = m_source.convertToFormat(QImage::Format_RGB32);
++
++ QVector<uchar> pixelData(w * h * 3);
++ uchar *p = &pixelData[0];
++ QRgb *src = (QRgb *)tx.bits();
++
++ for (int i = 0; i < w * h; ++i) {
++ *p++ = qRed(*src);
++ *p++ = qGreen(*src);
++ *p++ = qBlue(*src);
++ ++src;
++ }
+
+- glBindTexture(target, m_texture.id);
+- glTexSubImage2D(target, 0, 0, 0, w, h, format,
+- GL_UNSIGNED_BYTE, tx.bits());
++ glBindTexture(target, m_texture.id);
++ glTexSubImage2D(target, 0, 0, 0, w, h, external_format,
++ GL_UNSIGNED_BYTE, &pixelData[0]);
++ } else {
++ const QImage tx = ctx->d_func()->convertToGLFormat(m_source, true, external_format);
++
++ glBindTexture(target, m_texture.id);
++ glTexSubImage2D(target, 0, 0, 0, w, h, external_format,
++ GL_UNSIGNED_BYTE, tx.bits());
++ }
+
+ if (useFramebufferObjects())
+ m_source = QImage();
+diff --git a/src/opengl/qwindowsurface_gl.cpp b/src/opengl/qwindowsurface_gl.cpp
+index e353f5d..7194f9d 100644
+--- a/src/opengl/qwindowsurface_gl.cpp
++++ b/src/opengl/qwindowsurface_gl.cpp
+@@ -493,7 +493,6 @@ void QGLWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoint &
+ }
+ #endif
+ d_ptr->paintedRegion = QRegion();
+-
+ context()->swapBuffers();
+ } else {
+ glFlush();
+@@ -688,11 +687,13 @@ void QGLWindowSurface::updateGeometry() {
+ d_ptr->size = rect.size();
+
+ if (d_ptr->ctx) {
++#ifndef QT_OPENGL_ES_2
+ if (d_ptr->destructive_swap_buffers) {
+ glBindTexture(target, d_ptr->tex_id);
+ glTexImage2D(target, 0, GL_RGBA, rect.width(), rect.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
+ glBindTexture(target, 0);
+ }
++#endif
+ return;
+ }
+
+@@ -756,11 +757,7 @@ void QGLWindowSurface::updateGeometry() {
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+-#ifndef QT_OPENGL_ES
+ glOrtho(0, d_ptr->pb->width(), d_ptr->pb->height(), 0, -999999, 999999);
+-#else
+- glOrthof(0, d_ptr->pb->width(), d_ptr->pb->height(), 0, -999999, 999999);
+-#endif
+
+ d_ptr->pb->d_ptr->qctx->d_func()->internal_context = true;
+ return;
+@@ -774,6 +771,7 @@ void QGLWindowSurface::updateGeometry() {
+
+ ctx->makeCurrent();
+
++#ifndef QT_OPENGL_ES_2
+ if (d_ptr->destructive_swap_buffers) {
+ glGenTextures(1, &d_ptr->tex_id);
+ glBindTexture(target, d_ptr->tex_id);
+@@ -783,6 +781,7 @@ void QGLWindowSurface::updateGeometry() {
+ glTexParameterf(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glBindTexture(target, 0);
+ }
++#endif
+
+ qDebug() << "QGLWindowSurface: Using plain widget as window surface" << this;;
+ d_ptr->ctx = ctx;
+--
+1.6.5
+