201 m_rhi = m_window->rhi();
203 qWarning(
"No QRhi found for window %p, QQuickRhiItem will not be functional", m_window);
208 m_dpr = m_window->effectiveDevicePixelRatio();
209 const int minTexSize = m_rhi->resourceLimit(QRhi::TextureSizeMin);
210 const int maxTexSize = m_rhi->resourceLimit(QRhi::TextureSizeMax);
214 if (newSize.isEmpty())
215 newSize = QSize(
int(m_item->width()),
int(m_item->height())) * m_dpr;
217 newSize.setWidth(qMin(maxTexSize, qMax(minTexSize, newSize.width())));
218 newSize.setHeight(qMin(maxTexSize, qMax(minTexSize, newSize.height())));
229 if (m_msaaColorBuffer) {
230 if (m_msaaColorBuffer->backingFormat() != itemD->rhiTextureFormat
231 || m_msaaColorBuffer->sampleCount() != itemD->samples)
238 if (m_sgTexture && m_sgTexture->hasAlphaChannel() != itemD->blend) {
244 if (!
m_rhi->isTextureFormatSupported(itemD->rhiTextureFormat)) {
245 qWarning(
"QQuickRhiItem: The requested texture format (%d) is not supported by the "
246 "underlying 3D graphics API implementation",
int(itemD->rhiTextureFormat));
248 m_colorTexture = m_rhi->newTexture(itemD->rhiTextureFormat, newSize, itemD->samples,
249 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
251 qWarning(
"Failed to create backing texture for QQuickRhiItem");
259 if (!m_msaaColorBuffer) {
260 if (!m_rhi->isFeatureSupported(QRhi::MultisampleRenderBuffer)) {
261 qWarning(
"QQuickRhiItem: Multisample renderbuffers are reported as unsupported; "
262 "sample count %d will not work as expected", itemD
->samples);
264 if (!
m_rhi->isTextureFormatSupported(itemD->rhiTextureFormat)) {
265 qWarning(
"QQuickRhiItem: The requested texture format (%d) is not supported by the "
266 "underlying 3D graphics API implementation",
int(itemD->rhiTextureFormat));
268 m_msaaColorBuffer.reset(m_rhi->newRenderBuffer(QRhiRenderBuffer::Color, newSize, itemD->samples,
269 {}, itemD->rhiTextureFormat));
270 if (!m_msaaColorBuffer->create()) {
271 qWarning(
"Failed to create multisample color buffer for QQuickRhiItem");
272 m_msaaColorBuffer.reset();
277 m_resolveTexture = m_rhi->newTexture(itemD->rhiTextureFormat, newSize, 1,
278 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
280 qWarning(
"Failed to create resolve texture for QQuickRhiItem");
294 qWarning(
"Failed to rebuild texture for QQuickRhiItem after resizing");
297 if (m_msaaColorBuffer && m_msaaColorBuffer->pixelSize() != newSize) {
298 m_msaaColorBuffer->setPixelSize(newSize);
299 if (!m_msaaColorBuffer->create())
300 qWarning(
"Failed to rebuild multisample color buffer for QQuickRhiitem after resizing");
306 qWarning(
"Failed to rebuild resolve texture for QQuickRhiItem after resizing");
310 QQuickWindow::CreateTextureOptions options;
312 options |= QQuickWindow::TextureHasAlphaChannel;
314 m_sgTexture.reset(m_window->createTextureFromRhiTexture(m_colorTexture ? m_colorTexture : m_resolveTexture,
316 setTexture(m_sgTexture.get());
320 const QSize pixelSize = m_colorTexture ? m_colorTexture->pixelSize()
321 : m_msaaColorBuffer->pixelSize();
322 if (!m_depthStencilBuffer) {
323 m_depthStencilBuffer.reset(m_rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, pixelSize, itemD->samples));
324 if (!m_depthStencilBuffer->create()) {
325 qWarning(
"Failed to create depth-stencil buffer for QQuickRhiItem");
329 }
else if (m_depthStencilBuffer->pixelSize() != pixelSize) {
330 m_depthStencilBuffer->setPixelSize(pixelSize);
331 if (!m_depthStencilBuffer->create()) {
332 qWarning(
"Failed to rebuild depth-stencil buffer for QQuickRhiItem with new size");
336 if (!m_renderTarget) {
339 color0.setTexture(m_colorTexture);
341 color0.setRenderBuffer(m_msaaColorBuffer.get());
342 if (itemD->samples > 1)
343 color0.setResolveTexture(m_resolveTexture);
345 m_renderTarget.reset(m_rhi->newTextureRenderTarget(rtDesc));
346 m_renderPassDescriptor.reset(m_renderTarget->newCompatibleRenderPassDescriptor());
347 m_renderTarget->setRenderPassDescriptor(m_renderPassDescriptor.get());
348 if (!m_renderTarget->create()) {
349 qWarning(
"Failed to create render target for QQuickRhiitem");
358 if (newSize != itemD->effectiveTextureSize) {
359 itemD->effectiveTextureSize = newSize;
360 emit m_item->effectiveColorBufferSizeChanged();
365 m_renderer->initialize(cb);
367 m_renderer->synchronize(m_item);
435QSGNode *QQuickRhiItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
441 if (!oldNode && (width() <= 0 || height() <= 0))
445 QQuickRhiItemNode *n =
static_cast<QQuickRhiItemNode *>(oldNode);
448 d->node =
new QQuickRhiItemNode(
this);
449 if (!d->node->hasRenderer()) {
450 QQuickRhiItemRenderer *r = createRenderer();
453 d->node->setRenderer(r);
455 qWarning(
"No QQuickRhiItemRenderer was created; the item will not render");
472 if (window()->rhi()->isYUpInFramebuffer()) {
473 n->setTextureCoordinatesTransform(d->mirrorVertically
474 ? QSGSimpleTextureNode::NoTransform
475 : QSGSimpleTextureNode::MirrorVertically);
477 n->setTextureCoordinatesTransform(d->mirrorVertically
478 ? QSGSimpleTextureNode::MirrorVertically
479 : QSGSimpleTextureNode::NoTransform);
481 n->setFiltering(d->smooth ? QSGTexture::Linear : QSGTexture::Nearest);
482 n->setRect(0, 0, qMax<
int>(0, width()), qMax<
int>(0, height()));
627void QQuickRhiItem::setColorBufferFormat(TextureFormat format)
630 if (d->itemTextureFormat == format)
633 d->itemTextureFormat = format;
635 case TextureFormat::RGBA8:
636 d->rhiTextureFormat = QRhiTexture::RGBA8;
638 case TextureFormat::RGBA16F:
639 d->rhiTextureFormat = QRhiTexture::RGBA16F;
641 case TextureFormat::RGBA32F:
642 d->rhiTextureFormat = QRhiTexture::RGBA32F;
644 case TextureFormat::RGB10A2:
645 d->rhiTextureFormat = QRhiTexture::RGB10A2;
648 emit colorBufferFormatChanged();
\inmodule QtGuiPrivate \inheaderfile rhi/qrhi.h