95void QWaylandQuickCompositor::grabSurface(QWaylandSurfaceGrabber *grabber,
const QWaylandBufferRef &buffer)
97 if (buffer.isSharedMemory()) {
98 QWaylandCompositor::grabSurface(grabber, buffer);
103 QWaylandQuickOutput *output =
static_cast<QWaylandQuickOutput *>(defaultOutput());
105 emit grabber->failed(QWaylandSurfaceGrabber::RendererNotReady);
111 class GrabState :
public QRunnable
114 QWaylandSurfaceGrabber *grabber =
nullptr;
115 QWaylandBufferRef buffer;
119 QOpenGLFramebufferObject fbo(buffer.size());
121 QOpenGLTextureBlitter blitter;
124 glViewport(0, 0, buffer.size().width(), buffer.size().height());
126 QOpenGLTextureBlitter::Origin surfaceOrigin =
127 buffer.origin() == QWaylandSurface::OriginTopLeft
128 ? QOpenGLTextureBlitter::OriginTopLeft
129 : QOpenGLTextureBlitter::OriginBottomLeft;
131 auto texture = buffer.toOpenGLTexture();
132 blitter.bind(texture->target());
133 blitter.blit(texture->textureId(), QMatrix4x4(), surfaceOrigin);
136 emit grabber->success(fbo.toImage());
140 GrabState *state =
new GrabState;
141 state->grabber = grabber;
142 state->buffer = buffer;
143 static_cast<QQuickWindow *>(output->window())->scheduleRenderJob(state, QQuickWindow::AfterRenderingStage);
145 emit grabber->failed(QWaylandSurfaceGrabber::UnknownBufferType);