From 0b25c9f68ae24fdb384f0e88c8a138e1cad80ace Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Mon, 14 Jan 2013 20:53:32 +0100 Subject: [PATCH] uterm: video: return information for all buffers on get_buffers() 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 --- src/uterm_fbdev_video.c | 25 +++++++++++++++---------- src/uterm_video.c | 8 ++++---- src/uterm_video.h | 6 +++--- src/uterm_video_drm.c | 2 +- src/uterm_video_dumb.c | 24 +++++++++++++----------- src/uterm_video_internal.h | 6 +++--- 6 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/uterm_fbdev_video.c b/src/uterm_fbdev_video.c index b4cae9e..1e5324a 100644 --- a/src/uterm_fbdev_video.c +++ b/src/uterm_fbdev_video.c @@ -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, diff --git a/src/uterm_video.c b/src/uterm_video.c index 60455b6..0265fc0 100644 --- a/src/uterm_video.c +++ b/src/uterm_video.c @@ -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); } diff --git a/src/uterm_video.h b/src/uterm_video.h index 2170b89..af20fad 100644 --- a/src/uterm_video.h +++ b/src/uterm_video.h @@ -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); diff --git a/src/uterm_video_drm.c b/src/uterm_video_drm.c index e72e258..b9166ba 100644 --- a/src/uterm_video_drm.c +++ b/src/uterm_video_drm.c @@ -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, diff --git a/src/uterm_video_dumb.c b/src/uterm_video_dumb.c index 130f5e3..7f11ca6 100644 --- a/src/uterm_video_dumb.c +++ b/src/uterm_video_dumb.c @@ -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, diff --git a/src/uterm_video_internal.h b/src/uterm_video_internal.h index 18725be..b761182 100644 --- a/src/uterm_video_internal.h +++ b/src/uterm_video_internal.h @@ -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,