summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2014-12-12 13:48:07 +0100
committerPhilipp Zabel <p.zabel@pengutronix.de>2014-12-18 17:27:13 +0100
commite915a99187d37b24debe454c175c6484f14fa4e4 (patch)
tree695b087521bc1ca19f4cc5f5afe9bf0f24b13417
parent66af7323b8c67dcbbc76cd086a8d25775efc19f7 (diff)
downloadkmsfbwrap-e915a99187d37b24debe454c175c6484f14fa4e4.tar.gz
kmsfbwrap-e915a99187d37b24debe454c175c6484f14fa4e4.tar.xz
Add support for ARGB1555 format
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--src/bgi.c19
-rw-r--r--src/kmsfb-manage.c56
-rw-r--r--src/kmsfb.h2
3 files changed, 62 insertions, 15 deletions
diff --git a/src/bgi.c b/src/bgi.c
index a190f5c..2024311 100644
--- a/src/bgi.c
+++ b/src/bgi.c
@@ -406,6 +406,25 @@ int bgi_init(struct kms_fb *fb)
fb->fb_var.bits_per_pixel = fb->bpp;
switch (fb->bpp) {
+ case 16:
+ if (fb->alpha) {
+ fb->fb_var.transp.offset = 15;
+ fb->fb_var.transp.length = 1;
+ fb->fb_var.red.offset = 10;
+ fb->fb_var.red.length = 5;
+ fb->fb_var.green.offset = 5;
+ fb->fb_var.green.length = 5;
+ } else {
+ fb->fb_var.transp.offset = 0;
+ fb->fb_var.transp.length = 0;
+ fb->fb_var.red.offset = 11;
+ fb->fb_var.red.length = 5;
+ fb->fb_var.green.offset = 5;
+ fb->fb_var.green.length = 6;
+ }
+ fb->fb_var.blue.offset = 0;
+ fb->fb_var.blue.length = 5;
+ break;
case 32:
fb->fb_var.red.offset = 16;
fb->fb_var.red.length = 8;
diff --git a/src/kmsfb-manage.c b/src/kmsfb-manage.c
index b2b39de..0fbad75 100644
--- a/src/kmsfb-manage.c
+++ b/src/kmsfb-manage.c
@@ -812,16 +812,16 @@ static int create_drm_fbs(struct kms_fb *kms_fb, int alpha)
uint32_t offsets[4] = { };
int err, i;
- if (alpha && kms_fb->bpp != 32) {
- fprintf(stderr, "alpha needs bpp=32\n");
- return -EINVAL;
- }
-
switch (kms_fb->bpp) {
case 16:
- pixel_format = DRM_FORMAT_RGB565;
+ pixel_format = alpha ? DRM_FORMAT_ARGB1555
+ : DRM_FORMAT_RGB565;
break;
case 24:
+ if (alpha) {
+ fprintf(stderr, "alpha needs bpp=16/32\n");
+ return -EINVAL;
+ }
pixel_format = DRM_FORMAT_BGR888;
break;
case 32:
@@ -1163,6 +1163,7 @@ static int fb_create(struct drm_resource *res, int fd, const char *cmd)
fb->yres = kd.yres;
fb->pitch = kd.pitch;
fb->bpp = kd.bpp;
+ fb->alpha = kd.alpha;
fb->num_slices = kd.triplebuf ? 3 : 1;
fb->vsync.val = kd.vsync;
fb->id = globals.num_kms_fbs;
@@ -1184,14 +1185,41 @@ static int fb_create(struct drm_resource *res, int fd, const char *cmd)
if (kd.fill) {
int x, y;
- uint32_t *pix;
-
- for (y = 0; y < fb->yres; y++) {
- for (x = 0; x < fb->xres; x++) {
- pix = fb->fb + (x * fb->bpp / 8) + y * fb->pitch;
- *pix = ((x & 0xff) << 8) | (0xff - (y & 0xff)) |
- (((0xff - x) & 0xff) << 16) |
- ((((x ^ y) & 1) ? 0x00 : 0xff) << 24);
+
+ if (fb->bpp == 32) {
+ uint32_t *pix;
+
+ for (y = 0; y < fb->yres; y++) {
+ for (x = 0; x < fb->xres; x++) {
+ pix = fb->fb + x * 4 + y * fb->pitch;
+ *pix = ((x & 0xff) << 8) |
+ (0xff - (y & 0xff)) |
+ (((0xff - x) & 0xff) << 16) |
+ ((((x ^ y) & 1) ? 0x00 : 0xff) << 24);
+ }
+ }
+ } else if (fb->bpp == 16 && !fb->alpha) {
+ uint16_t *pix;
+
+ for (y = 0; y < fb->yres; y++) {
+ for (x = 0; x < fb->xres; x++) {
+ pix = fb->fb + x * 2 + y * fb->pitch;
+ *pix = ((x & 0x3f) << 5) |
+ (0x1f - (y & 0x1f)) |
+ (((0x1f - x) & 0x1f) << 11);
+ }
+ }
+ } else if (fb->bpp == 16 && fb->alpha) {
+ uint16_t *pix;
+
+ for (y = 0; y < fb->yres; y++) {
+ for (x = 0; x < fb->xres; x++) {
+ pix = fb->fb + x * 2 + y * fb->pitch;
+ *pix = ((x & 0x1f) << 5) |
+ (0x1f - (y & 0x1f)) |
+ (((0x1f - x) & 0x1f) << 10) |
+ ((((x ^ y) & 1) ? 0 : 1) << 15);
+ }
}
}
}
diff --git a/src/kmsfb.h b/src/kmsfb.h
index 9a36b57..65f9f7e 100644
--- a/src/kmsfb.h
+++ b/src/kmsfb.h
@@ -50,7 +50,7 @@ struct kms_fb {
uint32_t xres, yres, pitch;
uint32_t bpp;
-
+ int alpha;
int num_slices;
struct kms_slice slices[3];