- Timestamp:
- Mar 8, 2010, 12:52:58 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.6.2 (added) merged: 650 /branches/vendor/nokia/qt/current merged: 649 /branches/vendor/nokia/qt/4.6.1 removed
- Property svn:mergeinfo changed
-
trunk/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
r561 r651 1 1 /**************************************************************************** 2 2 ** 3 ** Copyright (C) 20 09Nokia Corporation and/or its subsidiary(-ies).3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 4 4 ** All rights reserved. 5 5 ** Contact: Nokia Corporation (qt-info@nokia.com) … … 76 76 #include <private/qpainter_p.h> 77 77 #include <private/qfontengine_p.h> 78 #include <private/qtextureglyphcache_p.h>79 78 #include <private/qpixmapdata_gl_p.h> 80 79 #include <private/qdatabuffer_p.h> … … 83 82 #include "qglengineshadermanager_p.h" 84 83 #include "qgl2pexvertexarray_p.h" 85 86 84 #include "qtriangulatingstroker_p.h" 85 #include "qtextureglyphcache_gl_p.h" 87 86 88 87 #include <QDebug> … … 91 90 92 91 //#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 unit97 static const GLuint QT_MASK_TEXTURE_UNIT = 1;98 static const GLuint QT_BACKGROUND_TEXTURE_UNIT = 2;99 100 #ifdef Q_WS_WIN101 extern Q_GUI_EXPORT bool qt_cleartype_enabled;102 #endif103 104 class QGLTextureGlyphCache : public QObject, public QTextureGlyphCache105 {106 Q_OBJECT107 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, and135 // about to be destroyed, we have to transfer ownership136 // of the texture to one of the share contexts137 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 else193 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 allow202 // ### resizeTextureData to fail203 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_2258 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_ALPHA263 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 #else269 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, oldWidth, oldHeight);270 #endif271 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 255295 }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_ES2304 glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_ALPHA, GL_UNSIGNED_BYTE, mask.bits());305 #else306 // glTexSubImage2D() might cause some garbage to appear in the texture if the mask width is307 // not a multiple of four bytes. The bug appeared on a computer with 32-bit Windows Vista308 // and nVidia GeForce 8500GT. GL_UNPACK_ALIGNMENT is set to four bytes, 'mask' has a309 // multiple of four bytes per line, and most of the glyph shows up correctly in the310 // 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 instance312 // by converting it to a format with four bytes per pixel. Another is to copy one line at a313 // 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 #endif318 }319 }320 321 int QGLTextureGlyphCache::glyphMargin() const322 {323 #if defined(Q_WS_MAC)324 return 2;325 #elif defined (Q_WS_X11)326 return 0;327 #else328 return m_type == QFontEngineGlyphCache::Raster_RGBMask ? 2 : 0;329 #endif330 }331 92 332 93 extern QImage qt_imageForBrush(int brushStyle, bool invert); … … 404 165 void QGL2PaintEngineExPrivate::useSimpleShader() 405 166 { 406 shaderManager->simpleProgram()->bind(); 407 shaderManager->setDirty(); 167 shaderManager->useSimpleProgram(); 408 168 409 169 if (matrixDirty) 410 170 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 }417 171 } 418 172 … … 633 387 matrixDirty = false; 634 388 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]); 638 394 639 395 dasher.setInvScale(inverseScale); … … 751 507 glUseProgram(0); 752 508 509 // Disable all the vertex attribute arrays: 510 for (int i = 0; i < QT_GL_VERTEX_ARRAY_TRACKED_COUNT; ++i) 511 glDisableVertexAttribArray(i); 512 753 513 #ifndef QT_OPENGL_ES_2 754 514 // be nice to people who mix OpenGL 1.x code with QPainter commands … … 796 556 glDepthFunc(GL_LESS); 797 557 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 798 567 } 799 568 … … 810 579 811 580 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 816 581 lastTextureUsed = GLuint(-1); 817 582 } 818 583 819 584 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()); 825 587 } 826 588 827 589 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); 833 592 } 834 593 835 594 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()); 843 598 } 844 599 … … 953 708 954 709 prepareForDraw(currentBrush.isOpaque()); 955 glEnableVertexAttribArray(QT_VERTEX_COORDS_ATTR);956 710 #ifdef QT_OPENGL_CACHE_AS_VBOS 957 711 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); 959 713 #else 960 glVertexAttribPointer(QT_VERTEX_COORDS_ATTR, 2, GL_FLOAT, false, 0, cache->vertices);714 setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, cache->vertices); 961 715 #endif 962 716 glDrawArrays(cache->primitiveType, 0, cache->vertexCount); … … 1078 832 #if 0 1079 833 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); 1082 835 glDrawArrays(GL_TRIANGLE_STRIP, 0, count); 1083 glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);1084 836 #else 1085 837 … … 1091 843 glStencilFunc(GL_ALWAYS, GL_STENCIL_HIGH_BIT, 0xff); 1092 844 } 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); 1095 846 glDrawArrays(GL_TRIANGLE_STRIP, 0, count); 1096 glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);1097 847 #endif 1098 848 } … … 1185 935 // The shader program has changed so mark all uniforms as dirty: 1186 936 brushUniformsDirty = true; 1187 shaderMatrixUniformDirty = true;1188 937 opacityUniformDirty = true; 1189 938 } … … 1191 940 if (brushUniformsDirty && mode != ImageDrawingMode && mode != ImageArrayDrawingMode) 1192 941 updateBrushUniforms(); 1193 1194 if (shaderMatrixUniformDirty) {1195 glUniformMatrix3fv(location(QGLEngineShaderManager::PmvMatrix), 1, GL_FALSE, (GLfloat*)pmvMatrix);1196 shaderMatrixUniformDirty = false;1197 }1198 942 1199 943 if (opacityMode == QGLEngineShaderManager::UniformOpacity && opacityUniformDirty) { … … 1207 951 void QGL2PaintEngineExPrivate::composite(const QGLRect& boundingRect) 1208 952 { 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); 1220 955 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 1221 1222 glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);1223 956 } 1224 957 … … 1228 961 { 1229 962 // 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); 1232 964 1233 965 int previousStop = 0; … … 1242 974 previousStop = stop; 1243 975 } 1244 glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);1245 976 } 1246 977 … … 1329 1060 if (opaque) { 1330 1061 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()); 1333 1063 glDrawArrays(GL_TRIANGLE_STRIP, 0, stroker.vertexCount() / 2); 1334 1064 … … 1337 1067 // d->prepareForDraw(true); 1338 1068 // glDrawArrays(GL_LINE_STRIP, 0, d->stroker.vertexCount() / 2); 1339 1340 glDisableVertexAttribArray(QT_VERTEX_COORDS_ATTR);1341 1069 1342 1070 } else { … … 1553 1281 GLfloat dy = 1.0 / cache->height(); 1554 1282 1555 QGLPoint *oldVertexCoordinateDataPtr = vertexCoordinateArray.data();1556 QGLPoint *oldTextureCoordinateDataPtr = textureCoordinateArray.data();1557 1558 1283 vertexCoordinateArray.clear(); 1559 1284 textureCoordinateArray.clear(); … … 1568 1293 } 1569 1294 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()); 1574 1297 1575 1298 if (addOffset) { … … 1833 1556 #if !defined(QT_OPENGL_ES_2) 1834 1557 #if defined(Q_WS_WIN) 1558 extern Q_GUI_EXPORT bool qt_cleartype_enabled; 1835 1559 if (qt_cleartype_enabled) 1836 1560 #endif … … 1900 1624 d->needsSync = false; 1901 1625 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 1902 1629 setState(state()); 1903 1630 } … … 2225 1952 renderHintsChanged(); 2226 1953 2227 if (old_state == s || old_state->matrixChanged) {1954 if (old_state == s || old_state->matrixChanged) 2228 1955 d->matrixDirty = true; 2229 d->simpleShaderMatrixUniformDirty = true;2230 d->shaderMatrixUniformDirty = true;2231 }2232 1956 2233 1957 if (old_state == s || old_state->compositionModeChanged) … … 2291 2015 2292 2016 QT_END_NAMESPACE 2293 2294 #include "qpaintengineex_opengl2.moc"
Note:
See TracChangeset
for help on using the changeset viewer.