diff options
Diffstat (limited to 'src/quick/scenegraph/qsgdefaultrendercontext_p.h')
-rw-r--r-- | src/quick/scenegraph/qsgdefaultrendercontext_p.h | 148 |
1 files changed, 80 insertions, 68 deletions
diff --git a/src/quick/scenegraph/qsgdefaultrendercontext_p.h b/src/quick/scenegraph/qsgdefaultrendercontext_p.h index 57aa4b4c90..c3352aa89f 100644 --- a/src/quick/scenegraph/qsgdefaultrendercontext_p.h +++ b/src/quick/scenegraph/qsgdefaultrendercontext_p.h @@ -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 #ifndef QSGDEFAULTRENDERCONTEXT_H #define QSGDEFAULTRENDERCONTEXT_H @@ -52,61 +16,109 @@ // #include <QtQuick/private/qsgcontext_p.h> -#include <QtQuick/private/qsgdepthstencilbuffer_p.h> +#include <rhi/qshader.h> QT_BEGIN_NAMESPACE -class QOpenGLContext; +class QRhi; +class QRhiCommandBuffer; +class QRhiRenderPassDescriptor; +class QRhiResourceUpdateBatch; +class QRhiTexture; class QSGMaterialShader; -class QOpenGLFramebufferObject; +class QSurface; -namespace QSGAtlasTexture { +namespace QSGRhiAtlasTexture { class Manager; } -class Q_QUICK_PRIVATE_EXPORT QSGDefaultRenderContext : public QSGRenderContext +class Q_QUICK_EXPORT QSGDefaultRenderContext : public QSGRenderContext { Q_OBJECT public: QSGDefaultRenderContext(QSGContext *context); - QOpenGLContext *openglContext() const { return m_gl; } - bool isValid() const override { return m_gl; } - - void initialize(void *context) override; + QRhi *rhi() const override { return m_rhi; } + bool isValid() const override { return m_rhi != nullptr; } + + static const int INIT_PARAMS_MAGIC = 0x50E; + struct InitParams : public QSGRenderContext::InitParams { + int sType = INIT_PARAMS_MAGIC; // help discovering broken code passing something else as 'context' + QRhi *rhi = nullptr; + int sampleCount = 1; // 1, 4, 8, ... + // only used as a hint f.ex. in the texture atlas init + QSize initialSurfacePixelSize; + // The first window that will be used with this rc, if available. + // Only a hint, to help picking better values for atlases. + QSurface *maybeSurface = nullptr; + }; + + void initialize(const QSGRenderContext::InitParams *params) override; void invalidate() override; - void renderNextFrame(QSGRenderer *renderer, uint fboId) override; - QSGDistanceFieldGlyphCache *distanceFieldGlyphCache(const QRawFont &font) override; + void prepareSync(qreal devicePixelRatio, + QRhiCommandBuffer *cb, + const QQuickGraphicsConfiguration &config) override; + + void beginNextFrame(QSGRenderer *renderer, const QSGRenderTarget &renderTarget, + RenderPassCallback mainPassRecordingStart, + RenderPassCallback mainPassRecordingEnd, + void *callbackUserData) override; + void renderNextFrame(QSGRenderer *renderer) override; + void endNextFrame(QSGRenderer *renderer) override; - virtual QSharedPointer<QSGDepthStencilBuffer> depthStencilBufferForFbo(QOpenGLFramebufferObject *fbo); - QSGDepthStencilBufferManager *depthStencilBufferManager(); + void preprocess() override; + void invalidateGlyphCaches() override; + QSGDistanceFieldGlyphCache *distanceFieldGlyphCache(const QRawFont &font, int renderTypeQuality) override; + QSGCurveGlyphAtlas *curveGlyphAtlas(const QRawFont &font) override; QSGTexture *createTexture(const QImage &image, uint flags) const override; - QSGRenderer *createRenderer() override; + QSGRenderer *createRenderer(QSGRendererInterface::RenderMode renderMode = QSGRendererInterface::RenderMode2D) override; QSGTexture *compressedTextureForFactory(const QSGCompressedTextureFactory *factory) const override; - virtual void compileShader(QSGMaterialShader *shader, QSGMaterial *material, const char *vertexCode = nullptr, const char *fragmentCode = nullptr); - virtual void initializeShader(QSGMaterialShader *shader); - - void setAttachToGraphicsContext(bool attach) override; + virtual void initializeRhiShader(QSGMaterialShader *shader, QShader::Variant shaderVariant); - static QSGDefaultRenderContext *from(QOpenGLContext *context); - - bool hasBrokenIndexBufferObjects() const { return m_brokenIBOs; } int maxTextureSize() const override { return m_maxTextureSize; } - bool separateIndexBuffer() const; + bool useDepthBufferFor2D() const { return m_useDepthBufferFor2D; } + int msaaSampleCount() const { return m_initParams.sampleCount; } + + QRhiCommandBuffer *currentFrameCommandBuffer() const { + // may be null if not in an active frame, but returning null is valid then + return m_currentFrameCommandBuffer; + } + QRhiRenderPassDescriptor *currentFrameRenderPass() const { + // may be null if not in an active frame, but returning null is valid then + return m_currentFrameRenderPass; + } + + qreal currentDevicePixelRatio() const + { + // Valid starting from QQuickWindow::syncSceneGraph(). This takes the + // redirections, e.g. QQuickWindow::setRenderTarget(), into account. + // This calculation logic matches what the renderer does, so this is + // the same value that gets exposed in RenderState::devicePixelRatio() + // to material shaders. This getter is useful to perform dpr-related + // operations in the sync phase (in updatePaintNode()). + return m_currentDevicePixelRatio; + } + + QRhiResourceUpdateBatch *maybeGlyphCacheResourceUpdates(); + QRhiResourceUpdateBatch *glyphCacheResourceUpdates(); + void deferredReleaseGlyphCacheTexture(QRhiTexture *texture); + void resetGlyphCacheResources(); protected: - static QString fontKey(const QRawFont &font); - - QOpenGLContext *m_gl; - QSGDepthStencilBufferManager *m_depthStencilManager; + InitParams m_initParams; + QRhi *m_rhi; int m_maxTextureSize; - bool m_brokenIBOs; - bool m_serializedRender; - bool m_attachToGLContext; - QSGAtlasTexture::Manager *m_atlasManager; + QSGRhiAtlasTexture::Manager *m_rhiAtlasManager; + QRhiCommandBuffer *m_currentFrameCommandBuffer; + QRhiRenderPassDescriptor *m_currentFrameRenderPass; + qreal m_currentDevicePixelRatio; + bool m_useDepthBufferFor2D; + QRhiResourceUpdateBatch *m_glyphCacheResourceUpdates; + QSet<QRhiTexture *> m_pendingGlyphCacheTextures; + QHash<FontKey, QSGCurveGlyphAtlas *> m_curveGlyphAtlases; }; QT_END_NAMESPACE |