109void QQuickFramebufferObject::setTextureFollowsItemSize(
bool follows)
111 Q_D(QQuickFramebufferObject);
112 if (d->followsItemSize == follows)
114 d->followsItemSize = follows;
115 emit textureFollowsItemSizeChanged(d->followsItemSize);
136void QQuickFramebufferObject::setMirrorVertically(
bool enable)
138 Q_D(QQuickFramebufferObject);
139 if (d->mirrorVertically == enable)
141 d->mirrorVertically = enable;
142 emit mirrorVerticallyChanged(d->mirrorVertically);
155void QQuickFramebufferObject::geometryChange(
const QRectF &newGeometry,
const QRectF &oldGeometry)
157 QQuickItem::geometryChange(newGeometry, oldGeometry);
159 Q_D(QQuickFramebufferObject);
160 if (newGeometry.size() != oldGeometry.size() && d->followsItemSize)
254QSGNode *QQuickFramebufferObject::updatePaintNode(QSGNode *node, UpdatePaintNodeData *)
256 QSGFramebufferObjectNode *n =
static_cast<QSGFramebufferObjectNode *>(node);
263 if (!n && (width() <= 0 || height() <= 0))
266 Q_D(QQuickFramebufferObject);
269 if (!isOpenGL(d->sceneGraphRenderContext()))
272 d->node =
new QSGFramebufferObjectNode;
277 n->window = window();
278 n->renderer = createRenderer();
279 n->renderer->data = n;
281 connect(window(), SIGNAL(beforeRendering()), n, SLOT(render()));
282 connect(window(), SIGNAL(screenChanged(QScreen*)), n, SLOT(handleScreenChange()));
285 n->renderer->synchronize(
this);
287 QSize minFboSize = d->sceneGraphContext()->minimumFBOSize();
288 QSize desiredFboSize(qMax<
int>(minFboSize.width(), width()),
289 qMax<
int>(minFboSize.height(), height()));
291 n->devicePixelRatio = d->effectiveDevicePixelRatio();
292 desiredFboSize *= n->devicePixelRatio;
294 if (n->fbo && ((d->followsItemSize && n->fbo->size() != desiredFboSize) || n->invalidatePending)) {
298 delete n->msDisplayFbo;
299 n->msDisplayFbo =
nullptr;
300 n->invalidatePending =
false;
304 n->fbo = n->renderer->createFramebufferObject(desiredFboSize);
306 GLuint displayTexture = n->fbo->texture();
308 if (n->fbo->format().samples() > 0) {
309 n->msDisplayFbo =
new QOpenGLFramebufferObject(n->fbo->size());
310 displayTexture = n->msDisplayFbo->texture();
313 QSGTexture *wrapper = QNativeInterface::QSGOpenGLTexture::fromNative(displayTexture,
316 QQuickWindow::TextureHasAlphaChannel);
317 n->setTexture(wrapper);
320 n->setTextureCoordinatesTransform(d->mirrorVertically ? QSGSimpleTextureNode::MirrorVertically : QSGSimpleTextureNode::NoTransform);
321 n->setFiltering(d->smooth ? QSGTexture::Linear : QSGTexture::Nearest);
322 n->setRect(0, 0, width(), height());
340QSGTextureProvider *QQuickFramebufferObject::textureProvider()
const
345 if (QQuickItem::isTextureProvider())
346 return QQuickItem::textureProvider();
348 Q_D(
const QQuickFramebufferObject);
349 QQuickWindow *w = window();
350 if (!w || !w->isSceneGraphInitialized() || QThread::currentThread() != QQuickWindowPrivate::get(w)->context->thread()) {
351 qWarning(
"QQuickFramebufferObject::textureProvider: can only be queried on the rendering thread of an exposed window");
354 if (!isOpenGL(d->sceneGraphRenderContext()))
357 d->node =
new QSGFramebufferObjectNode;