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,