1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QRHINULL_P_H
5#define QRHINULL_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qrhi_p.h"
19
20QT_BEGIN_NAMESPACE
21
22struct QNullBuffer : public QRhiBuffer
23{
24 QNullBuffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size);
25 ~QNullBuffer();
26 void destroy() override;
27 bool create() override;
28 char *beginFullDynamicBufferUpdateForCurrentFrame() override;
29
30 char *data = nullptr;
31};
32
33struct QNullRenderBuffer : public QRhiRenderBuffer
34{
35 QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize,
36 int sampleCount, QRhiRenderBuffer::Flags flags,
37 QRhiTexture::Format backingFormatHint);
38 ~QNullRenderBuffer();
39 void destroy() override;
40 bool create() override;
41 QRhiTexture::Format backingFormat() const override;
42
43 bool valid = false;
44 uint generation = 0;
45};
46
47struct QNullTexture : public QRhiTexture
48{
49 QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth,
50 int arraySize, int sampleCount, Flags flags);
51 ~QNullTexture();
52 void destroy() override;
53 bool create() override;
54 bool createFrom(NativeTexture src) override;
55
56 bool valid = false;
57 QVarLengthArray<std::array<QImage, QRhi::MAX_MIP_LEVELS>, 6> image;
58 uint generation = 0;
59};
60
61struct QNullSampler : public QRhiSampler
62{
63 QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
64 AddressMode u, AddressMode v, AddressMode w);
65 ~QNullSampler();
66 void destroy() override;
67 bool create() override;
68};
69
70struct QNullRenderPassDescriptor : public QRhiRenderPassDescriptor
71{
72 QNullRenderPassDescriptor(QRhiImplementation *rhi);
73 ~QNullRenderPassDescriptor();
74 void destroy() override;
75 bool isCompatible(const QRhiRenderPassDescriptor *other) const override;
76 QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() const override;
77 QVector<quint32> serializedFormat() const override;
78};
79
80struct QNullRenderTargetData
81{
82 QNullRenderTargetData(QRhiImplementation *) { }
83
84 QNullRenderPassDescriptor *rp = nullptr;
85 QSize pixelSize;
86 float dpr = 1;
87 QRhiRenderTargetAttachmentTracker::ResIdList currentResIdList;
88};
89
90struct QNullSwapChainRenderTarget : public QRhiSwapChainRenderTarget
91{
92 QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain);
93 ~QNullSwapChainRenderTarget();
94 void destroy() override;
95
96 QSize pixelSize() const override;
97 float devicePixelRatio() const override;
98 int sampleCount() const override;
99
100 QNullRenderTargetData d;
101};
102
103struct QNullTextureRenderTarget : public QRhiTextureRenderTarget
104{
105 QNullTextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags);
106 ~QNullTextureRenderTarget();
107 void destroy() override;
108
109 QSize pixelSize() const override;
110 float devicePixelRatio() const override;
111 int sampleCount() const override;
112
113 QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() override;
114 bool create() override;
115
116 QNullRenderTargetData d;
117};
118
119struct QNullShaderResourceBindings : public QRhiShaderResourceBindings
120{
121 QNullShaderResourceBindings(QRhiImplementation *rhi);
122 ~QNullShaderResourceBindings();
123 void destroy() override;
124 bool create() override;
125 void updateResources(UpdateFlags flags) override;
126};
127
128struct QNullGraphicsPipeline : public QRhiGraphicsPipeline
129{
130 QNullGraphicsPipeline(QRhiImplementation *rhi);
131 ~QNullGraphicsPipeline();
132 void destroy() override;
133 bool create() override;
134};
135
136struct QNullComputePipeline : public QRhiComputePipeline
137{
138 QNullComputePipeline(QRhiImplementation *rhi);
139 ~QNullComputePipeline();
140 void destroy() override;
141 bool create() override;
142};
143
144struct QNullCommandBuffer : public QRhiCommandBuffer
145{
146 QNullCommandBuffer(QRhiImplementation *rhi);
147 ~QNullCommandBuffer();
148 void destroy() override;
149};
150
151struct QNullSwapChain : public QRhiSwapChain
152{
153 QNullSwapChain(QRhiImplementation *rhi);
154 ~QNullSwapChain();
155 void destroy() override;
156
157 QRhiCommandBuffer *currentFrameCommandBuffer() override;
158 QRhiRenderTarget *currentFrameRenderTarget() override;
159
160 QSize surfacePixelSize() override;
161 bool isFormatSupported(Format f) override;
162
163 QRhiRenderPassDescriptor *newCompatibleRenderPassDescriptor() override;
164 bool createOrResize() override;
165
166 QWindow *window = nullptr;
167 QNullSwapChainRenderTarget rt;
168 QNullCommandBuffer cb;
169 int frameCount = 0;
170};
171
172class QRhiNull : public QRhiImplementation
173{
174public:
175 QRhiNull(QRhiNullInitParams *params);
176
177 bool create(QRhi::Flags flags) override;
178 void destroy() override;
179
180 QRhiGraphicsPipeline *createGraphicsPipeline() override;
181 QRhiComputePipeline *createComputePipeline() override;
182 QRhiShaderResourceBindings *createShaderResourceBindings() override;
183 QRhiBuffer *createBuffer(QRhiBuffer::Type type,
184 QRhiBuffer::UsageFlags usage,
185 quint32 size) override;
186 QRhiRenderBuffer *createRenderBuffer(QRhiRenderBuffer::Type type,
187 const QSize &pixelSize,
188 int sampleCount,
189 QRhiRenderBuffer::Flags flags,
190 QRhiTexture::Format backingFormatHint) override;
191 QRhiTexture *createTexture(QRhiTexture::Format format,
192 const QSize &pixelSize,
193 int depth,
194 int arraySize,
195 int sampleCount,
196 QRhiTexture::Flags flags) override;
197 QRhiSampler *createSampler(QRhiSampler::Filter magFilter,
198 QRhiSampler::Filter minFilter,
199 QRhiSampler::Filter mipmapMode,
200 QRhiSampler:: AddressMode u,
201 QRhiSampler::AddressMode v,
202 QRhiSampler::AddressMode w) override;
203
204 QRhiTextureRenderTarget *createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
205 QRhiTextureRenderTarget::Flags flags) override;
206
207 QRhiSwapChain *createSwapChain() override;
208 QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) override;
209 QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) override;
210 QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) override;
211 QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) override;
212 QRhi::FrameOpResult finish() override;
213
214 void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
215
216 void beginPass(QRhiCommandBuffer *cb,
217 QRhiRenderTarget *rt,
218 const QColor &colorClearValue,
219 const QRhiDepthStencilClearValue &depthStencilClearValue,
220 QRhiResourceUpdateBatch *resourceUpdates,
221 QRhiCommandBuffer::BeginPassFlags flags) override;
222 void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
223
224 void setGraphicsPipeline(QRhiCommandBuffer *cb,
225 QRhiGraphicsPipeline *ps) override;
226
227 void setShaderResources(QRhiCommandBuffer *cb,
228 QRhiShaderResourceBindings *srb,
229 int dynamicOffsetCount,
230 const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) override;
231
232 void setVertexInput(QRhiCommandBuffer *cb,
233 int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings,
234 QRhiBuffer *indexBuf, quint32 indexOffset,
235 QRhiCommandBuffer::IndexFormat indexFormat) override;
236
237 void setViewport(QRhiCommandBuffer *cb, const QRhiViewport &viewport) override;
238 void setScissor(QRhiCommandBuffer *cb, const QRhiScissor &scissor) override;
239 void setBlendConstants(QRhiCommandBuffer *cb, const QColor &c) override;
240 void setStencilRef(QRhiCommandBuffer *cb, quint32 refValue) override;
241
242 void draw(QRhiCommandBuffer *cb, quint32 vertexCount,
243 quint32 instanceCount, quint32 firstVertex, quint32 firstInstance) override;
244
245 void drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount,
246 quint32 instanceCount, quint32 firstIndex,
247 qint32 vertexOffset, quint32 firstInstance) override;
248
249 void debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name) override;
250 void debugMarkEnd(QRhiCommandBuffer *cb) override;
251 void debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg) override;
252
253 void beginComputePass(QRhiCommandBuffer *cb,
254 QRhiResourceUpdateBatch *resourceUpdates,
255 QRhiCommandBuffer::BeginPassFlags flags) override;
256 void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override;
257 void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) override;
258 void dispatch(QRhiCommandBuffer *cb, int x, int y, int z) override;
259
260 const QRhiNativeHandles *nativeHandles(QRhiCommandBuffer *cb) override;
261 void beginExternal(QRhiCommandBuffer *cb) override;
262 void endExternal(QRhiCommandBuffer *cb) override;
263 double lastCompletedGpuTime(QRhiCommandBuffer *cb) override;
264
265 QList<int> supportedSampleCounts() const override;
266 int ubufAlignment() const override;
267 bool isYUpInFramebuffer() const override;
268 bool isYUpInNDC() const override;
269 bool isClipDepthZeroToOne() const override;
270 QMatrix4x4 clipSpaceCorrMatrix() const override;
271 bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags) const override;
272 bool isFeatureSupported(QRhi::Feature feature) const override;
273 int resourceLimit(QRhi::ResourceLimit limit) const override;
274 const QRhiNativeHandles *nativeHandles() override;
275 QRhiDriverInfo driverInfo() const override;
276 QRhiStats statistics() override;
277 bool makeThreadLocalNativeContextCurrent() override;
278 void releaseCachedResources() override;
279 bool isDeviceLost() const override;
280
281 QByteArray pipelineCacheData() override;
282 void setPipelineCacheData(const QByteArray &data) override;
283
284 void simulateTextureUpload(const QRhiResourceUpdateBatchPrivate::TextureOp &u);
285 void simulateTextureCopy(const QRhiResourceUpdateBatchPrivate::TextureOp &u);
286 void simulateTextureGenMips(const QRhiResourceUpdateBatchPrivate::TextureOp &u);
287
288 QRhiNullNativeHandles nativeHandlesStruct;
289 QRhiSwapChain *currentSwapChain = nullptr;
290 QNullCommandBuffer offscreenCommandBuffer;
291};
292
293QT_END_NAMESPACE
294
295#endif
296

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