screenshooter: Use the renderer function for reading out pixels
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Tue, 13 Nov 2012 18:10:22 +0000 (19:10 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 13 Nov 2012 22:01:02 +0000 (17:01 -0500)
This also changes the compositor's read_format to a pixman format.

src/compositor.h
src/gles2-renderer.c
src/screenshooter.c

index e2dbd0d..57d363a 100644 (file)
@@ -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;
index 27c23eb..2a62da2 100644 (file)
@@ -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;
index ffcc970..23181a2 100644 (file)
@@ -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;