90void QWaylandQuickCompositor::grabSurface(QWaylandSurfaceGrabber *grabber,
const QWaylandBufferRef &buffer)
92 if (buffer.isSharedMemory()) {
93 QWaylandCompositor::grabSurface(grabber, buffer);
98 QWaylandQuickOutput *output =
static_cast<QWaylandQuickOutput *>(defaultOutput());
100 emit grabber->failed(QWaylandSurfaceGrabber::RendererNotReady);
106 class GrabState :
public QRunnable
109 QWaylandSurfaceGrabber *grabber =
nullptr;
110 QWaylandBufferRef buffer;
114 QOpenGLFramebufferObject fbo(buffer.size());
116 QOpenGLTextureBlitter blitter;
119 glViewport(0, 0, buffer.size().width(), buffer.size().height());
121 QOpenGLTextureBlitter::Origin surfaceOrigin =
122 buffer.origin() == QWaylandSurface::OriginTopLeft
123 ? QOpenGLTextureBlitter::OriginTopLeft
124 : QOpenGLTextureBlitter::OriginBottomLeft;
126 auto texture = buffer.toOpenGLTexture();
127 blitter.bind(texture->target());
128 blitter.blit(texture->textureId(), QMatrix4x4(), surfaceOrigin);
131 emit grabber->success(fbo.toImage());
135 GrabState *state =
new GrabState;
136 state->grabber = grabber;
137 state->buffer = buffer;
138 static_cast<QQuickWindow *>(output->window())->scheduleRenderJob(state, QQuickWindow::AfterRenderingStage);
140 emit grabber->failed(QWaylandSurfaceGrabber::UnknownBufferType);