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 QPoint dstOffset = subresDesc.destinationTopLeft();
465 QSize size = clampedSubResourceUploadSize(QSize(w, h), dstOffset, level,
466 texD->pixelSize());
467 size = clampedSubResourceUploadSizeForSourceData(size, subresDesc.dataStride(),
468 4, srcData.size());
469 if (size.isEmpty())
470 continue;
471 w = size.width();
472 h = size.height();
473 const char *src = srcData.constData();
474 const int srcBpl = w * 4;
475 int srcStride = srcBpl;
476 if (subresDesc.dataStride())
477 srcStride = subresDesc.dataStride();
478 uchar *dst = texD->image[layer][level].bits();
479 const int dstBpl = texD->image[layer][level].bytesPerLine();
480 for (int y = 0; y < h; ++y) {
481 memcpy(dst + dstOffset.x() * 4 + (y + dstOffset.y()) * dstBpl,
482 src + y * srcStride,
483 size_t(srcBpl));
484 }
485 }
486 }
487 }
488 }
489}
490
492{
493 QNullTexture *srcD = QRHI_RES(QNullTexture, u.src);
494 QNullTexture *dstD = QRHI_RES(QNullTexture, u.dst);
495 const QImage &srcImage(srcD->image[u.desc.sourceLayer()][u.desc.sourceLevel()]);
496 QImage &dstImage(dstD->image[u.desc.destinationLayer()][u.desc.destinationLevel()]);
497 const QPoint dstPos = u.desc.destinationTopLeft();
498 const QSize size = u.desc.pixelSize().isEmpty() ? srcD->pixelSize() : u.desc.pixelSize();
499 const QPoint srcPos = u.desc.sourceTopLeft();
500
501 QPainter painter(&dstImage);
502 painter.setCompositionMode(QPainter::CompositionMode_Source);
503 painter.drawImage(QRect(dstPos, size), srcImage, QRect(srcPos, size));
504}
505
507{
508 QNullTexture *texD = QRHI_RES(QNullTexture, u.dst);
509 const QSize baseSize = texD->pixelSize();
510 const int levelCount = q->mipLevelsForSize(baseSize);
511 for (int level = 1; level < levelCount; ++level)
512 texD->image[0][level] = texD->image[0][0].scaled(q->sizeForMipLevel(level, baseSize));
513}
514
515void QRhiNull::resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
516{
517 Q_UNUSED(cb);
519 for (int opIdx = 0; opIdx < ud->activeBufferOpCount; ++opIdx) {
520 const QRhiResourceUpdateBatchPrivate::BufferOp &u(ud->bufferOps[opIdx]);
523 {
524 QNullBuffer *bufD = QRHI_RES(QNullBuffer, u.buf);
525 memcpy(bufD->data + u.offset, u.data.constData(), size_t(u.data.size()));
527 QRhiReadbackResult *result = u.result;
528 result->data.resize(u.readSize);
529 QNullBuffer *bufD = QRHI_RES(QNullBuffer, u.buf);
530 memcpy(result->data.data(), bufD->data + u.offset, size_t(u.readSize));
531 if (result->completed)
532 result->completed();
533 }
534 }
535 for (int opIdx = 0; opIdx < ud->activeTextureOpCount; ++opIdx) {
536 const QRhiResourceUpdateBatchPrivate::TextureOp &u(ud->textureOps[opIdx]);
538 if (u.dst->format() == QRhiTexture::RGBA8)
541 if (u.src->format() == QRhiTexture::RGBA8 && u.dst->format() == QRhiTexture::RGBA8)
544 QRhiReadbackResult *result = u.result;
545 QNullTexture *texD = QRHI_RES(QNullTexture, u.rb.texture());
546 if (texD) {
547 result->format = texD->format();
548 if (u.rb.rect().isValid())
549 result->pixelSize = u.rb.rect().size();
550 else
551 result->pixelSize = q->sizeForMipLevel(u.rb.level(), texD->pixelSize());
552 } else {
553 Q_ASSERT(currentSwapChain);
554 result->format = QRhiTexture::RGBA8;
555 if (u.rb.rect().isValid())
556 result->pixelSize = u.rb.rect().size();
557 else
558 result->pixelSize = currentSwapChain->currentPixelSize();
559 }
560 quint32 bytesPerLine = 0;
561 quint32 byteSize = 0;
562 textureFormatInfo(result->format, result->pixelSize, &bytesPerLine, &byteSize, nullptr);
563 if (texD && texD->format() == QRhiTexture::RGBA8) {
564 result->data.resize(int(byteSize));
565 const QImage &src(texD->image[u.rb.layer()][u.rb.level()]);
566 char *dst = result->data.data();
567 for (int y = 0, h = src.height(); y < h; ++y) {
568 memcpy(dst, src.constScanLine(y), bytesPerLine);
569 dst += bytesPerLine;
570 }
571 } else {
572 result->data.fill(0, int(byteSize));
573 }
574 if (result->completed)
575 result->completed();
577 if (u.dst->format() == QRhiTexture::RGBA8)
579 }
580 }
581 ud->free();
582}
583
584void QRhiNull::beginPass(QRhiCommandBuffer *cb,
585 QRhiRenderTarget *rt,
586 const QColor &colorClearValue,
587 const QRhiDepthStencilClearValue &depthStencilClearValue,
588 QRhiResourceUpdateBatch *resourceUpdates,
589 QRhiCommandBuffer::BeginPassFlags flags)
590{
591 Q_UNUSED(colorClearValue);
592 Q_UNUSED(depthStencilClearValue);
593 Q_UNUSED(flags);
594
595 if (resourceUpdates)
596 resourceUpdate(cb, resourceUpdates);
597
598 if (rt->resourceType() == QRhiRenderTarget::TextureRenderTarget) {
600 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(rtTex->description(), rtTex->d.currentResIdList))
601 rtTex->create();
602 }
603}
604
605void QRhiNull::endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
606{
607 if (resourceUpdates)
608 resourceUpdate(cb, resourceUpdates);
609}
610
611void QRhiNull::beginComputePass(QRhiCommandBuffer *cb,
612 QRhiResourceUpdateBatch *resourceUpdates,
613 QRhiCommandBuffer::BeginPassFlags flags)
614{
615 Q_UNUSED(flags);
616 if (resourceUpdates)
617 resourceUpdate(cb, resourceUpdates);
618}
619
620void QRhiNull::endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
621{
622 if (resourceUpdates)
623 resourceUpdate(cb, resourceUpdates);
624}
625
626QNullBuffer::QNullBuffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size)
628{
629}
630
635
637{
638 delete[] data;
639 data = nullptr;
640
641 QRHI_RES_RHI(QRhiNull);
642 if (rhiD)
643 rhiD->unregisterResource(this);
644}
645
647{
648 if (data)
649 destroy();
650
651 data = new char[m_size];
652 memset(data, 0, m_size);
653
654 QRHI_RES_RHI(QRhiNull);
655 rhiD->registerResource(this);
656
657 return true;
658}
659
661{
662 Q_ASSERT(m_type == Dynamic);
663 return data;
664}
665
666QNullRenderBuffer::QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize,
667 int sampleCount, QRhiRenderBuffer::Flags flags,
668 QRhiTexture::Format backingFormatHint)
670{
671}
672
677
679{
680 valid = false;
681
682 QRHI_RES_RHI(QRhiNull);
683 if (rhiD)
684 rhiD->unregisterResource(this);
685}
686
688{
689 if (valid)
690 destroy();
691
692 valid = true;
693 generation += 1;
694
695 QRHI_RES_RHI(QRhiNull);
696 rhiD->registerResource(this);
697
698 return true;
699}
700
702{
703 return m_type == Color ? QRhiTexture::RGBA8 : QRhiTexture::UnknownFormat;
704}
705
706QNullTexture::QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth,
707 int arraySize, int sampleCount, Flags flags)
709{
710}
711
716
718{
719 valid = false;
720
721 QRHI_RES_RHI(QRhiNull);
722 if (rhiD)
723 rhiD->unregisterResource(this);
724}
725
727{
728 if (valid)
729 destroy();
730
731 valid = true;
732
733 QRHI_RES_RHI(QRhiNull);
734 const bool isCube = m_flags.testFlag(CubeMap);
735 const bool is3D = m_flags.testFlag(ThreeDimensional);
736 const bool isArray = m_flags.testFlag(TextureArray);
737 const bool hasMipMaps = m_flags.testFlag(MipMapped);
738 const bool is1D = m_flags.testFlags(OneDimensional);
739 QSize size = is1D ? QSize(qMax(1, m_pixelSize.width()), 1)
740 : (m_pixelSize.isEmpty() ? QSize(1, 1) : m_pixelSize);
741 const int mipLevelCount = hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1;
742 const int layerCount = is3D ? qMax(1, m_depth)
743 : (isCube ? 6
744 : (isArray ? qMax(0, m_arraySize)
745 : 1));
746
747 if (!rhiD->textureFormatInfo(m_format, size, nullptr, nullptr, nullptr)) {
748 valid = false;
749 return false;
750 }
751
752 if (m_format == RGBA8) {
753 image.resize(layerCount);
754 for (int layer = 0; layer < layerCount; ++layer) {
755 for (int level = 0; level < mipLevelCount; ++level) {
756 image[layer][level] = QImage(rhiD->q->sizeForMipLevel(level, size),
757 QImage::Format_RGBA8888_Premultiplied);
758 image[layer][level].fill(Qt::yellow);
759 }
760 }
761 }
762
763 generation += 1;
764
765 rhiD->registerResource(this);
766
767 return true;
768}
769
770bool QNullTexture::createFrom(QRhiTexture::NativeTexture src)
771{
772 Q_UNUSED(src);
773 if (valid)
774 destroy();
775
776 valid = true;
777
778 generation += 1;
779
780 QRHI_RES_RHI(QRhiNull);
781 rhiD->registerResource(this);
782
783 return true;
784}
785
786QNullSampler::QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode,
787 AddressMode u, AddressMode v, AddressMode w)
789{
790}
791
796
798{
799 QRHI_RES_RHI(QRhiNull);
800 if (rhiD)
801 rhiD->unregisterResource(this);
802}
803
805{
806 QRHI_RES_RHI(QRhiNull);
807 rhiD->registerResource(this);
808 return true;
809}
810
815
820
822{
823 QRHI_RES_RHI(QRhiNull);
824 if (rhiD)
825 rhiD->unregisterResource(this);
826}
827
828bool QNullRenderPassDescriptor::isCompatible(const QRhiRenderPassDescriptor *other) const
829{
830 Q_UNUSED(other);
831 return true;
832}
833
835{
836 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
837 QRHI_RES_RHI(QRhiNull);
838 rhiD->registerResource(rpD, false);
839 return rpD;
840}
841
846
847QNullSwapChainRenderTarget::QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
849 d(rhi)
850{
851}
852
857
861
863{
864 return d.pixelSize;
865}
866
868{
869 return d.dpr;
870}
871
873{
874 return 1;
875}
876
878 const QRhiTextureRenderTargetDescription &desc,
879 Flags flags)
881 d(rhi)
882{
883}
884
889
891{
892 QRHI_RES_RHI(QRhiNull);
893 if (rhiD)
894 rhiD->unregisterResource(this);
895}
896
898{
899 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
900 QRHI_RES_RHI(QRhiNull);
901 rhiD->registerResource(rpD, false);
902 return rpD;
903}
904
906{
907 QRHI_RES_RHI(QRhiNull);
908 d.rp = QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
909 if (m_desc.cbeginColorAttachments() != m_desc.cendColorAttachments()) {
910 const QRhiColorAttachment *colorAtt = m_desc.cbeginColorAttachments();
911 QRhiTexture *tex = colorAtt->texture();
912 QRhiRenderBuffer *rb = colorAtt->renderBuffer();
913 d.pixelSize = tex ? rhiD->q->sizeForMipLevel(colorAtt->level(), tex->pixelSize()) : rb->pixelSize();
914 } else if (m_desc.depthStencilBuffer()) {
915 d.pixelSize = m_desc.depthStencilBuffer()->pixelSize();
916 } else if (m_desc.depthTexture()) {
917 d.pixelSize = m_desc.depthTexture()->pixelSize();
918 }
919 QRhiRenderTargetAttachmentTracker::updateResIdList<QNullTexture, QNullRenderBuffer>(m_desc, &d.currentResIdList);
920 rhiD->registerResource(this);
921 return true;
922}
923
925{
926 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(m_desc, d.currentResIdList))
927 const_cast<QNullTextureRenderTarget *>(this)->create();
928
929 return d.pixelSize;
930}
931
933{
934 return d.dpr;
935}
936
938{
939 return 1;
940}
941
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->sanityCheckShaderResourceBindings(this))
963 return false;
964
965 rhiD->updateLayoutDesc(this);
966
967 rhiD->registerResource(this, false);
968 return true;
969}
970
972{
973 Q_UNUSED(flags);
974}
975
978{
979}
980
985
987{
988 QRHI_RES_RHI(QRhiNull);
989 if (rhiD)
990 rhiD->unregisterResource(this);
991}
992
994{
995 QRHI_RES_RHI(QRhiNull);
996 if (!rhiD->sanityCheckGraphicsPipeline(this))
997 return false;
998
999 rhiD->registerResource(this);
1000 return true;
1001}
1002
1005{
1006}
1007
1012
1014{
1015 QRHI_RES_RHI(QRhiNull);
1016 if (rhiD)
1017 rhiD->unregisterResource(this);
1018}
1019
1021{
1022 QRHI_RES_RHI(QRhiNull);
1023 rhiD->registerResource(this);
1024 return true;
1025}
1026
1029{
1030}
1031
1036
1038{
1039 // nothing to do here
1040}
1041
1042QNullSwapChain::QNullSwapChain(QRhiImplementation *rhi)
1043 : QRhiSwapChain(rhi),
1044 rt(rhi, this),
1045 cb(rhi)
1046{
1047}
1048
1053
1055{
1056 QRHI_RES_RHI(QRhiNull);
1057 if (rhiD)
1058 rhiD->unregisterResource(this);
1059}
1060
1062{
1063 return &cb;
1064}
1065
1070
1072{
1073 return QSize(1280, 720);
1074}
1075
1077{
1078 return f == SDR;
1079}
1080
1082{
1083 QNullRenderPassDescriptor *rpD = new QNullRenderPassDescriptor(m_rhi);
1084 QRHI_RES_RHI(QRhiNull);
1085 rhiD->registerResource(rpD, false);
1086 return rpD;
1087}
1088
1090{
1091 const bool needsRegistration = !window || window != m_window;
1092 if (window && window != m_window)
1093 destroy();
1094
1095 window = m_window;
1096 m_currentPixelSize = surfacePixelSize();
1097 rt.setRenderPassDescriptor(m_renderPassDesc); // for the public getter in QRhiRenderTarget
1098 rt.d.rp = QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
1099 rt.d.pixelSize = m_currentPixelSize;
1100 frameCount = 0;
1101
1102 if (needsRegistration) {
1103 QRHI_RES_RHI(QRhiNull);
1104 rhiD->registerResource(this);
1105 }
1106
1107 return true;
1108}
1109
1110QT_END_NAMESPACE
const char * constData() const
Definition qrhi_p.h:374
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:515
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:611
void beginPass(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
Definition qrhinull.cpp:584
bool isClipDepthZeroToOne() const override
Definition qrhinull.cpp:97
void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:620
void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
Definition qrhinull.cpp:605
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:491
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:506
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:599
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:626
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:646
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:636
char * beginFullDynamicBufferUpdateForCurrentFrame() override
Definition qrhinull.cpp:660
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)
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:986
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:993
QNullGraphicsPipeline(QRhiImplementation *rhi)
Definition qrhinull.cpp:976
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:678
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:687
QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize, int sampleCount, QRhiRenderBuffer::Flags flags, QRhiTexture::Format backingFormatHint)
Definition qrhinull.cpp:666
QRhiTexture::Format backingFormat() const override
Definition qrhinull.cpp:701
QNullRenderPassDescriptor(QRhiImplementation *rhi)
Definition qrhinull.cpp:811
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() const override
Definition qrhinull.cpp:834
QVector< quint32 > serializedFormat() const override
Definition qrhinull.cpp:842
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:821
bool isCompatible(const QRhiRenderPassDescriptor *other) const override
Definition qrhinull.cpp:828
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:797
QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, AddressMode u, AddressMode v, AddressMode w)
Definition qrhinull.cpp:786
bool create() override
Definition qrhinull.cpp:804
QNullShaderResourceBindings(QRhiImplementation *rhi)
Definition qrhinull.cpp:942
bool create() override
Creates the corresponding resource binding set.
Definition qrhinull.cpp:959
void updateResources(UpdateFlags flags) override
Definition qrhinull.cpp:971
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:952
QSize pixelSize() const override
Definition qrhinull.cpp:862
float devicePixelRatio() const override
Definition qrhinull.cpp:867
QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
Definition qrhinull.cpp:847
int sampleCount() const override
Definition qrhinull.cpp:872
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:858
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:924
int sampleCount() const override
Definition qrhinull.cpp:937
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:890
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() override
Definition qrhinull.cpp:897
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:905
QNullTextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags)
Definition qrhinull.cpp:877
float devicePixelRatio() const override
Definition qrhinull.cpp:932
bool create() override
Creates the corresponding native graphics resources.
Definition qrhinull.cpp:726
bool createFrom(NativeTexture src) override
Similar to create(), except that no new native textures are created.
Definition qrhinull.cpp:770
QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, Flags flags)
Definition qrhinull.cpp:706
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
Definition qrhinull.cpp:717
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h
Definition qrhi.h:1849