91void QWaylandQuickCompositor::grabSurface(QWaylandSurfaceGrabber *grabber,
const QWaylandBufferRef &buffer)
93 if (buffer.isSharedMemory()) {
94 QWaylandCompositor::grabSurface(grabber, buffer);
99 QWaylandQuickOutput *output =
static_cast<QWaylandQuickOutput *>(defaultOutput());
101 emit grabber->failed(QWaylandSurfaceGrabber::RendererNotReady);
107 class GrabState :
public QRunnable
110 QWaylandSurfaceGrabber *grabber =
nullptr;
111 QWaylandBufferRef buffer;
115 QOpenGLFramebufferObject fbo(buffer.size());
117 QOpenGLTextureBlitter blitter;
120 glViewport(0, 0, buffer.size().width(), buffer.size().height());
122 QOpenGLTextureBlitter::Origin surfaceOrigin =
123 buffer.origin() == QWaylandSurface::OriginTopLeft
124 ? QOpenGLTextureBlitter::OriginTopLeft
125 : QOpenGLTextureBlitter::OriginBottomLeft;
127 auto texture = buffer.toOpenGLTexture();
128 blitter.bind(texture->target());
129 blitter.blit(texture->textureId(), QMatrix4x4(), surfaceOrigin);
132 emit grabber->success(fbo.toImage());
136 GrabState *state =
new GrabState;
137 state->grabber = grabber;
138 state->buffer = buffer;
139 static_cast<QQuickWindow *>(output->window())->scheduleRenderJob(state, QQuickWindow::AfterRenderingStage);
141 emit grabber->failed(QWaylandSurfaceGrabber::UnknownBufferType);