Don't use Vertexarrays
authorBjörn Breitmeyer <bjoern.breitmeyer@kdab.com>
Wed, 19 Feb 2014 10:36:28 +0000 (11:36 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Fri, 21 Feb 2014 07:16:05 +0000 (08:16 +0100)
If custom Glcode is used and a buffer is not unbound
the drawcall will take the bound buffer over the
vertex array, so its a bad idea to use them, besides
the fact that in core profile buffers should be used.

Change-Id: I4107d85b664a0c67207652ae34c2569572fa6a8b
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp
src/quick/scenegraph/qsgdefaultdistancefieldglyphcache_p.h

index c5c4e18..4a8d908 100644 (file)
@@ -61,28 +61,18 @@ QSGDefaultDistanceFieldGlyphCache::QSGDefaultDistanceFieldGlyphCache(QSGDistance
     , m_maxTextureSize(0)
     , m_maxTextureCount(3)
     , m_blitProgram(0)
+    , m_blitBuffer(QOpenGLBuffer::VertexBuffer)
     , m_fboGuard(0)
 #if !defined(QT_OPENGL_ES_2)
     , m_funcs(0)
 #endif
 {
-    m_blitVertexCoordinateArray[0] = -1.0f;
-    m_blitVertexCoordinateArray[1] = -1.0f;
-    m_blitVertexCoordinateArray[2] =  1.0f;
-    m_blitVertexCoordinateArray[3] = -1.0f;
-    m_blitVertexCoordinateArray[4] =  1.0f;
-    m_blitVertexCoordinateArray[5] =  1.0f;
-    m_blitVertexCoordinateArray[6] = -1.0f;
-    m_blitVertexCoordinateArray[7] =  1.0f;
-
-    m_blitTextureCoordinateArray[0] = 0.0f;
-    m_blitTextureCoordinateArray[1] = 0.0f;
-    m_blitTextureCoordinateArray[2] = 1.0f;
-    m_blitTextureCoordinateArray[3] = 0.0f;
-    m_blitTextureCoordinateArray[4] = 1.0f;
-    m_blitTextureCoordinateArray[5] = 1.0f;
-    m_blitTextureCoordinateArray[6] = 0.0f;
-    m_blitTextureCoordinateArray[7] = 1.0f;
+    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,
+                                 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();
 
     m_areaAllocator = new QSGAreaAllocator(QSize(maxTextureSize(), m_maxTextureCount * maxTextureSize()));
 }
@@ -415,12 +405,13 @@ void QSGDefaultDistanceFieldGlyphCache::resizeTexture(TextureInfo *texInfo, int
 
     glViewport(0, 0, oldWidth, oldHeight);
 
-    ctx->functions()->glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, m_blitVertexCoordinateArray);
-    ctx->functions()->glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, m_blitTextureCoordinateArray);
+    m_blitBuffer.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);
     m_blitProgram->disableAttributeArray(int(QT_OPACITY_ATTR));
     m_blitProgram->setUniformValue("imageTexture", GLuint(0));
 
@@ -456,6 +447,7 @@ 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();
 }
 
 bool QSGDefaultDistanceFieldGlyphCache::useTextureResizeWorkaround() const
index a5833af..b561bc0 100644 (file)
@@ -45,6 +45,7 @@
 #include "qsgadaptationlayer_p.h"
 #include <QtGui/qopenglfunctions.h>
 #include <qopenglshaderprogram.h>
+#include <qopenglbuffer.h>
 #include <QtGui/private/qopenglengineshadersource_p.h>
 #include <private/qsgareaallocator_p.h>
 
@@ -133,8 +134,7 @@ private:
     QSGAreaAllocator *m_areaAllocator;
 
     QOpenGLShaderProgram *m_blitProgram;
-    GLfloat m_blitVertexCoordinateArray[8];
-    GLfloat m_blitTextureCoordinateArray[8];
+    QOpenGLBuffer m_blitBuffer;
 
     QOpenGLSharedResourceGuard *m_fboGuard;
 #if !defined(QT_OPENGL_ES_2)