1/****************************************************************************
2**
3** Copyright (C) 2019 The Qt Company Ltd.
4** Contact: http://www.qt.io/licensing/
5**
6** This file is part of the Qt Gui module
7**
8** $QT_BEGIN_LICENSE:LGPL3$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see http://www.qt.io/terms-conditions. For further
15** information use the contact form at http://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPLv3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or later as published by the Free
28** Software Foundation and appearing in the file LICENSE.GPL included in
29** the packaging of this file. Please review the following information to
30** ensure the GNU General Public License version 2.0 requirements will be
31** met: http://www.gnu.org/licenses/gpl-2.0.html.
32**
33** $QT_END_LICENSE$
34**
35****************************************************************************/
36
37#ifndef QRHINULL_P_H
38#define QRHINULL_P_H
39
40//
41// W A R N I N G
42// -------------
43//
44// This file is not part of the Qt API. It exists purely as an
45// implementation detail. This header file may change from version to
46// version without notice, or even be removed.
47//
48// We mean it.
49//
50
51#include "qrhinull_p.h"
52#include "qrhi_p_p.h"
53
54QT_BEGIN_NAMESPACE
55
56struct QNullBuffer : public QRhiBuffer
57{
58 QNullBuffer(QRhiImplementation *rhi, Type type, UsageFlags usage, int size);
59 ~QNullBuffer();
60 void release() override;
61 bool build() override;
62
63 QByteArray data;
64};
65
66struct QNullRenderBuffer : public QRhiRenderBuffer
67{
68 QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize,
69 int sampleCount, QRhiRenderBuffer::Flags flags);
70 ~QNullRenderBuffer();
71 void release() override;
72 bool build() override;
73 QRhiTexture::Format backingFormat() const override;
74};
75
76struct QNullTexture : public QRhiTexture
77{
78 QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize,
79 int sampleCount, Flags flags);
80 ~QNullTexture();
81 void release() override;
82 bool build() override;
83 bool buildFrom(NativeTexture src) override;
84
85 QImage image[QRhi::MAX_LAYERS][QRhi::MAX_LEVELS];
86};
87
88struct QNullSampler : public QRhiSampler
89{
90 QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
91 AddressMode u, AddressMode v, AddressMode w);
92 ~QNullSampler();
93 void release() override;
94 bool build() override;
95};
96
97struct QNullRenderPassDescriptor : public QRhiRenderPassDescriptor
98{
99 QNullRenderPassDescriptor(QRhiImplementation *rhi);
100 ~QNullRenderPassDescriptor();
101 void release() override;
102 bool isCompatible(const QRhiRenderPassDescriptor *other) const override;
103};
104
105struct QNullRenderTargetData
106{
107 QNullRenderTargetData(QRhiImplementation *) { }
108
109 QNullRenderPassDescriptor *rp = nullptr;
110 QSize pixelSize;
111 float dpr = 1;
112};
113
114struct QNullReferenceRenderTarget : public QRhiRenderTarget
115{
116 QNullReferenceRenderTarget(QRhiImplementation *rhi);
117 ~QNullReferenceRenderTarget();
118 void release() override;
119
120 QSize pixelSize() const override;
121 float devicePixelRatio() const override;
122 int sampleCount() const override;
123
124 QNullRenderTargetData d;
125};
126
127struct QNullTextureRenderTarget : public QRhiTextureRenderTarget
128{
129 QNullTextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags);
130 ~QNullTextureRenderTarget();
131 void release() override;
132
133 QSize pixelSize() const override;
134 float devicePixelRatio() const override;
135 int sampleCount() const override;
136
137 QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() override;
138 bool build() override;
139
140 QNullRenderTargetData d;
141};
142
143struct QNullShaderResourceBindings : public QRhiShaderResourceBindings
144{
145 QNullShaderResourceBindings(QRhiImplementation *rhi);
146 ~QNullShaderResourceBindings();
147 void release() override;
148 bool build() override;
149};
150
151struct QNullGraphicsPipeline : public QRhiGraphicsPipeline
152{
153 QNullGraphicsPipeline(QRhiImplementation *rhi);
154 ~QNullGraphicsPipeline();
155 void release() override;
156 bool build() override;
157};
158
159struct QNullComputePipeline : public QRhiComputePipeline
160{
161 QNullComputePipeline(QRhiImplementation *rhi);
162 ~QNullComputePipeline();
163 void release() override;
164 bool build() override;
165};
166
167struct QNullCommandBuffer : public QRhiCommandBuffer
168{
169 QNullCommandBuffer(QRhiImplementation *rhi);
170 ~QNullCommandBuffer();
171 void release() override;
172};
173
174struct QNullSwapChain : public QRhiSwapChain
175{
176 QNullSwapChain(QRhiImplementation *rhi);
177 ~QNullSwapChain();
178 void release() override;
179
180 QRhiCommandBuffer *currentFrameCommandBuffer() override;
181 QRhiRenderTarget *currentFrameRenderTarget() override;
182
183 QSize surfacePixelSize() override;
184
185 QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() override;
186 bool buildOrResize() override;
187
188 QNullReferenceRenderTarget rt;
189 QNullCommandBuffer cb;
190 int frameCount = 0;
191};
192
193class QRhiNull : public QRhiImplementation
194{
195public:
196 QRhiNull(QRhiNullInitParams *params);
197
198 bool create(QRhi::Flags flags) override;
199 void destroy() override;
200
201 QRhiGraphicsPipeline *createGraphicsPipeline() override;
202 QRhiComputePipeline *createComputePipeline() override;
203 QRhiShaderResourceBindings *createShaderResourceBindings() override;
204 QRhiBuffer *createBuffer(QRhiBuffer::Type type,
205 QRhiBuffer::UsageFlags usage,
206 int size) override;
207 QRhiRenderBuffer *createRenderBuffer(QRhiRenderBuffer::Type type,
208 const QSize &pixelSize,
209 int sampleCount,
210 QRhiRenderBuffer::Flags flags) override;
211 QRhiTexture *createTexture(QRhiTexture::Format format,
212 const QSize &pixelSize,
213 int sampleCount,
214 QRhiTexture::Flags flags) override;
215 QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
216 QRhiSampler::Filter minFilter,
217 QRhiSampler::Filter mipmapMode,
218 QRhiSampler:: AddressMode u,
219 QRhiSampler::AddressMode v,
220 QRhiSampler::AddressMode w) override;
221
222 QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
223 QRhiTextureRenderTarget::Flags flags) override;
224
225 QRhiSwapChain *createSwapChain() override;
226 QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) override;
227 QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) override;
228 QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) override;
229 QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) override;
230 QRhi::FrameOpResult finish() override;
231
232 void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
233
234 void beginPass(QRhiCommandBuffer *cb,
235 QRhiRenderTarget *rt,
236 const QColor &colorClearValue,
237 const QRhiDepthStencilClearValue &depthStencilClearValue,
238 QRhiResourceUpdateBatch *resourceUpdates) override;
239 void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
240
241 void setGraphicsPipeline(QRhiCommandBuffer *cb,
242 QRhiGraphicsPipeline *ps) override;
243
244 void setShaderResources(QRhiCommandBuffer *cb,
245 QRhiShaderResourceBindings *srb,
246 int dynamicOffsetCount,
247 const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) override;
248
249 void setVertexInput(QRhiCommandBuffer *cb,
250 int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings,
251 QRhiBuffer *indexBuf, quint32 indexOffset,
252 QRhiCommandBuffer::IndexFormat indexFormat) override;
253
254 void setViewport(QRhiCommandBuffer *cb, const QRhiViewport &viewport) override;
255 void setScissor(QRhiCommandBuffer *cb, const QRhiScissor &scissor) override;
256 void setBlendConstants(QRhiCommandBuffer *cb, const QColor &c) override;
257 void setStencilRef(QRhiCommandBuffer *cb, quint32 refValue) override;
258
259 void draw(QRhiCommandBuffer *cb, quint32 vertexCount,
260 quint32 instanceCount, quint32 firstVertex, quint32 firstInstance) override;
261
262 void drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount,
263 quint32 instanceCount, quint32 firstIndex,
264 qint32 vertexOffset, quint32 firstInstance) override;
265
266 void debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name) override;
267 void debugMarkEnd(QRhiCommandBuffer *cb) override;
268 void debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg) override;
269
270 void beginComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
271 void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
272 void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) override;
273 void dispatch(QRhiCommandBuffer *cb, int x, int y, int z) override;
274
275 const QRhiNativeHandles *nativeHandles(QRhiCommandBuffer *cb) override;
276 void beginExternal(QRhiCommandBuffer *cb) override;
277 void endExternal(QRhiCommandBuffer *cb) override;
278
279 QVector<int> supportedSampleCounts() const override;
280 int ubufAlignment() const override;
281 bool isYUpInFramebuffer() const override;
282 bool isYUpInNDC() const override;
283 bool isClipDepthZeroToOne() const override;
284 QMatrix4x4 clipSpaceCorrMatrix() const override;
285 bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags) const override;
286 bool isFeatureSupported(QRhi::Feature feature) const override;
287 int resourceLimit(QRhi::ResourceLimit limit) const override;
288 const QRhiNativeHandles *nativeHandles() override;
289 void sendVMemStatsToProfiler() override;
290 bool makeThreadLocalNativeContextCurrent() override;
291 void releaseCachedResources() override;
292 bool isDeviceLost() const override;
293
294 void simulateTextureUpload(const QRhiResourceUpdateBatchPrivate::TextureOp &u);
295 void simulateTextureCopy(const QRhiResourceUpdateBatchPrivate::TextureOp &u);
296 void simulateTextureGenMips(const QRhiResourceUpdateBatchPrivate::TextureOp &u);
297
298 QRhiNullNativeHandles nativeHandlesStruct;
299 QRhiSwapChain *currentSwapChain = nullptr;
300 QNullCommandBuffer offscreenCommandBuffer;
301};
302
303QT_END_NAMESPACE
304
305#endif
306

source code of qtbase/src/gui/rhi/qrhinull_p_p.h