diff options
author | Laszlo Agocs <laszlo.agocs@digia.com> | 2014-02-03 17:36:55 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-18 21:00:00 +0100 |
commit | a2e92f6dee12320a58a4bcc95c14649b27804427 (patch) | |
tree | 3198365f9f7ca75cc3c4bd23340bb5fe15ee63a5 /src/quick | |
parent | 337524714cad51934879d817564c5d58e6dbd0c0 (diff) |
Dynamic GL in Quick
The counterpart to I716fdebb. Implements the dynamic path
in scenegraph.
Task-number: QTBUG-36483
Change-Id: I2dc613ba84560b7b8e36d3cd1da61c050ab08db0
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
Diffstat (limited to 'src/quick')
-rw-r--r-- | src/quick/designer/designersupport.cpp | 5 | ||||
-rw-r--r-- | src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp | 2 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgcontext.cpp | 23 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp | 6 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgdefaultimagenode.cpp | 19 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgatlastexture.cpp | 21 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp | 13 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgtexture.cpp | 11 | ||||
-rw-r--r-- | src/quick/scenegraph/util/qsgtexturematerial.cpp | 27 |
9 files changed, 72 insertions, 55 deletions
diff --git a/src/quick/designer/designersupport.cpp b/src/quick/designer/designersupport.cpp index e0b4bd41e5..99dcf2ca71 100644 --- a/src/quick/designer/designersupport.cpp +++ b/src/quick/designer/designersupport.cpp @@ -94,7 +94,10 @@ void DesignerSupport::refFromEffectItem(QQuickItem *referencedItem, bool hide) texture->setSize(referencedItem->boundingRect().size().toSize()); texture->setRecursive(true); #ifndef QT_OPENGL_ES - texture->setFormat(GL_RGBA8); + if (QOpenGLContext::openGLModuleType() == QOpenGLContext::DesktopGL) + texture->setFormat(GL_RGBA8); + else + texture->setFormat(GL_RGBA); #else texture->setFormat(GL_RGBA); #endif diff --git a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp index 4b15b04b36..614e1a83bc 100644 --- a/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp +++ b/src/quick/scenegraph/coreapi/qsgbatchrenderer.cpp @@ -2186,7 +2186,7 @@ void Renderer::renderUnmergedBatch(const Batch *batch) if (g->drawingMode() == GL_LINE_STRIP || g->drawingMode() == GL_LINE_LOOP || g->drawingMode() == GL_LINES) glLineWidth(g->lineWidth()); #if !defined(QT_OPENGL_ES_2) - else if (g->drawingMode() == GL_POINTS) + else if (!QOpenGLContext::currentContext()->isES() && g->drawingMode() == GL_POINTS) glPointSize(g->lineWidth()); #endif diff --git a/src/quick/scenegraph/qsgcontext.cpp b/src/quick/scenegraph/qsgcontext.cpp index 9f7818a442..835eeb1c36 100644 --- a/src/quick/scenegraph/qsgcontext.cpp +++ b/src/quick/scenegraph/qsgcontext.cpp @@ -99,13 +99,8 @@ public: QSGContextPrivate() : antialiasingMethod(QSGContext::UndecidedAntialiasing) , distanceFieldDisabled(qmlDisableDistanceField()) - , distanceFieldAntialiasing( -#if !defined(QT_OPENGL_ES) || defined(QT_OPENGL_ES_2_ANGLE) - QSGGlyphNode::HighQualitySubPixelAntialiasing -#else - QSGGlyphNode::GrayAntialiasing -#endif - ) + , distanceFieldAntialiasing(QSGGlyphNode::HighQualitySubPixelAntialiasing) + , distanceFieldAntialiasingDecided(false) { } @@ -117,6 +112,7 @@ public: QSGContext::AntialiasingMethod antialiasingMethod; bool distanceFieldDisabled; QSGDistanceFieldGlyphNode::AntialiasingMode distanceFieldAntialiasing; + bool distanceFieldAntialiasingDecided; static QOpenGLContext *sharedOpenGLContext; }; @@ -161,6 +157,8 @@ QSGContext::QSGContext(QObject *parent) : { Q_D(QSGContext); QByteArray mode = qgetenv("QSG_DISTANCEFIELD_ANTIALIASING"); + if (!mode.isEmpty()) + d->distanceFieldAntialiasingDecided = true; if (mode == "subpixel") d->distanceFieldAntialiasing = QSGGlyphNode::HighQualitySubPixelAntialiasing; else if (mode == "subpixel-lowq") @@ -212,6 +210,17 @@ void QSGContext::renderContextInitialized(QSGRenderContext *renderContext) } } + // With OpenGL ES, except for Angle on Windows, use GrayAntialiasing, unless + // some value had been requested explicitly. This could not be decided + // before without a context. Now the context is ready. + if (!d->distanceFieldAntialiasingDecided) { + d->distanceFieldAntialiasingDecided = true; +#ifndef Q_OS_WIN + if (renderContext->openglContext()->isES()) + d->distanceFieldAntialiasing = QSGGlyphNode::GrayAntialiasing; +#endif + } + static bool dumped = false; if (!dumped && qEnvironmentVariableIsSet("QSG_INFO")) { dumped = true; diff --git a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp index a625eebd5d..18142cc585 100644 --- a/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp +++ b/src/quick/scenegraph/qsgdefaultdistancefieldglyphcache.cpp @@ -231,7 +231,8 @@ void QSGDefaultDistanceFieldGlyphCache::createTexture(TextureInfo *texInfo, int glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #if !defined(QT_OPENGL_ES_2) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + if (!QOpenGLContext::currentContext()->isES()) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); const GLint internalFormat = isCoreProfile() ? GL_R8 : GL_ALPHA; const GLenum format = isCoreProfile() ? GL_RED : GL_ALPHA; #else @@ -373,7 +374,8 @@ void QSGDefaultDistanceFieldGlyphCache::resizeTexture(TextureInfo *texInfo, int glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #if !defined(QT_OPENGL_ES_2) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + if (!ctx->isES()) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); #endif glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, oldWidth, oldHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); diff --git a/src/quick/scenegraph/qsgdefaultimagenode.cpp b/src/quick/scenegraph/qsgdefaultimagenode.cpp index 926c0c1f4a..9113d1e447 100644 --- a/src/quick/scenegraph/qsgdefaultimagenode.cpp +++ b/src/quick/scenegraph/qsgdefaultimagenode.cpp @@ -307,13 +307,11 @@ void QSGDefaultImageNode::preprocess() markDirty(DirtyMaterial); } -#ifdef QT_OPENGL_ES_2 inline static bool isPowerOfTwo(int x) { // Assumption: x >= 1 return x == (x & -x); } -#endif namespace { struct X { float x, tx; }; @@ -360,15 +358,18 @@ void QSGDefaultImageNode::updateGeometry() bool hasTiles = hTiles != 1 || vTiles != 1; bool fullTexture = innerSourceRect == QRectF(0, 0, 1, 1); -#ifdef QT_OPENGL_ES_2 - QOpenGLContext *ctx = QOpenGLContext::currentContext(); - bool npotSupported = ctx->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat); - QSize size = t->textureSize(); - bool isNpot = !isPowerOfTwo(size.width()) || !isPowerOfTwo(size.height()); - bool wrapSupported = npotSupported || !isNpot; -#else bool wrapSupported = true; + + QOpenGLContext *ctx = QOpenGLContext::currentContext(); +#ifndef QT_OPENGL_ES_2 + if (ctx->isES()) #endif + { + bool npotSupported = ctx->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat); + QSize size = t->textureSize(); + const bool isNpot = !isPowerOfTwo(size.width()) || !isPowerOfTwo(size.height()); + wrapSupported = npotSupported || !isNpot; + } // An image can be rendered as a single quad if: // - There are no margins, and either: diff --git a/src/quick/scenegraph/util/qsgatlastexture.cpp b/src/quick/scenegraph/util/qsgatlastexture.cpp index 333bc62143..b0787e9a2e 100644 --- a/src/quick/scenegraph/util/qsgatlastexture.cpp +++ b/src/quick/scenegraph/util/qsgatlastexture.cpp @@ -143,7 +143,13 @@ Atlas::Atlas(const QSize &size) , m_allocated(false) { -#ifdef QT_OPENGL_ES + m_internalFormat = GL_RGBA; + m_externalFormat = GL_BGRA; + +#ifndef QT_OPENGL_ES + if (QOpenGLContext::currentContext()->isES()) { +#endif + #if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK) QString *deviceName = static_cast<QString *>(QGuiApplication::platformNativeInterface()->nativeResourceForIntegration("AndroidDeviceName")); @@ -153,7 +159,7 @@ Atlas::Atlas(const QSize &size) || deviceName->compare(QStringLiteral("samsung SM-T215"), Qt::CaseInsensitive) == 0); #else static bool wrongfullyReportsBgra8888Support = false; -#endif +#endif // ANDROID const char *ext = (const char *) glGetString(GL_EXTENSIONS); if (!wrongfullyReportsBgra8888Support @@ -165,13 +171,13 @@ Atlas::Atlas(const QSize &size) } else if (strstr(ext, "GL_APPLE_texture_format_BGRA8888")) { m_internalFormat = GL_RGBA; m_externalFormat = GL_BGRA; -#endif +#endif // IOS } else { m_internalFormat = m_externalFormat = GL_RGBA; } -#else - m_internalFormat = GL_RGBA; - m_externalFormat = GL_BGRA; + +#ifndef QT_OPENGL_ES + } #endif m_use_bgra_fallback = qEnvironmentVariableIsSet("QSG_ATLAS_USE_BGRA_FALLBACK"); @@ -328,7 +334,8 @@ void Atlas::bind(QSGTexture::Filtering filtering) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); #if !defined(QT_OPENGL_ES_2) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); + if (!QOpenGLContext::currentContext()->isES()) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); #endif glTexImage2D(GL_TEXTURE_2D, 0, m_internalFormat, m_size.width(), m_size.height(), 0, m_externalFormat, GL_UNSIGNED_BYTE, 0); diff --git a/src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp b/src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp index 59bde0d602..db8ed03b8d 100644 --- a/src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp +++ b/src/quick/scenegraph/util/qsgdepthstencilbuffer.cpp @@ -75,8 +75,6 @@ void QSGDepthStencilBuffer::detach() GL_RENDERBUFFER, 0); } -// ###TODO Remove once using Khronos OpenGL headers -#if defined(QT_OPENGL_ES_2) #ifndef GL_DEPTH24_STENCIL8_OES #define GL_DEPTH24_STENCIL8_OES 0x88F0 #endif @@ -84,7 +82,6 @@ void QSGDepthStencilBuffer::detach() #ifndef GL_DEPTH_COMPONENT24_OES #define GL_DEPTH_COMPONENT24_OES 0x81A6 #endif -#endif QSGDefaultDepthStencilBuffer::QSGDefaultDepthStencilBuffer(QOpenGLContext *context, const Format &format) : QSGDepthStencilBuffer(context, format) @@ -117,12 +114,10 @@ QSGDefaultDepthStencilBuffer::QSGDefaultDepthStencilBuffer(QOpenGLContext *conte if (!m_depthBuffer && (format.attachments & DepthAttachment)) { m_functions.glGenRenderbuffers(1, &m_depthBuffer); m_functions.glBindRenderbuffer(GL_RENDERBUFFER, m_depthBuffer); -#ifdef QT_OPENGL_ES - const GLenum internalFormat = m_functions.hasOpenGLExtension(QOpenGLExtensions::Depth24) + GLenum internalFormat = GL_DEPTH_COMPONENT; + if (context->isES()) + internalFormat = m_functions.hasOpenGLExtension(QOpenGLExtensions::Depth24) ? GL_DEPTH_COMPONENT24_OES : GL_DEPTH_COMPONENT16; -#else - const GLenum internalFormat = GL_DEPTH_COMPONENT; -#endif if (format.samples && m_functions.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)) { m_functions.glRenderbufferStorageMultisample(GL_RENDERBUFFER, format.samples, internalFormat, width, height); @@ -136,7 +131,7 @@ QSGDefaultDepthStencilBuffer::QSGDefaultDepthStencilBuffer(QOpenGLContext *conte #ifdef QT_OPENGL_ES const GLenum internalFormat = GL_STENCIL_INDEX8; #else - const GLenum internalFormat = GL_STENCIL_INDEX; + const GLenum internalFormat = context->isES() ? GL_STENCIL_INDEX8 : GL_STENCIL_INDEX; #endif if (format.samples && m_functions.hasOpenGLExtension(QOpenGLExtensions::FramebufferMultisample)) { m_functions.glRenderbufferStorageMultisample(GL_RENDERBUFFER, format.samples, diff --git a/src/quick/scenegraph/util/qsgtexture.cpp b/src/quick/scenegraph/util/qsgtexture.cpp index 3bbcb0c112..d9e29f6ec0 100644 --- a/src/quick/scenegraph/util/qsgtexture.cpp +++ b/src/quick/scenegraph/util/qsgtexture.cpp @@ -39,8 +39,6 @@ ** ****************************************************************************/ -#define GL_GLEXT_PROTOTYPES - #include "qsgtexture_p.h" #include <qopenglfunctions.h> #include <QtQuick/private/qsgcontext_p.h> @@ -83,7 +81,7 @@ static QElapsedTimer qsg_renderer_timer; QT_BEGIN_NAMESPACE -#if !defined(QT_NO_DEBUG) && defined(QT_OPENGL_ES_2) +#ifndef QT_NO_DEBUG inline static bool isPowerOfTwo(int x) { // Assumption: x >= 1 @@ -514,7 +512,7 @@ void QSGTexture::updateBindOptions(bool force) } if (force || d->wrapChanged) { -#if !defined(QT_NO_DEBUG) && defined(QT_OPENGL_ES_2) +#ifndef QT_NO_DEBUG if (d->horizontalWrap == Repeat || d->verticalWrap == Repeat) { bool npotSupported = QOpenGLFunctions(QOpenGLContext::currentContext()).hasOpenGLFeature(QOpenGLFunctions::NPOTTextures); QSize size = textureSize(); @@ -686,7 +684,10 @@ void QSGPlainTexture::bind() externalFormat = GL_BGRA; #ifdef QT_OPENGL_ES internalFormat = GL_BGRA; -#endif +#else + if (context->isES()) + internalFormat = GL_BGRA; +#endif // QT_OPENGL_ES } else if (!wrongfullyReportsBgra8888Support && (context->hasExtension(QByteArrayLiteral("GL_EXT_texture_format_BGRA8888")) || context->hasExtension(QByteArrayLiteral("GL_IMG_texture_format_BGRA8888")))) { diff --git a/src/quick/scenegraph/util/qsgtexturematerial.cpp b/src/quick/scenegraph/util/qsgtexturematerial.cpp index df55404504..fcdb4fcdfe 100644 --- a/src/quick/scenegraph/util/qsgtexturematerial.cpp +++ b/src/quick/scenegraph/util/qsgtexturematerial.cpp @@ -46,13 +46,11 @@ QT_BEGIN_NAMESPACE -#ifdef QT_OPENGL_ES_2 inline static bool isPowerOfTwo(int x) { // Assumption: x >= 1 return x == (x & -x); } -#endif QSGMaterialType QSGOpaqueTextureMaterialShader::type; @@ -83,19 +81,20 @@ void QSGOpaqueTextureMaterialShader::updateState(const RenderState &state, QSGMa QSGTexture *t = tx->texture(); t->setFiltering(tx->filtering()); -#ifdef QT_OPENGL_ES_2 - bool npotSupported = QOpenGLFunctions(const_cast<QOpenGLContext *>(state.context())).hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat); - QSize size = t->textureSize(); - bool isNpot = !isPowerOfTwo(size.width()) || !isPowerOfTwo(size.height()); - if (!npotSupported && isNpot) { - t->setHorizontalWrapMode(QSGTexture::ClampToEdge); - t->setVerticalWrapMode(QSGTexture::ClampToEdge); - } else -#endif - { - t->setHorizontalWrapMode(tx->horizontalWrapMode()); - t->setVerticalWrapMode(tx->verticalWrapMode()); + + t->setHorizontalWrapMode(tx->horizontalWrapMode()); + t->setVerticalWrapMode(tx->verticalWrapMode()); + bool npotSupported = const_cast<QOpenGLContext *>(state.context()) + ->functions()->hasOpenGLFeature(QOpenGLFunctions::NPOTTextureRepeat); + if (!npotSupported) { + QSize size = t->textureSize(); + const bool isNpot = !isPowerOfTwo(size.width()) || !isPowerOfTwo(size.height()); + if (isNpot) { + t->setHorizontalWrapMode(QSGTexture::ClampToEdge); + t->setVerticalWrapMode(QSGTexture::ClampToEdge); + } } + t->setMipmapFiltering(tx->mipmapFiltering()); if (oldTx == 0 || oldTx->texture()->textureId() != t->textureId()) |