Ignore:
Timestamp:
Mar 8, 2010, 12:52:58 PM (15 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.6.2 sources.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp

    r561 r651  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    7676#include <private/qpainter_p.h>
    7777#include <private/qfontengine_p.h>
    78 #include <private/qtextureglyphcache_p.h>
    7978#include <private/qpixmapdata_gl_p.h>
    8079#include <private/qdatabuffer_p.h>
     
    8382#include "qglengineshadermanager_p.h"
    8483#include "qgl2pexvertexarray_p.h"
    85 
    8684#include "qtriangulatingstroker_p.h"
     85#include "qtextureglyphcache_gl_p.h"
    8786
    8887#include <QDebug>
     
    9190
    9291//#define QT_GL_NO_SCISSOR_TEST
    93 
    94 static const GLuint GL_STENCIL_HIGH_BIT         = 0x80;
    95 static const GLuint QT_BRUSH_TEXTURE_UNIT       = 0;
    96 static const GLuint QT_IMAGE_TEXTURE_UNIT       = 0; //Can be the same as brush texture unit
    97 static const GLuint QT_MASK_TEXTURE_UNIT        = 1;
    98 static const GLuint QT_BACKGROUND_TEXTURE_UNIT  = 2;
    99 
    100 #ifdef Q_WS_WIN
    101 extern Q_GUI_EXPORT bool qt_cleartype_enabled;
    102 #endif
    103 
    104 class QGLTextureGlyphCache : public QObject, public QTextureGlyphCache
    105 {
    106     Q_OBJECT
    107 public:
    108     QGLTextureGlyphCache(QGLContext *context, QFontEngineGlyphCache::Type type, const QTransform &matrix);
    109     ~QGLTextureGlyphCache();
    110 
    111     virtual void createTextureData(int width, int height);
    112     virtual void resizeTextureData(int width, int height);
    113     virtual void fillTexture(const Coord &c, glyph_t glyph);
    114     virtual int glyphMargin() const;
    115 
    116     inline GLuint texture() const { return m_texture; }
    117 
    118     inline int width() const { return m_width; }
    119     inline int height() const { return m_height; }
    120 
    121     inline void setPaintEnginePrivate(QGL2PaintEngineExPrivate *p) { pex = p; }
    122 
    123 
    124 public Q_SLOTS:
    125     void contextDestroyed(const QGLContext *context) {
    126         if (context == ctx) {
    127             QList<const QGLContext *> shares = qgl_share_reg()->shares(ctx);
    128             if (shares.isEmpty()) {
    129                 glDeleteFramebuffers(1, &m_fbo);
    130                 if (m_width || m_height)
    131                     glDeleteTextures(1, &m_texture);
    132                 ctx = 0;
    133             } else {
    134                 // since the context holding the texture is shared, and
    135                 // about to be destroyed, we have to transfer ownership
    136                 // of the texture to one of the share contexts
    137                 ctx = const_cast<QGLContext *>((ctx == shares.at(0)) ? shares.at(1) : shares.at(0));
    138             }
    139         }
    140     }
    141 
    142 private:
    143     QGLContext *ctx;
    144 
    145     QGL2PaintEngineExPrivate *pex;
    146 
    147     GLuint m_texture;
    148     GLuint m_fbo;
    149 
    150     int m_width;
    151     int m_height;
    152 
    153     QGLShaderProgram *m_program;
    154 };
    155 
    156 QGLTextureGlyphCache::QGLTextureGlyphCache(QGLContext *context, QFontEngineGlyphCache::Type type, const QTransform &matrix)
    157     : QTextureGlyphCache(type, matrix)
    158     , ctx(context)
    159     , m_width(0)
    160     , m_height(0)
    161 {
    162     glGenFramebuffers(1, &m_fbo);
    163     connect(QGLSignalProxy::instance(), SIGNAL(aboutToDestroyContext(const QGLContext*)),
    164             SLOT(contextDestroyed(const QGLContext*)));
    165 }
    166 
    167 QGLTextureGlyphCache::~QGLTextureGlyphCache()
    168 {
    169     if (ctx) {
    170         QGLShareContextScope scope(ctx);
    171         glDeleteFramebuffers(1, &m_fbo);
    172 
    173         if (m_width || m_height)
    174             glDeleteTextures(1, &m_texture);
    175     }
    176 }
    177 
    178 void QGLTextureGlyphCache::createTextureData(int width, int height)
    179 {
    180     glGenTextures(1, &m_texture);
    181     glBindTexture(GL_TEXTURE_2D, m_texture);
    182 
    183     m_width = width;
    184     m_height = height;
    185 
    186     QVarLengthArray<uchar> data(width * height);
    187     for (int i = 0; i < data.size(); ++i)
    188         data[i] = 0;
    189 
    190     if (m_type == QFontEngineGlyphCache::Raster_RGBMask)
    191         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &data[0]);
    192     else
    193         glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &data[0]);
    194 
    195     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    196     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    197 }
    198 
    199 void QGLTextureGlyphCache::resizeTextureData(int width, int height)
    200 {
    201     // ### the QTextureGlyphCache API needs to be reworked to allow
    202     // ### resizeTextureData to fail
    203 
    204     int oldWidth = m_width;
    205     int oldHeight = m_height;
    206 
    207     GLuint oldTexture = m_texture;
    208     createTextureData(width, height);
    209 
    210     glBindFramebuffer(GL_FRAMEBUFFER_EXT, m_fbo);
    211 
    212     GLuint tmp_texture;
    213     glGenTextures(1, &tmp_texture);
    214     glBindTexture(GL_TEXTURE_2D, tmp_texture);
    215     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, oldWidth, oldHeight, 0,
    216                  GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    217     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    218     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    219     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    220     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    221     glBindTexture(GL_TEXTURE_2D, 0);
    222     glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
    223                            GL_TEXTURE_2D, tmp_texture, 0);
    224 
    225     glActiveTexture(GL_TEXTURE0 + QT_IMAGE_TEXTURE_UNIT);
    226     glBindTexture(GL_TEXTURE_2D, oldTexture);
    227 
    228     pex->transferMode(BrushDrawingMode);
    229 
    230     glDisable(GL_STENCIL_TEST);
    231     glDisable(GL_DEPTH_TEST);
    232     glDisable(GL_SCISSOR_TEST);
    233     glDisable(GL_BLEND);
    234 
    235     glViewport(0, 0, oldWidth, oldHeight);
    236 
    237     float vertexCoordinateArray[] = { -1, -1, 1, -1, 1, 1, -1, 1 };
    238     float textureCoordinateArray[] = { 0, 0, 1, 0, 1, 1, 0, 1 };
    239 
    240     glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    241     glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
    242 
    243     glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexCoordinateArray);
    244     glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, textureCoordinateArray);
    245 
    246     pex->shaderManager->blitProgram()->bind();
    247     pex->shaderManager->blitProgram()->setUniformValue("imageTexture", QT_IMAGE_TEXTURE_UNIT);
    248     pex->shaderManager->setDirty();
    249 
    250     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
    251 
    252     glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    253     glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
    254 
    255     glBindTexture(GL_TEXTURE_2D, m_texture);
    256 
    257 #ifdef QT_OPENGL_ES_2
    258     QDataBuffer<uchar> buffer(4*oldWidth*oldHeight);
    259     buffer.resize(4*oldWidth*oldHeight);
    260     glReadPixels(0, 0, oldWidth, oldHeight, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
    261 
    262     // do an in-place conversion from GL_RGBA to GL_ALPHA
    263     for (int i=0; i<oldWidth*oldHeight; ++i)
    264         buffer.data()[i] = buffer.at(4*i + 3);
    265 
    266     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, oldWidth, oldHeight,
    267                     GL_ALPHA, GL_UNSIGNED_BYTE, buffer.data());
    268 #else
    269     glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, oldWidth, oldHeight);
    270 #endif
    271 
    272     glFramebufferRenderbuffer(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
    273                               GL_RENDERBUFFER_EXT, 0);
    274     glDeleteTextures(1, &tmp_texture);
    275     glDeleteTextures(1, &oldTexture);
    276 
    277     glBindFramebuffer(GL_FRAMEBUFFER_EXT, ctx->d_ptr->current_fbo);
    278 
    279     glViewport(0, 0, pex->width, pex->height);
    280     pex->updateClipScissorTest();
    281 }
    282 
    283 void QGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph)
    284 {
    285     QImage mask = textureMapForGlyph(glyph);
    286     const int maskWidth = mask.width();
    287     const int maskHeight = mask.height();
    288 
    289     if (mask.format() == QImage::Format_Mono) {
    290         mask = mask.convertToFormat(QImage::Format_Indexed8);
    291         for (int y = 0; y < maskHeight; ++y) {
    292             uchar *src = (uchar *) mask.scanLine(y);
    293             for (int x = 0; x < maskWidth; ++x)
    294                 src[x] = -src[x]; // convert 0 and 1 into 0 and 255
    295         }
    296      }
    297 
    298 
    299     glBindTexture(GL_TEXTURE_2D, m_texture);
    300     if (mask.format() == QImage::Format_RGB32) {
    301         glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_BGRA, GL_UNSIGNED_BYTE, mask.bits());
    302     } else {
    303 #ifdef QT_OPENGL_ES2
    304         glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_ALPHA, GL_UNSIGNED_BYTE, mask.bits());
    305 #else
    306         // glTexSubImage2D() might cause some garbage to appear in the texture if the mask width is
    307         // not a multiple of four bytes. The bug appeared on a computer with 32-bit Windows Vista
    308         // and nVidia GeForce 8500GT. GL_UNPACK_ALIGNMENT is set to four bytes, 'mask' has a
    309         // multiple of four bytes per line, and most of the glyph shows up correctly in the
    310         // texture, which makes me think that this is a driver bug.
    311         // One workaround is to make sure the mask width is a multiple of four bytes, for instance
    312         // by converting it to a format with four bytes per pixel. Another is to copy one line at a
    313         // time.
    314 
    315         for (int i = 0; i < maskHeight; ++i)
    316             glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y + i, maskWidth, 1, GL_ALPHA, GL_UNSIGNED_BYTE, mask.scanLine(i));
    317 #endif
    318     }
    319 }
    320 
    321 int QGLTextureGlyphCache::glyphMargin() const
    322 {
    323 #if defined(Q_WS_MAC)
    324     return 2;
    325 #elif defined (Q_WS_X11)
    326     return 0;
    327 #else
    328     return m_type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0;
    329 #endif
    330 }
    33192
    33293extern QImage qt_imageForBrush(int brushStyle, bool invert);
     
    404165void QGL2PaintEngineExPrivate::useSimpleShader()
    405166{
    406     shaderManager->simpleProgram()->bind();
    407     shaderManager->setDirty();
     167    shaderManager->useSimpleProgram();
    408168
    409169    if (matrixDirty)
    410170        updateMatrix();
    411 
    412     if (simpleShaderMatrixUniformDirty) {
    413         const GLuint location = shaderManager->simpleProgram()->uniformLocation("pmvMatrix");
    414         glUniformMatrix3fv(location, 1, GL_FALSE, (GLfloat*)pmvMatrix);
    415         simpleShaderMatrixUniformDirty = false;
    416     }
    417171}
    418172
     
    633387    matrixDirty = false;
    634388
    635     // The actual data has been updated so both shader program's uniforms need updating
    636     simpleShaderMatrixUniformDirty = true;
    637     shaderMatrixUniformDirty = true;
     389    // Set the PMV matrix attribute. As we use an attributes rather than uniforms, we only
     390    // need to do this once for every matrix change and persists across all shader programs.
     391    glVertexAttrib3fv(QT_PMV_MATRIX_1_ATTR, pmvMatrix[0]);
     392    glVertexAttrib3fv(QT_PMV_MATRIX_2_ATTR, pmvMatrix[1]);
     393    glVertexAttrib3fv(QT_PMV_MATRIX_3_ATTR, pmvMatrix[2]);
    638394
    639395    dasher.setInvScale(inverseScale);
     
    751507    glUseProgram(0);
    752508
     509    // Disable all the vertex attribute arrays:
     510    for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i)
     511        glDisableVertexAttribArray(i);
     512
    753513#ifndef QT_OPENGL_ES_2
    754514    // be nice to people who mix OpenGL 1.x code with QPainter commands
     
    796556    glDepthFunc(GL_LESS);
    797557    glClearDepth(1);
     558    glStencilMask(0xff);
     559    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
     560    glStencilFunc(GL_ALWAYS, 0, 0xff);
     561    glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
     562    glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
     563    glDisableVertexAttribArray(QT_OPACITY_ATTR);
     564#ifndef QT_OPENGL_ES_2
     565    glColor4f(1.0f, 1.0f, 1.0f, 1.0f); // color may have been changed by glVertexAttrib()
     566#endif
    798567}
    799568
     
    810579
    811580    if (mode == TextDrawingMode || mode == ImageDrawingMode || mode == ImageArrayDrawingMode) {
    812         glDisableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
    813         glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    814         glDisableVertexAttribArray(QT_OPACITY_ATTR);
    815 
    816581        lastTextureUsed = GLuint(-1);
    817582    }
    818583
    819584    if (newMode == TextDrawingMode) {
    820         glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    821         glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
    822 
    823         glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexCoordinateArray.data());
    824         glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, textureCoordinateArray.data());
     585        setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinateArray.data());
     586        setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinateArray.data());
    825587    }
    826588
    827589    if (newMode == ImageDrawingMode) {
    828         glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    829         glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
    830 
    831         glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, staticVertexCoordinateArray);
    832         glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, staticTextureCoordinateArray);
     590        setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray);
     591        setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, staticTextureCoordinateArray);
    833592    }
    834593
    835594    if (newMode == ImageArrayDrawingMode) {
    836         glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    837         glEnableVertexAttribArray(QT_TEXTURE_COORDS_ATTR);
    838         glEnableVertexAttribArray(QT_OPACITY_ATTR);
    839 
    840         glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexCoordinateArray.data());
    841         glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, textureCoordinateArray.data());
    842         glVertexAttribPointer(QT_OPACITY_ATTR, 1, GL_FLOAT, GL_FALSE, 0, opacityArray.data());
     595        setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinateArray.data());
     596        setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinateArray.data());
     597        setVertexAttributePointer(QT_OPACITY_ATTR, (GLfloat*)opacityArray.data());
    843598    }
    844599
     
    953708
    954709            prepareForDraw(currentBrush.isOpaque());
    955             glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    956710#ifdef QT_OPENGL_CACHE_AS_VBOS
    957711            glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
    958             glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, false, 0, 0);
     712            setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
    959713#else
    960             glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, false, 0, cache->vertices);
     714            setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, cache->vertices);
    961715#endif
    962716            glDrawArrays(cache->primitiveType, 0, cache->vertexCount);
     
    1078832#if 0
    1079833        glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); // Simply invert the stencil bit
    1080         glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1081         glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, data);
     834        setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, data);
    1082835        glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
    1083         glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1084836#else
    1085837
     
    1091843            glStencilFunc(GL_ALWAYS, GL_STENCIL_HIGH_BIT, 0xff);
    1092844        }
    1093         glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1094         glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, data);
     845        setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, data);
    1095846        glDrawArrays(GL_TRIANGLE_STRIP, 0, count);
    1096         glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1097847#endif
    1098848    }
     
    1185935        // The shader program has changed so mark all uniforms as dirty:
    1186936        brushUniformsDirty = true;
    1187         shaderMatrixUniformDirty = true;
    1188937        opacityUniformDirty = true;
    1189938    }
     
    1191940    if (brushUniformsDirty && mode != ImageDrawingMode && mode != ImageArrayDrawingMode)
    1192941        updateBrushUniforms();
    1193 
    1194     if (shaderMatrixUniformDirty) {
    1195         glUniformMatrix3fv(location(QGLEngineShaderManager::PmvMatrix), 1, GL_FALSE, (GLfloat*)pmvMatrix);
    1196         shaderMatrixUniformDirty = false;
    1197     }
    1198942
    1199943    if (opacityMode == QGLEngineShaderManager::UniformOpacity && opacityUniformDirty) {
     
    1207951void QGL2PaintEngineExPrivate::composite(const QGLRect& boundingRect)
    1208952{
    1209     // Setup a vertex array for the bounding rect:
    1210     GLfloat rectVerts[] = {
    1211         boundingRect.left, boundingRect.top,
    1212         boundingRect.left, boundingRect.bottom,
    1213         boundingRect.right, boundingRect.bottom,
    1214         boundingRect.right, boundingRect.top
    1215     };
    1216 
    1217     glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1218     glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, rectVerts);
    1219 
     953    setCoords(staticVertexCoordinateArray, boundingRect);
     954    setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, staticVertexCoordinateArray);
    1220955    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
    1221 
    1222     glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1223956}
    1224957
     
    1228961{
    1229962    // Now setup the pointer to the vertex array:
    1230     glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1231     glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, data);
     963    setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, (GLfloat*)data);
    1232964
    1233965    int previousStop = 0;
     
    1242974        previousStop = stop;
    1243975    }
    1244     glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1245976}
    1246977
     
    13291060    if (opaque) {
    13301061        prepareForDraw(opaque);
    1331         glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    1332         glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, false, 0, stroker.vertices());
     1062        setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, stroker.vertices());
    13331063        glDrawArrays(GL_TRIANGLE_STRIP, 0, stroker.vertexCount() / 2);
    13341064
     
    13371067//         d->prepareForDraw(true);
    13381068//         glDrawArrays(GL_LINE_STRIP, 0, d->stroker.vertexCount() / 2);
    1339 
    1340         glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);
    13411069
    13421070    } else {
     
    15531281    GLfloat dy = 1.0 / cache->height();
    15541282
    1555     QGLPoint *oldVertexCoordinateDataPtr = vertexCoordinateArray.data();
    1556     QGLPoint *oldTextureCoordinateDataPtr = textureCoordinateArray.data();
    1557 
    15581283    vertexCoordinateArray.clear();
    15591284    textureCoordinateArray.clear();
     
    15681293    }
    15691294
    1570     if (vertexCoordinateArray.data() != oldVertexCoordinateDataPtr)
    1571         glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, vertexCoordinateArray.data());
    1572     if (textureCoordinateArray.data() != oldTextureCoordinateDataPtr)
    1573         glVertexAttribPointer(QT_TEXTURE_COORDS_ATTR, 2, GL_FLOAT, GL_FALSE, 0, textureCoordinateArray.data());
     1295    setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, (GLfloat*)vertexCoordinateArray.data());
     1296    setVertexAttributePointer(QT_TEXTURE_COORDS_ATTR, (GLfloat*)textureCoordinateArray.data());
    15741297
    15751298    if (addOffset) {
     
    18331556#if !defined(QT_OPENGL_ES_2)
    18341557#if defined(Q_WS_WIN)
     1558    extern Q_GUI_EXPORT bool qt_cleartype_enabled;
    18351559    if (qt_cleartype_enabled)
    18361560#endif
     
    19001624        d->needsSync = false;
    19011625        d->shaderManager->setDirty();
     1626        d->ctx->d_func()->syncGlState();
     1627        for (int i = 0; i < 3; ++i)
     1628            d->vertexAttribPointers[i] = (GLfloat*)-1; // Assume the pointers are clobbered
    19021629        setState(state());
    19031630    }
     
    22251952        renderHintsChanged();
    22261953
    2227     if (old_state == s || old_state->matrixChanged) {
     1954    if (old_state == s || old_state->matrixChanged)
    22281955        d->matrixDirty = true;
    2229         d->simpleShaderMatrixUniformDirty = true;
    2230         d->shaderMatrixUniformDirty = true;
    2231     }
    22321956
    22331957    if (old_state == s || old_state->compositionModeChanged)
     
    22912015
    22922016QT_END_NAMESPACE
    2293 
    2294 #include "qpaintengineex_opengl2.moc"
Note: See TracChangeset for help on using the changeset viewer.