Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qsgadaptationlayer_p.h
Go to the documentation of this file.
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// Qt-Security score:significant reason:default
4
5#ifndef QSGADAPTATIONLAYER_P_H
6#define QSGADAPTATIONLAYER_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtQuick/qsgnode.h>
20#include <QtQuick/qsgtexture.h>
21#include <QtQuick/qquickpainteditem.h>
22#include <QtCore/qobject.h>
23#include <QtCore/qrect.h>
24#include <QtGui/qbrush.h>
25#include <QtGui/qcolor.h>
26#include <QtGui/qpainterpath.h>
27#include <QtCore/qsharedpointer.h>
28#include <QtGui/qglyphrun.h>
29#include <QtGui/qpainterpath.h>
30#include <QtCore/qurl.h>
31#include <private/qfontengine_p.h>
32#include <QtGui/private/qdatabuffer_p.h>
33#include <private/qdistancefield_p.h>
34#include <private/qintrusivelist_p.h>
35#include <rhi/qshader.h>
36
37// ### remove
38#include <QtQuick/private/qquicktext_p.h>
39
41
42class QSGNode;
43class QImage;
44class TextureReference;
46class QSGInternalImageNode;
47class QSGPainterNode;
48class QSGInternalRectangleNode;
49class QSGGlyphNode;
50class QSGRootNode;
51class QSGSpriteNode;
52class QSGRenderNode;
53class QSGRenderContext;
54class QRhiTexture;
55
56class Q_QUICK_EXPORT QSGNodeVisitorEx
57{
58public:
59 virtual ~QSGNodeVisitorEx();
60
61 // visit(...) returns true if the children are supposed to be
62 // visisted and false if they're supposed to be skipped by the visitor.
63
64 virtual bool visit(QSGTransformNode *) = 0;
65 virtual void endVisit(QSGTransformNode *) = 0;
66 virtual bool visit(QSGClipNode *) = 0;
67 virtual void endVisit(QSGClipNode *) = 0;
68 virtual bool visit(QSGGeometryNode *) = 0;
69 virtual void endVisit(QSGGeometryNode *) = 0;
70 virtual bool visit(QSGOpacityNode *) = 0;
71 virtual void endVisit(QSGOpacityNode *) = 0;
72 virtual bool visit(QSGInternalImageNode *) = 0;
73 virtual void endVisit(QSGInternalImageNode *) = 0;
74 virtual bool visit(QSGPainterNode *) = 0;
75 virtual void endVisit(QSGPainterNode *) = 0;
76 virtual bool visit(QSGInternalRectangleNode *) = 0;
77 virtual void endVisit(QSGInternalRectangleNode *) = 0;
78 virtual bool visit(QSGGlyphNode *) = 0;
79 virtual void endVisit(QSGGlyphNode *) = 0;
80 virtual bool visit(QSGRootNode *) = 0;
81 virtual void endVisit(QSGRootNode *) = 0;
82#if QT_CONFIG(quick_sprite)
83 virtual bool visit(QSGSpriteNode *) = 0;
84 virtual void endVisit(QSGSpriteNode *) = 0;
85#endif
86 virtual bool visit(QSGRenderNode *) = 0;
87 virtual void endVisit(QSGRenderNode *) = 0;
88
89 void visitChildren(QSGNode *node);
90};
91
92
93class Q_QUICK_EXPORT QSGVisitableNode : public QSGGeometryNode
94{
95public:
96 QSGVisitableNode() { setFlag(IsVisitableNode); }
97 ~QSGVisitableNode() override;
98
99 virtual void accept(QSGNodeVisitorEx *) = 0;
100};
101
102class Q_QUICK_EXPORT QSGInternalRectangleNode : public QSGVisitableNode
103{
104public:
105 ~QSGInternalRectangleNode() override;
106
107 virtual void setRect(const QRectF &rect) = 0;
108 virtual void setColor(const QColor &color) = 0;
109 virtual void setPenColor(const QColor &color) = 0;
110 virtual void setPenWidth(qreal width) = 0;
111 virtual void setGradientStops(const QGradientStops &stops) = 0;
112 virtual void setGradientVertical(bool vertical) = 0;
113 virtual void setRadius(qreal radius) = 0;
114 virtual void setTopLeftRadius(qreal radius) = 0;
115 virtual void setTopRightRadius(qreal radius) = 0;
116 virtual void setBottomLeftRadius(qreal radius) = 0;
117 virtual void setBottomRightRadius(qreal radius) = 0;
118 virtual void resetTopLeftRadius() = 0;
119 virtual void resetTopRightRadius() = 0;
120 virtual void resetBottomLeftRadius() = 0;
121 virtual void resetBottomRightRadius() = 0;
122 virtual void setAntialiasing(bool antialiasing) { Q_UNUSED(antialiasing); }
123 virtual void setAligned(bool aligned) = 0;
124
125 virtual void update() = 0;
126
127 void accept(QSGNodeVisitorEx *visitor) override { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); }
128};
129
130
131class Q_QUICK_EXPORT QSGInternalImageNode : public QSGVisitableNode
132{
133public:
134 ~QSGInternalImageNode() override;
135
136 virtual void setTargetRect(const QRectF &rect) = 0;
137 virtual void setInnerTargetRect(const QRectF &rect) = 0;
138 virtual void setInnerSourceRect(const QRectF &rect) = 0;
139 // The sub-source rect's width and height specify the number of times the inner source rect
140 // is repeated inside the inner target rect. The x and y specify which (normalized) location
141 // in the inner source rect maps to the upper-left corner of the inner target rect.
142 virtual void setSubSourceRect(const QRectF &rect) = 0;
143 virtual void setTexture(QSGTexture *texture) = 0;
144 virtual void setAntialiasing(bool antialiasing) { Q_UNUSED(antialiasing); }
145 virtual void setMirror(bool horizontally, bool vertically) = 0;
146 virtual void setMipmapFiltering(QSGTexture::Filtering filtering) = 0;
147 virtual void setFiltering(QSGTexture::Filtering filtering) = 0;
148 virtual void setHorizontalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
149 virtual void setVerticalWrapMode(QSGTexture::WrapMode wrapMode) = 0;
150
151 virtual void update() = 0;
152
153 void accept(QSGNodeVisitorEx *visitor) override { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); }
154};
155
156class Q_QUICK_EXPORT QSGPainterNode : public QSGVisitableNode
157{
158public:
159 ~QSGPainterNode() override;
160
161 virtual void setPreferredRenderTarget(QQuickPaintedItem::RenderTarget target) = 0;
162 virtual void setSize(const QSize &size) = 0;
163 virtual void setDirty(const QRect &dirtyRect = QRect()) = 0;
164 virtual void setOpaquePainting(bool opaque) = 0;
165 virtual void setLinearFiltering(bool linearFiltering) = 0;
166 virtual void setMipmapping(bool mipmapping) = 0;
167 virtual void setSmoothPainting(bool s) = 0;
168 virtual void setFillColor(const QColor &c) = 0;
169 virtual void setContentsScale(qreal s) = 0;
170 virtual void setFastFBOResizing(bool dynamic) = 0;
171 virtual void setTextureSize(const QSize &size) = 0;
172
173 virtual QImage toImage() const = 0;
174 virtual void update() = 0;
175 virtual QSGTexture *texture() const = 0;
176
177 void accept(QSGNodeVisitorEx *visitor) override { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); }
178};
179
180class Q_QUICK_EXPORT QSGLayer : public QSGDynamicTexture
181{
182 Q_OBJECT
183public:
184 ~QSGLayer() override;
185
186 enum Format {
187 RGBA8 = 1,
188 RGBA16F,
189 RGBA32F
190 };
191 virtual void setItem(QSGNode *item) = 0;
192 virtual void setRect(const QRectF &logicalRect) = 0;
193 virtual void setSize(const QSize &pixelSize) = 0;
194 virtual void scheduleUpdate() = 0;
195 virtual QImage toImage() const = 0;
196 virtual void setLive(bool live) = 0;
197 virtual void setRecursive(bool recursive) = 0;
198 virtual void setFormat(Format format) = 0;
199 virtual void setHasMipmaps(bool mipmap) = 0;
200 virtual void setDevicePixelRatio(qreal ratio) = 0;
201 virtual void setMirrorHorizontal(bool mirror) = 0;
202 virtual void setMirrorVertical(bool mirror) = 0;
203 virtual void setSamples(int samples) = 0;
204 Q_SLOT virtual void markDirtyTexture() = 0;
205 Q_SLOT virtual void invalidated() = 0;
206
207Q_SIGNALS:
208 void updateRequested();
209 void scheduledUpdateCompleted();
210
211protected:
212 QSGLayer(QSGTexturePrivate &dd);
213};
214
215#if QT_CONFIG(quick_sprite)
216
217class Q_QUICK_EXPORT QSGSpriteNode : public QSGVisitableNode
218{
219public:
220 ~QSGSpriteNode() override;
221
222 virtual void setTexture(QSGTexture *texture) = 0;
223 virtual void setTime(float time) = 0;
224 virtual void setSourceA(const QPoint &source) = 0;
225 virtual void setSourceB(const QPoint &source) = 0;
226 virtual void setSpriteSize(const QSize &size) = 0;
227 virtual void setSheetSize(const QSize &size) = 0;
228 virtual void setSize(const QSizeF &size) = 0;
229 virtual void setFiltering(QSGTexture::Filtering filtering) = 0;
230
231 virtual void update() = 0;
232
233 void accept(QSGNodeVisitorEx *visitor) override { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); }
234};
235
236#endif
237
238class Q_QUICK_EXPORT QSGGuiThreadShaderEffectManager : public QObject
239{
240 Q_OBJECT
241
242public:
243 ~QSGGuiThreadShaderEffectManager() override;
244
245 enum Status {
246 Compiled,
247 Uncompiled,
248 Error
249 };
250
251 virtual bool hasSeparateSamplerAndTextureObjects() const = 0;
252
253 virtual QString log() const = 0;
254 virtual Status status() const = 0;
255
256 struct ShaderInfo {
257 enum Type {
258 TypeVertex,
259 TypeFragment,
260 TypeOther
261 };
262 enum VariableType {
263 Constant, // cbuffer members or uniforms
264 Sampler,
265 Texture // for APIs with separate texture and sampler objects
266 };
267 struct Variable {
268 VariableType type = Constant;
269 QByteArray name;
270 uint offset = 0; // for cbuffer members
271 uint size = 0; // for cbuffer members
272 int bindPoint = 0; // for textures/samplers, where applicable
273 };
274
275 QString name; // optional, f.ex. the filename, used for debugging purposes only
276 QShader rhiShader;
277 Type type;
278 QList<Variable> variables;
279
280 // Vertex inputs are not tracked here as QSGGeometry::AttributeSet
281 // hardwires that anyways so it is up to the shader to provide
282 // compatible inputs (e.g. compatible with
283 // QSGGeometry::defaultAttributes_TexturedPoint2D()).
284 };
285
286 virtual void prepareShaderCode(ShaderInfo::Type typeHint, const QUrl &src, ShaderInfo *result) = 0;
287
288Q_SIGNALS:
289 void shaderCodePrepared(bool ok, ShaderInfo::Type typeHint, const QUrl &src, ShaderInfo *result);
290 void logAndStatusChanged();
291};
292
293#ifndef QT_NO_DEBUG_STREAM
294Q_QUICK_EXPORT QDebug operator<<(QDebug debug, const QSGGuiThreadShaderEffectManager::ShaderInfo::Variable &v);
295#endif
296
297class Q_QUICK_EXPORT QSGShaderEffectNode : public QObject, public QSGVisitableNode
298{
299 Q_OBJECT
300
301public:
302 ~QSGShaderEffectNode() override;
303
304 enum DirtyShaderFlag {
305 DirtyShaders = 0x01,
306 DirtyShaderConstant = 0x02,
307 DirtyShaderTexture = 0x04,
308 DirtyShaderGeometry = 0x08,
309 DirtyShaderMesh = 0x10,
310
311 DirtyShaderAll = 0xFF
312 };
313 Q_DECLARE_FLAGS(DirtyShaderFlags, DirtyShaderFlag)
314
315 enum CullMode { // must match ShaderEffect
316 NoCulling,
317 BackFaceCulling,
318 FrontFaceCulling
319 };
320
321 struct VariableData {
322 enum SpecialType { None, Unused, Source, SubRect, Opacity, Matrix };
323
324 QVariant value;
325 SpecialType specialType;
326 int propertyIndex = -1;
327 };
328
329 struct ShaderData {
330 ShaderData() {}
331 bool hasShaderCode = false;
332 QSGGuiThreadShaderEffectManager::ShaderInfo shaderInfo;
333 QList<VariableData> varData;
334 };
335
336 struct SyncData {
337 DirtyShaderFlags dirty;
338 CullMode cullMode;
339 bool blending;
340 struct ShaderSyncData {
341 const ShaderData *shader;
342 const QSet<int> *dirtyConstants;
343 const QSet<int> *dirtyTextures;
344 };
345 ShaderSyncData vertex;
346 ShaderSyncData fragment;
347 void *materialTypeCacheKey;
348 qint8 viewCount;
349 };
350
351 // Each ShaderEffect item has one node (render thread) and one manager (gui thread).
352
353 virtual QRectF updateNormalizedTextureSubRect(bool supportsAtlasTextures) = 0;
354 virtual void syncMaterial(SyncData *syncData) = 0;
355
356 void accept(QSGNodeVisitorEx *visitor) override { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); }
357
358Q_SIGNALS:
359 void textureChanged();
360};
361
362Q_DECLARE_OPERATORS_FOR_FLAGS(QSGShaderEffectNode::DirtyShaderFlags)
363
364#ifndef QT_NO_DEBUG_STREAM
365Q_QUICK_EXPORT QDebug operator<<(QDebug debug, const QSGShaderEffectNode::VariableData &vd);
366#endif
367
368class Q_QUICK_EXPORT QSGGlyphNode : public QSGVisitableNode
369{
370public:
371 enum AntialiasingMode
372 {
373 DefaultAntialiasing = -1,
374 GrayAntialiasing,
375 LowQualitySubPixelAntialiasing,
376 HighQualitySubPixelAntialiasing
377 };
378
379 QSGGlyphNode() {}
380 ~QSGGlyphNode() override;
381
382 virtual void setGlyphs(const QPointF &position, const QGlyphRun &glyphs) = 0;
383 virtual void setColor(const QColor &color) = 0;
384 virtual void setStyle(QQuickText::TextStyle style) = 0;
385 virtual void setStyleColor(const QColor &color) = 0;
386 virtual QPointF baseLine() const = 0;
387
388 virtual QRectF boundingRect() const { return m_bounding_rect; }
389 virtual void setBoundingRect(const QRectF &bounds) { m_bounding_rect = bounds; }
390
391 virtual void setPreferredAntialiasingMode(AntialiasingMode) = 0;
392 virtual void setRenderTypeQuality(int renderTypeQuality) { Q_UNUSED(renderTypeQuality) }
393
394 virtual void update() = 0;
395
396 void accept(QSGNodeVisitorEx *visitor) override { if (visitor->visit(this)) visitor->visitChildren(this); visitor->endVisit(this); }
397protected:
398 QRectF m_bounding_rect;
399};
400
402{
403public:
404 virtual ~QSGDistanceFieldGlyphConsumer();
405
406 virtual void invalidateGlyphs(const QList<quint32> &glyphs) = 0;
407 QIntrusiveListNode node;
408};
410
411class Q_QUICK_EXPORT QSGDistanceFieldGlyphCache
412{
413public:
414 QSGDistanceFieldGlyphCache(const QRawFont &font,
415 int renderTypeQuality);
416 virtual ~QSGDistanceFieldGlyphCache();
417
418 struct Metrics {
419 qreal width;
420 qreal height;
421 qreal baselineX;
422 qreal baselineY;
423
424 bool isNull() const { return width == 0 || height == 0; }
425 };
426
427 struct TexCoord {
428 qreal x = 0;
429 qreal y = 0;
430 qreal width = -1;
431 qreal height = -1;
432 qreal xMargin = 0;
433 qreal yMargin = 0;
434
435 TexCoord() {}
436
437 bool isNull() const { return width <= 0 || height <= 0; }
438 bool isValid() const { return width >= 0 && height >= 0; }
439 };
440
441 struct Texture {
442 QRhiTexture *texture = nullptr;
443 QSize size;
444
445 bool operator == (const Texture &other) const {
446 return texture == other.texture;
447 }
448 };
449
450 const QRawFont &referenceFont() const { return m_referenceFont; }
451
452 qreal fontScale(qreal pixelSize) const
453 {
454 return pixelSize / baseFontSize();
455 }
456 qreal distanceFieldRadius() const
457 {
458 return QT_DISTANCEFIELD_RADIUS(m_doubleGlyphResolution) / qreal(QT_DISTANCEFIELD_SCALE(m_doubleGlyphResolution));
459 }
460 int glyphCount() const { return m_glyphCount; }
461 bool doubleGlyphResolution() const { return m_doubleGlyphResolution; }
462 int renderTypeQuality() const { return m_renderTypeQuality; }
463
464 Metrics glyphMetrics(glyph_t glyph, qreal pixelSize);
465 inline TexCoord glyphTexCoord(glyph_t glyph);
466 inline const Texture *glyphTexture(glyph_t glyph);
467
468 void populate(const QList<glyph_t> &glyphs);
469 void release(const QList<glyph_t> &glyphs);
470
471 void update();
472
473 void registerGlyphNode(QSGDistanceFieldGlyphConsumer *node) { m_registeredNodes.insert(node); }
474 void unregisterGlyphNode(QSGDistanceFieldGlyphConsumer *node) { m_registeredNodes.remove(node); }
475
476 virtual void processPendingGlyphs();
477
478 virtual bool eightBitFormatIsAlphaSwizzled() const = 0;
479 virtual bool screenSpaceDerivativesSupported() const = 0;
480 virtual bool isActive() const;
481
482protected:
483 struct GlyphPosition {
484 glyph_t glyph;
485 QPointF position;
486 };
487
488 struct GlyphData {
489 Texture *texture = nullptr;
490 TexCoord texCoord;
491 QRectF boundingRect;
492 QPainterPath path;
493 quint32 ref = 0;
494
495 GlyphData() {}
496 };
497
498 virtual void requestGlyphs(const QSet<glyph_t> &glyphs) = 0;
499 virtual void storeGlyphs(const QList<QDistanceField> &glyphs) = 0;
500 virtual void referenceGlyphs(const QSet<glyph_t> &glyphs) = 0;
501 virtual void releaseGlyphs(const QSet<glyph_t> &glyphs) = 0;
502
503 void setGlyphsPosition(const QList<GlyphPosition> &glyphs);
504 void setGlyphsTexture(const QList<glyph_t> &glyphs, const Texture &tex);
505 void markGlyphsToRender(const QList<glyph_t> &glyphs);
506 inline void removeGlyph(glyph_t glyph);
507
508 void updateRhiTexture(QRhiTexture *oldTex, QRhiTexture *newTex, const QSize &newTexSize);
509
510 inline bool containsGlyph(glyph_t glyph);
511
512 GlyphData &glyphData(glyph_t glyph);
513 GlyphData &emptyData(glyph_t glyph);
514
515 int baseFontSize() const;
516
517#if defined(QSG_DISTANCEFIELD_CACHE_DEBUG)
518 virtual void saveTexture(QRhiTexture *texture, const QString &nameBase) const = 0;
519#endif
520
521 bool m_doubleGlyphResolution;
522 int m_renderTypeQuality;
523
524protected:
525 QRawFont m_referenceFont;
526
527private:
528 int m_glyphCount;
529 QList<Texture> m_textures;
530 QHash<glyph_t, GlyphData> m_glyphsData;
531 QDataBuffer<glyph_t> m_pendingGlyphs;
532 QSet<glyph_t> m_populatingGlyphs;
533 QSGDistanceFieldGlyphConsumerList m_registeredNodes;
534
535 static Texture s_emptyTexture;
536};
537
538inline QSGDistanceFieldGlyphCache::TexCoord QSGDistanceFieldGlyphCache::glyphTexCoord(glyph_t glyph)
539{
540 return glyphData(glyph).texCoord;
541}
542
543inline const QSGDistanceFieldGlyphCache::Texture *QSGDistanceFieldGlyphCache::glyphTexture(glyph_t glyph)
544{
545 return glyphData(glyph).texture;
546}
547
548inline void QSGDistanceFieldGlyphCache::removeGlyph(glyph_t glyph)
549{
550 GlyphData &gd = glyphData(glyph);
551 gd.texCoord = TexCoord();
552 gd.texture = &s_emptyTexture;
553}
554
555inline bool QSGDistanceFieldGlyphCache::containsGlyph(glyph_t glyph)
556{
557 return glyphData(glyph).texCoord.isValid();
558}
559
560QT_END_NAMESPACE
561
562Q_DECLARE_METATYPE(QSGGuiThreadShaderEffectManager::ShaderInfo::Type)
563
564#endif
Combined button and popup list for selecting options.
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
Definition qdir.cpp:2582
QDebug operator<<(QDebug dbg, const QFileInfo &fi)
QIntrusiveList< QSGDistanceFieldGlyphConsumer, &QSGDistanceFieldGlyphConsumer::node > QSGDistanceFieldGlyphConsumerList