Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qrhinull.cpp
Go to the documentation of this file.
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// Qt-Security score:significant reason:default
4
5#include "qrhinull_p.h"
6#include <qmath.h>
7#include <QPainter>
8
10
11/*!
12 \class QRhiNullInitParams
13 \inmodule QtGuiPrivate
14 \inheaderfile rhi/qrhi.h
15 \since 6.6
16 \brief Null backend specific initialization parameters.
17
18 \note This is a RHI API with limited compatibility guarantees, see \l QRhi
19 for details.
20
21 A Null QRhi needs no special parameters for initialization.
22
23 \badcode
24 QRhiNullInitParams params;
25 rhi = QRhi::create(QRhi::Null, &params);
26 \endcode
27
28 The Null backend does not issue any graphics calls and creates no
29 resources. All QRhi operations will succeed as normal so applications can
30 still be run, albeit potentially at an unthrottled speed, depending on
31 their frame rendering strategy.
32 */
33
34/*!
35 \class QRhiNullNativeHandles
36 \inmodule QtGuiPrivate
37 \inheaderfile rhi/qrhi.h
38 \since 6.6
39 \brief Empty.
40
41 \note This is a RHI API with limited compatibility guarantees, see \l QRhi
42 for details.
43 */
44
45QRhiNull::QRhiNull(QRhiNullInitParams *params)
46 : offscreenCommandBuffer(this)
47{
48 Q_UNUSED(params);
49}
50
51bool QRhiNull::create(QRhi::Flags flags)
52{
53 Q_UNUSED(flags);
54 return true;
55}
56
58{
59}
60
62{
63 return { 1 };
64}
65
66QList<QSize> QRhiNull::supportedShadingRates(int sampleCount) const
67{
68 Q_UNUSED(sampleCount);
69 return { QSize(1, 1) };
70}
71
72QRhiSwapChain *QRhiNull::createSwapChain()
73{
74 return new QNullSwapChain(this);
75}
76
77QRhiBuffer *QRhiNull::createBuffer(QRhiBuffer::Type type, QRhiBuffer::UsageFlags usage, quint32 size)
78{
79 return new QNullBuffer(this, type, usage, size);
80}
81
83{
84 return 256;
85}
86
88{
89 return false;
90}
91
92bool QRhiNull::isYUpInNDC() const
93{
94 return true;
95}
96
98{
99 return true;
100}
101
103{
104 return QMatrix4x4(); // identity
105}
106
107bool QRhiNull::isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags) const
108{
109 Q_UNUSED(format);
110 Q_UNUSED(flags);
111 return true;
112}
113
114bool QRhiNull::isFeatureSupported(QRhi::Feature feature) const
115{
116 Q_UNUSED(feature);
117 return true;
118}
119
120int QRhiNull::resourceLimit(QRhi::ResourceLimit limit) const
121{
122 switch (limit) {
123 case QRhi::TextureSizeMin:
124 return 1;
125 case QRhi::TextureSizeMax:
126 return 16384;
127 case QRhi::MaxColorAttachments:
128 return 8;
129 case QRhi::FramesInFlight:
130 return 1;
131 case QRhi::MaxAsyncReadbackFrames:
132 return 1;
133 case QRhi::MaxThreadGroupsPerDimension:
134 return 0;
135 case QRhi::MaxThreadsPerThreadGroup:
136 return 0;
137 case QRhi::MaxThreadGroupX:
138 return 0;
139 case QRhi::MaxThreadGroupY:
140 return 0;
141 case QRhi::MaxThreadGroupZ:
142 return 0;
143 case QRhi::TextureArraySizeMax:
144 return 2048;
145 case QRhi::MaxUniformBufferRange:
146 return 65536;
147 case QRhi::MaxVertexInputs:
148 return 32;
149 case QRhi::MaxVertexOutputs:
150 return 32;
151 case QRhi::ShadingRateImageTileSize:
152 return 0;
153 }
154
155 Q_UNREACHABLE_RETURN(0);
156}
157
159{
160 return &nativeHandlesStruct;
161}
162
164{
165 QRhiDriverInfo info;
166 info.deviceName = QByteArrayLiteral("Null");
167 return info;
168}
169
171{
172 return {};
173}
174
176{
177 // not applicable
178 return false;
179}
180
181void QRhiNull::setQueueSubmitParams(QRhiNativeHandles *)
182{
183 // not applicable
184}
185
187{
188 // nothing to do here
189}
190
192{
193 return false;
194}
195
197{
198 return QByteArray();
199}
200
201void QRhiNull::setPipelineCacheData(const QByteArray &data)
202{
203 Q_UNUSED(data);
204}
205
206QRhiRenderBuffer *QRhiNull::createRenderBuffer(QRhiRenderBuffer::Type type, const QSize &pixelSize,
207 int sampleCount, QRhiRenderBuffer::Flags flags,
208 QRhiTexture::Format backingFormatHint)
209{
210 return new QNullRenderBuffer(this, type, pixelSize, sampleCount, flags, backingFormatHint);
211}
212
213QRhiTexture *QRhiNull::createTexture(QRhiTexture::Format format,
214 const QSize &pixelSize, int depth, int arraySize,
215 int sampleCount, QRhiTexture::Flags flags)
216{
217 return new QNullTexture(this, format, pixelSize, depth, arraySize, sampleCount, flags);
218}
219
220QRhiSampler *QRhiNull::createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter,
221 QRhiSampler::Filter mipmapMode,
222 QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w)
223{
224 return new QNullSampler(this, magFilter, minFilter, mipmapMode, u, v, w);
225}
226
227QRhiTextureRenderTarget *QRhiNull::createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc,
228 QRhiTextureRenderTarget::Flags flags)
229{
230 return new QNullTextureRenderTarget(this, desc, flags);
231}
232
233QRhiShadingRateMap *QRhiNull::createShadingRateMap()
234{
235 return nullptr;
236}
237
239{
240 return new QNullGraphicsPipeline(this);
241}
242
244{
245 return new QNullComputePipeline(this);
246}
247
249{
250 return new QNullShaderResourceBindings(this);
251}
252
253void QRhiNull::setGraphicsPipeline(QRhiCommandBuffer *cb, QRhiGraphicsPipeline *ps)
254{
255 Q_UNUSED(cb);
256 Q_UNUSED(ps);
257}
258
259void QRhiNull::setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBindings *srb,
260 int dynamicOffsetCount,
261 const QRhiCommandBuffer::DynamicOffset *dynamicOffsets)
262{
263 Q_UNUSED(cb);
264 Q_UNUSED(srb);
265 Q_UNUSED(dynamicOffsetCount);
266 Q_UNUSED(dynamicOffsets);
267}
268
269void QRhiNull::setVertexInput(QRhiCommandBuffer *cb,
270 int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings,
271 QRhiBuffer *indexBuf, quint32 indexOffset, QRhiCommandBuffer::IndexFormat indexFormat)
272{
273 Q_UNUSED(cb);
274 Q_UNUSED(startBinding);
275 Q_UNUSED(bindingCount);
276 Q_UNUSED(bindings);
277 Q_UNUSED(indexBuf);
278 Q_UNUSED(indexOffset);
279 Q_UNUSED(indexFormat);
280}
281
282void QRhiNull::setViewport(QRhiCommandBuffer *cb, const QRhiViewport &viewport)
283{
284 Q_UNUSED(cb);
285 Q_UNUSED(viewport);
286}
287
288void QRhiNull::setScissor(QRhiCommandBuffer *cb, const QRhiScissor &scissor)
289{
290 Q_UNUSED(cb);
291 Q_UNUSED(scissor);
292}
293
294void QRhiNull::setBlendConstants(QRhiCommandBuffer *cb, const QColor &c)
295{
296 Q_UNUSED(cb);
297 Q_UNUSED(c);
298}
299
300void QRhiNull::setStencilRef(QRhiCommandBuffer *cb, quint32 refValue)
301{
302 Q_UNUSED(cb);
303 Q_UNUSED(refValue);
304}
305
306void QRhiNull::setShadingRate(QRhiCommandBuffer *cb, const QSize &coarsePixelSize)
307{
308 Q_UNUSED(cb);
309 Q_UNUSED(coarsePixelSize);
310}
311
312void QRhiNull::draw(QRhiCommandBuffer *cb, quint32 vertexCount,
313 quint32 instanceCount, quint32 firstVertex, quint32 firstInstance)
314{
315 Q_UNUSED(cb);
316 Q_UNUSED(vertexCount);
317 Q_UNUSED(instanceCount);
318 Q_UNUSED(firstVertex);
319 Q_UNUSED(firstInstance);
320}
321
322void QRhiNull::drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount,
323 quint32 instanceCount, quint32 firstIndex, qint32 vertexOffset, quint32 firstInstance)
324{
325 Q_UNUSED(cb);
326 Q_UNUSED(indexCount);
327 Q_UNUSED(instanceCount);
328 Q_UNUSED(firstIndex);
329 Q_UNUSED(vertexOffset);
330 Q_UNUSED(firstInstance);
331}
332
333void QRhiNull::drawIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
334 quint32 indirectBufferOffset, quint32 drawCount, quint32 stride)
335{
336 Q_UNUSED(cb);
337 Q_UNUSED(indirectBuffer);
338 Q_UNUSED(indirectBufferOffset);
339 Q_UNUSED(drawCount);
340 Q_UNUSED(stride);
341}
342
343void QRhiNull::drawIndexedIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer,
344 quint32 indirectBufferOffset, quint32 drawCount, quint32 stride)
345{
346 Q_UNUSED(cb);
347 Q_UNUSED(indirectBuffer);
348 Q_UNUSED(indirectBufferOffset);
349 Q_UNUSED(drawCount);
350 Q_UNUSED(stride);
351}
352
353void QRhiNull::debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name)
354{
355 Q_UNUSED(cb);
356 Q_UNUSED(name);
357}
358
359void QRhiNull::debugMarkEnd(QRhiCommandBuffer *cb)
360{
361 Q_UNUSED(cb);
362}
363
364void QRhiNull::debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg)
365{
366 Q_UNUSED(cb);
367 Q_UNUSED(msg);
368}
369
370void QRhiNull::setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps)
371{
372 Q_UNUSED(cb);
373 Q_UNUSED(ps);
374}
375
376void QRhiNull::dispatch(QRhiCommandBuffer *cb, int x, int y, int z)
377{
378 Q_UNUSED(cb);
379 Q_UNUSED(x);
380 Q_UNUSED(y);
381 Q_UNUSED(z);
382}
383
384const QRhiNativeHandles *QRhiNull::nativeHandles(QRhiCommandBuffer *cb)
385{
386 Q_UNUSED(cb);
387 return nullptr;
388}
389
390void QRhiNull::beginExternal(QRhiCommandBuffer *cb)
391{
392 Q_UNUSED(cb);
393}
394
395void QRhiNull::endExternal(QRhiCommandBuffer *cb)
396{
397 Q_UNUSED(cb);
398}
399
400double QRhiNull::lastCompletedGpuTime(QRhiCommandBuffer *cb)
401{
402 Q_UNUSED(cb);
403 return 0;
404}
405
406QRhi::FrameOpResult QRhiNull::beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags)
407{
408 Q_UNUSED(flags);
409 currentSwapChain = swapChain;
410 return QRhi::FrameOpSuccess;
411}
412
413QRhi::FrameOpResult QRhiNull::endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags)
414{
415 Q_UNUSED(flags);
416 QNullSwapChain *swapChainD = QRHI_RES(QNullSwapChain, swapChain);
417 swapChainD->frameCount += 1;
418 currentSwapChain = nullptr;
419 return QRhi::FrameOpSuccess;
420}
421
422QRhi::FrameOpResult QRhiNull::beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags)
423{
424 Q_UNUSED(flags);
425 *cb = &offscreenCommandBuffer;
426 return QRhi::FrameOpSuccess;
427}
428
429QRhi::FrameOpResult QRhiNull::endOffscreenFrame(QRhi::EndFrameFlags flags)
430{
431 Q_UNUSED(flags);
432 return QRhi::FrameOpSuccess;
433}
434
436{
437 return QRhi::FrameOpSuccess;
438}
439
441{
442 QNullTexture *texD = QRHI_RES(QNullTexture, u.dst);
443 for (int layer = 0, maxLayer = u.subresDesc.size(); layer < maxLayer; ++layer) {
444 for (int level = 0; level < QRhi::MAX_MIP_LEVELS; ++level) {
445 for (const QRhiTextureSubresourceUploadDescription &subresDesc : std::as_const(u.subresDesc[layer][level])) {
446 if (!subresDesc.image().isNull()) {
447 const QImage src = subresDesc.image();
448 QPainter painter(&texD->image[layer][level]);
449 const QSize srcSize = subresDesc.sourceSize().isEmpty()
450 ? src.size() : subresDesc.sourceSize();
451 painter.setCompositionMode(QPainter::CompositionMode_Source);
452 painter.drawImage(subresDesc.destinationTopLeft(), src,
453 QRect(subresDesc.sourceTopLeft(), srcSize));
454 } else if (!subresDesc.data().isEmpty()) {
455 const QSize subresSize = q->sizeForMipLevel(level, texD->pixelSize());
456 int w = subresSize.width();
457 int h = subresSize.height();
458 if (!subresDesc.sourceSize().isEmpty()) {
459 w = subresDesc.sourceSize().width();
460 h = subresDesc.sourceSize().height();
461 }
462 // sourceTopLeft is not supported on this path as per QRhi docs
463 const char *src = subresDesc.data().constData();
464 const int srcBpl = w * 4;
465 int srcStride = srcBpl;
466 if (subresDesc.dataStride())
467 srcStride = subresDesc.dataStride();
468 const QPoint dstOffset = subresDesc.destinationTopLeft();
469 uchar *dst = texD->image[layer][level].bits();
470 const int dstBpl = texD->image[layer][level].bytesPerLine();
471 for (int y = 0; y < h; ++y) {
472 memcpy(dst + dstOffset.x() * 4 + (y + dstOffset.y()) * dstBpl,
473 src + y * srcStride,
474 size_t(srcBpl));
475 }
476 }
477 }
478 }
479 }
480}
481
483{
484 QNullTexture *srcD = QRHI_RES(QNullTexture, u.src);
485 QNullTexture *dstD = QRHI_RES(QNullTexture, u.dst);
486 const QImage &srcImage(srcD->image[u.desc.sourceLayer()][u.desc.sourceLevel()]);
487 QImage &dstImage(dstD->image[u.desc.destinationLayer()][u.desc.destinationLevel()]);
488 const QPoint dstPos = u.desc.destinationTopLeft();
489 const QSize size = u.desc.pixelSize().isEmpty() ? srcD->pixelSize() : u.desc.pixelSize();
490 const QPoint srcPos = u.desc.sourceTopLeft();
491
492 QPainter painter(&dstImage);
493 painter.setCompositionMode(QPainter::CompositionMode_Source);
494 painter.drawImage(QRect(dstPos, size), srcImage, QRect(srcPos, size));
495}
496
498{
499 QNullTexture *texD = QRHI_RES(QNullTexture, u.dst);
500 const QSize baseSize = texD->pixelSize();
501 const int levelCount = q->mipLevelsForSize(baseSize);
502 for (int level = 1; level < levelCount; ++level)
503 texD->image[0][level] = texD->image[0][0].scaled(q->sizeForMipLevel(level, baseSize));
504}
505
506void QRhiNull::resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
507{
508 Q_UNUSED(cb);
510 for (int opIdx = 0; opIdx < ud->activeBufferOpCount; ++opIdx) {
511 const QRhiResourceUpdateBatchPrivate::BufferOp &u(ud->bufferOps[opIdx]);
514 {
515 QNullBuffer *bufD = QRHI_RES(QNullBuffer, u.buf);
516 memcpy(bufD->data + u.offset, u.data.constData(), size_t(u.data.size()));
518 QRhiReadbackResult *result = u.result;
519 result->data.resize(u.readSize);
520 QNullBuffer *bufD = QRHI_RES(QNullBuffer, u.buf);
521 memcpy(result->data.data(), bufD->data + u.offset, size_t(u.readSize));
522 if (result->completed)
523 result->completed();
524 }
525 }
526 for (int opIdx = 0; opIdx < ud->activeTextureOpCount; ++opIdx) {
527 const QRhiResourceUpdateBatchPrivate::TextureOp &u(ud->textureOps[opIdx]);
529 if (u.dst->format() == QRhiTexture::RGBA8)
532 if (u.src->format() == QRhiTexture::RGBA8 && u.dst->format() == QRhiTexture::RGBA8)
535 QRhiReadbackResult *result = u.result;
536 QNullTexture *texD = QRHI_RES(QNullTexture, u.rb.texture());
537 if (texD) {
538 result->format = texD->format();
539 if (u.rb.rect().isValid())
540 result->pixelSize = u.rb.rect().size();
541 else
542 result->pixelSize = q->sizeForMipLevel(u.rb.level(), texD->pixelSize());
543 } else {
544 Q_ASSERT(currentSwapChain);
545 result->format = QRhiTexture::RGBA8;
546 if (u.rb.rect().isValid())
547 result->pixelSize = u.rb.rect().size();
548 else
549 result->pixelSize = currentSwapChain->currentPixelSize();
550 }
551 quint32 bytesPerLine = 0;
552 quint32 byteSize = 0;
553 textureFormatInfo(result->format, result->pixelSize, &bytesPerLine, &byteSize, nullptr);
554 if (texD && texD->format() == QRhiTexture::RGBA8) {
555 result->data.resize(int(byteSize));
556 const QImage &src(texD->image[u.rb.layer()][u.rb.level()]);
557 char *dst = result->data.data();
558 for (int y = 0, h = src.height(); y < h; ++y) {
559 memcpy(dst, src.constScanLine(y), bytesPerLine);
560 dst += bytesPerLine;
561 }
562 } else {
563 result->data.fill(0, int(byteSize));
564 }
565 if (result->completed)
566 result->completed();
568 if (u.dst->format() == QRhiTexture::RGBA8)
570 }
571 }
572 ud->free();
573}
574
575void QRhiNull::beginPass(QRhiCommandBuffer *cb,
576 QRhiRenderTarget *rt,
577 const QColor &colorClearValue,
578 const QRhiDepthStencilClearValue &depthStencilClearValue,
579 QRhiResourceUpdateBatch *resourceUpdates,
580 QRhiCommandBuffer::BeginPassFlags flags)
581{
582 Q_UNUSED(colorClearValue);
583 Q_UNUSED(depthStencilClearValue);
584 Q_UNUSED(flags);
585
586 if (resourceUpdates)
587 resourceUpdate(cb, resourceUpdates);
588
589 if (rt->resourceType() == QRhiRenderTarget::TextureRenderTarget) {
591 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(rtTex->description(), rtTex->d.currentResIdList))
592 rtTex->create();
593 }
594}
595
596void QRhiNull::endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
597{
598 if (resourceUpdates)
599 resourceUpdate(cb, resourceUpdates);
600}
601
602void QRhiNull::beginComputePass(QRhiCommandBuffer *cb,
603 QRhiResourceUpdateBatch *resourceUpdates,
604 QRhiCommandBuffer::BeginPassFlags flags)
605{
606 Q_UNUSED(flags);
607 if (resourceUpdates)
608 resourceUpdate(cb, resourceUpdates);
609}
610
611void QRhiNull::endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
612{
613 if (resourceUpdates)
614 resourceUpdate(cb, resourceUpdates);
615}
616
617QNullBuffer::QNullBuffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size)
619{
620}
621
626
628{
629 delete[] data;
630 data = nullptr;
631
632 QRHI_RES_RHI(QRhiNull);
633 if (rhiD)
634 rhiD->unregisterResource(this);
635}
636
638{
639 if (data)
640 destroy();
641
642 data = new char[m_size];
643 memset(data, 0, m_size);
644
645 QRHI_RES_RHI(QRhiNull);
646 rhiD->registerResource(this);
647
648 return true;
649}
650
652{
653 Q_ASSERT(m_type == Dynamic);
654 return data;
655}
656
657QNullRenderBuffer::QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize,
658 int sampleCount, QRhiRenderBuffer::Flags flags,
659 QRhiTexture::Format backingFormatHint)
661{
662}
663
668
670{
671 valid = false;
672
673 QRHI_RES_RHI(QRhiNull);
674 if (rhiD)
675 rhiD->unregisterResource(this);
676}
677
679{
680 if (valid)
681 destroy();
682
683 valid = true;
684 generation += 1;
685
686 QRHI_RES_RHI(QRhiNull);
687 rhiD->registerResource(this);
688
689 return true;
690}
691
693{
694 return m_type == Color ? QRhiTexture::RGBA8 : QRhiTexture::UnknownFormat;
695}
696
697QNullTexture::QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth,
698 int arraySize, int sampleCount, Flags flags)
700{
701}
702
707
709{
710 valid = false;
711
712 QRHI_RES_RHI(QRhiNull);
713 if (rhiD)
714 rhiD->unregisterResource(this);
715}
716
718{
719 if (valid)
720 destroy();
721
722 valid = true;
723
724 QRHI_RES_RHI(QRhiNull);
725 const bool isCube = m_flags.testFlag(CubeMap);
726 const bool is3D = m_flags.testFlag(ThreeDimensional);
727 const bool isArray = m_flags.testFlag(TextureArray);
728 const bool hasMipMaps = m_flags.testFlag(MipMapped);
729 const bool is1D = m_flags.testFlags(OneDimensional);
730 QSize size = is1D ? QSize(qMax(1, m_pixelSize.width()), 1)
731 : (m_pixelSize.isEmpty() ? QSize(1, 1) : m_pixelSize);
732 const int mipLevelCount = hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1;
733 const int layerCount = is3D ? qMax(1, m_depth)
734 : (isCube ? 6
735 : (isArray ? qMax(0, m_arraySize)
736 : 1));
737
738 if (m_format == RGBA8) {
739 image.resize(layerCount);
740 for (int layer = 0; layer < layerCount; ++layer) {
741 for (int level = 0; level < mipLevelCount; ++level) {
742 image[layer][level] = QImage(rhiD->q->sizeForMipLevel(level, size),
743 QImage::Format_RGBA8888_Premultiplied);
744 image[layer][level].fill(Qt::yellow);
745 }
746 }
747 }
748
749 generation += 1;
750
751 rhiD->registerResource(this);
752
753 return true;
754}
755
756bool QNullTexture::createFrom(QRhiTexture::NativeTexture src)
757{
758 Q_UNUSED(src);
759 if (valid)
760 destroy();
761
762 valid = true;
763
764 generation += 1;
765
766 QRHI_RES_RHI(QRhiNull);
767 rhiD->registerResource(this);
768
769 return true;
770}
771
772QNullSampler::QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
773 AddressMode u, AddressMode v, AddressMode w)
775{
776}
777
782
784{
785 QRHI_RES_RHI(QRhiNull);
786 if (rhiD)
787 rhiD->unregisterResource(this);
788}
789
791{
792 QRHI_RES_RHI(QRhiNull);
793 rhiD->registerResource(this);
794 return true;
795}
796
801
806
808{
809 QRHI_RES_RHI(QRhiNull);
810 if (rhiD)
811 rhiD->unregisterResource(this);
812}
813
814bool QNullRenderPassDescriptor::isCompatible(const QRhiRenderPassDescriptor *other) const
815{
816 Q_UNUSED(other);
817 return true;
818}
819
821{
822 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
823 QRHI_RES_RHI(QRhiNull);
824 rhiD->registerResource(rpD, false);
825 return rpD;
826}
827
832
833QNullSwapChainRenderTarget::QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
835 d(rhi)
836{
837}
838
843
847
849{
850 return d.pixelSize;
851}
852
854{
855 return d.dpr;
856}
857
859{
860 return 1;
861}
862
864 const QRhiTextureRenderTargetDescription &desc,
865 Flags flags)
867 d(rhi)
868{
869}
870
875
877{
878 QRHI_RES_RHI(QRhiNull);
879 if (rhiD)
880 rhiD->unregisterResource(this);
881}
882
884{
885 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
886 QRHI_RES_RHI(QRhiNull);
887 rhiD->registerResource(rpD, false);
888 return rpD;
889}
890
892{
893 QRHI_RES_RHI(QRhiNull);
894 d.rp = QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
895 if (m_desc.cbeginColorAttachments() != m_desc.cendColorAttachments()) {
896 const QRhiColorAttachment *colorAtt = m_desc.cbeginColorAttachments();
897 QRhiTexture *tex = colorAtt->texture();
898 QRhiRenderBuffer *rb = colorAtt->renderBuffer();
899 d.pixelSize = tex ? rhiD->q->sizeForMipLevel(colorAtt->level(), tex->pixelSize()) : rb->pixelSize();
900 } else if (m_desc.depthStencilBuffer()) {
901 d.pixelSize = m_desc.depthStencilBuffer()->pixelSize();
902 } else if (m_desc.depthTexture()) {
903 d.pixelSize = m_desc.depthTexture()->pixelSize();
904 }
905 QRhiRenderTargetAttachmentTracker::updateResIdList<QNullTexture, QNullRenderBuffer>(m_desc, &d.currentResIdList);
906 rhiD->registerResource(this);
907 return true;
908}
909
911{
912 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(m_desc, d.currentResIdList))
913 const_cast<QNullTextureRenderTarget *>(this)->create();
914
915 return d.pixelSize;
916}
917
919{
920 return d.dpr;
921}
922
924{
925 return 1;
926}
927
932
937
939{
940 QRHI_RES_RHI(QRhiNull);
941 if (rhiD)
942 rhiD->unregisterResource(this);
943}
944
946{
947 QRHI_RES_RHI(QRhiNull);
948 if (!rhiD->sanityCheckShaderResourceBindings(this))
949 return false;
950
951 rhiD->updateLayoutDesc(this);
952
953 rhiD->registerResource(this, false);
954 return true;
955}
956
958{
959 Q_UNUSED(flags);
960}
961
964{
965}
966
971
973{
974 QRHI_RES_RHI(QRhiNull);
975 if (rhiD)
976 rhiD->unregisterResource(this);
977}
978
980{
981 QRHI_RES_RHI(QRhiNull);
982 if (!rhiD->sanityCheckGraphicsPipeline(this))
983 return false;
984
985 rhiD->registerResource(this);
986 return true;
987}
988
991{
992}
993
998
1000{
1001 QRHI_RES_RHI(QRhiNull);
1002 if (rhiD)
1003 rhiD->unregisterResource(this);
1004}
1005
1007{
1008 QRHI_RES_RHI(QRhiNull);
1009 rhiD->registerResource(this);
1010 return true;
1011}
1012
1015{
1016}
1017
1022
1024{
1025 // nothing to do here
1026}
1027
1028QNullSwapChain::QNullSwapChain(QRhiImplementation *rhi)
1029 : QRhiSwapChain(rhi),
1030 rt(rhi, this),
1031 cb(rhi)
1032{
1033}
1034
1039
1041{
1042 QRHI_RES_RHI(QRhiNull);
1043 if (rhiD)
1044 rhiD->unregisterResource(this);
1045}
1046
1048{
1049 return &cb;
1050}
1051
1056
1058{
1059 return QSize(1280, 720);
1060}
1061
1063{
1064 return f == SDR;
1065}
1066
1068{
1069 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
1070 QRHI_RES_RHI(QRhiNull);
1071 rhiD->registerResource(rpD, false);
1072 return rpD;
1073}
1074
1076{
1077 const bool needsRegistration = !window || window != m_window;
1078 if (window && window != m_window)
1079 destroy();
1080
1081 window = m_window;
1082 m_currentPixelSize = surfacePixelSize();
1083 rt.setRenderPassDescriptor(m_renderPassDesc); // for the public getter in QRhiRenderTarget
1084 rt.d.rp = QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
1085 rt.d.pixelSize = m_currentPixelSize;
1086 frameCount = 0;
1087
1088 if (needsRegistration) {
1089 QRHI_RES_RHI(QRhiNull);
1090 rhiD->registerResource(this);
1091 }
1092
1093 return true;
1094}
1095
1096QT_END_NAMESPACE
const char * constData() const
Definition qrhi_p.h:372
void setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBindings *srb, int dynamicOffsetCount, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) override
Definition qrhinull.cpp:259
double lastCompletedGpuTime(QRhiCommandBuffer *cb) override
Definition qrhinull.cpp:400
QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) override
Definition qrhinull.cpp:429
bool isFeatureSupported(QRhi::Feature feature) const override
Definition qrhinull.cpp:114
void debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg) override
Definition qrhinull.cpp:364
void dispatch(QRhiCommandBuffer *cb, int x, int y, int z) override
Definition qrhinull.cpp:376
QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) override
Definition qrhinull.cpp:406
void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:506
void drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount, quint32 instanceCount, quint32 firstIndex, qint32 vertexOffset, quint32 firstInstance) override
Definition qrhinull.cpp:322
void beginComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
Definition qrhinull.cpp:602
void beginPass(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
Definition qrhinull.cpp:575
bool isClipDepthZeroToOne() const override
Definition qrhinull.cpp:97
void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:611
void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:596
QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) override
Definition qrhinull.cpp:413
QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) override
Definition qrhinull.cpp:422
bool isYUpInNDC() const override
Definition qrhinull.cpp:92
QRhiDriverInfo driverInfo() const override
Definition qrhinull.cpp:163
void setScissor(QRhiCommandBuffer *cb, const QRhiScissor &scissor) override
Definition qrhinull.cpp:288
void simulateTextureUpload(const QRhiResourceUpdateBatchPrivate::TextureOp &u)
Definition qrhinull.cpp:440
QRhiComputePipeline * createComputePipeline() override
Definition qrhinull.cpp:243
void setPipelineCacheData(const QByteArray &data) override
Definition qrhinull.cpp:201
void setVertexInput(QRhiCommandBuffer *cb, int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf, quint32 indexOffset, QRhiCommandBuffer::IndexFormat indexFormat) override
Definition qrhinull.cpp:269
void debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name) override
Definition qrhinull.cpp:353
void draw(QRhiCommandBuffer *cb, quint32 vertexCount, quint32 instanceCount, quint32 firstVertex, quint32 firstInstance) override
Definition qrhinull.cpp:312
QByteArray pipelineCacheData() override
Definition qrhinull.cpp:196
void destroy() override
Definition qrhinull.cpp:57
const QRhiNativeHandles * nativeHandles() override
Definition qrhinull.cpp:158
void setGraphicsPipeline(QRhiCommandBuffer *cb, QRhiGraphicsPipeline *ps) override
Definition qrhinull.cpp:253
void releaseCachedResources() override
Definition qrhinull.cpp:186
void simulateTextureCopy(const QRhiResourceUpdateBatchPrivate::TextureOp &u)
Definition qrhinull.cpp:482
QRhiTexture * createTexture(QRhiTexture::Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, QRhiTexture::Flags flags) override
Definition qrhinull.cpp:213
QList< QSize > supportedShadingRates(int sampleCount) const override
Definition qrhinull.cpp:66
void simulateTextureGenMips(const QRhiResourceUpdateBatchPrivate::TextureOp &u)
Definition qrhinull.cpp:497
void setShadingRate(QRhiCommandBuffer *cb, const QSize &coarsePixelSize) override
Definition qrhinull.cpp:306
bool makeThreadLocalNativeContextCurrent() override
Definition qrhinull.cpp:175
void drawIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride) override
Definition qrhinull.cpp:333
const QRhiNativeHandles * nativeHandles(QRhiCommandBuffer *cb) override
Definition qrhinull.cpp:384
bool isYUpInFramebuffer() const override
Definition qrhinull.cpp:87
QRhi::FrameOpResult finish() override
Definition qrhinull.cpp:435
void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) override
Definition qrhinull.cpp:370
QRhiStats statistics() override
Definition qrhinull.cpp:170
QRhiShadingRateMap * createShadingRateMap() override
Definition qrhinull.cpp:233
void beginExternal(QRhiCommandBuffer *cb) override
Definition qrhinull.cpp:390
QRhiSwapChain * createSwapChain() override
Definition qrhinull.cpp:72
void setViewport(QRhiCommandBuffer *cb, const QRhiViewport &viewport) override
Definition qrhinull.cpp:282
QRhiTextureRenderTarget * createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget::Flags flags) override
Definition qrhinull.cpp:227
QRhiGraphicsPipeline * createGraphicsPipeline() override
Definition qrhinull.cpp:238
bool create(QRhi::Flags flags) override
Definition qrhinull.cpp:51
void setStencilRef(QRhiCommandBuffer *cb, quint32 refValue) override
Definition qrhinull.cpp:300
void debugMarkEnd(QRhiCommandBuffer *cb) override
Definition qrhinull.cpp:359
QList< int > supportedSampleCounts() const override
Definition qrhinull.cpp:61
QMatrix4x4 clipSpaceCorrMatrix() const override
Definition qrhinull.cpp:102
QRhiSampler * createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler::Filter mipmapMode, QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w) override
Definition qrhinull.cpp:220
void drawIndexedIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride) override
Definition qrhinull.cpp:343
QRhiSwapChain * currentSwapChain
Definition qrhinull_p.h:301
int ubufAlignment() const override
Definition qrhinull.cpp:82
bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags) const override
Definition qrhinull.cpp:107
int resourceLimit(QRhi::ResourceLimit limit) const override
Definition qrhinull.cpp:120
QRhiShaderResourceBindings * createShaderResourceBindings() override
Definition qrhinull.cpp:248
void setBlendConstants(QRhiCommandBuffer *cb, const QColor &c) override
Definition qrhinull.cpp:294
void endExternal(QRhiCommandBuffer *cb) override
Definition qrhinull.cpp:395
bool isDeviceLost() const override
Definition qrhinull.cpp:191
static QRhiResourceUpdateBatchPrivate * get(QRhiResourceUpdateBatch *b)
Definition qrhi_p.h:597
Combined button and popup list for selecting options.
#define QRHI_RES_RHI(t)
Definition qrhi_p.h:31
#define QRHI_RES(t, x)
Definition qrhi_p.h:30
char * data
Definition qrhinull_p.h:31
QNullBuffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size)
Definition qrhinull.cpp:617
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:637
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:627
char * beginFullDynamicBufferUpdateForCurrentFrame() override
Definition qrhinull.cpp:651
QNullCommandBuffer(QRhiImplementation *rhi)
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:999
bool create() override
QNullComputePipeline(QRhiImplementation *rhi)
Definition qrhinull.cpp:989
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:972
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:979
QNullGraphicsPipeline(QRhiImplementation *rhi)
Definition qrhinull.cpp:962
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:669
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:678
QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize, int sampleCount, QRhiRenderBuffer::Flags flags, QRhiTexture::Format backingFormatHint)
Definition qrhinull.cpp:657
QRhiTexture::Format backingFormat() const override
Definition qrhinull.cpp:692
QNullRenderPassDescriptor(QRhiImplementation *rhi)
Definition qrhinull.cpp:797
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() const override
Definition qrhinull.cpp:820
QVector< quint32 > serializedFormat() const override
Definition qrhinull.cpp:828
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:807
bool isCompatible(const QRhiRenderPassDescriptor *other) const override
Definition qrhinull.cpp:814
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:783
QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, AddressMode u, AddressMode v, AddressMode w)
Definition qrhinull.cpp:772
bool create() override
Definition qrhinull.cpp:790
QNullShaderResourceBindings(QRhiImplementation *rhi)
Definition qrhinull.cpp:928
bool create() override
Creates the corresponding resource binding set.
Definition qrhinull.cpp:945
void updateResources(UpdateFlags flags) override
Definition qrhinull.cpp:957
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:938
QSize pixelSize() const override
Definition qrhinull.cpp:848
float devicePixelRatio() const override
Definition qrhinull.cpp:853
QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
Definition qrhinull.cpp:833
int sampleCount() const override
Definition qrhinull.cpp:858
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:844
bool createOrResize() override
Creates the swapchain if not already done and resizes the swapchain buffers to match the current size...
QSize surfacePixelSize() override
bool isFormatSupported(Format f) override
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
QRhiCommandBuffer * currentFrameCommandBuffer() override
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() override
QRhiRenderTarget * currentFrameRenderTarget() override
QNullSwapChain(QRhiImplementation *rhi)
QSize pixelSize() const override
Definition qrhinull.cpp:910
int sampleCount() const override
Definition qrhinull.cpp:923
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:876
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() override
Definition qrhinull.cpp:883
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:891
QNullTextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags)
Definition qrhinull.cpp:863
float devicePixelRatio() const override
Definition qrhinull.cpp:918
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:717
bool createFrom(NativeTexture src) override
Similar to create(), except that no new native textures are created.
Definition qrhinull.cpp:756
QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, Flags flags)
Definition qrhinull.cpp:697
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:708
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
Definition qrhi.h:1844