diff options
Diffstat (limited to 'src/quick/scenegraph/qsgdefaultcontext.cpp')
-rw-r--r-- | src/quick/scenegraph/qsgdefaultcontext.cpp | 183 |
1 files changed, 92 insertions, 91 deletions
diff --git a/src/quick/scenegraph/qsgdefaultcontext.cpp b/src/quick/scenegraph/qsgdefaultcontext.cpp index 5813844cd2..7d1daa1716 100644 --- a/src/quick/scenegraph/qsgdefaultcontext.cpp +++ b/src/quick/scenegraph/qsgdefaultcontext.cpp @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQuick module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qsgdefaultcontext_p.h" @@ -43,10 +7,11 @@ #include <QtQuick/private/qsgdefaultinternalimagenode_p.h> #include <QtQuick/private/qsgdefaultpainternode_p.h> #include <QtQuick/private/qsgdefaultglyphnode_p.h> +#include <QtQuick/private/qsgcurveglyphnode_p.h> #include <QtQuick/private/qsgdistancefieldglyphnode_p.h> #include <QtQuick/private/qsgdistancefieldglyphnode_p_p.h> -#include <QtQuick/private/qsgrenderloop_p.h> -#include <QtQuick/private/qsgdefaultlayer_p.h> +#include <QtQuick/private/qsgrhisupport_p.h> +#include <QtQuick/private/qsgrhilayer_p.h> #include <QtQuick/private/qsgdefaultrendercontext_p.h> #include <QtQuick/private/qsgdefaultrectanglenode_p.h> #include <QtQuick/private/qsgdefaultimagenode_p.h> @@ -54,25 +19,30 @@ #if QT_CONFIG(quick_sprite) #include <QtQuick/private/qsgdefaultspritenode_p.h> #endif +#include <QtQuick/private/qsgrhishadereffectnode_p.h> +#include <QtQuick/private/qsginternaltextnode_p.h> +#include <QtQuick/private/qsgrhiinternaltextnode_p.h> -#include <QtGui/QOpenGLContext> -#include <QtGui/QOpenGLFramebufferObject> +#include <QOpenGLContext> -#include <QtQuick/QQuickWindow> +#include <QtQuick/private/qquickwindow_p.h> +#include <QtQuick/private/qquickitem_p.h> #include <private/qqmlglobal_p.h> #include <algorithm> +#include <rhi/qrhi.h> + QT_BEGIN_NAMESPACE namespace QSGMultisampleAntialiasing { class ImageNode : public QSGDefaultInternalImageNode { public: + ImageNode(QSGDefaultRenderContext *rc) : QSGDefaultInternalImageNode(rc) { } void setAntialiasing(bool) override { } }; - class RectangleNode : public QSGDefaultInternalRectangleNode { public: void setAntialiasing(bool) override { } @@ -118,7 +88,7 @@ void QSGDefaultContext::renderContextInitialized(QSGRenderContext *renderContext { m_mutex.lock(); - auto openglRenderContext = static_cast<const QSGDefaultRenderContext *>(renderContext); + auto rc = static_cast<const QSGDefaultRenderContext *>(renderContext); if (m_antialiasingMethod == UndecidedAntialiasing) { if (Q_UNLIKELY(qEnvironmentVariableIsSet("QSG_ANTIALIASING_METHOD"))) { const QByteArray aaType = qgetenv("QSG_ANTIALIASING_METHOD"); @@ -127,46 +97,24 @@ void QSGDefaultContext::renderContextInitialized(QSGRenderContext *renderContext else if (aaType == "vertex") m_antialiasingMethod = VertexAntialiasing; } - if (m_antialiasingMethod == UndecidedAntialiasing) { - if (openglRenderContext->openglContext()->format().samples() > 0) - m_antialiasingMethod = MsaaAntialiasing; - else - m_antialiasingMethod = VertexAntialiasing; - } + if (m_antialiasingMethod == UndecidedAntialiasing) + m_antialiasingMethod = rc->msaaSampleCount() > 1 ? MsaaAntialiasing : VertexAntialiasing; } - // With OpenGL ES, except for Angle on Windows, use GrayAntialiasing, unless +#if QT_CONFIG(opengl) + // With OpenGL ES, use GrayAntialiasing, unless // some value had been requested explicitly. This could not be decided // before without a context. Now the context is ready. if (!m_distanceFieldAntialiasingDecided) { m_distanceFieldAntialiasingDecided = true; -#ifndef Q_OS_WIN32 - if (openglRenderContext->openglContext()->isOpenGLES()) + Q_ASSERT(rc->rhi()); + if (rc->rhi()->backend() == QRhi::OpenGLES2 + && static_cast<const QRhiGles2NativeHandles *>(rc->rhi()->nativeHandles())->context->isOpenGLES()) + { m_distanceFieldAntialiasing = QSGGlyphNode::GrayAntialiasing; -#endif - } - - static bool dumped = false; - if (!dumped && QSG_LOG_INFO().isDebugEnabled()) { - dumped = true; - QSurfaceFormat format = openglRenderContext->openglContext()->format(); - QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); - qCDebug(QSG_LOG_INFO, "R/G/B/A Buffers: %d %d %d %d", format.redBufferSize(), - format.greenBufferSize(), format.blueBufferSize(), format.alphaBufferSize()); - qCDebug(QSG_LOG_INFO, "Depth Buffer: %d", format.depthBufferSize()); - qCDebug(QSG_LOG_INFO, "Stencil Buffer: %d", format.stencilBufferSize()); - qCDebug(QSG_LOG_INFO, "Samples: %d", format.samples()); - qCDebug(QSG_LOG_INFO, "GL_VENDOR: %s", (const char*)funcs->glGetString(GL_VENDOR)); - qCDebug(QSG_LOG_INFO, "GL_RENDERER: %s", - (const char*)funcs->glGetString(GL_RENDERER)); - qCDebug(QSG_LOG_INFO, "GL_VERSION: %s", (const char*)funcs->glGetString(GL_VERSION)); - QByteArrayList exts = openglRenderContext->openglContext()->extensions().toList(); - std::sort(exts.begin(), exts.end()); - qCDebug(QSG_LOG_INFO, "GL_EXTENSIONS: %s", exts.join(' ').constData()); - qCDebug(QSG_LOG_INFO, "Max Texture Size: %d", openglRenderContext->maxTextureSize()); - qCDebug(QSG_LOG_INFO, "Debug context: %s", - format.testOption(QSurfaceFormat::DebugContext) ? "true" : "false"); + } } +#endif m_mutex.unlock(); } @@ -187,11 +135,11 @@ QSGInternalRectangleNode *QSGDefaultContext::createInternalRectangleNode() : new QSGDefaultInternalRectangleNode; } -QSGInternalImageNode *QSGDefaultContext::createInternalImageNode() +QSGInternalImageNode *QSGDefaultContext::createInternalImageNode(QSGRenderContext *renderContext) { return m_antialiasingMethod == MsaaAntialiasing - ? new QSGMultisampleAntialiasing::ImageNode - : new QSGDefaultInternalImageNode; + ? new QSGMultisampleAntialiasing::ImageNode(static_cast<QSGDefaultRenderContext *>(renderContext)) + : new QSGDefaultInternalImageNode(static_cast<QSGDefaultRenderContext *>(renderContext)); } QSGPainterNode *QSGDefaultContext::createPainterNode(QQuickPaintedItem *item) @@ -199,35 +147,56 @@ QSGPainterNode *QSGDefaultContext::createPainterNode(QQuickPaintedItem *item) return new QSGDefaultPainterNode(item); } -QSGGlyphNode *QSGDefaultContext::createGlyphNode(QSGRenderContext *rc, bool preferNativeGlyphNode) +QSGInternalTextNode *QSGDefaultContext::createInternalTextNode(QSGRenderContext *renderContext) { - if (m_distanceFieldDisabled || preferNativeGlyphNode) { - return new QSGDefaultGlyphNode; + return new QSGRhiInternalTextNode(renderContext); +} + +QSGGlyphNode *QSGDefaultContext::createGlyphNode(QSGRenderContext *rc, + QSGTextNode::RenderType renderType, + int renderTypeQuality) +{ + if (renderType == QSGTextNode::CurveRendering) { + return new QSGCurveGlyphNode(rc); + } else if (m_distanceFieldDisabled || renderType == QSGTextNode::NativeRendering) { + return new QSGDefaultGlyphNode(rc); } else { QSGDistanceFieldGlyphNode *node = new QSGDistanceFieldGlyphNode(rc); node->setPreferredAntialiasingMode(m_distanceFieldAntialiasing); + node->setRenderTypeQuality(renderTypeQuality); return node; } } QSGLayer *QSGDefaultContext::createLayer(QSGRenderContext *renderContext) { - return new QSGDefaultLayer(renderContext); + return new QSGRhiLayer(renderContext); } QSurfaceFormat QSGDefaultContext::defaultSurfaceFormat() const { QSurfaceFormat format = QSurfaceFormat::defaultFormat(); + // These depend solely on the env.vars., not QQuickGraphicsConfiguration + // since that does not have a flag that maps 100% to QSG_NO_xx_BUFFER. static bool useDepth = qEnvironmentVariableIsEmpty("QSG_NO_DEPTH_BUFFER"); static bool useStencil = qEnvironmentVariableIsEmpty("QSG_NO_STENCIL_BUFFER"); static bool enableDebug = qEnvironmentVariableIsSet("QSG_OPENGL_DEBUG"); - format.setDepthBufferSize(useDepth ? 24 : 0); - format.setStencilBufferSize(useStencil ? 8 : 0); + static bool disableVSync = qEnvironmentVariableIsSet("QSG_NO_VSYNC"); + if (useDepth && format.depthBufferSize() == -1) + format.setDepthBufferSize(24); + else if (!useDepth) + format.setDepthBufferSize(0); + if (useStencil && format.stencilBufferSize() == -1) + format.setStencilBufferSize(8); + else if (!useStencil) + format.setStencilBufferSize(0); if (enableDebug) format.setOption(QSurfaceFormat::DebugContext); if (QQuickWindow::hasDefaultAlphaBuffer()) format.setAlphaBufferSize(8); format.setSwapBehavior(QSurfaceFormat::DoubleBuffer); + if (disableVSync) // swapInterval defaults to 1, it has no -1 special value + format.setSwapInterval(0); return format; } @@ -269,31 +238,63 @@ QSGSpriteNode *QSGDefaultContext::createSpriteNode() } #endif +QSGGuiThreadShaderEffectManager *QSGDefaultContext::createGuiThreadShaderEffectManager() +{ + return new QSGRhiGuiThreadShaderEffectManager; +} + +QSGShaderEffectNode *QSGDefaultContext::createShaderEffectNode(QSGRenderContext *renderContext) +{ + return new QSGRhiShaderEffectNode(static_cast<QSGDefaultRenderContext *>(renderContext)); +} + QSGRendererInterface::GraphicsApi QSGDefaultContext::graphicsApi() const { - return OpenGL; + return QSGRhiSupport::instance()->graphicsApi(); +} + +void *QSGDefaultContext::getResource(QQuickWindow *window, Resource resource) const +{ + if (!window) + return nullptr; + + // Unlike the graphicsApi and shaderType and similar queries, getting a + // native resource is only possible when there is an initialized + // rendercontext, or rather, only within rendering a frame, as per + // QSGRendererInterface docs. This is good since getting some things is + // only possible within a beginFrame - endFrame with the RHI. + + const QSGDefaultRenderContext *rc = static_cast<const QSGDefaultRenderContext *>( + QQuickWindowPrivate::get(window)->context); + QSGRhiSupport *rhiSupport = QSGRhiSupport::instance(); + +#if QT_CONFIG(vulkan) + if (resource == VulkanInstanceResource) + return window->vulkanInstance(); +#endif + return const_cast<void *>(rhiSupport->rifResource(resource, rc, window)); } QSGRendererInterface::ShaderType QSGDefaultContext::shaderType() const { - return GLSL; + return RhiShader; } QSGRendererInterface::ShaderCompilationTypes QSGDefaultContext::shaderCompilationType() const { - return RuntimeCompilation; + return OfflineCompilation; } QSGRendererInterface::ShaderSourceTypes QSGDefaultContext::shaderSourceType() const { - return ShaderSourceString | ShaderSourceFile; + return ShaderSourceFile; } QT_END_NAMESPACE static void initResources() { - Q_INIT_RESOURCE(scenegraph); + Q_INIT_RESOURCE(scenegraph_shaders); } Q_CONSTRUCTOR_FUNCTION(initResources) |