1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qsgsoftwarecontext_p.h"
5
6#include "qsgsoftwareinternalrectanglenode_p.h"
7#include "qsgsoftwareinternalimagenode_p.h"
8#include "qsgsoftwarepainternode_p.h"
9#include "qsgsoftwarepixmaptexture_p.h"
10#include "qsgsoftwareglyphnode_p.h"
11#include "qsgsoftwarepublicnodes_p.h"
12#include "qsgsoftwarelayer_p.h"
13#include "qsgsoftwarerenderer_p.h"
14#if QT_CONFIG(quick_sprite)
15#include "qsgsoftwarespritenode_p.h"
16#endif
17
18#include <QtCore/QCoreApplication>
19#include <QtCore/QElapsedTimer>
20
21#include <QtGui/QWindow>
22#include <QtQuick/private/qquickwindow_p.h>
23#include <QtQuick/private/qquickitem_p.h>
24
25// Used for very high-level info about the renderering and gl context
26// Includes GL_VERSION, type of render loop, atlas size, etc.
27Q_LOGGING_CATEGORY(QSG_RASTER_LOG_INFO, "qt.scenegraph.info")
28
29// Used to debug the renderloop logic. Primarily useful for platform integrators
30// and when investigating the render loop logic.
31Q_LOGGING_CATEGORY(QSG_RASTER_LOG_RENDERLOOP, "qt.scenegraph.renderloop")
32
33// GLSL shader compilation
34Q_LOGGING_CATEGORY(QSG_RASTER_LOG_TIME_COMPILATION, "qt.scenegraph.time.compilation")
35
36// polish, animations, sync, render and swap in the render loop
37Q_LOGGING_CATEGORY(QSG_RASTER_LOG_TIME_RENDERLOOP, "qt.scenegraph.time.renderloop")
38
39// Texture uploads and swizzling
40Q_LOGGING_CATEGORY(QSG_RASTER_LOG_TIME_TEXTURE, "qt.scenegraph.time.texture")
41
42// Glyph preparation (only for distance fields atm)
43Q_LOGGING_CATEGORY(QSG_RASTER_LOG_TIME_GLYPH, "qt.scenegraph.time.glyph")
44
45// Timing inside the renderer base class
46Q_LOGGING_CATEGORY(QSG_RASTER_LOG_TIME_RENDERER, "qt.scenegraph.time.renderer")
47
48QT_BEGIN_NAMESPACE
49
50QSGSoftwareRenderContext::QSGSoftwareRenderContext(QSGContext *ctx)
51 : QSGRenderContext(ctx)
52 , m_initialized(false)
53 , m_activePainter(nullptr)
54{
55}
56
57QSGSoftwareContext::QSGSoftwareContext(QObject *parent)
58 : QSGContext(parent)
59{
60}
61
62QSGInternalRectangleNode *QSGSoftwareContext::createInternalRectangleNode()
63{
64 return new QSGSoftwareInternalRectangleNode();
65}
66
67QSGInternalImageNode *QSGSoftwareContext::createInternalImageNode(QSGRenderContext *renderContext)
68{
69 Q_UNUSED(renderContext);
70 return new QSGSoftwareInternalImageNode();
71}
72
73QSGPainterNode *QSGSoftwareContext::createPainterNode(QQuickPaintedItem *item)
74{
75 return new QSGSoftwarePainterNode(item);
76}
77
78QSGGlyphNode *QSGSoftwareContext::createGlyphNode(QSGRenderContext *rc, bool preferNativeGlyphNode, int renderTypeQuality)
79{
80 Q_UNUSED(rc);
81 Q_UNUSED(preferNativeGlyphNode);
82 Q_UNUSED(renderTypeQuality);
83 return new QSGSoftwareGlyphNode();
84}
85
86QSGLayer *QSGSoftwareContext::createLayer(QSGRenderContext *renderContext)
87{
88 return new QSGSoftwareLayer(renderContext);
89}
90
91QSurfaceFormat QSGSoftwareContext::defaultSurfaceFormat() const
92{
93 QSurfaceFormat format = QSurfaceFormat::defaultFormat();
94 format.setRenderableType(QSurfaceFormat::DefaultRenderableType);
95 format.setMajorVersion(0);
96 format.setMinorVersion(0);
97 return format;
98}
99
100void QSGSoftwareRenderContext::initializeIfNeeded()
101{
102 if (m_initialized)
103 return;
104 m_initialized = true;
105 emit initialized();
106}
107
108void QSGSoftwareRenderContext::invalidate()
109{
110 qDeleteAll(c: m_texturesToDelete);
111 m_texturesToDelete.clear();
112
113 qDeleteAll(c: m_textures);
114 m_textures.clear();
115
116 Q_ASSERT(m_fontEnginesToClean.isEmpty());
117
118 qDeleteAll(c: m_glyphCaches);
119 m_glyphCaches.clear();
120
121 m_sg->renderContextInvalidated(renderContext: this);
122 emit invalidated();
123}
124
125QSGTexture *QSGSoftwareRenderContext::createTexture(const QImage &image, uint flags) const
126{
127 return new QSGSoftwarePixmapTexture(image, flags);
128}
129
130QSGRenderer *QSGSoftwareRenderContext::createRenderer(QSGRendererInterface::RenderMode)
131{
132 return new QSGSoftwareRenderer(this);
133}
134
135
136void QSGSoftwareRenderContext::renderNextFrame(QSGRenderer *renderer)
137{
138 renderer->renderScene();
139}
140
141int QSGSoftwareRenderContext::maxTextureSize() const
142{
143 return 2048;
144}
145
146QSGRendererInterface *QSGSoftwareContext::rendererInterface(QSGRenderContext *renderContext)
147{
148 Q_UNUSED(renderContext);
149 return this;
150}
151
152QSGRectangleNode *QSGSoftwareContext::createRectangleNode()
153{
154 return new QSGSoftwareRectangleNode;
155}
156
157QSGImageNode *QSGSoftwareContext::createImageNode()
158{
159 return new QSGSoftwareImageNode;
160}
161
162QSGNinePatchNode *QSGSoftwareContext::createNinePatchNode()
163{
164 return new QSGSoftwareNinePatchNode;
165}
166
167#if QT_CONFIG(quick_sprite)
168QSGSpriteNode *QSGSoftwareContext::createSpriteNode()
169{
170 return new QSGSoftwareSpriteNode;
171}
172#endif
173
174QSGRendererInterface::GraphicsApi QSGSoftwareContext::graphicsApi() const
175{
176 return Software;
177}
178
179QSGRendererInterface::ShaderType QSGSoftwareContext::shaderType() const
180{
181 return UnknownShadingLanguage;
182}
183
184QSGRendererInterface::ShaderCompilationTypes QSGSoftwareContext::shaderCompilationType() const
185{
186 return {};
187}
188
189QSGRendererInterface::ShaderSourceTypes QSGSoftwareContext::shaderSourceType() const
190{
191 return {};
192}
193
194void *QSGSoftwareContext::getResource(QQuickWindow *window, Resource resource) const
195{
196 if (!window)
197 return nullptr;
198
199 auto cd = QQuickWindowPrivate::get(c: window);
200
201 if (resource == PainterResource)
202 return window->isSceneGraphInitialized() ? static_cast<QSGSoftwareRenderContext *>(cd->context)->m_activePainter : nullptr;
203 else if (resource == RedirectPaintDevice)
204 return cd->redirect.rt.paintDevice;
205
206 return nullptr;
207}
208
209QT_END_NAMESPACE
210
211#include "moc_qsgsoftwarecontext_p.cpp"
212

source code of qtdeclarative/src/quick/scenegraph/adaptations/software/qsgsoftwarecontext.cpp