From 26b5a9c67f8c4f8bf4cace5c189f506d3f89f3ce Mon Sep 17 00:00:00 2001 From: Jani Hautakangas Date: Tue, 19 Oct 2010 17:48:01 +0200 Subject: Fix GL_OES_element_index_uint and add GL_OES_depth24 detection. GL_OES_element_index_uint detection was not working because EGL config wasn't yet resolved. In addition QFrameBufferObject should use 24bit depth render buffer if extension is available. Task-number: QTBUG-14542 Reviewed-by: Gunnar --- .../gl2paintengineex/qpaintengineex_opengl2.cpp | 8 ++++---- src/opengl/gl2paintengineex/qtriangulator.cpp | 21 +++++--------------- src/opengl/qgl.cpp | 6 ++++++ src/opengl/qgl_p.h | 4 +++- src/opengl/qglextensions_p.h | 23 ++++++++-------------- src/opengl/qglframebufferobject.cpp | 19 +++++++++++++----- 6 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp index a98d7cc..5c7ebfa 100644 --- a/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp +++ b/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp @@ -825,7 +825,7 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path) glBindBuffer(GL_ARRAY_BUFFER, cache->vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cache->ibo); - if (glSupportsElementIndexUint) + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) 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); @@ -836,7 +836,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 (glSupportsElementIndexUint) { + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) { cache->indices = (quint32 *) qMalloc(sizeof(quint32) * polys.indices.size()); memcpy(cache->indices, polys.indices.data(), sizeof(quint32) * polys.indices.size()); } else { @@ -853,7 +853,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 (glSupportsElementIndexUint) + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, 0); else glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, 0); @@ -861,7 +861,7 @@ void QGL2PaintEngineExPrivate::fill(const QVectorPath& path) glBindBuffer(GL_ARRAY_BUFFER, 0); #else setVertexAttributePointer(QT_VERTEX_COORDS_ATTR, cache->vertices); - if (glSupportsElementIndexUint) + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_INT, (qint32 *)cache->indices); else glDrawElements(cache->primitiveType, cache->indexCount, GL_UNSIGNED_SHORT, (qint16 *)cache->indices); diff --git a/src/opengl/gl2paintengineex/qtriangulator.cpp b/src/opengl/gl2paintengineex/qtriangulator.cpp index b839b00..85f604a 100644 --- a/src/opengl/gl2paintengineex/qtriangulator.cpp +++ b/src/opengl/gl2paintengineex/qtriangulator.cpp @@ -58,7 +58,6 @@ #include #include -#include QT_BEGIN_NAMESPACE @@ -3014,10 +3013,8 @@ void QTriangulator::MonotoneToTriangles::decompose() QTriangleSet qTriangulate(const qreal *polygon, int count, uint hint, const QTransform &matrix) { - QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint - QTriangleSet triangleSet; - if (glSupportsElementIndexUint) { + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) { QTriangulator triangulator; triangulator.initialize(polygon, count, hint, matrix); QVertexSet vertexSet = triangulator.triangulate(); @@ -3037,10 +3034,8 @@ QTriangleSet qTriangulate(const qreal *polygon, QTriangleSet qTriangulate(const QVectorPath &path, const QTransform &matrix, qreal lod) { - QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint - QTriangleSet triangleSet; - if (glSupportsElementIndexUint) { + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) { QTriangulator triangulator; triangulator.initialize(path, matrix, lod); QVertexSet vertexSet = triangulator.triangulate(); @@ -3059,10 +3054,8 @@ QTriangleSet qTriangulate(const QVectorPath &path, QTriangleSet qTriangulate(const QPainterPath &path, const QTransform &matrix, qreal lod) { - QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint - QTriangleSet triangleSet; - if (glSupportsElementIndexUint) { + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) { QTriangulator triangulator; triangulator.initialize(path, matrix, lod); QVertexSet vertexSet = triangulator.triangulate(); @@ -3081,10 +3074,8 @@ QTriangleSet qTriangulate(const QPainterPath &path, QPolylineSet qPolyline(const QVectorPath &path, const QTransform &matrix, qreal lod) { - QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint - QPolylineSet polyLineSet; - if (glSupportsElementIndexUint) { + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) { QTriangulator triangulator; triangulator.initialize(path, matrix, lod); QVertexSet vertexSet = triangulator.polyline(); @@ -3103,10 +3094,8 @@ QPolylineSet qPolyline(const QVectorPath &path, QPolylineSet qPolyline(const QPainterPath &path, const QTransform &matrix, qreal lod) { - QGLContext *ctx = 0; // Not really used but needs to be introduced for glSupportsElementIndexUint - QPolylineSet polyLineSet; - if (glSupportsElementIndexUint) { + if (QGLExtensions::glExtensions() & QGLExtensions::ElementIndexUint) { QTriangulator triangulator; triangulator.initialize(path, matrix, lod); QVertexSet vertexSet = triangulator.polyline(); diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp index 7f25887..62eff6e 100644 --- a/src/opengl/qgl.cpp +++ b/src/opengl/qgl.cpp @@ -5292,6 +5292,12 @@ QGLExtensions::Extensions QGLExtensions::currentContextExtensions() #if defined(QT_OPENGL_ES) if (extensions.match("GL_OES_packed_depth_stencil")) glExtensions |= PackedDepthStencil; + if (extensions.match("GL_OES_element_index_uint")) + glExtensions |= ElementIndexUint; + if (extensions.match("GL_OES_depth24")) + glExtensions |= Depth24; +#else + glExtensions |= ElementIndexUint; #endif if (extensions.match("GL_ARB_framebuffer_object")) { // ARB_framebuffer_object also includes EXT_framebuffer_blit. diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h index 387c8f7..6c494ee 100644 --- a/src/opengl/qgl_p.h +++ b/src/opengl/qgl_p.h @@ -284,7 +284,9 @@ public: DDSTextureCompression = 0x00008000, ETC1TextureCompression = 0x00010000, PVRTCTextureCompression = 0x00020000, - FragmentShader = 0x00040000 + FragmentShader = 0x00040000, + ElementIndexUint = 0x00080000, + Depth24 = 0x00100000 }; Q_DECLARE_FLAGS(Extensions, Extension) diff --git a/src/opengl/qglextensions_p.h b/src/opengl/qglextensions_p.h index e81e849..a35ad87 100644 --- a/src/opengl/qglextensions_p.h +++ b/src/opengl/qglextensions_p.h @@ -346,17 +346,6 @@ struct QGLExtensionFuncs qt_glEGLImageTargetTexture2DOES = 0; qt_glEGLImageTargetRenderbufferStorageOES = 0; #endif - - // OES_element_index_uint -#if !defined(QT_OPENGL_ES) - qt_glSupportsElementIndexUint = true; -#else - QString extensions = reinterpret_cast(glGetString(GL_EXTENSIONS)); - if (extensions.contains("GL_OES_element_index_uint")) - qt_glSupportsElementIndexUint = true; - else - qt_glSupportsElementIndexUint = false; -#endif } @@ -483,8 +472,6 @@ struct QGLExtensionFuncs _glEGLImageTargetTexture2DOES qt_glEGLImageTargetTexture2DOES; _glEGLImageTargetRenderbufferStorageOES qt_glEGLImageTargetRenderbufferStorageOES; #endif - - bool qt_glSupportsElementIndexUint; }; @@ -576,6 +563,14 @@ struct QGLExtensionFuncs #define GL_TEXTURE1 0x84C1 #endif +#ifndef GL_DEPTH_COMPONENT16 +#define GL_DEPTH_COMPONENT16 0x81A5 +#endif + +#ifndef GL_DEPTH_COMPONENT24_OES +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#endif + #ifndef GL_EXT_framebuffer_object #define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 #define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 @@ -883,8 +878,6 @@ struct QGLExtensionFuncs #define glEGLImageTargetRenderbufferStorageOES QGLContextPrivate::extensionFuncs(ctx).qt_glEGLImageTargetRenderbufferStorageOES #endif -#define glSupportsElementIndexUint QGLContextPrivate::extensionFuncs(ctx).qt_glSupportsElementIndexUint - extern bool qt_resolve_framebufferobject_extensions(QGLContext *ctx); bool qt_resolve_buffer_extensions(QGLContext *ctx); diff --git a/src/opengl/qglframebufferobject.cpp b/src/opengl/qglframebufferobject.cpp index 6c9b288..a1472f7 100644 --- a/src/opengl/qglframebufferobject.cpp +++ b/src/opengl/qglframebufferobject.cpp @@ -508,17 +508,26 @@ void QGLFramebufferObjectPrivate::init(QGLFramebufferObject *q, const QSize &sz, Q_ASSERT(glIsRenderbuffer(depth_buffer)); if (samples != 0 && glRenderbufferStorageMultisampleEXT) { #ifdef QT_OPENGL_ES -#define GL_DEPTH_COMPONENT16 0x81A5 - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, - GL_DEPTH_COMPONENT16, size.width(), size.height()); + if (QGLExtensions::glExtensions() & QGLExtensions::Depth24) { + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, + GL_DEPTH_COMPONENT24_OES, size.width(), size.height()); + } else { + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, + GL_DEPTH_COMPONENT16, size.width(), size.height()); + } #else glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, samples, GL_DEPTH_COMPONENT, size.width(), size.height()); #endif } else { #ifdef QT_OPENGL_ES -#define GL_DEPTH_COMPONENT16 0x81A5 - glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16, size.width(), size.height()); + if (QGLExtensions::glExtensions() & QGLExtensions::Depth24) { + glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24_OES, + size.width(), size.height()); + } else { + glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16, + size.width(), size.height()); + } #else glRenderbufferStorage(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, size.width(), size.height()); #endif -- cgit v0.12