From 10f0485464acebd281f37b78f9ab5d02ee4ada9b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Breitmeyer?= <bjoern.breitmeyer@kdab.com>
Date: Tue, 25 Feb 2014 10:18:06 +0100
Subject: [PATCH] Fixed regression from fd5c629f4336b1f79

Buffer offsets were wrong, and a type
in the buffer content.

Task-number: QTBUG-36989

Change-Id: I863976420d495b006692c4b614f74c285649cb1a
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
---
 .../qsgdefaultdistancefieldglyphcache.cpp     | 25 +++++++++++++------
 .../qsgdefaultdistancefieldglyphcache_p.h     |  2 ++
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp
index 4a8d908d2f..a625eebd5d 100644
--- a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp
+++ b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp
@@ -69,7 +69,7 @@ QSGDefaultDistanceFieldGlyphCache::QSGDefaultDistanceFieldGlyphCache(QSGDistance
 {
     m_blitBuffer.create();
     m_blitBuffer.bind();
-    static GLfloat buffer[16] = {1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f,
+    static GLfloat buffer[16] = {-1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f,
                                  0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
     m_blitBuffer.allocate(buffer, sizeof(buffer));
     m_blitBuffer.release();
@@ -405,13 +405,21 @@ void QSGDefaultDistanceFieldGlyphCache::resizeTexture(TextureInfo *texInfo, int
 
     glViewport(0, 0, oldWidth, oldHeight);
 
-    m_blitBuffer.bind();
-
+    const bool vaoInit = m_vao.isCreated();
+    if (isCoreProfile()) {
+        if ( !vaoInit )
+            m_vao.create();
+        m_vao.bind();
+    }
     m_blitProgram->bind();
-    m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
-    m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
-    m_blitProgram->setAttributeBuffer(int(QT_VERTEX_COORDS_ATTR), GL_FLOAT, 0, 2);
-    m_blitProgram->setAttributeBuffer(int(QT_TEXTURE_COORDS_ATTR), GL_FLOAT, 8, 2);
+    if (!vaoInit || !isCoreProfile()) {
+        m_blitBuffer.bind();
+
+        m_blitProgram->enableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
+        m_blitProgram->enableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
+        m_blitProgram->setAttributeBuffer(int(QT_VERTEX_COORDS_ATTR), GL_FLOAT, 0, 2);
+        m_blitProgram->setAttributeBuffer(int(QT_TEXTURE_COORDS_ATTR), GL_FLOAT, 32, 2);
+    }
     m_blitProgram->disableAttributeArray(int(QT_OPACITY_ATTR));
     m_blitProgram->setUniformValue("imageTexture", GLuint(0));
 
@@ -447,7 +455,8 @@ void QSGDefaultDistanceFieldGlyphCache::resizeTexture(TextureInfo *texInfo, int
 
     m_blitProgram->disableAttributeArray(int(QT_VERTEX_COORDS_ATTR));
     m_blitProgram->disableAttributeArray(int(QT_TEXTURE_COORDS_ATTR));
-    m_blitBuffer.release();
+    if (isCoreProfile())
+        m_vao.release();
 }
 
 bool QSGDefaultDistanceFieldGlyphCache::useTextureResizeWorkaround() const
diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h
index b561bc08f7..e1be2105cd 100644
--- a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h
+++ b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h
@@ -46,6 +46,7 @@
 #include <QtGui/qopenglfunctions.h>
 #include <qopenglshaderprogram.h>
 #include <qopenglbuffer.h>
+#include <qopenglvertexarrayobject.h>
 #include <QtGui/private/qopenglengineshadersource_p.h>
 #include <private/qsgareaallocator_p.h>
 
@@ -135,6 +136,7 @@ private:
 
     QOpenGLShaderProgram *m_blitProgram;
     QOpenGLBuffer m_blitBuffer;
+    QOpenGLVertexArrayObject m_vao;
 
     QOpenGLSharedResourceGuard *m_fboGuard;
 #if !defined(QT_OPENGL_ES_2)
-- 
GitLab