1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
// 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
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtQuick/private/qsgcontext_p.h>
#include <rhi/qshader.h>
QT_BEGIN_NAMESPACE
class QRhi;
class QRhiCommandBuffer;
class QRhiRenderPassDescriptor;
class QRhiResourceUpdateBatch;
class QRhiTexture;
class QRhiRenderBuffer;
class QSGMaterialShader;
class QSurface;
class QSGDefaultRenderContext;
namespace QSGRhiAtlasTexture {
class Manager;
}
class QSGDepthStencilBuffer
{
public:
QSGDepthStencilBuffer() { }
QSGDepthStencilBuffer(QRhiRenderBuffer *ds) : ds(ds) { }
~QSGDepthStencilBuffer();
QRhiRenderBuffer *ds = nullptr;
QSGDefaultRenderContext *rc = nullptr;
};
class Q_QUICK_EXPORT QSGDefaultRenderContext : public QSGRenderContext
{
Q_OBJECT
public:
QSGDefaultRenderContext(QSGContext *context);
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 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;
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(QSGRendererInterface::RenderMode renderMode = QSGRendererInterface::RenderMode2D) override;
QSGTexture *compressedTextureForFactory(const QSGCompressedTextureFactory *factory) const override;
virtual void initializeRhiShader(QSGMaterialShader *shader, QShader::Variant shaderVariant);
int maxTextureSize() const override { return m_maxTextureSize; }
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();
QSharedPointer<QSGDepthStencilBuffer> getDepthStencilBuffer(const QSize &size, int sampleCount);
void addDepthStencilBuffer(const QSharedPointer<QSGDepthStencilBuffer> &ds);
protected:
InitParams m_initParams;
QRhi *m_rhi;
int m_maxTextureSize;
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;
QHash<std::pair<QSize, int>, QWeakPointer<QSGDepthStencilBuffer>> m_depthStencilBuffers;
friend class QSGDepthStencilBuffer;
};
QT_END_NAMESPACE
#endif // QSGDEFAULTRENDERCONTEXT_H
|