uterm: video: return information for all buffers on get_buffers()
authorDavid Herrmann <dh.herrmann@googlemail.com>
Mon, 14 Jan 2013 19:53:32 +0000 (20:53 +0100)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Mon, 14 Jan 2013 19:53:32 +0000 (20:53 +0100)
This renames get_buffer() to get_buffers() and returns back _and_ front
buffer to the application. This allows the application to create
supplemantal data for the buffers and manage it themself.

This data _must_ stay the same as long an activation-period of a display
so users can rely on the buffer information.
Also all information for back and front buffer is the same except for the
data pointer (which is only the same for single-buffered FBs).

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
src/uterm_fbdev_video.c
src/uterm_video.c
src/uterm_video.h
src/uterm_video_drm.c
src/uterm_video_dumb.c
src/uterm_video_internal.h

index b4cae9e..1e5324a 100644 (file)
@@ -430,12 +430,12 @@ static int display_set_dpms(struct uterm_display *disp, int state)
        return 0;
 }
 
-static int display_get_buffer(struct uterm_display *disp,
-                             struct uterm_video_buffer *buffer,
-                             unsigned int formats)
+static int display_get_buffers(struct uterm_display *disp,
+                              struct uterm_video_buffer *buffer,
+                              unsigned int formats)
 {
        struct fbdev_display *dfb = disp->data;
-       unsigned int f = 0;
+       unsigned int f = 0, i;
 
        if (dfb->xrgb32)
                f = UTERM_FORMAT_XRGB32;
@@ -445,11 +445,16 @@ static int display_get_buffer(struct uterm_display *disp,
        if (!(formats & f))
                return -EOPNOTSUPP;
 
-       buffer->width = dfb->xres;
-       buffer->height = dfb->yres;
-       buffer->stride = dfb->stride;
-       buffer->format = f;
-       buffer->data = dfb->map;
+       for (i = 0; i < 2; ++i) {
+               buffer[i].width = dfb->xres;
+               buffer[i].height = dfb->yres;
+               buffer[i].stride = dfb->stride;
+               buffer[i].format = f;
+               if (!(disp->flags & DISPLAY_DBUF) || !i)
+                       buffer[i].data = dfb->map;
+               else
+                       buffer[i].data = &dfb->map[dfb->yres * dfb->stride];
+       }
 
        return 0;
 }
@@ -495,7 +500,7 @@ static const struct display_ops fbdev_display_ops = {
        .deactivate = display_deactivate,
        .set_dpms = display_set_dpms,
        .use = NULL,
-       .get_buffer = display_get_buffer,
+       .get_buffers = display_get_buffers,
        .swap = display_swap,
        .blit = uterm_fbdev_display_blit,
        .fake_blendv = uterm_fbdev_display_fake_blendv,
index 60455b6..0265fc0 100644 (file)
@@ -423,14 +423,14 @@ int uterm_display_use(struct uterm_display *disp)
        return VIDEO_CALL(disp->ops->use, -EOPNOTSUPP, disp);
 }
 
-int uterm_display_get_buffer(struct uterm_display *disp,
-                            struct uterm_video_buffer *buffer,
-                            unsigned int formats)
+int uterm_display_get_buffers(struct uterm_display *disp,
+                             struct uterm_video_buffer *buffer,
+                             unsigned int formats)
 {
        if (!disp || !display_is_online(disp) || !buffer)
                return -EINVAL;
 
-       return VIDEO_CALL(disp->ops->get_buffer, -EOPNOTSUPP, disp, buffer,
+       return VIDEO_CALL(disp->ops->get_buffers, -EOPNOTSUPP, disp, buffer,
                          formats);
 }
 
index 2170b89..af20fad 100644 (file)
@@ -165,9 +165,9 @@ int uterm_display_set_dpms(struct uterm_display *disp, int state);
 int uterm_display_get_dpms(const struct uterm_display *disp);
 
 int uterm_display_use(struct uterm_display *disp);
-int uterm_display_get_buffer(struct uterm_display *disp,
-                            struct uterm_video_buffer *buffer,
-                            unsigned int formats);
+int uterm_display_get_buffers(struct uterm_display *disp,
+                             struct uterm_video_buffer *buffer,
+                             unsigned int formats);
 int uterm_display_swap(struct uterm_display *disp, bool immediate);
 bool uterm_display_is_swapping(struct uterm_display *disp);
 
index e72e258..b9166ba 100644 (file)
@@ -819,7 +819,7 @@ static const struct display_ops drm_display_ops = {
        .deactivate = display_deactivate,
        .set_dpms = uterm_drm_display_set_dpms,
        .use = display_use,
-       .get_buffer = NULL,
+       .get_buffers = NULL,
        .swap = display_swap,
        .blit = display_blit,
        .fake_blendv = display_fake_blendv,
index 130f5e3..7f11ca6 100644 (file)
@@ -240,23 +240,25 @@ static void display_deactivate(struct uterm_display *disp)
        disp->current_mode = NULL;
 }
 
-static int display_get_buffer(struct uterm_display *disp,
-                             struct uterm_video_buffer *buffer,
-                             unsigned int formats)
+static int display_get_buffers(struct uterm_display *disp,
+                              struct uterm_video_buffer *buffer,
+                              unsigned int formats)
 {
        struct uterm_drm2d_display *d2d = uterm_drm_display_get_data(disp);
        struct uterm_drm2d_rb *rb;
+       int i;
 
        if (!(formats & UTERM_FORMAT_XRGB32))
                return -EOPNOTSUPP;
 
-       rb = &d2d->rb[d2d->current_rb ^ 1];
-
-       buffer->width = uterm_drm_mode_get_width(disp->current_mode);
-       buffer->height = uterm_drm_mode_get_height(disp->current_mode);
-       buffer->stride = rb->stride;
-       buffer->format = UTERM_FORMAT_XRGB32;
-       buffer->data = rb->map;
+       for (i = 0; i < 2; ++i) {
+               rb = &d2d->rb[i];
+               buffer[i].width = uterm_drm_mode_get_width(disp->current_mode);
+               buffer[i].height = uterm_drm_mode_get_height(disp->current_mode);
+               buffer[i].stride = rb->stride;
+               buffer[i].format = UTERM_FORMAT_XRGB32;
+               buffer[i].data = rb->map;
+       }
 
        return 0;
 }
@@ -448,7 +450,7 @@ static const struct display_ops dumb_display_ops = {
        .deactivate = display_deactivate,
        .set_dpms = uterm_drm_display_set_dpms,
        .use = NULL,
-       .get_buffer = display_get_buffer,
+       .get_buffers = display_get_buffers,
        .swap = display_swap,
        .blit = display_blit,
        .fake_blendv = display_fake_blendv,
index 18725be..b761182 100644 (file)
@@ -54,9 +54,9 @@ struct display_ops {
        void (*deactivate) (struct uterm_display *disp);
        int (*set_dpms) (struct uterm_display *disp, int state);
        int (*use) (struct uterm_display *disp);
-       int (*get_buffer) (struct uterm_display *disp,
-                          struct uterm_video_buffer *buffer,
-                          unsigned int formats);
+       int (*get_buffers) (struct uterm_display *disp,
+                           struct uterm_video_buffer *buffer,
+                           unsigned int formats);
        int (*swap) (struct uterm_display *disp, bool immediate);
        int (*blit) (struct uterm_display *disp,
                     const struct uterm_video_buffer *buf,