54QSGDefaultContext::QSGDefaultContext(QObject *parent)
56 , m_antialiasingMethod(QSGContext::UndecidedAntialiasing)
57 , m_distanceFieldDisabled(qmlDisableDistanceField())
58 , m_distanceFieldAntialiasing(QSGGlyphNode::HighQualitySubPixelAntialiasing)
59 , m_distanceFieldAntialiasingDecided(
false)
61 if (Q_UNLIKELY(!qEnvironmentVariableIsEmpty(
"QSG_DISTANCEFIELD_ANTIALIASING"))) {
62 const QByteArray mode = qgetenv(
"QSG_DISTANCEFIELD_ANTIALIASING");
63 m_distanceFieldAntialiasingDecided =
true;
64 if (mode ==
"subpixel")
65 m_distanceFieldAntialiasing = QSGGlyphNode::HighQualitySubPixelAntialiasing;
66 else if (mode ==
"subpixel-lowq")
67 m_distanceFieldAntialiasing = QSGGlyphNode::LowQualitySubPixelAntialiasing;
68 else if (mode ==
"gray")
69 m_distanceFieldAntialiasing = QSGGlyphNode::GrayAntialiasing;
73 if (qEnvironmentVariableIsSet(
"QSG_RENDER_TIMING")) {
74 const_cast<QLoggingCategory &>(QSG_LOG_TIME_GLYPH()).setEnabled(QtDebugMsg,
true);
75 const_cast<QLoggingCategory &>(QSG_LOG_TIME_TEXTURE()).setEnabled(QtDebugMsg,
true);
76 const_cast<QLoggingCategory &>(QSG_LOG_TIME_RENDERER()).setEnabled(QtDebugMsg,
true);
77 const_cast<QLoggingCategory &>(QSG_LOG_TIME_RENDERLOOP()).setEnabled(QtDebugMsg,
true);
78 const_cast<QLoggingCategory &>(QSG_LOG_TIME_COMPILATION()).setEnabled(QtDebugMsg,
true);
87void QSGDefaultContext::renderContextInitialized(QSGRenderContext *renderContext)
91 auto rc =
static_cast<
const QSGDefaultRenderContext *>(renderContext);
92 if (m_antialiasingMethod == UndecidedAntialiasing) {
93 if (Q_UNLIKELY(qEnvironmentVariableIsSet(
"QSG_ANTIALIASING_METHOD"))) {
94 const QByteArray aaType = qgetenv(
"QSG_ANTIALIASING_METHOD");
96 m_antialiasingMethod = MsaaAntialiasing;
97 else if (aaType ==
"vertex")
98 m_antialiasingMethod = VertexAntialiasing;
100 if (m_antialiasingMethod == UndecidedAntialiasing)
101 m_antialiasingMethod = rc->msaaSampleCount() > 1 ? MsaaAntialiasing : VertexAntialiasing;
108 if (!m_distanceFieldAntialiasingDecided) {
109 m_distanceFieldAntialiasingDecided =
true;
111 if (rc->rhi()->backend() == QRhi::OpenGLES2
112 &&
static_cast<
const QRhiGles2NativeHandles *>(rc->rhi()->nativeHandles())->context->isOpenGLES())
114 m_distanceFieldAntialiasing = QSGGlyphNode::GrayAntialiasing;
138QSGInternalImageNode *QSGDefaultContext::createInternalImageNode(QSGRenderContext *renderContext)
140 return m_antialiasingMethod == MsaaAntialiasing
141 ?
new QSGMultisampleAntialiasing::ImageNode(
static_cast<QSGDefaultRenderContext *>(renderContext))
142 :
new QSGDefaultInternalImageNode(
static_cast<QSGDefaultRenderContext *>(renderContext));
155QSGGlyphNode *QSGDefaultContext::createGlyphNode(QSGRenderContext *rc,
156 QSGTextNode::RenderType renderType,
157 int renderTypeQuality)
159 if (renderType == QSGTextNode::CurveRendering) {
160 return new QSGCurveGlyphNode(rc);
161 }
else if (m_distanceFieldDisabled || renderType == QSGTextNode::NativeRendering) {
162 return new QSGDefaultGlyphNode(rc);
164 QSGDistanceFieldGlyphNode *node =
new QSGDistanceFieldGlyphNode(rc);
165 node->setPreferredAntialiasingMode(m_distanceFieldAntialiasing);
166 node->setRenderTypeQuality(renderTypeQuality);
176QSurfaceFormat QSGDefaultContext::defaultSurfaceFormat()
const
178 QSurfaceFormat format = QSurfaceFormat::defaultFormat();
181 static bool useDepth = qEnvironmentVariableIsEmpty(
"QSG_NO_DEPTH_BUFFER");
182 static bool useStencil = qEnvironmentVariableIsEmpty(
"QSG_NO_STENCIL_BUFFER");
183 static bool enableDebug = qEnvironmentVariableIsSet(
"QSG_OPENGL_DEBUG");
184 static bool disableVSync = qEnvironmentVariableIsSet(
"QSG_NO_VSYNC");
185 if (useDepth && format.depthBufferSize() == -1)
186 format.setDepthBufferSize(24);
188 format.setDepthBufferSize(0);
189 if (useStencil && format.stencilBufferSize() == -1)
190 format.setStencilBufferSize(8);
191 else if (!useStencil)
192 format.setStencilBufferSize(0);
194 format.setOption(QSurfaceFormat::DebugContext);
195 if (QQuickWindow::hasDefaultAlphaBuffer())
196 format.setAlphaBufferSize(8);
197 format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
199 format.setSwapInterval(0);
256void *QSGDefaultContext::getResource(QQuickWindow *window, Resource resource)
const
267 const QSGDefaultRenderContext *rc =
static_cast<
const QSGDefaultRenderContext *>(
268 QQuickWindowPrivate::get(window)->context);
269 QSGRhiSupport *rhiSupport = QSGRhiSupport::instance();
272 if (resource == VulkanInstanceResource)
273 return window->vulkanInstance();
275 return const_cast<
void *>(rhiSupport->rifResource(resource, rc, window));