diff options
author | Thomas Hebb <tommyhebb@gmail.com> | 2013-10-12 10:59:26 -0400 |
---|---|---|
committer | Thomas Hebb <tommyhebb@gmail.com> | 2013-10-12 11:05:04 -0400 |
commit | b658d3a0a1e0c072b25a7aff5635a7688e42ce6e (patch) | |
tree | 64b128b43ab8ffa386601889e2f36c61ab4db512 | |
parent | 995c0b08a3006df39414a9ec6103c55c674b51fc (diff) |
fb: support YUY2 framebuffers using the FOURCC API
This is a bit of a hack. FOURCC support should be done properly if
more modes are ever added, but it's not worth it for just the one.
-rw-r--r-- | src/etnaviv/etna_fb.c | 44 | ||||
-rw-r--r-- | src/lib/fbdemos.c | 1 |
2 files changed, 25 insertions, 20 deletions
diff --git a/src/etnaviv/etna_fb.c b/src/etnaviv/etna_fb.c index 5bd7470..b7985b5 100644 --- a/src/etnaviv/etna_fb.c +++ b/src/etnaviv/etna_fb.c @@ -39,6 +39,8 @@ #include <errno.h> #include <assert.h> +#include <linux/videodev2.h> + /* Structure to convert framebuffer format to RS destination conf */ struct etna_fb_format_desc { @@ -51,28 +53,28 @@ struct etna_fb_format_desc unsigned blue_length; unsigned alpha_offset; unsigned alpha_length; + unsigned grayscale; unsigned rs_format; bool swap_rb; }; static const struct etna_fb_format_desc etna_fb_formats[] = { - /* bpp ro rl go gl bo bl ao al rs_format swap_rb */ - {32, 16, 8, 8, 8, 0 , 8, 0, 0, RS_FORMAT_X8R8G8B8, false}, - {32, 0 , 8, 8, 8, 16, 8, 0, 0, RS_FORMAT_X8R8G8B8, true}, - {32, 16, 8, 8, 8, 0 , 8, 24, 8, RS_FORMAT_A8R8G8B8, false}, - {32, 0 , 8, 8, 8, 16, 8, 24, 8, RS_FORMAT_A8R8G8B8, true}, - {16, 8 , 4, 4, 4, 0, 4, 0, 0, RS_FORMAT_X4R4G4B4, false}, - {16, 0 , 4, 4, 4, 8, 4, 0, 0, RS_FORMAT_X4R4G4B4, true}, - {16, 8 , 4, 4, 4, 0, 4, 12, 4, RS_FORMAT_A4R4G4B4, false}, - {16, 0 , 4, 4, 4, 8, 4, 12, 4, RS_FORMAT_A4R4G4B4, true}, - {16, 10, 5, 5, 5, 0, 5, 0, 0, RS_FORMAT_X1R5G5B5, false}, - {16, 0, 5, 5, 5, 10, 5, 0, 0, RS_FORMAT_X1R5G5B5, true}, - {16, 10, 5, 5, 5, 0, 5, 15, 1, RS_FORMAT_A1R5G5B5, false}, - {16, 0, 5, 5, 5, 10, 5, 15, 1, RS_FORMAT_A1R5G5B5, true}, - {16, 11, 5, 5, 6, 0, 5, 0, 0, RS_FORMAT_R5G6B5, false}, - {16, 0, 5, 5, 6, 11, 5, 0, 0, RS_FORMAT_R5G6B5, true}, - /* I guess we could support YUV outputs as well, for overlays, - * at least on GPUs that support YUV resolve target... */ + /* bpp ro rl go gl bo bl ao al gs rs_format swap_rb */ + {32, 16, 8, 8, 8, 0 , 8, 0, 0, 0, RS_FORMAT_X8R8G8B8, false}, + {32, 0 , 8, 8, 8, 16, 8, 0, 0, 0, RS_FORMAT_X8R8G8B8, true}, + {32, 16, 8, 8, 8, 0 , 8, 24, 8, 0, RS_FORMAT_A8R8G8B8, false}, + {32, 0 , 8, 8, 8, 16, 8, 24, 8, 0, RS_FORMAT_A8R8G8B8, true}, + {16, 8 , 4, 4, 4, 0, 4, 0, 0, 0, RS_FORMAT_X4R4G4B4, false}, + {16, 0 , 4, 4, 4, 8, 4, 0, 0, 0, RS_FORMAT_X4R4G4B4, true}, + {16, 8 , 4, 4, 4, 0, 4, 12, 4, 0, RS_FORMAT_A4R4G4B4, false}, + {16, 0 , 4, 4, 4, 8, 4, 12, 4, 0, RS_FORMAT_A4R4G4B4, true}, + {16, 10, 5, 5, 5, 0, 5, 0, 0, 0, RS_FORMAT_X1R5G5B5, false}, + {16, 0, 5, 5, 5, 10, 5, 0, 0, 0, RS_FORMAT_X1R5G5B5, true}, + {16, 10, 5, 5, 5, 0, 5, 15, 1, 0, RS_FORMAT_A1R5G5B5, false}, + {16, 0, 5, 5, 5, 10, 5, 15, 1, 0, RS_FORMAT_A1R5G5B5, true}, + {16, 11, 5, 5, 6, 0, 5, 0, 0, 0, RS_FORMAT_R5G6B5, false}, + {16, 0, 5, 5, 6, 11, 5, 0, 0, 0, RS_FORMAT_R5G6B5, true}, + {16, 0, 0, 0, 0, 0 , 0, 0, 0, V4L2_PIX_FMT_YUYV, RS_FORMAT_YUY2, false}, }; #define NUM_FB_FORMATS (sizeof(etna_fb_formats) / sizeof(etna_fb_formats[0])) @@ -94,18 +96,20 @@ bool etna_fb_get_format(const struct fb_var_screeninfo *fb_var, unsigned *rs_for desc->blue_offset == fb_var->blue.offset && desc->blue_length == fb_var->blue.length && (desc->alpha_offset == fb_var->transp.offset || desc->alpha_length == 0) && - desc->alpha_length == fb_var->transp.length) + desc->alpha_length == fb_var->transp.length && + desc->grayscale == fb_var->grayscale) { break; } } if(fmt_idx == NUM_FB_FORMATS) { - printf("Unsupported framebuffer format: red_offset=%i red_length=%i green_offset=%i green_length=%i blue_offset=%i blue_length=%i trans_offset=%i transp_length=%i\n", + printf("Unsupported framebuffer format: red_offset=%i red_length=%i green_offset=%i green_length=%i blue_offset=%i blue_length=%i trans_offset=%i transp_length=%i grayscale=%i\n", (int)fb_var->red.offset, (int)fb_var->red.length, (int)fb_var->green.offset, (int)fb_var->green.length, (int)fb_var->blue.offset, (int)fb_var->blue.length, - (int)fb_var->transp.offset, (int)fb_var->transp.length); + (int)fb_var->transp.offset, (int)fb_var->transp.length, + (int)fb_var->grayscale); return false; } else { printf("Framebuffer format: %i, flip_rb=%i\n", diff --git a/src/lib/fbdemos.c b/src/lib/fbdemos.c index c4f3ddd..3885149 100644 --- a/src/lib/fbdemos.c +++ b/src/lib/fbdemos.c @@ -205,6 +205,7 @@ int fb_open(int num, struct fb_info *out) printf(" blue.length %i\n", (unsigned)out->fb_var.blue.length); printf(" transp.offset %i\n", (unsigned)out->fb_var.transp.offset); printf(" transp.length %i\n", (unsigned)out->fb_var.transp.length); + printf(" grayscale %i\n", (unsigned)out->fb_var.grayscale); out->fd = fd; out->stride = out->fb_fix.line_length; |