Until now we required external renderers to use the blit/blend helpers.
However, this seems hardly reasonable now so we provide a way to retrieve
the 2D buffer via the public API.
This is limited to xrgb32 and rgb16, other formats are not exported for
now (and probably not used, yet?). The 3D backends do not support that so
use the blit/blend helpers or OpenGL.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
unsigned int stride;
bool xrgb32;
+ bool rgb16;
unsigned int Bpp;
unsigned int off_r;
unsigned int off_g;
dfb->dither_g = 0;
dfb->dither_b = 0;
dfb->xrgb32 = false;
+ dfb->rgb16 = false;
if (dfb->len_r == 8 && dfb->len_g == 8 && dfb->len_b == 8 &&
dfb->off_r == 16 && dfb->off_g == 8 && dfb->off_b == 0 &&
dfb->Bpp == 4)
dfb->xrgb32 = true;
+ else if (dfb->len_r == 5 && dfb->len_g == 6 && dfb->len_b == 5 &&
+ dfb->off_r == 11 && dfb->off_g == 5 && dfb->off_b == 0 &&
+ dfb->Bpp == 2)
+ dfb->rgb16 = true;
/* TODO: make dithering configurable */
disp->flags |= DISPLAY_DITHERING;
return 0;
}
+static int display_get_buffer(struct uterm_display *disp,
+ struct uterm_video_buffer *buffer,
+ unsigned int formats)
+{
+ struct fbdev_display *dfb = disp->data;
+ unsigned int f = 0;
+
+ if (dfb->xrgb32)
+ f = UTERM_FORMAT_XRGB32;
+ else if (dfb->rgb16)
+ f = UTERM_FORMAT_RGB16;
+
+ if (!(formats & f))
+ return -EOPNOTSUPP;
+
+ buffer->width = dfb->xres;
+ buffer->height = dfb->yres;
+ buffer->stride = dfb->stride;
+ buffer->format = f;
+ buffer->data = dfb->map;
+
+ return 0;
+}
+
static int display_swap(struct uterm_display *disp, bool immediate)
{
struct fbdev_display *dfb = disp->data;
.deactivate = display_deactivate,
.set_dpms = display_set_dpms,
.use = NULL,
+ .get_buffer = display_get_buffer,
.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)
+{
+ if (!disp || !display_is_online(disp) || !buffer)
+ return -EINVAL;
+
+ return VIDEO_CALL(disp->ops->get_buffer, -EOPNOTSUPP, disp, buffer,
+ formats);
+}
+
int uterm_display_swap(struct uterm_display *disp, bool immediate)
{
if (!disp || !display_is_online(disp) || !video_is_awake(disp->video))
};
enum uterm_video_format {
- UTERM_FORMAT_GREY,
- UTERM_FORMAT_XRGB32,
+ UTERM_FORMAT_GREY = 0x01,
+ UTERM_FORMAT_XRGB32 = 0x02,
+ UTERM_FORMAT_RGB16 = 0x04,
};
struct uterm_video_buffer {
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_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,
.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)
+{
+ struct uterm_drm2d_display *d2d = uterm_drm_display_get_data(disp);
+ struct uterm_drm2d_rb *rb;
+
+ 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;
+
+ return 0;
+}
+
static int display_swap(struct uterm_display *disp, bool immediate)
{
int ret, rb;
.deactivate = display_deactivate,
.set_dpms = uterm_drm_display_set_dpms,
.use = NULL,
+ .get_buffer = display_get_buffer,
.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 (*swap) (struct uterm_display *disp, bool immediate);
int (*blit) (struct uterm_display *disp,
const struct uterm_video_buffer *buf,