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;
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;
}
.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,
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);
}
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);
.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,
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;
}
.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,
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,