diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp index 4a8d908d2f0c2041a2d7665ca4537ce33f528689..a625eebd5d9b56af241d7af69013834dac59f854 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 b561bc08f762ddc9a9706c8647851ba283bb0aa6..e1be2105cdfb66d4df0dbf48f752a0676356d2b9 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)