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 QByteArray srcData = subresDesc.data();
464 const char *src = srcData.constData();
465 const int srcBpl = w * 4;
466 int srcStride = srcBpl;
467 if (subresDesc.dataStride())
468 srcStride = subresDesc.dataStride();
469 const QPoint dstOffset = subresDesc.destinationTopLeft();
470 uchar *dst = texD->image[layer][level].bits();
471 const int dstBpl = texD->image[layer][level].bytesPerLine();
472 for (int y = 0; y < h; ++y) {
473 memcpy(dst + dstOffset.x() * 4 + (y + dstOffset.y()) * dstBpl,
474 src + y * srcStride,
475 size_t(srcBpl));
476 }
477 }
478 }
479 }
480 }
481}
482
484{
485 QNullTexture *srcD = QRHI_RES(QNullTexture, u.src);
486 QNullTexture *dstD = QRHI_RES(QNullTexture, u.dst);
487 const QImage &srcImage(srcD->image[u.desc.sourceLayer()][u.desc.sourceLevel()]);
488 QImage &dstImage(dstD->image[u.desc.destinationLayer()][u.desc.destinationLevel()]);
489 const QPoint dstPos = u.desc.destinationTopLeft();
490 const QSize size = u.desc.pixelSize().isEmpty() ? srcD->pixelSize() : u.desc.pixelSize();
491 const QPoint srcPos = u.desc.sourceTopLeft();
492
493 QPainter painter(&dstImage);
494 painter.setCompositionMode(QPainter::CompositionMode_Source);
495 painter.drawImage(QRect(dstPos, size), srcImage, QRect(srcPos, size));
496}
497
499{
500 QNullTexture *texD = QRHI_RES(QNullTexture, u.dst);
501 const QSize baseSize = texD->pixelSize();
502 const int levelCount = q->mipLevelsForSize(baseSize);
503 for (int level = 1; level < levelCount; ++level)
504 texD->image[0][level] = texD->image[0][0].scaled(q->sizeForMipLevel(level, baseSize));
505}
506
507void QRhiNull::resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
508{
509 Q_UNUSED(cb);
511 for (int opIdx = 0; opIdx < ud->activeBufferOpCount; ++opIdx) {
512 const QRhiResourceUpdateBatchPrivate::BufferOp &u(ud->bufferOps[opIdx]);
515 {
516 QNullBuffer *bufD = QRHI_RES(QNullBuffer, u.buf);
517 memcpy(bufD->data + u.offset, u.data.constData(), size_t(u.data.size()));
519 QRhiReadbackResult *result = u.result;
520 result->data.resize(u.readSize);
521 QNullBuffer *bufD = QRHI_RES(QNullBuffer, u.buf);
522 memcpy(result->data.data(), bufD->data + u.offset, size_t(u.readSize));
523 if (result->completed)
524 result->completed();
525 }
526 }
527 for (int opIdx = 0; opIdx < ud->activeTextureOpCount; ++opIdx) {
528 const QRhiResourceUpdateBatchPrivate::TextureOp &u(ud->textureOps[opIdx]);
530 if (u.dst->format() == QRhiTexture::RGBA8)
533 if (u.src->format() == QRhiTexture::RGBA8 && u.dst->format() == QRhiTexture::RGBA8)
536 QRhiReadbackResult *result = u.result;
537 QNullTexture *texD = QRHI_RES(QNullTexture, u.rb.texture());
538 if (texD) {
539 result->format = texD->format();
540 if (u.rb.rect().isValid())
541 result->pixelSize = u.rb.rect().size();
542 else
543 result->pixelSize = q->sizeForMipLevel(u.rb.level(), texD->pixelSize());
544 } else {
545 Q_ASSERT(currentSwapChain);
546 result->format = QRhiTexture::RGBA8;
547 if (u.rb.rect().isValid())
548 result->pixelSize = u.rb.rect().size();
549 else
550 result->pixelSize = currentSwapChain->currentPixelSize();
551 }
552 quint32 bytesPerLine = 0;
553 quint32 byteSize = 0;
554 textureFormatInfo(result->format, result->pixelSize, &bytesPerLine, &byteSize, nullptr);
555 if (texD && texD->format() == QRhiTexture::RGBA8) {
556 result->data.resize(int(byteSize));
557 const QImage &src(texD->image[u.rb.layer()][u.rb.level()]);
558 char *dst = result->data.data();
559 for (int y = 0, h = src.height(); y < h; ++y) {
560 memcpy(dst, src.constScanLine(y), bytesPerLine);
561 dst += bytesPerLine;
562 }
563 } else {
564 result->data.fill(0, int(byteSize));
565 }
566 if (result->completed)
567 result->completed();
569 if (u.dst->format() == QRhiTexture::RGBA8)
571 }
572 }
573 ud->free();
574}
575
576void QRhiNull::beginPass(QRhiCommandBuffer *cb,
577 QRhiRenderTarget *rt,
578 const QColor &colorClearValue,
579 const QRhiDepthStencilClearValue &depthStencilClearValue,
580 QRhiResourceUpdateBatch *resourceUpdates,
581 QRhiCommandBuffer::BeginPassFlags flags)
582{
583 Q_UNUSED(colorClearValue);
584 Q_UNUSED(depthStencilClearValue);
585 Q_UNUSED(flags);
586
587 if (resourceUpdates)
588 resourceUpdate(cb, resourceUpdates);
589
590 if (rt->resourceType() == QRhiRenderTarget::TextureRenderTarget) {
592 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(rtTex->description(), rtTex->d.currentResIdList))
593 rtTex->create();
594 }
595}
596
597void QRhiNull::endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
598{
599 if (resourceUpdates)
600 resourceUpdate(cb, resourceUpdates);
601}
602
603void QRhiNull::beginComputePass(QRhiCommandBuffer *cb,
604 QRhiResourceUpdateBatch *resourceUpdates,
605 QRhiCommandBuffer::BeginPassFlags flags)
606{
607 Q_UNUSED(flags);
608 if (resourceUpdates)
609 resourceUpdate(cb, resourceUpdates);
610}
611
612void QRhiNull::endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
613{
614 if (resourceUpdates)
615 resourceUpdate(cb, resourceUpdates);
616}
617
618QNullBuffer::QNullBuffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size)
620{
621}
622
627
629{
630 delete[] data;
631 data = nullptr;
632
633 QRHI_RES_RHI(QRhiNull);
634 if (rhiD)
635 rhiD->unregisterResource(this);
636}
637
639{
640 if (data)
641 destroy();
642
643 data = new char[m_size];
644 memset(data, 0, m_size);
645
646 QRHI_RES_RHI(QRhiNull);
647 rhiD->registerResource(this);
648
649 return true;
650}
651
653{
654 Q_ASSERT(m_type == Dynamic);
655 return data;
656}
657
658QNullRenderBuffer::QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize,
659 int sampleCount, QRhiRenderBuffer::Flags flags,
660 QRhiTexture::Format backingFormatHint)
662{
663}
664
669
671{
672 valid = false;
673
674 QRHI_RES_RHI(QRhiNull);
675 if (rhiD)
676 rhiD->unregisterResource(this);
677}
678
680{
681 if (valid)
682 destroy();
683
684 valid = true;
685 generation += 1;
686
687 QRHI_RES_RHI(QRhiNull);
688 rhiD->registerResource(this);
689
690 return true;
691}
692
694{
695 return m_type == Color ? QRhiTexture::RGBA8 : QRhiTexture::UnknownFormat;
696}
697
698QNullTexture::QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth,
699 int arraySize, int sampleCount, Flags flags)
701{
702}
703
708
710{
711 valid = false;
712
713 QRHI_RES_RHI(QRhiNull);
714 if (rhiD)
715 rhiD->unregisterResource(this);
716}
717
719{
720 if (valid)
721 destroy();
722
723 valid = true;
724
725 QRHI_RES_RHI(QRhiNull);
726 const bool isCube = m_flags.testFlag(CubeMap);
727 const bool is3D = m_flags.testFlag(ThreeDimensional);
728 const bool isArray = m_flags.testFlag(TextureArray);
729 const bool hasMipMaps = m_flags.testFlag(MipMapped);
730 const bool is1D = m_flags.testFlags(OneDimensional);
731 QSize size = is1D ? QSize(qMax(1, m_pixelSize.width()), 1)
732 : (m_pixelSize.isEmpty() ? QSize(1, 1) : m_pixelSize);
733 const int mipLevelCount = hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1;
734 const int layerCount = is3D ? qMax(1, m_depth)
735 : (isCube ? 6
736 : (isArray ? qMax(0, m_arraySize)
737 : 1));
738
739 if (m_format == RGBA8) {
740 image.resize(layerCount);
741 for (int layer = 0; layer < layerCount; ++layer) {
742 for (int level = 0; level < mipLevelCount; ++level) {
743 image[layer][level] = QImage(rhiD->q->sizeForMipLevel(level, size),
744 QImage::Format_RGBA8888_Premultiplied);
745 image[layer][level].fill(Qt::yellow);
746 }
747 }
748 }
749
750 generation += 1;
751
752 rhiD->registerResource(this);
753
754 return true;
755}
756
757bool QNullTexture::createFrom(QRhiTexture::NativeTexture src)
758{
759 Q_UNUSED(src);
760 if (valid)
761 destroy();
762
763 valid = true;
764
765 generation += 1;
766
767 QRHI_RES_RHI(QRhiNull);
768 rhiD->registerResource(this);
769
770 return true;
771}
772
773QNullSampler::QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
774 AddressMode u, AddressMode v, AddressMode w)
776{
777}
778
783
785{
786 QRHI_RES_RHI(QRhiNull);
787 if (rhiD)
788 rhiD->unregisterResource(this);
789}
790
792{
793 QRHI_RES_RHI(QRhiNull);
794 rhiD->registerResource(this);
795 return true;
796}
797
802
807
809{
810 QRHI_RES_RHI(QRhiNull);
811 if (rhiD)
812 rhiD->unregisterResource(this);
813}
814
815bool QNullRenderPassDescriptor::isCompatible(const QRhiRenderPassDescriptor *other) const
816{
817 Q_UNUSED(other);
818 return true;
819}
820
822{
823 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
824 QRHI_RES_RHI(QRhiNull);
825 rhiD->registerResource(rpD, false);
826 return rpD;
827}
828
833
834QNullSwapChainRenderTarget::QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
836 d(rhi)
837{
838}
839
844
848
850{
851 return d.pixelSize;
852}
853
855{
856 return d.dpr;
857}
858
860{
861 return 1;
862}
863
865 const QRhiTextureRenderTargetDescription &desc,
866 Flags flags)
868 d(rhi)
869{
870}
871
876
878{
879 QRHI_RES_RHI(QRhiNull);
880 if (rhiD)
881 rhiD->unregisterResource(this);
882}
883
885{
886 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
887 QRHI_RES_RHI(QRhiNull);
888 rhiD->registerResource(rpD, false);
889 return rpD;
890}
891
893{
894 QRHI_RES_RHI(QRhiNull);
895 d.rp = QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
896 if (m_desc.cbeginColorAttachments() != m_desc.cendColorAttachments()) {
897 const QRhiColorAttachment *colorAtt = m_desc.cbeginColorAttachments();
898 QRhiTexture *tex = colorAtt->texture();
899 QRhiRenderBuffer *rb = colorAtt->renderBuffer();
900 d.pixelSize = tex ? rhiD->q->sizeForMipLevel(colorAtt->level(), tex->pixelSize()) : rb->pixelSize();
901 } else if (m_desc.depthStencilBuffer()) {
902 d.pixelSize = m_desc.depthStencilBuffer()->pixelSize();
903 } else if (m_desc.depthTexture()) {
904 d.pixelSize = m_desc.depthTexture()->pixelSize();
905 }
906 QRhiRenderTargetAttachmentTracker::updateResIdList<QNullTexture, QNullRenderBuffer>(m_desc, &d.currentResIdList);
907 rhiD->registerResource(this);
908 return true;
909}
910
912{
913 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(m_desc, d.currentResIdList))
914 const_cast<QNullTextureRenderTarget *>(this)->create();
915
916 return d.pixelSize;
917}
918
920{
921 return d.dpr;
922}
923
925{
926 return 1;
927}
928
933
938
940{
941 QRHI_RES_RHI(QRhiNull);
942 if (rhiD)
943 rhiD->unregisterResource(this);
944}
945
947{
948 QRHI_RES_RHI(QRhiNull);
949 if (!rhiD->sanityCheckShaderResourceBindings(this))
950 return false;
951
952 rhiD->updateLayoutDesc(this);
953
954 rhiD->registerResource(this, false);
955 return true;
956}
957
959{
960 Q_UNUSED(flags);
961}
962
965{
966}
967
972
974{
975 QRHI_RES_RHI(QRhiNull);
976 if (rhiD)
977 rhiD->unregisterResource(this);
978}
979
981{
982 QRHI_RES_RHI(QRhiNull);
983 if (!rhiD->sanityCheckGraphicsPipeline(this))
984 return false;
985
986 rhiD->registerResource(this);
987 return true;
988}
989
992{
993}
994
999
1001{
1002 QRHI_RES_RHI(QRhiNull);
1003 if (rhiD)
1004 rhiD->unregisterResource(this);
1005}
1006
1008{
1009 QRHI_RES_RHI(QRhiNull);
1010 rhiD->registerResource(this);
1011 return true;
1012}
1013
1016{
1017}
1018
1023
1025{
1026 // nothing to do here
1027}
1028
1029QNullSwapChain::QNullSwapChain(QRhiImplementation *rhi)
1030 : QRhiSwapChain(rhi),
1031 rt(rhi, this),
1032 cb(rhi)
1033{
1034}
1035
1040
1042{
1043 QRHI_RES_RHI(QRhiNull);
1044 if (rhiD)
1045 rhiD->unregisterResource(this);
1046}
1047
1049{
1050 return &cb;
1051}
1052
1057
1059{
1060 return QSize(1280, 720);
1061}
1062
1064{
1065 return f == SDR;
1066}
1067
1069{
1070 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
1071 QRHI_RES_RHI(QRhiNull);
1072 rhiD->registerResource(rpD, false);
1073 return rpD;
1074}
1075
1077{
1078 const bool needsRegistration = !window || window != m_window;
1079 if (window && window != m_window)
1080 destroy();
1081
1082 window = m_window;
1083 m_currentPixelSize = surfacePixelSize();
1084 rt.setRenderPassDescriptor(m_renderPassDesc); // for the public getter in QRhiRenderTarget
1085 rt.d.rp = QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
1086 rt.d.pixelSize = m_currentPixelSize;
1087 frameCount = 0;
1088
1089 if (needsRegistration) {
1090 QRHI_RES_RHI(QRhiNull);
1091 rhiD->registerResource(this);
1092 }
1093
1094 return true;
1095}
1096
1097QT_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:507
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:603
void beginPass(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
Definition qrhinull.cpp:576
bool isClipDepthZeroToOne() const override
Definition qrhinull.cpp:97
void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:612
void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:597
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:483
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:498
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:618
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:638
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:628
char * beginFullDynamicBufferUpdateForCurrentFrame() override
Definition qrhinull.cpp:652
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.
bool create() override
QNullComputePipeline(QRhiImplementation *rhi)
Definition qrhinull.cpp:990
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:973
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:980
QNullGraphicsPipeline(QRhiImplementation *rhi)
Definition qrhinull.cpp:963
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:670
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:679
QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize, int sampleCount, QRhiRenderBuffer::Flags flags, QRhiTexture::Format backingFormatHint)
Definition qrhinull.cpp:658
QRhiTexture::Format backingFormat() const override
Definition qrhinull.cpp:693
QNullRenderPassDescriptor(QRhiImplementation *rhi)
Definition qrhinull.cpp:798
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() const override
Definition qrhinull.cpp:821
QVector< quint32 > serializedFormat() const override
Definition qrhinull.cpp:829
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:808
bool isCompatible(const QRhiRenderPassDescriptor *other) const override
Definition qrhinull.cpp:815
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:784
QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, AddressMode u, AddressMode v, AddressMode w)
Definition qrhinull.cpp:773
bool create() override
Definition qrhinull.cpp:791
QNullShaderResourceBindings(QRhiImplementation *rhi)
Definition qrhinull.cpp:929
bool create() override
Creates the corresponding resource binding set.
Definition qrhinull.cpp:946
void updateResources(UpdateFlags flags) override
Definition qrhinull.cpp:958
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:939
QSize pixelSize() const override
Definition qrhinull.cpp:849
float devicePixelRatio() const override
Definition qrhinull.cpp:854
QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
Definition qrhinull.cpp:834
int sampleCount() const override
Definition qrhinull.cpp:859
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:845
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:911
int sampleCount() const override
Definition qrhinull.cpp:924
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:877
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() override
Definition qrhinull.cpp:884
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:892
QNullTextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags)
Definition qrhinull.cpp:864
float devicePixelRatio() const override
Definition qrhinull.cpp:919
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:718
bool createFrom(NativeTexture src) override
Similar to create(), except that no new native textures are created.
Definition qrhinull.cpp:757
QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, Flags flags)
Definition qrhinull.cpp:698
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:709
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
Definition qrhi.h:1845