diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2014-07-29 12:09:16 +0200 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2014-07-29 12:20:14 +0200 |
commit | 4e947fb37160648818c23b9f1bf536a7ce733ef3 (patch) | |
tree | b401c0aa5cd3120d827650994fbb75d93cffbe9b | |
parent | 891b3e607cb69dc8516df7d69b059d584a7f3e96 (diff) | |
download | kmsfbwrap-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.c | 18 | ||||
-rw-r--r-- | src/kmsfb.h | 1 |
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); |