1// Copyright (C) 2008-2012 NVIDIA Corporation.
2// Copyright (C) 2020 The Qt Company Ltd.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
4
5#ifndef QSSGRHIEFFECTSYSTEM_P_H
6#define QSSGRHIEFFECTSYSTEM_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 <QtQuick3DRuntimeRender/private/qssgrendereffect_p.h>
20#include <QtQuick3DRuntimeRender/private/qssgrhicontext_p.h>
21#include <QtQuick3DRuntimeRender/private/qssgrendercommands_p.h>
22
23QT_BEGIN_NAMESPACE
24
25struct QSSGRhiEffectTexture;
26class QSSGRenderer;
27
28class QSSGProgramGenerator;
29class QSSGShaderLibraryManager;
30class QSSGShaderCache;
31
32struct QSSGEffectSceneCacheKey
33{
34 QByteArray m_shaderPathKey;
35 quintptr m_cmd;
36 int m_ubufIndex;
37
38 size_t m_hashCode = 0;
39
40 static size_t generateHashCode(const QByteArray &shaderPathKey, quintptr cmd, int ubufIndex)
41 {
42 return qHash(key: shaderPathKey) ^ qHash(key: cmd) ^ qHash(key: ubufIndex);
43 }
44
45 void updateHashCode()
46 {
47 m_hashCode = generateHashCode(shaderPathKey: m_shaderPathKey, cmd: m_cmd, ubufIndex: m_ubufIndex);
48 }
49
50 bool operator==(const QSSGEffectSceneCacheKey &other) const
51 {
52 return m_shaderPathKey == other.m_shaderPathKey
53 && m_cmd == other.m_cmd
54 && m_ubufIndex == other.m_ubufIndex;
55 }
56};
57
58inline size_t qHash(const QSSGEffectSceneCacheKey &key)
59{
60 return key.m_hashCode;
61}
62
63class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRhiEffectSystem
64{
65public:
66 explicit QSSGRhiEffectSystem(const std::shared_ptr<QSSGRenderContextInterface> &sgContext);
67 ~QSSGRhiEffectSystem();
68
69 void setup(QSize outputSize);
70 QRhiTexture *process(const QSSGRenderEffect &firstEffect,
71 QRhiTexture *inTexture,
72 QRhiTexture *inDepthTexture,
73 QVector2D cameraClipRange);
74
75 static QSSGRenderTextureFormat::Format overriddenOutputFormat(const QSSGRenderEffect *inEffect);
76
77 static QSSGRhiShaderPipelinePtr buildShaderForEffect(const QSSGBindShader &inCmd,
78 QSSGProgramGenerator &generator,
79 QSSGShaderLibraryManager &shaderLib,
80 QSSGShaderCache &shaderCache,
81 bool isYUpInFramebuffer);
82
83private:
84 void releaseResources();
85 QSSGRhiEffectTexture *doRenderEffect(const QSSGRenderEffect *inEffect,
86 QSSGRhiEffectTexture *inTexture);
87
88 void allocateBufferCmd(const QSSGAllocateBuffer *inCmd, QSSGRhiEffectTexture *inTexture, const QSSGRenderEffect *inEffect);
89 void applyInstanceValueCmd(const QSSGApplyInstanceValue *inCmd, const QSSGRenderEffect *inEffect);
90 void applyValueCmd(const QSSGApplyValue *inCmd, const QSSGRenderEffect *inEffect);
91 void bindShaderCmd(const QSSGBindShader *inCmd, const QSSGRenderEffect *inEffect);
92 void renderCmd(QSSGRhiEffectTexture *inTexture, QSSGRhiEffectTexture *target);
93
94 void addCommonEffectUniforms(const QSize &inputSize, const QSize &outputSize);
95 void addTextureToShaderPipeline(const QByteArray &name, QRhiTexture *texture, const QSSGRhiSamplerDescription &samplerDesc);
96
97 QSSGRhiEffectTexture *findTexture(const QByteArray &bufferName);
98 QSSGRhiEffectTexture *getTexture(const QByteArray &bufferName, const QSize &size,
99 QRhiTexture::Format format, bool isFinalOutput,
100 const QSSGRenderEffect *inEffect);
101 void releaseTexture(QSSGRhiEffectTexture *texture);
102 void releaseTextures();
103
104 QSize m_outSize;
105 std::shared_ptr<QSSGRenderContextInterface> m_sgContext;
106 QVector<QSSGRhiEffectTexture *> m_textures;
107 QRhiTexture *m_depthTexture = nullptr;
108 QVector2D m_cameraClipRange;
109 int m_currentUbufIndex = 0;
110 QHash<QSSGEffectSceneCacheKey, QSSGRhiShaderPipelinePtr> m_shaderPipelines;
111 QSSGRhiShaderPipeline *m_currentShaderPipeline = nullptr;
112 char *m_currentUBufData = nullptr;
113 QHash<QByteArray, QSSGRhiTexture> m_currentTextures;
114 QSet<QRhiTextureRenderTarget *> m_pendingClears;
115};
116
117QT_END_NAMESPACE
118
119#endif
120

source code of qtquick3d/src/runtimerender/qssgrhieffectsystem_p.h