summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2014-07-29 12:09:16 +0200
committerPhilipp Zabel <p.zabel@pengutronix.de>2014-07-29 12:20:14 +0200
commit4e947fb37160648818c23b9f1bf536a7ce733ef3 (patch)
treeb401c0aa5cd3120d827650994fbb75d93cffbe9b
parent891b3e607cb69dc8516df7d69b059d584a7f3e96 (diff)
downloadkmsfbwrap-4e947fb37160648818c23b9f1bf536a7ce733ef3.tar.gz
kmsfbwrap-4e947fb37160648818c23b9f1bf536a7ce733ef3.tar.xz
add alpha transparency support
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--src/kmsfb-manage.c18
-rw-r--r--src/kmsfb.h1
2 files changed, 15 insertions, 4 deletions
diff --git a/src/kmsfb-manage.c b/src/kmsfb-manage.c
index 3713e65..6b59c48 100644
--- a/src/kmsfb-manage.c
+++ b/src/kmsfb-manage.c
@@ -140,6 +140,8 @@ static int kms_data_val_set(struct kms_data *kd, const char *key, const char *va
kd->xpos = strtoul(value, NULL, 0);
else if (!strcmp(key, "ypos"))
kd->ypos = strtoul(value, NULL, 0);
+ else if (!strcmp(key, "alpha"))
+ kd->alpha = strtoul(value, NULL, 0);
else
return -EINVAL;
return 0;
@@ -780,7 +782,7 @@ static void line(const char *str)
printf("------------------------ %s ------------------------\n", str);
}
-static int create_drm_fbs(struct kms_fb *kms_fb)
+static int create_drm_fbs(struct kms_fb *kms_fb, int alpha)
{
uint32_t pixel_format;
uint32_t bo_handles[4] = { };
@@ -788,6 +790,11 @@ static int create_drm_fbs(struct kms_fb *kms_fb)
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;
@@ -796,7 +803,8 @@ static int create_drm_fbs(struct kms_fb *kms_fb)
pixel_format = DRM_FORMAT_BGR888;
break;
case 32:
- pixel_format = DRM_FORMAT_XRGB8888;
+ pixel_format = alpha ? DRM_FORMAT_ARGB8888
+ : DRM_FORMAT_XRGB8888;
break;
default:
fprintf(stderr, "illegal bpp: %d\n", kms_fb->bpp);
@@ -1063,7 +1071,7 @@ static int fb_create(struct drm_resource *res, int fd, const char *cmd)
return ret;
/* create DRM FBs */
- ret = create_drm_fbs(fb);
+ ret = create_drm_fbs(fb, kd.alpha);
if (ret)
return ret;
@@ -1075,7 +1083,8 @@ static int fb_create(struct drm_resource *res, int fd, const char *cmd)
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);
+ (((0xff - x) & 0xff) << 16) |
+ ((((x ^ y) & 1) ? 0x00 : 0xff) << 24);
}
}
}
@@ -1109,6 +1118,7 @@ static void usage(const char *prgname)
" 0 - (default) don't wait for vsync when panning, but honor WAITFORVSYNC\n"
" 1 - never wait for vsync\n"
" 2 - always wait for vsync\n"
+ " alpha [optional]: set to 1 to enable alpha transparency (default: 0)\n"
"-s show information about current drm state\n"
" (can be given multiple times, executed in order of options)\n"
"-w <windesc> create a DRM window into a framebuffer\n"
diff --git a/src/kmsfb.h b/src/kmsfb.h
index a257246..b9d1c8a 100644
--- a/src/kmsfb.h
+++ b/src/kmsfb.h
@@ -88,6 +88,7 @@ struct kms_data {
int triplebuf;
int fill;
int vsync;
+ int alpha;
};
int bgi_init(struct kms_fb *fb);