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::debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name)
334{
335 Q_UNUSED(cb);
336 Q_UNUSED(name);
337}
338
339void QRhiNull::debugMarkEnd(QRhiCommandBuffer *cb)
340{
341 Q_UNUSED(cb);
342}
343
344void QRhiNull::debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg)
345{
346 Q_UNUSED(cb);
347 Q_UNUSED(msg);
348}
349
350void QRhiNull::setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps)
351{
352 Q_UNUSED(cb);
353 Q_UNUSED(ps);
354}
355
356void QRhiNull::dispatch(QRhiCommandBuffer *cb, int x, int y, int z)
357{
358 Q_UNUSED(cb);
359 Q_UNUSED(x);
360 Q_UNUSED(y);
361 Q_UNUSED(z);
362}
363
364const QRhiNativeHandles *QRhiNull::nativeHandles(QRhiCommandBuffer *cb)
365{
366 Q_UNUSED(cb);
367 return nullptr;
368}
369
370void QRhiNull::beginExternal(QRhiCommandBuffer *cb)
371{
372 Q_UNUSED(cb);
373}
374
375void QRhiNull::endExternal(QRhiCommandBuffer *cb)
376{
377 Q_UNUSED(cb);
378}
379
380double QRhiNull::lastCompletedGpuTime(QRhiCommandBuffer *cb)
381{
382 Q_UNUSED(cb);
383 return 0;
384}
385
386QRhi::FrameOpResult QRhiNull::beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags)
387{
388 Q_UNUSED(flags);
389 currentSwapChain = swapChain;
390 return QRhi::FrameOpSuccess;
391}
392
393QRhi::FrameOpResult QRhiNull::endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags)
394{
395 Q_UNUSED(flags);
396 QNullSwapChain *swapChainD = QRHI_RES(QNullSwapChain, swapChain);
397 swapChainD->frameCount += 1;
398 currentSwapChain = nullptr;
399 return QRhi::FrameOpSuccess;
400}
401
402QRhi::FrameOpResult QRhiNull::beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags)
403{
404 Q_UNUSED(flags);
405 *cb = &offscreenCommandBuffer;
406 return QRhi::FrameOpSuccess;
407}
408
409QRhi::FrameOpResult QRhiNull::endOffscreenFrame(QRhi::EndFrameFlags flags)
410{
411 Q_UNUSED(flags);
412 return QRhi::FrameOpSuccess;
413}
414
416{
417 return QRhi::FrameOpSuccess;
418}
419
421{
422 QNullTexture *texD = QRHI_RES(QNullTexture, u.dst);
423 for (int layer = 0, maxLayer = u.subresDesc.size(); layer < maxLayer; ++layer) {
424 for (int level = 0; level < QRhi::MAX_MIP_LEVELS; ++level) {
425 for (const QRhiTextureSubresourceUploadDescription &subresDesc : std::as_const(u.subresDesc[layer][level])) {
426 if (!subresDesc.image().isNull()) {
427 const QImage src = subresDesc.image();
428 QPainter painter(&texD->image[layer][level]);
429 const QSize srcSize = subresDesc.sourceSize().isEmpty()
430 ? src.size() : subresDesc.sourceSize();
431 painter.setCompositionMode(QPainter::CompositionMode_Source);
432 painter.drawImage(subresDesc.destinationTopLeft(), src,
433 QRect(subresDesc.sourceTopLeft(), srcSize));
434 } else if (!subresDesc.data().isEmpty()) {
435 const QSize subresSize = q->sizeForMipLevel(level, texD->pixelSize());
436 int w = subresSize.width();
437 int h = subresSize.height();
438 if (!subresDesc.sourceSize().isEmpty()) {
439 w = subresDesc.sourceSize().width();
440 h = subresDesc.sourceSize().height();
441 }
442 // sourceTopLeft is not supported on this path as per QRhi docs
443 const char *src = subresDesc.data().constData();
444 const int srcBpl = w * 4;
445 int srcStride = srcBpl;
446 if (subresDesc.dataStride())
447 srcStride = subresDesc.dataStride();
448 const QPoint dstOffset = subresDesc.destinationTopLeft();
449 uchar *dst = texD->image[layer][level].bits();
450 const int dstBpl = texD->image[layer][level].bytesPerLine();
451 for (int y = 0; y < h; ++y) {
452 memcpy(dst + dstOffset.x() * 4 + (y + dstOffset.y()) * dstBpl,
453 src + y * srcStride,
454 size_t(srcBpl));
455 }
456 }
457 }
458 }
459 }
460}
461
463{
464 QNullTexture *srcD = QRHI_RES(QNullTexture, u.src);
465 QNullTexture *dstD = QRHI_RES(QNullTexture, u.dst);
466 const QImage &srcImage(srcD->image[u.desc.sourceLayer()][u.desc.sourceLevel()]);
467 QImage &dstImage(dstD->image[u.desc.destinationLayer()][u.desc.destinationLevel()]);
468 const QPoint dstPos = u.desc.destinationTopLeft();
469 const QSize size = u.desc.pixelSize().isEmpty() ? srcD->pixelSize() : u.desc.pixelSize();
470 const QPoint srcPos = u.desc.sourceTopLeft();
471
472 QPainter painter(&dstImage);
473 painter.setCompositionMode(QPainter::CompositionMode_Source);
474 painter.drawImage(QRect(dstPos, size), srcImage, QRect(srcPos, size));
475}
476
478{
479 QNullTexture *texD = QRHI_RES(QNullTexture, u.dst);
480 const QSize baseSize = texD->pixelSize();
481 const int levelCount = q->mipLevelsForSize(baseSize);
482 for (int level = 1; level < levelCount; ++level)
483 texD->image[0][level] = texD->image[0][0].scaled(q->sizeForMipLevel(level, baseSize));
484}
485
486void QRhiNull::resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
487{
488 Q_UNUSED(cb);
490 for (int opIdx = 0; opIdx < ud->activeBufferOpCount; ++opIdx) {
491 const QRhiResourceUpdateBatchPrivate::BufferOp &u(ud->bufferOps[opIdx]);
494 {
495 QNullBuffer *bufD = QRHI_RES(QNullBuffer, u.buf);
496 memcpy(bufD->data + u.offset, u.data.constData(), size_t(u.data.size()));
498 QRhiReadbackResult *result = u.result;
499 result->data.resize(u.readSize);
500 QNullBuffer *bufD = QRHI_RES(QNullBuffer, u.buf);
501 memcpy(result->data.data(), bufD->data + u.offset, size_t(u.readSize));
502 if (result->completed)
503 result->completed();
504 }
505 }
506 for (int opIdx = 0; opIdx < ud->activeTextureOpCount; ++opIdx) {
507 const QRhiResourceUpdateBatchPrivate::TextureOp &u(ud->textureOps[opIdx]);
509 if (u.dst->format() == QRhiTexture::RGBA8)
512 if (u.src->format() == QRhiTexture::RGBA8 && u.dst->format() == QRhiTexture::RGBA8)
515 QRhiReadbackResult *result = u.result;
516 QNullTexture *texD = QRHI_RES(QNullTexture, u.rb.texture());
517 if (texD) {
518 result->format = texD->format();
519 if (u.rb.rect().isValid())
520 result->pixelSize = u.rb.rect().size();
521 else
522 result->pixelSize = q->sizeForMipLevel(u.rb.level(), texD->pixelSize());
523 } else {
524 Q_ASSERT(currentSwapChain);
525 result->format = QRhiTexture::RGBA8;
526 if (u.rb.rect().isValid())
527 result->pixelSize = u.rb.rect().size();
528 else
529 result->pixelSize = currentSwapChain->currentPixelSize();
530 }
531 quint32 bytesPerLine = 0;
532 quint32 byteSize = 0;
533 textureFormatInfo(result->format, result->pixelSize, &bytesPerLine, &byteSize, nullptr);
534 if (texD && texD->format() == QRhiTexture::RGBA8) {
535 result->data.resize(int(byteSize));
536 const QImage &src(texD->image[u.rb.layer()][u.rb.level()]);
537 char *dst = result->data.data();
538 for (int y = 0, h = src.height(); y < h; ++y) {
539 memcpy(dst, src.constScanLine(y), bytesPerLine);
540 dst += bytesPerLine;
541 }
542 } else {
543 result->data.fill(0, int(byteSize));
544 }
545 if (result->completed)
546 result->completed();
548 if (u.dst->format() == QRhiTexture::RGBA8)
550 }
551 }
552 ud->free();
553}
554
555void QRhiNull::beginPass(QRhiCommandBuffer *cb,
556 QRhiRenderTarget *rt,
557 const QColor &colorClearValue,
558 const QRhiDepthStencilClearValue &depthStencilClearValue,
559 QRhiResourceUpdateBatch *resourceUpdates,
560 QRhiCommandBuffer::BeginPassFlags flags)
561{
562 Q_UNUSED(colorClearValue);
563 Q_UNUSED(depthStencilClearValue);
564 Q_UNUSED(flags);
565
566 if (resourceUpdates)
567 resourceUpdate(cb, resourceUpdates);
568
569 if (rt->resourceType() == QRhiRenderTarget::TextureRenderTarget) {
571 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(rtTex->description(), rtTex->d.currentResIdList))
572 rtTex->create();
573 }
574}
575
576void QRhiNull::endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
577{
578 if (resourceUpdates)
579 resourceUpdate(cb, resourceUpdates);
580}
581
582void QRhiNull::beginComputePass(QRhiCommandBuffer *cb,
583 QRhiResourceUpdateBatch *resourceUpdates,
584 QRhiCommandBuffer::BeginPassFlags flags)
585{
586 Q_UNUSED(flags);
587 if (resourceUpdates)
588 resourceUpdate(cb, resourceUpdates);
589}
590
591void QRhiNull::endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
592{
593 if (resourceUpdates)
594 resourceUpdate(cb, resourceUpdates);
595}
596
597QNullBuffer::QNullBuffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size)
599{
600}
601
606
608{
609 delete[] data;
610 data = nullptr;
611
612 QRHI_RES_RHI(QRhiNull);
613 if (rhiD)
614 rhiD->unregisterResource(this);
615}
616
618{
619 if (data)
620 destroy();
621
622 data = new char[m_size];
623 memset(data, 0, m_size);
624
625 QRHI_RES_RHI(QRhiNull);
626 rhiD->registerResource(this);
627
628 return true;
629}
630
632{
633 Q_ASSERT(m_type == Dynamic);
634 return data;
635}
636
637QNullRenderBuffer::QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize,
638 int sampleCount, QRhiRenderBuffer::Flags flags,
639 QRhiTexture::Format backingFormatHint)
641{
642}
643
648
650{
651 valid = false;
652
653 QRHI_RES_RHI(QRhiNull);
654 if (rhiD)
655 rhiD->unregisterResource(this);
656}
657
659{
660 if (valid)
661 destroy();
662
663 valid = true;
664 generation += 1;
665
666 QRHI_RES_RHI(QRhiNull);
667 rhiD->registerResource(this);
668
669 return true;
670}
671
673{
674 return m_type == Color ? QRhiTexture::RGBA8 : QRhiTexture::UnknownFormat;
675}
676
677QNullTexture::QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth,
678 int arraySize, int sampleCount, Flags flags)
680{
681}
682
687
689{
690 valid = false;
691
692 QRHI_RES_RHI(QRhiNull);
693 if (rhiD)
694 rhiD->unregisterResource(this);
695}
696
698{
699 if (valid)
700 destroy();
701
702 valid = true;
703
704 QRHI_RES_RHI(QRhiNull);
705 const bool isCube = m_flags.testFlag(CubeMap);
706 const bool is3D = m_flags.testFlag(ThreeDimensional);
707 const bool isArray = m_flags.testFlag(TextureArray);
708 const bool hasMipMaps = m_flags.testFlag(MipMapped);
709 const bool is1D = m_flags.testFlags(OneDimensional);
710 QSize size = is1D ? QSize(qMax(1, m_pixelSize.width()), 1)
711 : (m_pixelSize.isEmpty() ? QSize(1, 1) : m_pixelSize);
712 const int mipLevelCount = hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1;
713 const int layerCount = is3D ? qMax(1, m_depth)
714 : (isCube ? 6
715 : (isArray ? qMax(0, m_arraySize)
716 : 1));
717
718 if (m_format == RGBA8) {
719 image.resize(layerCount);
720 for (int layer = 0; layer < layerCount; ++layer) {
721 for (int level = 0; level < mipLevelCount; ++level) {
722 image[layer][level] = QImage(rhiD->q->sizeForMipLevel(level, size),
723 QImage::Format_RGBA8888_Premultiplied);
724 image[layer][level].fill(Qt::yellow);
725 }
726 }
727 }
728
729 generation += 1;
730
731 rhiD->registerResource(this);
732
733 return true;
734}
735
736bool QNullTexture::createFrom(QRhiTexture::NativeTexture src)
737{
738 Q_UNUSED(src);
739 if (valid)
740 destroy();
741
742 valid = true;
743
744 generation += 1;
745
746 QRHI_RES_RHI(QRhiNull);
747 rhiD->registerResource(this);
748
749 return true;
750}
751
752QNullSampler::QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
753 AddressMode u, AddressMode v, AddressMode w)
755{
756}
757
762
764{
765 QRHI_RES_RHI(QRhiNull);
766 if (rhiD)
767 rhiD->unregisterResource(this);
768}
769
771{
772 QRHI_RES_RHI(QRhiNull);
773 rhiD->registerResource(this);
774 return true;
775}
776
781
786
788{
789 QRHI_RES_RHI(QRhiNull);
790 if (rhiD)
791 rhiD->unregisterResource(this);
792}
793
794bool QNullRenderPassDescriptor::isCompatible(const QRhiRenderPassDescriptor *other) const
795{
796 Q_UNUSED(other);
797 return true;
798}
799
801{
802 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
803 QRHI_RES_RHI(QRhiNull);
804 rhiD->registerResource(rpD, false);
805 return rpD;
806}
807
812
813QNullSwapChainRenderTarget::QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
815 d(rhi)
816{
817}
818
823
827
829{
830 return d.pixelSize;
831}
832
834{
835 return d.dpr;
836}
837
839{
840 return 1;
841}
842
844 const QRhiTextureRenderTargetDescription &desc,
845 Flags flags)
847 d(rhi)
848{
849}
850
855
857{
858 QRHI_RES_RHI(QRhiNull);
859 if (rhiD)
860 rhiD->unregisterResource(this);
861}
862
864{
865 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
866 QRHI_RES_RHI(QRhiNull);
867 rhiD->registerResource(rpD, false);
868 return rpD;
869}
870
872{
873 QRHI_RES_RHI(QRhiNull);
874 d.rp = QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
875 if (m_desc.cbeginColorAttachments() != m_desc.cendColorAttachments()) {
876 const QRhiColorAttachment *colorAtt = m_desc.cbeginColorAttachments();
877 QRhiTexture *tex = colorAtt->texture();
878 QRhiRenderBuffer *rb = colorAtt->renderBuffer();
879 d.pixelSize = tex ? rhiD->q->sizeForMipLevel(colorAtt->level(), tex->pixelSize()) : rb->pixelSize();
880 } else if (m_desc.depthStencilBuffer()) {
881 d.pixelSize = m_desc.depthStencilBuffer()->pixelSize();
882 } else if (m_desc.depthTexture()) {
883 d.pixelSize = m_desc.depthTexture()->pixelSize();
884 }
885 QRhiRenderTargetAttachmentTracker::updateResIdList<QNullTexture, QNullRenderBuffer>(m_desc, &d.currentResIdList);
886 rhiD->registerResource(this);
887 return true;
888}
889
891{
892 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(m_desc, d.currentResIdList))
893 const_cast<QNullTextureRenderTarget *>(this)->create();
894
895 return d.pixelSize;
896}
897
899{
900 return d.dpr;
901}
902
904{
905 return 1;
906}
907
912
917
919{
920 QRHI_RES_RHI(QRhiNull);
921 if (rhiD)
922 rhiD->unregisterResource(this);
923}
924
926{
927 QRHI_RES_RHI(QRhiNull);
928 if (!rhiD->sanityCheckShaderResourceBindings(this))
929 return false;
930
931 rhiD->updateLayoutDesc(this);
932
933 rhiD->registerResource(this, false);
934 return true;
935}
936
938{
939 Q_UNUSED(flags);
940}
941
944{
945}
946
951
953{
954 QRHI_RES_RHI(QRhiNull);
955 if (rhiD)
956 rhiD->unregisterResource(this);
957}
958
960{
961 QRHI_RES_RHI(QRhiNull);
962 if (!rhiD->sanityCheckGraphicsPipeline(this))
963 return false;
964
965 rhiD->registerResource(this);
966 return true;
967}
968
971{
972}
973
978
980{
981 QRHI_RES_RHI(QRhiNull);
982 if (rhiD)
983 rhiD->unregisterResource(this);
984}
985
987{
988 QRHI_RES_RHI(QRhiNull);
989 rhiD->registerResource(this);
990 return true;
991}
992
993QNullCommandBuffer::QNullCommandBuffer(QRhiImplementation *rhi)
995{
996}
997
1002
1004{
1005 // nothing to do here
1006}
1007
1008QNullSwapChain::QNullSwapChain(QRhiImplementation *rhi)
1009 : QRhiSwapChain(rhi),
1010 rt(rhi, this),
1011 cb(rhi)
1012{
1013}
1014
1019
1021{
1022 QRHI_RES_RHI(QRhiNull);
1023 if (rhiD)
1024 rhiD->unregisterResource(this);
1025}
1026
1028{
1029 return &cb;
1030}
1031
1036
1038{
1039 return QSize(1280, 720);
1040}
1041
1043{
1044 return f == SDR;
1045}
1046
1048{
1049 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
1050 QRHI_RES_RHI(QRhiNull);
1051 rhiD->registerResource(rpD, false);
1052 return rpD;
1053}
1054
1056{
1057 const bool needsRegistration = !window || window != m_window;
1058 if (window && window != m_window)
1059 destroy();
1060
1061 window = m_window;
1062 m_currentPixelSize = surfacePixelSize();
1063 rt.setRenderPassDescriptor(m_renderPassDesc); // for the public getter in QRhiRenderTarget
1064 rt.d.rp = QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
1065 rt.d.pixelSize = m_currentPixelSize;
1066 frameCount = 0;
1067
1068 if (needsRegistration) {
1069 QRHI_RES_RHI(QRhiNull);
1070 rhiD->registerResource(this);
1071 }
1072
1073 return true;
1074}
1075
1076QT_END_NAMESPACE
const char * constData() const
Definition qrhi_p.h:367
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:380
QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) override
Definition qrhinull.cpp:409
bool isFeatureSupported(QRhi::Feature feature) const override
Definition qrhinull.cpp:114
void debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg) override
Definition qrhinull.cpp:344
void dispatch(QRhiCommandBuffer *cb, int x, int y, int z) override
Definition qrhinull.cpp:356
QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) override
Definition qrhinull.cpp:386
void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:486
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:582
void beginPass(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
Definition qrhinull.cpp:555
bool isClipDepthZeroToOne() const override
Definition qrhinull.cpp:97
void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:591
void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:576
QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) override
Definition qrhinull.cpp:393
QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) override
Definition qrhinull.cpp:402
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:420
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:333
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:462
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:477
void setShadingRate(QRhiCommandBuffer *cb, const QSize &coarsePixelSize) override
Definition qrhinull.cpp:306
bool makeThreadLocalNativeContextCurrent() override
Definition qrhinull.cpp:175
const QRhiNativeHandles * nativeHandles(QRhiCommandBuffer *cb) override
Definition qrhinull.cpp:364
bool isYUpInFramebuffer() const override
Definition qrhinull.cpp:87
QRhi::FrameOpResult finish() override
Definition qrhinull.cpp:415
void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) override
Definition qrhinull.cpp:350
QRhiStats statistics() override
Definition qrhinull.cpp:170
QRhiShadingRateMap * createShadingRateMap() override
Definition qrhinull.cpp:233
void beginExternal(QRhiCommandBuffer *cb) override
Definition qrhinull.cpp:370
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:339
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
QRhiSwapChain * currentSwapChain
Definition qrhinull_p.h:295
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:375
bool isDeviceLost() const override
Definition qrhinull.cpp:191
static QRhiResourceUpdateBatchPrivate * get(QRhiResourceUpdateBatch *b)
Definition qrhi_p.h:592
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:597
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:617
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:607
char * beginFullDynamicBufferUpdateForCurrentFrame() override
Definition qrhinull.cpp:631
QNullCommandBuffer(QRhiImplementation *rhi)
Definition qrhinull.cpp:993
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:979
bool create() override
Definition qrhinull.cpp:986
QNullComputePipeline(QRhiImplementation *rhi)
Definition qrhinull.cpp:969
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:952
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:959
QNullGraphicsPipeline(QRhiImplementation *rhi)
Definition qrhinull.cpp:942
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:649
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:658
QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize, int sampleCount, QRhiRenderBuffer::Flags flags, QRhiTexture::Format backingFormatHint)
Definition qrhinull.cpp:637
QRhiTexture::Format backingFormat() const override
Definition qrhinull.cpp:672
QNullRenderPassDescriptor(QRhiImplementation *rhi)
Definition qrhinull.cpp:777
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() const override
Definition qrhinull.cpp:800
QVector< quint32 > serializedFormat() const override
Definition qrhinull.cpp:808
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:787
bool isCompatible(const QRhiRenderPassDescriptor *other) const override
Definition qrhinull.cpp:794
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:763
QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, AddressMode u, AddressMode v, AddressMode w)
Definition qrhinull.cpp:752
bool create() override
Definition qrhinull.cpp:770
QNullShaderResourceBindings(QRhiImplementation *rhi)
Definition qrhinull.cpp:908
bool create() override
Creates the corresponding resource binding set.
Definition qrhinull.cpp:925
void updateResources(UpdateFlags flags) override
Definition qrhinull.cpp:937
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:918
QSize pixelSize() const override
Definition qrhinull.cpp:828
float devicePixelRatio() const override
Definition qrhinull.cpp:833
QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
Definition qrhinull.cpp:813
int sampleCount() const override
Definition qrhinull.cpp:838
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:824
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:890
int sampleCount() const override
Definition qrhinull.cpp:903
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:856
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() override
Definition qrhinull.cpp:863
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:871
QNullTextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags)
Definition qrhinull.cpp:843
float devicePixelRatio() const override
Definition qrhinull.cpp:898
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:697
bool createFrom(NativeTexture src) override
Similar to create(), except that no new native textures are created.
Definition qrhinull.cpp:736
QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, Flags flags)
Definition qrhinull.cpp:677
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:688
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
Definition qrhi.h:1812