blob: 376c7d38abd68a78955a4cfd1e8e69833f9e1a61 (
plain)
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
|
// Copyright (C) 2019 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 QSGRHISHADEREFFECTNODE_P_H
#define QSGRHISHADEREFFECTNODE_P_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 <private/qsgadaptationlayer_p.h>
#include <qsgmaterial.h>
#include <QUrl>
QT_BEGIN_NAMESPACE
class QSGDefaultRenderContext;
class QSGPlainTexture;
class QSGRhiShaderEffectNode;
class QFileSelector;
class QSGRhiShaderLinker
{
public:
void reset(const QShader &vs, const QShader &fs);
void feedConstants(const QSGShaderEffectNode::ShaderData &shader, const QSet<int> *dirtyIndices = nullptr);
void feedSamplers(const QSGShaderEffectNode::ShaderData &shader, const QSet<int> *dirtyIndices = nullptr);
void linkTextureSubRects();
void dump();
struct Constant {
uint size;
QSGShaderEffectNode::VariableData::SpecialType specialType;
QVariant value;
bool operator==(const Constant &other) const {
return size == other.size && specialType == other.specialType
&& (specialType == QSGShaderEffectNode::VariableData::None ? value == other.value : true);
}
};
bool m_error;
QShader m_vs;
QShader m_fs;
QHash<uint, Constant> m_constants; // offset -> Constant
QHash<int, QVariant> m_samplers; // binding -> value (source ref)
QHash<QByteArray, int> m_samplerNameMap; // name -> binding
QSet<int> m_subRectBindings;
};
QDebug operator<<(QDebug debug, const QSGRhiShaderLinker::Constant &c);
class QSGRhiShaderEffectMaterial : public QSGMaterial
{
public:
QSGRhiShaderEffectMaterial(QSGRhiShaderEffectNode *node);
~QSGRhiShaderEffectMaterial();
int compare(const QSGMaterial *other) const override;
QSGMaterialType *type() const override;
QSGMaterialShader *createShader(QSGRendererInterface::RenderMode renderMode) const override;
void updateTextureProviders(bool layoutChange);
bool usesSubRectUniform(int binding) const { return m_linker.m_subRectBindings.contains(binding); }
static const int MAX_BINDINGS = 32;
QSGRhiShaderEffectNode *m_node;
QSGMaterialType *m_materialType = nullptr;
void *m_materialTypeCacheKey = nullptr;
QSGRhiShaderLinker m_linker;
QVector<QSGTextureProvider *> m_textureProviders; // [binding] = QSGTextureProvider
bool m_geometryUsesTextureSubRect = false;
QSGShaderEffectNode::CullMode m_cullMode = QSGShaderEffectNode::NoCulling;
bool m_hasCustomVertexShader = false;
bool m_hasCustomFragmentShader = false;
QShader m_vertexShader;
QShader m_fragmentShader;
QSGPlainTexture *m_dummyTexture = nullptr;
};
class QSGRhiShaderEffectNode : public QSGShaderEffectNode
{
Q_OBJECT
public:
QSGRhiShaderEffectNode(QSGDefaultRenderContext *rc);
QRectF updateNormalizedTextureSubRect(bool supportsAtlasTextures) override;
void syncMaterial(SyncData *syncData) override;
void preprocess() override;
static void resetMaterialTypeCache(void *materialTypeCacheKey);
static void garbageCollectMaterialTypeCache(void *materialTypeCacheKey);
private Q_SLOTS:
void handleTextureChange();
void handleTextureProviderDestroyed(QObject *object);
private:
QSGRhiShaderEffectMaterial m_material;
};
class QSGRhiGuiThreadShaderEffectManager : public QSGGuiThreadShaderEffectManager
{
public:
bool hasSeparateSamplerAndTextureObjects() const override;
QString log() const override;
Status status() const override;
void prepareShaderCode(ShaderInfo::Type typeHint, const QUrl &src, ShaderInfo *result) override;
private:
bool reflect(ShaderInfo *result);
Status m_status = Uncompiled;
QFileSelector *m_fileSelector = nullptr;
};
QT_END_NAMESPACE
#endif // QSGRHISHADEREFFECTNODE_P_H
|