12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
35
36
37
38
39
40
41
42
43
46 : offscreenCommandBuffer(
this)
68 Q_UNUSED(sampleCount);
69 return { QSize(1, 1) };
74 return new QNullSwapChain(
this);
77QRhiBuffer *
QRhiNull::createBuffer(QRhiBuffer::Type type, QRhiBuffer::UsageFlags usage, quint32 size)
79 return new QNullBuffer(
this, type, usage, size);
123 case QRhi::TextureSizeMin:
125 case QRhi::TextureSizeMax:
127 case QRhi::MaxColorAttachments:
129 case QRhi::FramesInFlight:
131 case QRhi::MaxAsyncReadbackFrames:
133 case QRhi::MaxThreadGroupsPerDimension:
135 case QRhi::MaxThreadsPerThreadGroup:
137 case QRhi::MaxThreadGroupX:
139 case QRhi::MaxThreadGroupY:
141 case QRhi::MaxThreadGroupZ:
143 case QRhi::TextureArraySizeMax:
145 case QRhi::MaxUniformBufferRange:
147 case QRhi::MaxVertexInputs:
149 case QRhi::MaxVertexOutputs:
151 case QRhi::ShadingRateImageTileSize:
155 Q_UNREACHABLE_RETURN(0);
160 return &nativeHandlesStruct;
166 info.deviceName = QByteArrayLiteral(
"Null");
181void QRhiNull::setQueueSubmitParams(QRhiNativeHandles *)
206QRhiRenderBuffer *
QRhiNull::createRenderBuffer(QRhiRenderBuffer::Type type,
const QSize &pixelSize,
207 int sampleCount, QRhiRenderBuffer::Flags flags,
208 QRhiTexture::Format backingFormatHint)
210 return new QNullRenderBuffer(
this, type, pixelSize, sampleCount, flags, backingFormatHint);
214 const QSize &pixelSize,
int depth,
int arraySize,
215 int sampleCount, QRhiTexture::Flags flags)
217 return new QNullTexture(
this, format, pixelSize, depth, arraySize, sampleCount, flags);
221 QRhiSampler::Filter mipmapMode,
222 QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w)
224 return new QNullSampler(
this, magFilter, minFilter, mipmapMode, u, v, w);
228 QRhiTextureRenderTarget::Flags flags)
240 return new QNullGraphicsPipeline(
this);
245 return new QNullComputePipeline(
this);
250 return new QNullShaderResourceBindings(
this);
260 int dynamicOffsetCount,
261 const QRhiCommandBuffer::DynamicOffset *dynamicOffsets)
265 Q_UNUSED(dynamicOffsetCount);
266 Q_UNUSED(dynamicOffsets);
270 int startBinding,
int bindingCount,
const QRhiCommandBuffer::VertexInput *bindings,
271 QRhiBuffer *indexBuf, quint32 indexOffset, QRhiCommandBuffer::IndexFormat indexFormat)
274 Q_UNUSED(startBinding);
275 Q_UNUSED(bindingCount);
278 Q_UNUSED(indexOffset);
279 Q_UNUSED(indexFormat);
309 Q_UNUSED(coarsePixelSize);
313 quint32 instanceCount, quint32 firstVertex, quint32 firstInstance)
316 Q_UNUSED(vertexCount);
317 Q_UNUSED(instanceCount);
318 Q_UNUSED(firstVertex);
319 Q_UNUSED(firstInstance);
323 quint32 instanceCount, quint32 firstIndex, qint32 vertexOffset, quint32 firstInstance)
326 Q_UNUSED(indexCount);
327 Q_UNUSED(instanceCount);
328 Q_UNUSED(firstIndex);
329 Q_UNUSED(vertexOffset);
330 Q_UNUSED(firstInstance);
334 quint32 indirectBufferOffset, quint32 drawCount, quint32 stride)
337 Q_UNUSED(indirectBuffer);
338 Q_UNUSED(indirectBufferOffset);
344 quint32 indirectBufferOffset, quint32 drawCount, quint32 stride)
347 Q_UNUSED(indirectBuffer);
348 Q_UNUSED(indirectBufferOffset);
410 return QRhi::FrameOpSuccess;
419 return QRhi::FrameOpSuccess;
425 *cb = &offscreenCommandBuffer;
426 return QRhi::FrameOpSuccess;
432 return QRhi::FrameOpSuccess;
437 return QRhi::FrameOpSuccess;
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();
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,
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();
493 QPainter painter(&dstImage);
494 painter.setCompositionMode(QPainter::CompositionMode_Source);
495 painter.drawImage(QRect(dstPos, size), srcImage, QRect(srcPos, size));
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));
519 QRhiReadbackResult *result = u.result;
520 result->data.resize(u.readSize);
522 memcpy(result->data.data(), bufD
->data + u.offset, size_t(u.readSize));
523 if (result->completed)
530 if (u.dst->format() == QRhiTexture::RGBA8)
533 if (u.src->format() == QRhiTexture::RGBA8 && u.dst->format() == QRhiTexture::RGBA8)
536 QRhiReadbackResult *result = u.result;
539 result->format = texD->format();
540 if (u.rb.rect().isValid())
541 result->pixelSize = u.rb.rect().size();
543 result->pixelSize = q->sizeForMipLevel(u.rb.level(), texD->pixelSize());
546 result->format = QRhiTexture::RGBA8;
547 if (u.rb.rect().isValid())
548 result->pixelSize = u.rb.rect().size();
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);
564 result->data.fill(0,
int(byteSize));
566 if (result->completed)
569 if (u.dst->format() == QRhiTexture::RGBA8)
577 QRhiRenderTarget *rt,
578 const QColor &colorClearValue,
579 const QRhiDepthStencilClearValue &depthStencilClearValue,
580 QRhiResourceUpdateBatch *resourceUpdates,
581 QRhiCommandBuffer::BeginPassFlags flags)
583 Q_UNUSED(colorClearValue);
584 Q_UNUSED(depthStencilClearValue);
590 if (rt->resourceType() == QRhiRenderTarget::TextureRenderTarget) {
592 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(rtTex->description(), rtTex->d.currentResIdList))
597void QRhiNull::
endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
604 QRhiResourceUpdateBatch *resourceUpdates,
605 QRhiCommandBuffer::BeginPassFlags flags)
635 rhiD->unregisterResource(
this);
643 data =
new char[m_size];
644 memset(
data, 0, m_size);
647 rhiD->registerResource(
this);
654 Q_ASSERT(m_type == Dynamic);
659 int sampleCount, QRhiRenderBuffer::Flags flags,
660 QRhiTexture::Format backingFormatHint)
676 rhiD->unregisterResource(
this);
688 rhiD->registerResource(
this);
695 return m_type == Color ? QRhiTexture::RGBA8 : QRhiTexture::UnknownFormat;
699 int arraySize,
int sampleCount, Flags flags)
715 rhiD->unregisterResource(
this);
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)
736 : (isArray ? qMax(0, m_arraySize)
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);
752 rhiD->registerResource(
this);
768 rhiD->registerResource(
this);
774 AddressMode u, AddressMode v, AddressMode w)
788 rhiD->unregisterResource(
this);
794 rhiD->registerResource(
this);
812 rhiD->unregisterResource(
this);
825 rhiD->registerResource(rpD,
false);
865 const QRhiTextureRenderTargetDescription &desc,
881 rhiD->unregisterResource(
this);
888 rhiD->registerResource(rpD,
false);
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();
906 QRhiRenderTargetAttachmentTracker::updateResIdList<QNullTexture, QNullRenderBuffer>(m_desc, &d.currentResIdList);
907 rhiD->registerResource(
this);
913 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(m_desc, d.currentResIdList))
943 rhiD->unregisterResource(
this);
949 if (!rhiD->sanityCheckShaderResourceBindings(
this))
952 rhiD->updateLayoutDesc(
this);
954 rhiD->registerResource(
this,
false);
977 rhiD->unregisterResource(
this);
983 if (!rhiD->sanityCheckGraphicsPipeline(
this))
986 rhiD->registerResource(
this);
1004 rhiD->unregisterResource(
this);
1010 rhiD->registerResource(
this);
1045 rhiD->unregisterResource(
this);
1060 return QSize(1280, 720);
1072 rhiD->registerResource(rpD,
false);
1078 const bool needsRegistration = !window || window != m_window;
1079 if (window && window != m_window)
1083 m_currentPixelSize = surfacePixelSize();
1084 rt.setRenderPassDescriptor(m_renderPassDesc);
1085 rt.d.rp =
QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
1086 rt.d.pixelSize = m_currentPixelSize;
1089 if (needsRegistration) {
1091 rhiD->registerResource(
this);
const char * constData() const
void setShaderResources(QRhiCommandBuffer *cb, QRhiShaderResourceBindings *srb, int dynamicOffsetCount, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets) override
double lastCompletedGpuTime(QRhiCommandBuffer *cb) override
QRhi::FrameOpResult endOffscreenFrame(QRhi::EndFrameFlags flags) override
bool isFeatureSupported(QRhi::Feature feature) const override
void debugMarkMsg(QRhiCommandBuffer *cb, const QByteArray &msg) override
void dispatch(QRhiCommandBuffer *cb, int x, int y, int z) override
QRhi::FrameOpResult beginFrame(QRhiSwapChain *swapChain, QRhi::BeginFrameFlags flags) override
void resourceUpdate(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
void drawIndexed(QRhiCommandBuffer *cb, quint32 indexCount, quint32 instanceCount, quint32 firstIndex, qint32 vertexOffset, quint32 firstInstance) override
void beginComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
void beginPass(QRhiCommandBuffer *cb, QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates, QRhiCommandBuffer::BeginPassFlags flags) override
bool isClipDepthZeroToOne() const override
void endComputePass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
void endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates) override
QRhi::FrameOpResult endFrame(QRhiSwapChain *swapChain, QRhi::EndFrameFlags flags) override
QRhi::FrameOpResult beginOffscreenFrame(QRhiCommandBuffer **cb, QRhi::BeginFrameFlags flags) override
bool isYUpInNDC() const override
QRhiDriverInfo driverInfo() const override
void setScissor(QRhiCommandBuffer *cb, const QRhiScissor &scissor) override
void simulateTextureUpload(const QRhiResourceUpdateBatchPrivate::TextureOp &u)
QRhiComputePipeline * createComputePipeline() override
void setPipelineCacheData(const QByteArray &data) override
void setVertexInput(QRhiCommandBuffer *cb, int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf, quint32 indexOffset, QRhiCommandBuffer::IndexFormat indexFormat) override
void debugMarkBegin(QRhiCommandBuffer *cb, const QByteArray &name) override
void draw(QRhiCommandBuffer *cb, quint32 vertexCount, quint32 instanceCount, quint32 firstVertex, quint32 firstInstance) override
QByteArray pipelineCacheData() override
const QRhiNativeHandles * nativeHandles() override
void setGraphicsPipeline(QRhiCommandBuffer *cb, QRhiGraphicsPipeline *ps) override
void releaseCachedResources() override
void simulateTextureCopy(const QRhiResourceUpdateBatchPrivate::TextureOp &u)
QRhiTexture * createTexture(QRhiTexture::Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, QRhiTexture::Flags flags) override
QList< QSize > supportedShadingRates(int sampleCount) const override
void simulateTextureGenMips(const QRhiResourceUpdateBatchPrivate::TextureOp &u)
void setShadingRate(QRhiCommandBuffer *cb, const QSize &coarsePixelSize) override
bool makeThreadLocalNativeContextCurrent() override
void drawIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride) override
const QRhiNativeHandles * nativeHandles(QRhiCommandBuffer *cb) override
bool isYUpInFramebuffer() const override
QRhi::FrameOpResult finish() override
void setComputePipeline(QRhiCommandBuffer *cb, QRhiComputePipeline *ps) override
QRhiStats statistics() override
QRhiShadingRateMap * createShadingRateMap() override
void beginExternal(QRhiCommandBuffer *cb) override
QRhiSwapChain * createSwapChain() override
void setViewport(QRhiCommandBuffer *cb, const QRhiViewport &viewport) override
QRhiTextureRenderTarget * createTextureRenderTarget(const QRhiTextureRenderTargetDescription &desc, QRhiTextureRenderTarget::Flags flags) override
QRhiGraphicsPipeline * createGraphicsPipeline() override
bool create(QRhi::Flags flags) override
void setStencilRef(QRhiCommandBuffer *cb, quint32 refValue) override
void debugMarkEnd(QRhiCommandBuffer *cb) override
QList< int > supportedSampleCounts() const override
QMatrix4x4 clipSpaceCorrMatrix() const override
QRhiSampler * createSampler(QRhiSampler::Filter magFilter, QRhiSampler::Filter minFilter, QRhiSampler::Filter mipmapMode, QRhiSampler::AddressMode u, QRhiSampler::AddressMode v, QRhiSampler::AddressMode w) override
void drawIndexedIndirect(QRhiCommandBuffer *cb, QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride) override
QRhiSwapChain * currentSwapChain
int ubufAlignment() const override
bool isTextureFormatSupported(QRhiTexture::Format format, QRhiTexture::Flags flags) const override
int resourceLimit(QRhi::ResourceLimit limit) const override
QRhiShaderResourceBindings * createShaderResourceBindings() override
void setBlendConstants(QRhiCommandBuffer *cb, const QColor &c) override
void endExternal(QRhiCommandBuffer *cb) override
bool isDeviceLost() const override
static QRhiResourceUpdateBatchPrivate * get(QRhiResourceUpdateBatch *b)
Combined button and popup list for selecting options.
QNullBuffer(QRhiImplementation *rhi, Type type, UsageFlags usage, quint32 size)
bool create() override
Creates the corresponding native graphics resources.
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
char * beginFullDynamicBufferUpdateForCurrentFrame() override
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.
QNullComputePipeline(QRhiImplementation *rhi)
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
bool create() override
Creates the corresponding native graphics resources.
QNullGraphicsPipeline(QRhiImplementation *rhi)
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
bool create() override
Creates the corresponding native graphics resources.
QNullRenderBuffer(QRhiImplementation *rhi, Type type, const QSize &pixelSize, int sampleCount, QRhiRenderBuffer::Flags flags, QRhiTexture::Format backingFormatHint)
QRhiTexture::Format backingFormat() const override
QNullRenderPassDescriptor(QRhiImplementation *rhi)
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() const override
~QNullRenderPassDescriptor()
QVector< quint32 > serializedFormat() const override
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
bool isCompatible(const QRhiRenderPassDescriptor *other) const override
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
QNullSampler(QRhiImplementation *rhi, Filter magFilter, Filter minFilter, Filter mipmapMode, AddressMode u, AddressMode v, AddressMode w)
QNullShaderResourceBindings(QRhiImplementation *rhi)
bool create() override
Creates the corresponding resource binding set.
void updateResources(UpdateFlags flags) override
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
~QNullShaderResourceBindings()
QSize pixelSize() const override
float devicePixelRatio() const override
~QNullSwapChainRenderTarget()
QNullSwapChainRenderTarget(QRhiImplementation *rhi, QRhiSwapChain *swapchain)
int sampleCount() const override
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
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)
~QNullTextureRenderTarget()
QSize pixelSize() const override
int sampleCount() const override
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
QRhiRenderPassDescriptor * newCompatibleRenderPassDescriptor() override
bool create() override
Creates the corresponding native graphics resources.
QNullTextureRenderTarget(QRhiImplementation *rhi, const QRhiTextureRenderTargetDescription &desc, Flags flags)
float devicePixelRatio() const override
bool create() override
Creates the corresponding native graphics resources.
bool createFrom(NativeTexture src) override
Similar to create(), except that no new native textures are created.
QNullTexture(QRhiImplementation *rhi, Format format, const QSize &pixelSize, int depth, int arraySize, int sampleCount, Flags flags)
void destroy() override
Releases (or requests deferred releasing of) the underlying native graphics resources.
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h