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 <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2013-01-14 20:53:32 +01:00
parent a67f02cf21
commit 0b25c9f68a
6 changed files with 39 additions and 32 deletions

View 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,

View 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);
}

View 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);

View 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,

View 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,

View 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,