Fixed crash in tst_QGL::multipleFBOInterleavedRendering().
Properly check for the ElementIndexUint extension. Change-Id: I8117aa052f2dd697a2dadeb7ce84a415b5fd24c8 Reviewed-on: http://codereview.qt.nokia.com/4311 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com>
This commit is contained in:
parent
6119d12d7d
commit
c8fcc29298
@ -666,6 +666,7 @@ struct QOpenGL2PEVectorPathCache
|
||||
int indexCount;
|
||||
GLenum primitiveType;
|
||||
qreal iscale;
|
||||
QVertexIndexVector::Type indexType;
|
||||
};
|
||||
|
||||
void QOpenGL2PaintEngineExPrivate::cleanupVectorPath(QPaintEngineEx *engine, void *data)
|
||||
@ -823,13 +824,14 @@ void QOpenGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
cache->indexCount = polys.indices.size();
|
||||
cache->primitiveType = GL_TRIANGLES;
|
||||
cache->iscale = inverseScale;
|
||||
cache->indexType = polys.indices.type();
|
||||
#ifdef QT_OPENGL_CACHE_AS_VBOS
|
||||
glGenBuffers(1, &cache->vbo);
|
||||
glGenBuffers(1, &cache->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
|
||||
|
||||
if (funcs.hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint))
|
||||
if (polys.indices.type() == QVertexIndexVector::UnsignedInt)
|
||||
funcs.glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint32) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
|
||||
else
|
||||
funcs.glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint16) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
|
||||
@ -840,7 +842,7 @@ void QOpenGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
funcs.glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW);
|
||||
#else
|
||||
cache->vertices = (float *) qMalloc(sizeof(float) * polys.vertices.size());
|
||||
if (funcs.hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint)) {
|
||||
if (polys.indices.type() == QVertexIndexVector::UnsignedInt) {
|
||||
cache->indices = (quint32 *) qMalloc(sizeof(quint32) * polys.indices.size());
|
||||
memcpy(cache->indices, polys.indices.data(), sizeof(quint32) * polys.indices.size());
|
||||
} else {
|
||||
@ -857,7 +859,7 @@ void QOpenGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
|
||||
setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
|
||||
if (funcs.hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint))
|
||||
if (cache->indexType == QVertexIndexVector::UnsignedInt)
|
||||
glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, 0);
|
||||
else
|
||||
glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, 0);
|
||||
@ -865,7 +867,7 @@ void QOpenGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
#else
|
||||
setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, cache->vertices);
|
||||
if (funcs.hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint))
|
||||
if (cache->indexType == QVertexIndexVector::UnsignedInt)
|
||||
glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, (qint32 *)cache->indices);
|
||||
else
|
||||
glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, (qint16 *)cache->indices);
|
||||
|
@ -55,6 +55,7 @@
|
||||
#include <QtCore/qalgorithms.h>
|
||||
|
||||
#include <private/qopenglcontext_p.h>
|
||||
#include <private/qopenglextensions_p.h>
|
||||
#include <private/qrbtree_p.h>
|
||||
|
||||
#include <math.h>
|
||||
@ -2508,12 +2509,19 @@ void QTriangulator<T>::MonotoneToTriangles::decompose()
|
||||
// qTriangulate //
|
||||
//============================================================================//
|
||||
|
||||
static bool hasElementIndexUint()
|
||||
{
|
||||
QOpenGLContext *context = QOpenGLContext::currentContext();
|
||||
if (!context)
|
||||
return false;
|
||||
return static_cast<QOpenGLExtensions *>(context->functions())->hasOpenGLExtension(QOpenGLExtensions::ElementIndexUint);
|
||||
}
|
||||
|
||||
Q_GUI_EXPORT QTriangleSet qTriangulate(const qreal *polygon,
|
||||
int count, uint hint, const QTransform &matrix)
|
||||
{
|
||||
QTriangleSet triangleSet;
|
||||
#if 0
|
||||
if (QOpenGLExtensions::glExtensions() & QOpenGLExtensions::ElementIndexUint) {
|
||||
if (hasElementIndexUint()) {
|
||||
QTriangulator<quint32> triangulator;
|
||||
triangulator.initialize(polygon, count, hint, matrix);
|
||||
QVertexSet<quint32> vertexSet = triangulator.triangulate();
|
||||
@ -2521,13 +2529,12 @@ Q_GUI_EXPORT QTriangleSet qTriangulate(const qreal *polygon,
|
||||
triangleSet.indices.setDataUint(vertexSet.indices);
|
||||
|
||||
} else {
|
||||
#endif
|
||||
QTriangulator<quint16> triangulator;
|
||||
triangulator.initialize(polygon, count, hint, matrix);
|
||||
QVertexSet<quint16> vertexSet = triangulator.triangulate();
|
||||
triangleSet.vertices = vertexSet.vertices;
|
||||
triangleSet.indices.setDataUshort(vertexSet.indices);
|
||||
// }
|
||||
}
|
||||
return triangleSet;
|
||||
}
|
||||
|
||||
@ -2535,21 +2542,19 @@ Q_GUI_EXPORT QTriangleSet qTriangulate(const QVectorPath &path,
|
||||
const QTransform &matrix, qreal lod)
|
||||
{
|
||||
QTriangleSet triangleSet;
|
||||
#if 0
|
||||
if (QOpenGLExtensions::glExtensions() & QOpenGLExtensions::ElementIndexUint) {
|
||||
if (hasElementIndexUint()) {
|
||||
QTriangulator<quint32> triangulator;
|
||||
triangulator.initialize(path, matrix, lod);
|
||||
QVertexSet<quint32> vertexSet = triangulator.triangulate();
|
||||
triangleSet.vertices = vertexSet.vertices;
|
||||
triangleSet.indices.setDataUint(vertexSet.indices);
|
||||
} else {
|
||||
#endif
|
||||
QTriangulator<quint16> triangulator;
|
||||
triangulator.initialize(path, matrix, lod);
|
||||
QVertexSet<quint16> vertexSet = triangulator.triangulate();
|
||||
triangleSet.vertices = vertexSet.vertices;
|
||||
triangleSet.indices.setDataUshort(vertexSet.indices);
|
||||
// }
|
||||
}
|
||||
return triangleSet;
|
||||
}
|
||||
|
||||
@ -2557,21 +2562,19 @@ QTriangleSet qTriangulate(const QPainterPath &path,
|
||||
const QTransform &matrix, qreal lod)
|
||||
{
|
||||
QTriangleSet triangleSet;
|
||||
#if 0
|
||||
if (QOpenGLExtensions::glExtensions() & QOpenGLExtensions::ElementIndexUint) {
|
||||
if (hasElementIndexUint()) {
|
||||
QTriangulator<quint32> triangulator;
|
||||
triangulator.initialize(path, matrix, lod);
|
||||
QVertexSet<quint32> vertexSet = triangulator.triangulate();
|
||||
triangleSet.vertices = vertexSet.vertices;
|
||||
triangleSet.indices.setDataUint(vertexSet.indices);
|
||||
} else {
|
||||
#endif
|
||||
QTriangulator<quint16> triangulator;
|
||||
triangulator.initialize(path, matrix, lod);
|
||||
QVertexSet<quint16> vertexSet = triangulator.triangulate();
|
||||
triangleSet.vertices = vertexSet.vertices;
|
||||
triangleSet.indices.setDataUshort(vertexSet.indices);
|
||||
// }
|
||||
}
|
||||
return triangleSet;
|
||||
}
|
||||
|
||||
@ -2579,21 +2582,19 @@ QPolylineSet qPolyline(const QVectorPath &path,
|
||||
const QTransform &matrix, qreal lod)
|
||||
{
|
||||
QPolylineSet polyLineSet;
|
||||
#if 0
|
||||
if (QOpenGLExtensions::glExtensions() & QOpenGLExtensions::ElementIndexUint) {
|
||||
if (hasElementIndexUint()) {
|
||||
QTriangulator<quint32> triangulator;
|
||||
triangulator.initialize(path, matrix, lod);
|
||||
QVertexSet<quint32> vertexSet = triangulator.polyline();
|
||||
polyLineSet.vertices = vertexSet.vertices;
|
||||
polyLineSet.indices.setDataUint(vertexSet.indices);
|
||||
} else {
|
||||
#endif
|
||||
QTriangulator<quint16> triangulator;
|
||||
triangulator.initialize(path, matrix, lod);
|
||||
QVertexSet<quint16> vertexSet = triangulator.polyline();
|
||||
polyLineSet.vertices = vertexSet.vertices;
|
||||
polyLineSet.indices.setDataUshort(vertexSet.indices);
|
||||
// }
|
||||
}
|
||||
return polyLineSet;
|
||||
}
|
||||
|
||||
@ -2601,21 +2602,19 @@ QPolylineSet qPolyline(const QPainterPath &path,
|
||||
const QTransform &matrix, qreal lod)
|
||||
{
|
||||
QPolylineSet polyLineSet;
|
||||
#if 0
|
||||
if (QOpenGLExtensions::glExtensions() & QOpenGLExtensions::ElementIndexUint) {
|
||||
if (hasElementIndexUint()) {
|
||||
QTriangulator<quint32> triangulator;
|
||||
triangulator.initialize(path, matrix, lod);
|
||||
QVertexSet<quint32> vertexSet = triangulator.polyline();
|
||||
polyLineSet.vertices = vertexSet.vertices;
|
||||
polyLineSet.indices.setDataUint(vertexSet.indices);
|
||||
} else {
|
||||
#endif
|
||||
QTriangulator<quint16> triangulator;
|
||||
triangulator.initialize(path, matrix, lod);
|
||||
QVertexSet<quint16> vertexSet = triangulator.polyline();
|
||||
polyLineSet.vertices = vertexSet.vertices;
|
||||
polyLineSet.indices.setDataUshort(vertexSet.indices);
|
||||
// }
|
||||
}
|
||||
return polyLineSet;
|
||||
}
|
||||
|
||||
|
@ -667,6 +667,7 @@ struct QGL2PEVectorPathCache
|
||||
int indexCount;
|
||||
GLenum primitiveType;
|
||||
qreal iscale;
|
||||
QVertexIndexVector::Type indexType;
|
||||
};
|
||||
|
||||
void QGL2PaintEngineExPrivate::cleanupVectorPath(QPaintEngineEx *engine, void *data)
|
||||
@ -824,13 +825,14 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
cache->indexCount = polys.indices.size();
|
||||
cache->primitiveType = GL_TRIANGLES;
|
||||
cache->iscale = inverseScale;
|
||||
cache->indexType = polys.indices.type();
|
||||
#ifdef QT_OPENGL_CACHE_AS_VBOS
|
||||
glGenBuffers(1, &cache->vbo);
|
||||
glGenBuffers(1, &cache->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
|
||||
|
||||
if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint)
|
||||
if (polys.indices.type() == QVertexIndexVector::UnsignedInt)
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint32) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
|
||||
else
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quint16) * polys.indices.size(), polys.indices.data(), GL_STATIC_DRAW);
|
||||
@ -841,7 +843,7 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * vertices.size(), vertices.data(), GL_STATIC_DRAW);
|
||||
#else
|
||||
cache->vertices = (float *) qMalloc(sizeof(float) * polys.vertices.size());
|
||||
if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) {
|
||||
if (polys.indices.type() == QVertexIndexVector::UnsignedInt) {
|
||||
cache->indices = (quint32 *) qMalloc(sizeof(quint32) * polys.indices.size());
|
||||
memcpy(cache->indices, polys.indices.data(), sizeof(quint32) * polys.indices.size());
|
||||
} else {
|
||||
@ -858,7 +860,7 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
glBindBuffer(GL_ARRAY_BUFFER, cache->vbo);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo);
|
||||
setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, 0);
|
||||
if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint)
|
||||
if (cache->indexType == QVertexIndexVector::UnsignedInt)
|
||||
glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, 0);
|
||||
else
|
||||
glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, 0);
|
||||
@ -866,7 +868,7 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
#else
|
||||
setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, cache->vertices);
|
||||
if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint)
|
||||
if (cache->indexType == QVertexIndexVector::UnsignedInt)
|
||||
glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, (qint32 *)cache->indices);
|
||||
else
|
||||
glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, (qint16 *)cache->indices);
|
||||
@ -895,7 +897,7 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path)
|
||||
|
||||
prepareForDraw(currentBrush.isOpaque());
|
||||
setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, vertices.constData());
|
||||
if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint)
|
||||
if (polys.indices.type() == QVertexIndexVector::UnsignedInt)
|
||||
glDrawElements(GL_TRIANGLES, polys.indices.size(), GL_UNSIGNED_INT, polys.indices.data());
|
||||
else
|
||||
glDrawElements(GL_TRIANGLES, polys.indices.size(), GL_UNSIGNED_SHORT, polys.indices.data());
|
||||
|
Loading…
Reference in New Issue
Block a user