From d7d7786026f57cfbd1b5c5ef4e2eb80d832e2d47 Mon Sep 17 00:00:00 2001 From: Jorgen Lind Date: Tue, 5 Nov 2013 12:25:29 +0100 Subject: Enable QOpenGLTexture for OpenGL ES 2 Change-Id: I3ec2b7af303070c92e86c0f5ca729eb1a1731682 Reviewed-by: Sean Harmer --- src/gui/kernel/qopenglcontext.cpp | 6 -- src/gui/kernel/qopenglcontext.h | 2 - src/gui/opengl/opengl.pri | 22 +++--- src/gui/opengl/qopengltexture.cpp | 132 ++++++++++++++++++++++++++++++-- src/gui/opengl/qopengltexture.h | 17 +++- src/gui/opengl/qopengltexturehelper.cpp | 17 ++++ src/gui/opengl/qopengltexturehelper_p.h | 8 ++ 7 files changed, 179 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp index 7b111c73e1..39dd2a2dfa 100644 --- a/src/gui/kernel/qopenglcontext.cpp +++ b/src/gui/kernel/qopenglcontext.cpp @@ -56,9 +56,7 @@ #include #include -#if !defined(QT_OPENGL_ES_2) #include -#endif #include @@ -527,10 +525,8 @@ void QOpenGLContext::destroy() d->versionFunctions.clear(); qDeleteAll(d->versionFunctionsBackend); d->versionFunctionsBackend.clear(); -#if !defined(QT_OPENGL_ES_2) delete d->textureFunctions; d->textureFunctions = 0; -#endif } /*! @@ -984,7 +980,6 @@ void QOpenGLContext::removeFunctionsBackend(const QOpenGLVersionStatus &v) d->versionFunctionsBackend.remove(v); } -#if !defined(QT_OPENGL_ES_2) /*! \internal */ @@ -1002,7 +997,6 @@ void QOpenGLContext::setTextureFunctions(QOpenGLTextureHelper* textureFuncs) Q_D(QOpenGLContext); d->textureFunctions = textureFuncs; } -#endif /*! \class QOpenGLContextGroup diff --git a/src/gui/kernel/qopenglcontext.h b/src/gui/kernel/qopenglcontext.h index 9756be30df..ce34a2d5a5 100644 --- a/src/gui/kernel/qopenglcontext.h +++ b/src/gui/kernel/qopenglcontext.h @@ -221,10 +221,8 @@ private: QOpenGLVersionFunctionsBackend *backend); void removeFunctionsBackend(const QOpenGLVersionStatus &v); -#if !defined(QT_OPENGL_ES_2) QOpenGLTextureHelper* textureFunctions() const; void setTextureFunctions(QOpenGLTextureHelper* textureFuncs); -#endif void destroy(); }; diff --git a/src/gui/opengl/opengl.pri b/src/gui/opengl/opengl.pri index 8212c0981f..d249b855f5 100644 --- a/src/gui/opengl/opengl.pri +++ b/src/gui/opengl/opengl.pri @@ -53,6 +53,17 @@ contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2) { opengl/qopenglvertexarrayobject.cpp \ opengl/qopengldebug.cpp + !wince* { + HEADERS += opengl/qopengltexture.h \ + opengl/qopengltexture_p.h \ + opengl/qopengltexturehelper_p.h \ + opengl/qopenglpixeltransferoptions.h + + SOURCES += opengl/qopengltexture.cpp \ + opengl/qopengltexturehelper.cpp \ + opengl/qopenglpixeltransferoptions.cpp + } + !contains(QT_CONFIG, opengles2) { HEADERS += opengl/qopenglfunctions_1_0.h \ opengl/qopenglfunctions_1_1.h \ @@ -77,11 +88,7 @@ contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2) { opengl/qopenglfunctions_4_2_compatibility.h \ opengl/qopenglfunctions_4_3_compatibility.h \ opengl/qopenglqueryhelper_p.h \ - opengl/qopengltimerquery.h \ - opengl/qopengltexture.h \ - opengl/qopengltexture_p.h \ - opengl/qopengltexturehelper_p.h \ - opengl/qopenglpixeltransferoptions.h + opengl/qopengltimerquery.h SOURCES += opengl/qopenglfunctions_1_0.cpp \ opengl/qopenglfunctions_1_1.cpp \ @@ -105,10 +112,7 @@ contains(QT_CONFIG, opengl)|contains(QT_CONFIG, opengles2) { opengl/qopenglfunctions_4_1_compatibility.cpp \ opengl/qopenglfunctions_4_2_compatibility.cpp \ opengl/qopenglfunctions_4_3_compatibility.cpp \ - opengl/qopengltimerquery.cpp \ - opengl/qopengltexture.cpp \ - opengl/qopengltexturehelper.cpp \ - opengl/qopenglpixeltransferoptions.cpp + opengl/qopengltimerquery.cpp } contains(QT_CONFIG, opengles2) { diff --git a/src/gui/opengl/qopengltexture.cpp b/src/gui/opengl/qopengltexture.cpp index 5407142b18..e3fffe5a1c 100644 --- a/src/gui/opengl/qopengltexture.cpp +++ b/src/gui/opengl/qopengltexture.cpp @@ -50,6 +50,11 @@ QT_BEGIN_NAMESPACE +//this is to work around GL_TEXTURE_WRAP_R_OES which also has 0x8072 as value +#if !defined(GL_TEXTURE_WRAP_R) + #define GL_TEXTURE_WRAP_R 0x8072 +#endif + QOpenGLTexturePrivate::QOpenGLTexturePrivate(QOpenGLTexture::Target textureTarget, QOpenGLTexture *qq) : q_ptr(qq), @@ -1255,6 +1260,13 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target \value SRGB_Alpha_DXT3 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT \value SRGB_Alpha_DXT5 Equivalent to GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT \value SRGB_BP_UNorm Equivalent to GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB + + \value DepthFormat Equivalent to GL_DEPTH_COMPONENT (OpenGL ES 2 only and when OES_depth_texture is present) + \value AlphaFormat Equivalent to GL_ALPHA (OpenGL ES 2 only) + \value RGBFormat Equivalent to GL_RGB (OpenGL ES 2 only) + \value RGBAFormat Equivalent to GL_RGBA (OpenGL ES 2 only) + \value LuminanceFormat Equivalent to GL_LUMINANCE (OpenGL ES 2 only) + \value LuminanceAlphaFormat Equivalent to GL_LUMINANCE_ALPHA (OpenGL ES 2 only) */ /*! @@ -1289,6 +1301,10 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target \value BGRA_Integer Equivalent to GL_BGRA_INTEGER \value Depth Equivalent to GL_DEPTH_COMPONENT \value DepthStencil Equivalent to GL_DEPTH_STENCIL + \value Alpha Equivalent to GL_ALPHA (OpenGL ES 2 only) + \value Luminance Equivalent to GL_LUMINANCE (OpenGL ES 2 only) + \value LuminanceAlpha Equivalent to GL_LUMINANCE_ALPHA (OpenGL ES 2 only) + */ /*! @@ -1303,6 +1319,7 @@ QOpenGLTexture *QOpenGLTexturePrivate::createTextureView(QOpenGLTexture::Target \value Int32 Equivalent to GL_INT \value UInt32 Equivalent to GL_UNSIGNED_INT \value Float16 Equivalent to GL_HALF_FLOAT + \value Float16OES Equivalent to GL_HALF_FLOAT_OES \value Float32 Equivalent to GL_FLOAT \value UInt32_RGB9_E5 Equivalent to GL_UNSIGNED_INT_5_9_9_9_REV \value UInt32_RG11B10F Equivalent to GL_UNSIGNED_INT_10F_11F_11F_REV @@ -1752,6 +1769,12 @@ void QOpenGLTexture::setFormat(TextureFormat format) case D32: case D32F: case D32FS8X24: + case DepthFormat: + case AlphaFormat: + case RGBFormat: + case RGBAFormat: + case LuminanceFormat: + case LuminanceAlphaFormat: d->formatClass = FormatClass_Unique; break; } @@ -2242,6 +2265,7 @@ bool QOpenGLTexture::hasFeature(Feature feature) bool supported = false; switch (feature) { +#if !defined(QT_OPENGL_ES_2) case ImmutableMultisampleStorage: case TextureBuffer: case StencilTexturing: @@ -2289,16 +2313,38 @@ bool QOpenGLTexture::hasFeature(Feature feature) break; } +#else + case Texture3D: + supported = ctx->hasExtension(QByteArrayLiteral("GL_OES_texture_3D")); + break; + case AnisotropicFiltering: + supported = ctx->hasExtension(QByteArrayLiteral("GL_EXT_texture_filter_anisotropic")); + break; + case NPOTTextures: + case NPOTTextureRepeat: + supported = f.version() >= qMakePair(3,0); + if (!supported) { + supported = ctx->hasExtension(QByteArrayLiteral("GL_OES_texture_npot")); + if (!supported) + supported = ctx->hasExtension(QByteArrayLiteral("GL_ARB_texture_non_power_of_two")); + } + default: + break; + } +#endif + return supported; } /*! Sets the base mipmap level used for all texture lookups with this texture to \a baseLevel. + \note This function has no effect on Qt built for OpenGL ES 2. \sa mipBaseLevel(), setMipMaxLevel(), setMipLevelRange() */ void QOpenGLTexture::setMipBaseLevel(int baseLevel) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->textureId); @@ -2306,6 +2352,10 @@ void QOpenGLTexture::setMipBaseLevel(int baseLevel) Q_ASSERT(baseLevel <= d->maxLevel); d->baseLevel = baseLevel; d->texFuncs->glTextureParameteri(d->textureId, d->target, GL_TEXTURE_BASE_LEVEL, baseLevel); +#else + Q_UNUSED(baseLevel); + qWarning("QOpenGLTexture: Mipmap base level is not supported"); +#endif } /*! @@ -2323,10 +2373,12 @@ int QOpenGLTexture::mipBaseLevel() const /*! Sets the maximum mipmap level used for all texture lookups with this texture to \a maxLevel. + \note This function has no effect on Qt built for OpenGL ES 2. \sa mipMaxLevel(), setMipBaseLevel(), setMipLevelRange() */ void QOpenGLTexture::setMipMaxLevel(int maxLevel) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->textureId); @@ -2334,6 +2386,10 @@ void QOpenGLTexture::setMipMaxLevel(int maxLevel) Q_ASSERT(d->baseLevel <= maxLevel); d->maxLevel = maxLevel; d->texFuncs->glTextureParameteri(d->textureId, d->target, GL_TEXTURE_MAX_LEVEL, maxLevel); +#else + Q_UNUSED(maxLevel); + qWarning("QOpenGLTexture: Mipmap max level is not supported"); +#endif } /*! @@ -2351,10 +2407,12 @@ int QOpenGLTexture::mipMaxLevel() const Sets the range of mipmap levels that can be used for texture lookups with this texture to range from \a baseLevel to \a maxLevel. + \note This function has no effect on Qt built for OpenGL ES 2. \sa setMipBaseLevel(), setMipMaxLevel(), mipLevelRange() */ void QOpenGLTexture::setMipLevelRange(int baseLevel, int maxLevel) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->textureId); @@ -2362,6 +2420,11 @@ void QOpenGLTexture::setMipLevelRange(int baseLevel, int maxLevel) Q_ASSERT(baseLevel <= maxLevel); d->texFuncs->glTextureParameteri(d->textureId, d->target, GL_TEXTURE_BASE_LEVEL, baseLevel); d->texFuncs->glTextureParameteri(d->textureId, d->target, GL_TEXTURE_MAX_LEVEL, maxLevel); +#else + Q_UNUSED(baseLevel); + Q_UNUSED(maxLevel); + qWarning("QOpenGLTexture: Mipmap level range is not supported"); +#endif } /*! @@ -2451,11 +2514,12 @@ void QOpenGLTexture::generateMipMaps(int baseLevel, bool resetBaseLevel) This function maps \a component to the output \a value. + \note This function has no effect on Mac and Qt built for OpenGL ES 2. \sa swizzleMask() */ void QOpenGLTexture::setSwizzleMask(SwizzleComponent component, SwizzleValue value) { -#if !defined(Q_OS_MAC) +#if !defined(Q_OS_MAC) && !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2467,9 +2531,9 @@ void QOpenGLTexture::setSwizzleMask(SwizzleComponent component, SwizzleValue val d->swizzleMask[component - SwizzleRed] = value; d->texFuncs->glTextureParameteri(d->textureId, d->target, component, value); #else - qWarning("Texture swizzling is not supported"); Q_UNUSED(component); Q_UNUSED(value); + qWarning("QOpenGLTexture: Texture swizzling is not supported"); #endif } @@ -2479,7 +2543,7 @@ void QOpenGLTexture::setSwizzleMask(SwizzleComponent component, SwizzleValue val void QOpenGLTexture::setSwizzleMask(SwizzleValue r, SwizzleValue g, SwizzleValue b, SwizzleValue a) { -#if !defined(Q_OS_MAC) +#if !defined(Q_OS_MAC) && !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2495,11 +2559,11 @@ void QOpenGLTexture::setSwizzleMask(SwizzleValue r, SwizzleValue g, d->swizzleMask[3] = a; d->texFuncs->glTextureParameteriv(d->textureId, d->target, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); #else - qWarning("Texture swizzling is not supported"); Q_UNUSED(r); Q_UNUSED(g); Q_UNUSED(b); Q_UNUSED(a); + qWarning("QOpenGLTexture: Texture swizzling is not supported"); #endif } @@ -2520,11 +2584,12 @@ QOpenGLTexture::SwizzleValue QOpenGLTexture::swizzleMask(SwizzleComponent compon shader will access the depth component as a single float, as normal. But when the parameter is set to StencilMode?, the shader will access the stencil component. + \note This function has no effect on Mac and Qt built for OpenGL ES 2. \sa depthStencilMode() */ void QOpenGLTexture::setDepthStencilMode(QOpenGLTexture::DepthStencilMode mode) { -#if !defined(Q_OS_MAC) +#if !defined(Q_OS_MAC) && !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2537,7 +2602,7 @@ void QOpenGLTexture::setDepthStencilMode(QOpenGLTexture::DepthStencilMode mode) d->texFuncs->glTextureParameteri(d->textureId, d->target, GL_DEPTH_STENCIL_TEXTURE_MODE, mode); #else Q_UNUSED(mode); - qWarning("DepthStencil Mode is not supported"); + qWarning("QOpenGLTexture: DepthStencil Mode is not supported"); #endif } @@ -2706,10 +2771,12 @@ QOpenGLTexture::WrapMode QOpenGLTexture::wrapMode(QOpenGLTexture::CoordinateDire /*! Sets the border color of the texture to \a color. + \note This function has no effect on Mac and Qt built for OpenGL ES 2. \sa borderColor() */ void QOpenGLTexture::setBorderColor(QColor color) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2723,6 +2790,10 @@ void QOpenGLTexture::setBorderColor(QColor color) for (int i = 0; i < 4; ++i) d->borderColor.append(QVariant(values[i])); d->texFuncs->glTextureParameterfv(d->textureId, d->target, GL_TEXTURE_BORDER_COLOR, values); +#else + Q_UNUSED(color); + qWarning("QOpenGLTexture: Border color is not supported"); +#endif } /*! @@ -2730,6 +2801,7 @@ void QOpenGLTexture::setBorderColor(QColor color) */ void QOpenGLTexture::setBorderColor(float r, float g, float b, float a) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2743,6 +2815,13 @@ void QOpenGLTexture::setBorderColor(float r, float g, float b, float a) for (int i = 0; i < 4; ++i) d->borderColor.append(QVariant(values[i])); d->texFuncs->glTextureParameterfv(d->textureId, d->target, GL_TEXTURE_BORDER_COLOR, values); +#else + Q_UNUSED(r); + Q_UNUSED(g); + Q_UNUSED(b); + Q_UNUSED(a); + qWarning("QOpenGLTexture: Border color is not supported"); +#endif } /*! @@ -2750,6 +2829,7 @@ void QOpenGLTexture::setBorderColor(float r, float g, float b, float a) */ void QOpenGLTexture::setBorderColor(int r, int g, int b, int a) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2763,6 +2843,13 @@ void QOpenGLTexture::setBorderColor(int r, int g, int b, int a) for (int i = 0; i < 4; ++i) d->borderColor.append(QVariant(values[i])); d->texFuncs->glTextureParameteriv(d->textureId, d->target, GL_TEXTURE_BORDER_COLOR, values); +#else + Q_UNUSED(r); + Q_UNUSED(g); + Q_UNUSED(b); + Q_UNUSED(a); + qWarning("QOpenGLTexture: Border color is not supported"); +#endif // TODO Handle case of using glTextureParameterIiv() based on format } @@ -2772,6 +2859,7 @@ void QOpenGLTexture::setBorderColor(int r, int g, int b, int a) */ void QOpenGLTexture::setBorderColor(uint r, uint g, uint b, uint a) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2785,6 +2873,13 @@ void QOpenGLTexture::setBorderColor(uint r, uint g, uint b, uint a) for (int i = 0; i < 4; ++i) d->borderColor.append(QVariant(values[i])); d->texFuncs->glTextureParameteriv(d->textureId, d->target, GL_TEXTURE_BORDER_COLOR, values); +#else + Q_UNUSED(r); + Q_UNUSED(g); + Q_UNUSED(b); + Q_UNUSED(a); + qWarning("QOpenGLTexture: Border color is not supported"); +#endif // TODO Handle case of using glTextureParameterIuiv() based on format } @@ -2862,10 +2957,12 @@ void QOpenGLTexture::borderColor(unsigned int *border) const Sets the minimum level of detail to \a value. This limits the selection of highest resolution mipmap (lowest mipmap level). The default value is -1000. + \note This function has no effect on Qt built for OpenGL ES 2. \sa minimumLevelOfDetail(), setMaximumLevelOfDetail(), setLevelOfDetailRange() */ void QOpenGLTexture::setMinimumLevelOfDetail(float value) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2873,6 +2970,10 @@ void QOpenGLTexture::setMinimumLevelOfDetail(float value) Q_ASSERT(value < d->maxLevelOfDetail); d->minLevelOfDetail = value; d->texFuncs->glTextureParameterf(d->textureId, d->target, GL_TEXTURE_MIN_LOD, value); +#else + Q_UNUSED(value); + qWarning("QOpenGLTexture: Detail level is not supported"); +#endif } /*! @@ -2890,10 +2991,12 @@ float QOpenGLTexture::minimumLevelOfDetail() const Sets the maximum level of detail to \a value. This limits the selection of lowest resolution mipmap (highest mipmap level). The default value is 1000. + \note This function has no effect on Qt built for OpenGL ES 2. \sa maximumLevelOfDetail(), setMinimumLevelOfDetail(), setLevelOfDetailRange() */ void QOpenGLTexture::setMaximumLevelOfDetail(float value) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2901,6 +3004,10 @@ void QOpenGLTexture::setMaximumLevelOfDetail(float value) Q_ASSERT(value > d->minLevelOfDetail); d->maxLevelOfDetail = value; d->texFuncs->glTextureParameterf(d->textureId, d->target, GL_TEXTURE_MAX_LOD, value); +#else + Q_UNUSED(value); + qWarning("QOpenGLTexture: Detail level is not supported"); +#endif } /*! @@ -2917,10 +3024,12 @@ float QOpenGLTexture::maximumLevelOfDetail() const /*! Sets the minimum and maximum level of detail parameters. + \note This function has no effect on Qt built for OpenGL ES 2. \sa levelOfDetailRange(), setMinimumLevelOfDetail(), setMaximumLevelOfDetail() */ void QOpenGLTexture::setLevelOfDetailRange(float min, float max) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); @@ -2930,6 +3039,11 @@ void QOpenGLTexture::setLevelOfDetailRange(float min, float max) d->maxLevelOfDetail = max; d->texFuncs->glTextureParameterf(d->textureId, d->target, GL_TEXTURE_MIN_LOD, min); d->texFuncs->glTextureParameterf(d->textureId, d->target, GL_TEXTURE_MAX_LOD, max); +#else + Q_UNUSED(min); + Q_UNUSED(max); + qWarning("QOpenGLTexture: Detail level is not supported"); +#endif } /*! @@ -2946,16 +3060,22 @@ QPair QOpenGLTexture::levelOfDetailRange() const /*! Sets the level of detail bias parameter. + \note This function has no effect on Qt built for OpenGL ES 2. \sa levelofDetailBias() */ void QOpenGLTexture::setLevelofDetailBias(float bias) { +#if !defined(QT_OPENGL_ES_2) Q_D(QOpenGLTexture); d->create(); Q_ASSERT(d->texFuncs); Q_ASSERT(d->textureId); d->levelOfDetailBias = bias; d->texFuncs->glTextureParameterf(d->textureId, d->target, GL_TEXTURE_LOD_BIAS, bias); +#else + Q_UNUSED(bias); + qWarning("QOpenGLTexture: Detail level is not supported"); +#endif } /*! diff --git a/src/gui/opengl/qopengltexture.h b/src/gui/opengl/qopengltexture.h index 3428f0d74a..5c0f8101a6 100644 --- a/src/gui/opengl/qopengltexture.h +++ b/src/gui/opengl/qopengltexture.h @@ -222,7 +222,16 @@ public: SRGB_Alpha_DXT1 = 0x8C4D, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT SRGB_Alpha_DXT3 = 0x8C4E, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT SRGB_Alpha_DXT5 = 0x8C4F, // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT - SRGB_BP_UNorm = 0x8E8D // GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB + SRGB_BP_UNorm = 0x8E8D, // GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB + + // ES 2 formats + DepthFormat = 0x1902, // GL_DEPTH_COMPONENT + AlphaFormat = 0x1906, // GL_ALPHA + RGBFormat = 0x1907, // GL_RGB + RGBAFormat = 0x1908, // GL_RGBA + LuminanceFormat = 0x1909, // GL_LUMINANCE + LuminanceAlphaFormat = 0x190A + }; // This is not used externally yet but is reserved to allow checking of @@ -296,7 +305,10 @@ public: RGBA_Integer = 0x8D99, // GL_RGBA_INTEGER BGRA_Integer = 0x8D9B, // GL_BGRA_INTEGER Depth = 0x1902, // GL_DEPTH_COMPONENT - DepthStencil = 0x84F9 // GL_DEPTH_STENCIL + DepthStencil = 0x84F9, // GL_DEPTH_STENCIL + Alpha = 0x1906, // GL_ALPHA + Luminance = 0x1909, // GL_LUMINANCE + LuminanceAlpha = 0x190A // GL_LUMINANCE_ALPHA }; enum PixelType { @@ -308,6 +320,7 @@ public: Int32 = 0x1404, // GL_INT UInt32 = 0x1405, // GL_UNSIGNED_INT Float16 = 0x140B, // GL_HALF_FLOAT + Float16OES = 0x8D61, // GL_HALF_FLOAT_OES Float32 = 0x1406, // GL_FLOAT UInt32_RGB9_E5 = 0x8C3E, // GL_UNSIGNED_INT_5_9_9_9_REV UInt32_RG11B10F = 0x8C3B, // GL_UNSIGNED_INT_10F_11F_11F_REV diff --git a/src/gui/opengl/qopengltexturehelper.cpp b/src/gui/opengl/qopengltexturehelper.cpp index e09b84cce6..7cd7ca54b2 100644 --- a/src/gui/opengl/qopengltexturehelper.cpp +++ b/src/gui/opengl/qopengltexturehelper.cpp @@ -48,6 +48,7 @@ QT_BEGIN_NAMESPACE QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context) { // Resolve EXT_direct_state_access entry points if present +#if !defined(QT_OPENGL_ES_2) if (context->hasExtension(QByteArrayLiteral("GL_EXT_direct_state_access"))) { TextureParameteriEXT = reinterpret_cast(context->getProcAddress(QByteArrayLiteral("glTextureParameteriEXT"))); TextureParameterivEXT = reinterpret_cast(context->getProcAddress(QByteArrayLiteral("glTextureParameterivEXT"))); @@ -96,6 +97,7 @@ QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context) CompressedTextureImage2D = &QOpenGLTextureHelper::dsa_CompressedTextureImage2D; CompressedTextureImage3D = &QOpenGLTextureHelper::dsa_CompressedTextureImage3D; } else { +#endif // Use our own DSA emulation TextureParameteri = &QOpenGLTextureHelper::qt_TextureParameteri; TextureParameteriv = &QOpenGLTextureHelper::qt_TextureParameteriv; @@ -117,9 +119,21 @@ QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context) CompressedTextureImage1D = &QOpenGLTextureHelper::qt_CompressedTextureImage1D; CompressedTextureImage2D = &QOpenGLTextureHelper::qt_CompressedTextureImage2D; CompressedTextureImage3D = &QOpenGLTextureHelper::qt_CompressedTextureImage3D; +#if defined(QT_OPENGL_ES_2) + if (context->hasExtension(QByteArrayLiteral("GL_OES_texture_3D"))) { + TexImage3D = reinterpret_cast(context->getProcAddress(QByteArrayLiteral("glTexImage3DOES"))); + TexSubImage3D = reinterpret_cast(context->getProcAddress(QByteArrayLiteral("glTexSubImage3DOES"))); + CompressedTexImage3D = reinterpret_cast(context->getProcAddress(QByteArrayLiteral("glCompressedTexImage3DOES"))); + CompressedTexSubImage3D = reinterpret_cast(context->getProcAddress(QByteArrayLiteral("glCompressedTexSubImage3DOES"))); + } +#endif + +#if !defined(QT_OPENGL_ES_2) } +#endif // Some DSA functions are part of NV_texture_multisample instead +#if !defined(QT_OPENGL_ES_2) if (context->hasExtension(QByteArrayLiteral("GL_NV_texture_multisample"))) { TextureImage3DMultisampleNV = reinterpret_cast(context->getProcAddress(QByteArrayLiteral("glTextureImage3DMultisampleNV"))); TextureImage2DMultisampleNV = reinterpret_cast(context->getProcAddress(QByteArrayLiteral("glTextureImage2DMultisampleNV"))); @@ -127,9 +141,12 @@ QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context) TextureImage3DMultisample = &QOpenGLTextureHelper::dsa_TextureImage3DMultisample; TextureImage2DMultisample = &QOpenGLTextureHelper::dsa_TextureImage2DMultisample; } else { +#endif TextureImage3DMultisample = &QOpenGLTextureHelper::qt_TextureImage3DMultisample; TextureImage2DMultisample = &QOpenGLTextureHelper::qt_TextureImage2DMultisample; +#if !defined(QT_OPENGL_ES_2) } +#endif #if defined(Q_OS_WIN) HMODULE handle = GetModuleHandleA("opengl32.dll"); diff --git a/src/gui/opengl/qopengltexturehelper_p.h b/src/gui/opengl/qopengltexturehelper_p.h index e3abaa80af..fa4bd8120a 100644 --- a/src/gui/opengl/qopengltexturehelper_p.h +++ b/src/gui/opengl/qopengltexturehelper_p.h @@ -256,6 +256,7 @@ public: } private: +#if !defined(QT_OPENGL_ES_2) // DSA wrapper (so we can use pointer to member function as switch) inline void dsa_TextureParameteri(GLuint texture, GLenum target, GLenum pname, GLint param) { @@ -403,6 +404,7 @@ private: { CompressedTextureImage3DEXT(texture, target, level, internalFormat, width, height, depth, border, imageSize, bits); } +#endif // DSA-like API @@ -899,6 +901,7 @@ public: int val = 0; glGetIntegerv(GL_UNPACK_ALIGNMENT, &val); options.setAlignment(val); +#if !defined(QT_OPENGL_ES_2) glGetIntegerv(GL_UNPACK_SKIP_IMAGES, &val); options.setSkipImages(val); glGetIntegerv(GL_UNPACK_SKIP_ROWS, &val); @@ -914,12 +917,14 @@ public: options.setLeastSignificantByteFirst(b); glGetBooleanv(GL_UNPACK_SWAP_BYTES, &b); options.setSwapBytesEnabled(b); +#endif return options; } inline void setPixelUploadOptions(const QOpenGLPixelTransferOptions &options) { glPixelStorei(GL_UNPACK_ALIGNMENT, options.alignment()); +#if !defined(QT_OPENGL_ES_2) glPixelStorei(GL_UNPACK_SKIP_IMAGES, options.skipImages()); glPixelStorei(GL_UNPACK_SKIP_ROWS, options.skipRows()); glPixelStorei(GL_UNPACK_SKIP_PIXELS, options.skipPixels()); @@ -927,6 +932,7 @@ public: glPixelStorei(GL_UNPACK_ROW_LENGTH, options.rowLength()); glPixelStorei(GL_UNPACK_LSB_FIRST, options.isLeastSignificantBitFirst()); glPixelStorei(GL_UNPACK_SWAP_BYTES, options.isSwapBytesEnabled()); +#endif } private: @@ -982,6 +988,7 @@ private: CompressedTextureImage2DMemberFunc CompressedTextureImage2D; CompressedTextureImage3DMemberFunc CompressedTextureImage3D; +#if !defined(QT_OPENGL_ES_2) // Raw function pointers for core and DSA functions // EXT_direct_state_access used when DSA is available @@ -1012,6 +1019,7 @@ private: // Plus some missing ones that are in the NV_texture_multisample extension instead void (QOPENGLF_APIENTRYP TextureImage3DMultisampleNV)(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); void (QOPENGLF_APIENTRYP TextureImage2DMultisampleNV)(GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +#endif // OpenGL 1.0 void (QOPENGLF_APIENTRYP GetIntegerv)(GLenum pname, GLint *params); -- cgit v1.2.3