1 | // Copyright (C) 2016 The Qt Company Ltd. |
2 | // Copyright (C) 2016 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> |
3 | // Copyright (C) 2016 Robin Burchell <robin.burchell@viroteck.net> |
4 | // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only |
5 | |
6 | #ifndef QSGRHIVISUALIZER_P_H |
7 | #define QSGRHIVISUALIZER_P_H |
8 | |
9 | // |
10 | // W A R N I N G |
11 | // ------------- |
12 | // |
13 | // This file is not part of the Qt API. It exists purely as an |
14 | // implementation detail. This header file may change from version to |
15 | // version without notice, or even be removed. |
16 | // |
17 | // We mean it. |
18 | // |
19 | |
20 | #include "qsgbatchrenderer_p.h" |
21 | |
22 | #include <QtCore/qrandom.h> |
23 | |
24 | QT_BEGIN_NAMESPACE |
25 | |
26 | namespace QSGBatchRenderer |
27 | { |
28 | |
29 | class RhiVisualizer : public Visualizer |
30 | { |
31 | public: |
32 | RhiVisualizer(Renderer *renderer); |
33 | ~RhiVisualizer(); |
34 | |
35 | void prepareVisualize() override; |
36 | void visualize() override; |
37 | |
38 | void releaseResources() override; |
39 | |
40 | struct DrawCall |
41 | { |
42 | static const int UBUF_SIZE = 152; // visualization.vert/frag |
43 | struct { |
44 | char data[UBUF_SIZE]; // matrix, rotation, color, pattern, projection |
45 | } uniforms; |
46 | struct { |
47 | QRhiGraphicsPipeline::Topology topology; |
48 | QRhiVertexInputAttribute::Format format; |
49 | int count; |
50 | int stride; |
51 | const void *data; // only when using own vbuf |
52 | } vertex; |
53 | struct { |
54 | QRhiCommandBuffer::IndexFormat format; |
55 | int count; |
56 | int stride; |
57 | const void *data; // only when using own ibuf |
58 | } index; |
59 | struct { |
60 | QRhiBuffer *vbuf; // either same for all draw calls and owned by the *Vis, or points to a Batch.Buffer.vbo.buf |
61 | int vbufOffset; |
62 | QRhiBuffer *ibuf; // same, but for index |
63 | int ibufOffset; |
64 | int ubufOffset; |
65 | } buf; |
66 | }; |
67 | |
68 | private: |
69 | QShader m_vs; |
70 | QShader m_fs; |
71 | |
72 | void recordDrawCalls(const QVector<DrawCall> &drawCalls, |
73 | QRhiCommandBuffer *cb, |
74 | QRhiShaderResourceBindings *srb, |
75 | bool blendOneOne = false); |
76 | |
77 | class PipelineCache { |
78 | public: |
79 | QRhiGraphicsPipeline *pipeline(RhiVisualizer *visualizer, |
80 | QRhi *rhi, |
81 | QRhiShaderResourceBindings *srb, |
82 | QRhiRenderPassDescriptor *rpDesc, |
83 | QRhiGraphicsPipeline::Topology topology, |
84 | QRhiVertexInputAttribute::Format vertexFormat, |
85 | quint32 vertexStride, |
86 | bool blendOneOne); |
87 | void releaseResources(); |
88 | private: |
89 | struct Pipeline { |
90 | QRhiGraphicsPipeline::Topology topology; |
91 | QRhiVertexInputAttribute::Format format; |
92 | quint32 stride; |
93 | QRhiGraphicsPipeline *ps; |
94 | }; |
95 | QVarLengthArray<Pipeline, 16> pipelines; |
96 | }; |
97 | |
98 | PipelineCache m_pipelines; |
99 | |
100 | class Fade { |
101 | public: |
102 | void prepare(RhiVisualizer *visualizer, |
103 | QRhi *rhi, QRhiResourceUpdateBatch *u, QRhiRenderPassDescriptor *rpDesc); |
104 | void releaseResources(); |
105 | void render(QRhiCommandBuffer *cb); |
106 | private: |
107 | RhiVisualizer *visualizer; |
108 | QRhiBuffer *vbuf = nullptr; |
109 | QRhiBuffer *ubuf = nullptr; |
110 | QRhiGraphicsPipeline *ps = nullptr; |
111 | QRhiShaderResourceBindings *srb = nullptr; |
112 | } m_fade; |
113 | |
114 | class ChangeVis { |
115 | public: |
116 | void prepare(Node *n, RhiVisualizer *visualizer, |
117 | QRhi *rhi, QRhiResourceUpdateBatch *u); |
118 | void releaseResources(); |
119 | void render(QRhiCommandBuffer *cb); |
120 | private: |
121 | void gather(Node *n); |
122 | RhiVisualizer *visualizer; |
123 | QVector<DrawCall> drawCalls; |
124 | QRhiBuffer *vbuf = nullptr; |
125 | QRhiBuffer *ibuf = nullptr; |
126 | QRhiBuffer *ubuf = nullptr; |
127 | QRhiShaderResourceBindings *srb = nullptr; |
128 | } m_changeVis; |
129 | |
130 | class BatchVis { |
131 | public: |
132 | void prepare(const QDataBuffer<Batch *> &opaqueBatches, |
133 | const QDataBuffer<Batch *> &alphaBatches, |
134 | RhiVisualizer *visualizer, |
135 | QRhi *rhi, QRhiResourceUpdateBatch *u, |
136 | bool forceUintIndex); |
137 | void releaseResources(); |
138 | void render(QRhiCommandBuffer *cb); |
139 | private: |
140 | void gather(Batch *b); |
141 | RhiVisualizer *visualizer; |
142 | bool forceUintIndex; |
143 | QVector<DrawCall> drawCalls; |
144 | QRhiBuffer *ubuf = nullptr; |
145 | QRhiShaderResourceBindings *srb = nullptr; |
146 | } m_batchVis; |
147 | |
148 | class ClipVis { |
149 | public: |
150 | void prepare(QSGNode *node, RhiVisualizer *visualizer, |
151 | QRhi *rhi, QRhiResourceUpdateBatch *u); |
152 | void releaseResources(); |
153 | void render(QRhiCommandBuffer *cb); |
154 | private: |
155 | void gather(QSGNode *node); |
156 | RhiVisualizer *visualizer; |
157 | QVector<DrawCall> drawCalls; |
158 | QRhiBuffer *vbuf = nullptr; |
159 | QRhiBuffer *ibuf = nullptr; |
160 | QRhiBuffer *ubuf = nullptr; |
161 | QRhiShaderResourceBindings *srb = nullptr; |
162 | } m_clipVis; |
163 | |
164 | class OverdrawVis { |
165 | public: |
166 | void prepare(Node *n, RhiVisualizer *visualizer, |
167 | QRhi *rhi, QRhiResourceUpdateBatch *u); |
168 | void releaseResources(); |
169 | void render(QRhiCommandBuffer *cb); |
170 | private: |
171 | void gather(Node *n); |
172 | RhiVisualizer *visualizer; |
173 | QVector<DrawCall> drawCalls; |
174 | QRhiBuffer *vbuf = nullptr; |
175 | QRhiBuffer *ibuf = nullptr; |
176 | QRhiBuffer *ubuf = nullptr; |
177 | QRhiShaderResourceBindings *srb = nullptr; |
178 | float step = 0.0f; |
179 | QMatrix4x4 rotation; |
180 | struct { |
181 | QRhiBuffer *vbuf = nullptr; |
182 | QRhiBuffer *ubuf = nullptr; |
183 | QRhiShaderResourceBindings *srb = nullptr; |
184 | QRhiGraphicsPipeline *ps = nullptr; |
185 | } box; |
186 | } m_overdrawVis; |
187 | |
188 | QRandomGenerator m_randomGenerator; |
189 | |
190 | friend class Fade; |
191 | friend class PipelineCache; |
192 | friend class ChangeVis; |
193 | friend class ClipVis; |
194 | friend class OverdrawVis; |
195 | }; |
196 | |
197 | } // namespace QSGBatchRenderer |
198 | |
199 | QT_END_NAMESPACE |
200 | |
201 | #endif // QSGRHIVISUALIZER_P_H |
202 | |