diff --git a/src/compositor.h b/src/compositor.h index e2dbd0d3..57d363a3 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -353,7 +353,7 @@ struct weston_compositor { PFNEGLDESTROYIMAGEKHRPROC destroy_image; int has_unpack_subimage; - GLenum read_format; + pixman_format_code_t read_format; PFNEGLBINDWAYLANDDISPLAYWL bind_display; PFNEGLUNBINDWAYLANDDISPLAYWL unbind_display; diff --git a/src/gles2-renderer.c b/src/gles2-renderer.c index 27c23ebc..2a62da28 100644 --- a/src/gles2-renderer.c +++ b/src/gles2-renderer.c @@ -1751,9 +1751,9 @@ gles2_renderer_setup(struct weston_compositor *ec, EGLSurface egl_surface) } if (strstr(extensions, "GL_EXT_read_format_bgra")) - ec->read_format = GL_BGRA_EXT; + ec->read_format = PIXMAN_a8r8g8b8; else - ec->read_format = GL_RGBA; + ec->read_format = PIXMAN_a8b8g8r8; if (strstr(extensions, "GL_EXT_unpack_subimage")) ec->has_unpack_subimage = 1; diff --git a/src/screenshooter.c b/src/screenshooter.c index ffcc9706..23181a23 100644 --- a/src/screenshooter.c +++ b/src/screenshooter.c @@ -112,10 +112,10 @@ screenshooter_frame_notify(struct wl_listener *listener, void *data) return; } - glPixelStorei(GL_PACK_ALIGNMENT, 1); - glReadPixels(0, 0, output->current->width, output->current->height, - output->compositor->read_format, - GL_UNSIGNED_BYTE, pixels); + output->compositor->renderer->read_pixels(output, + output->compositor->read_format, pixels, + 0, 0, output->current->width, + output->current->height); stride = wl_shm_buffer_get_stride(l->buffer); @@ -123,10 +123,10 @@ screenshooter_frame_notify(struct wl_listener *listener, void *data) s = pixels + stride * (l->buffer->height - 1); switch (output->compositor->read_format) { - case GL_BGRA_EXT: + case PIXMAN_a8r8g8b8: copy_bgra_yflip(d, s, output->current->height, stride); break; - case GL_RGBA: + case PIXMAN_a8b8g8r8: copy_rgba_yflip(d, s, output->current->height, stride); break; default: @@ -299,10 +299,10 @@ weston_recorder_frame_notify(struct wl_listener *listener, void *data) for (i = 0; i < n; i++) { width = r[i].x2 - r[i].x1; height = r[i].y2 - r[i].y1; - glReadPixels(r[i].x1, output->current->height - r[i].y2, - width, height, - output->compositor->read_format, - GL_UNSIGNED_BYTE, recorder->rect); + output->compositor->renderer->read_pixels(output, + output->compositor->read_format, recorder->rect, + r[i].x1, output->current->height - r[i].y2, + width, height); s = recorder->rect; p = recorder->rect; @@ -367,12 +367,15 @@ weston_recorder_create(struct weston_output *output, const char *filename) header.magic = WCAP_HEADER_MAGIC; switch (output->compositor->read_format) { - case GL_BGRA_EXT: + case PIXMAN_a8r8g8b8: header.format = WCAP_FORMAT_XRGB8888; break; - case GL_RGBA: + case PIXMAN_a8b8g8r8: header.format = WCAP_FORMAT_XBGR8888; break; + default: + weston_log("unknown recorder format\n"); + break; } header.width = output->current->width;