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);
390 return QRhi::FrameOpSuccess;
399 return QRhi::FrameOpSuccess;
405 *cb = &offscreenCommandBuffer;
406 return QRhi::FrameOpSuccess;
412 return QRhi::FrameOpSuccess;
417 return QRhi::FrameOpSuccess;
423 for (
int layer = 0, maxLayer = u.subresDesc.size(); layer < maxLayer; ++layer) {
424 for (
int level = 0; level < QRhi::MAX_MIP_LEVELS; ++level) {
425 for (
const QRhiTextureSubresourceUploadDescription &subresDesc : std::as_const(u.subresDesc[layer][level])) {
426 if (!subresDesc.image().isNull()) {
427 const QImage src = subresDesc.image();
428 QPainter painter(&texD->image[layer][level]);
429 const QSize srcSize = subresDesc.sourceSize().isEmpty()
430 ? src.size() : subresDesc.sourceSize();
431 painter.setCompositionMode(QPainter::CompositionMode_Source);
432 painter.drawImage(subresDesc.destinationTopLeft(), src,
433 QRect(subresDesc.sourceTopLeft(), srcSize));
434 }
else if (!subresDesc.data().isEmpty()) {
435 const QSize subresSize = q->sizeForMipLevel(level, texD->pixelSize());
436 int w = subresSize.width();
437 int h = subresSize.height();
438 if (!subresDesc.sourceSize().isEmpty()) {
439 w = subresDesc.sourceSize().width();
440 h = subresDesc.sourceSize().height();
443 const char *src = subresDesc.data().constData();
444 const int srcBpl = w * 4;
445 int srcStride = srcBpl;
446 if (subresDesc.dataStride())
447 srcStride = subresDesc.dataStride();
448 const QPoint dstOffset = subresDesc.destinationTopLeft();
449 uchar *dst = texD->image[layer][level].bits();
450 const int dstBpl = texD->image[layer][level].bytesPerLine();
451 for (
int y = 0; y < h; ++y) {
452 memcpy(dst + dstOffset.x() * 4 + (y + dstOffset.y()) * dstBpl,
466 const QImage &srcImage(srcD->image[u.desc.sourceLayer()][u.desc.sourceLevel()]);
467 QImage &dstImage(dstD->image[u.desc.destinationLayer()][u.desc.destinationLevel()]);
468 const QPoint dstPos = u.desc.destinationTopLeft();
469 const QSize size = u.desc.pixelSize().isEmpty() ? srcD->pixelSize() : u.desc.pixelSize();
470 const QPoint srcPos = u.desc.sourceTopLeft();
472 QPainter painter(&dstImage);
473 painter.setCompositionMode(QPainter::CompositionMode_Source);
474 painter.drawImage(QRect(dstPos, size), srcImage, QRect(srcPos, size));
480 const QSize baseSize = texD->pixelSize();
481 const int levelCount = q->mipLevelsForSize(baseSize);
482 for (
int level = 1; level < levelCount; ++level)
483 texD->image[0][level] = texD->image[0][0].scaled(q->sizeForMipLevel(level, baseSize));
498 QRhiReadbackResult *result = u.result;
499 result->data.resize(u.readSize);
501 memcpy(result->data.data(), bufD
->data + u.offset, size_t(u.readSize));
502 if (result->completed)
509 if (u.dst->format() == QRhiTexture::RGBA8)
512 if (u.src->format() == QRhiTexture::RGBA8 && u.dst->format() == QRhiTexture::RGBA8)
515 QRhiReadbackResult *result = u.result;
518 result->format = texD->format();
519 if (u.rb.rect().isValid())
520 result->pixelSize = u.rb.rect().size();
522 result->pixelSize = q->sizeForMipLevel(u.rb.level(), texD->pixelSize());
525 result->format = QRhiTexture::RGBA8;
526 if (u.rb.rect().isValid())
527 result->pixelSize = u.rb.rect().size();
531 quint32 bytesPerLine = 0;
532 quint32 byteSize = 0;
533 textureFormatInfo(result->format, result->pixelSize, &bytesPerLine, &byteSize,
nullptr);
534 if (texD && texD->format() == QRhiTexture::RGBA8) {
535 result->data.resize(
int(byteSize));
536 const QImage &src(texD->image[u.rb.layer()][u.rb.level()]);
537 char *dst = result->data.data();
538 for (
int y = 0, h = src.height(); y < h; ++y) {
539 memcpy(dst, src.constScanLine(y), bytesPerLine);
543 result->data.fill(0,
int(byteSize));
545 if (result->completed)
548 if (u.dst->format() == QRhiTexture::RGBA8)
556 QRhiRenderTarget *rt,
557 const QColor &colorClearValue,
558 const QRhiDepthStencilClearValue &depthStencilClearValue,
559 QRhiResourceUpdateBatch *resourceUpdates,
560 QRhiCommandBuffer::BeginPassFlags flags)
562 Q_UNUSED(colorClearValue);
563 Q_UNUSED(depthStencilClearValue);
569 if (rt->resourceType() == QRhiRenderTarget::TextureRenderTarget) {
571 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(rtTex->description(), rtTex->d.currentResIdList))
576void QRhiNull::
endPass(QRhiCommandBuffer *cb, QRhiResourceUpdateBatch *resourceUpdates)
583 QRhiResourceUpdateBatch *resourceUpdates,
584 QRhiCommandBuffer::BeginPassFlags flags)
614 rhiD->unregisterResource(
this);
622 data =
new char[m_size];
623 memset(
data, 0, m_size);
626 rhiD->registerResource(
this);
633 Q_ASSERT(m_type == Dynamic);
638 int sampleCount, QRhiRenderBuffer::Flags flags,
639 QRhiTexture::Format backingFormatHint)
655 rhiD->unregisterResource(
this);
667 rhiD->registerResource(
this);
674 return m_type == Color ? QRhiTexture::RGBA8 : QRhiTexture::UnknownFormat;
678 int arraySize,
int sampleCount, Flags flags)
694 rhiD->unregisterResource(
this);
705 const bool isCube = m_flags.testFlag(CubeMap);
706 const bool is3D = m_flags.testFlag(ThreeDimensional);
707 const bool isArray = m_flags.testFlag(TextureArray);
708 const bool hasMipMaps = m_flags.testFlag(MipMapped);
709 const bool is1D = m_flags.testFlags(OneDimensional);
710 QSize size = is1D ? QSize(qMax(1, m_pixelSize.width()), 1)
711 : (m_pixelSize.isEmpty() ? QSize(1, 1) : m_pixelSize);
712 const int mipLevelCount = hasMipMaps ? rhiD->q->mipLevelsForSize(size) : 1;
713 const int layerCount = is3D ? qMax(1, m_depth)
715 : (isArray ? qMax(0, m_arraySize)
718 if (m_format == RGBA8) {
719 image.resize(layerCount);
720 for (
int layer = 0; layer < layerCount; ++layer) {
721 for (
int level = 0; level < mipLevelCount; ++level) {
722 image[layer][level] = QImage(rhiD->q->sizeForMipLevel(level, size),
723 QImage::Format_RGBA8888_Premultiplied);
724 image[layer][level].fill(Qt::yellow);
731 rhiD->registerResource(
this);
747 rhiD->registerResource(
this);
753 AddressMode u, AddressMode v, AddressMode w)
767 rhiD->unregisterResource(
this);
773 rhiD->registerResource(
this);
791 rhiD->unregisterResource(
this);
804 rhiD->registerResource(rpD,
false);
844 const QRhiTextureRenderTargetDescription &desc,
860 rhiD->unregisterResource(
this);
867 rhiD->registerResource(rpD,
false);
874 d.rp =
QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
875 if (m_desc.cbeginColorAttachments() != m_desc.cendColorAttachments()) {
876 const QRhiColorAttachment *colorAtt = m_desc.cbeginColorAttachments();
877 QRhiTexture *tex = colorAtt->texture();
878 QRhiRenderBuffer *rb = colorAtt->renderBuffer();
879 d.pixelSize = tex ? rhiD->q->sizeForMipLevel(colorAtt->level(), tex->pixelSize()) : rb->pixelSize();
880 }
else if (m_desc.depthStencilBuffer()) {
881 d.pixelSize = m_desc.depthStencilBuffer()->pixelSize();
882 }
else if (m_desc.depthTexture()) {
883 d.pixelSize = m_desc.depthTexture()->pixelSize();
885 QRhiRenderTargetAttachmentTracker::updateResIdList<QNullTexture, QNullRenderBuffer>(m_desc, &d.currentResIdList);
886 rhiD->registerResource(
this);
892 if (!QRhiRenderTargetAttachmentTracker::isUpToDate<QNullTexture, QNullRenderBuffer>(m_desc, d.currentResIdList))
922 rhiD->unregisterResource(
this);
928 if (!rhiD->sanityCheckShaderResourceBindings(
this))
931 rhiD->updateLayoutDesc(
this);
933 rhiD->registerResource(
this,
false);
956 rhiD->unregisterResource(
this);
962 if (!rhiD->sanityCheckGraphicsPipeline(
this))
965 rhiD->registerResource(
this);
983 rhiD->unregisterResource(
this);
989 rhiD->registerResource(
this);
1024 rhiD->unregisterResource(
this);
1039 return QSize(1280, 720);
1051 rhiD->registerResource(rpD,
false);
1057 const bool needsRegistration = !window || window != m_window;
1058 if (window && window != m_window)
1062 m_currentPixelSize = surfacePixelSize();
1063 rt.setRenderPassDescriptor(m_renderPassDesc);
1064 rt.d.rp =
QRHI_RES(QNullRenderPassDescriptor, m_renderPassDesc);
1065 rt.d.pixelSize = m_currentPixelSize;
1068 if (needsRegistration) {
1070 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
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
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