drm/fourcc: Add DRM_FORMAT_C[124]
authorGeert Uytterhoeven <geert@linux-m68k.org>
Fri, 8 Jul 2022 18:20:50 +0000 (20:20 +0200)
committerSam Ravnborg <sam@ravnborg.org>
Sat, 9 Jul 2022 13:02:50 +0000 (15:02 +0200)
Introduce fourcc codes for color-indexed frame buffer formats with two,
four, and sixteen colors, and provide a mapping from bits per pixel and
depth to fourcc codes.

As the number of bits per pixel is less than eight, these rely on proper
block handling for the calculation of bits per pixel and pitch.

The fill order (the order in which multiple pixels are packed in a byte)
is the same order as used for indexed-color (2, 4, and 16 colors) images
in the PNG specification, Version 1.2.
This order is also the recommended and default order (FillOrder = 1) for
palette-color (16 colors) images in the TIFF 6.0 Specification, and is
also used for 16-color Linux frame buffer logos.

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/3d88ca7ad32ff3ff3469c10f0b36c312ea233a33.1657294931.git.geert@linux-m68k.org
drivers/gpu/drm/drm_fourcc.c
include/uapi/drm/drm_fourcc.h

index 6c76bd821d17e7c79fba2a6498ec7b3ff7961507..29f4fe199c4ddcf08f04645f8e4b04c0d93922cd 100644 (file)
@@ -43,6 +43,21 @@ uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth)
        uint32_t fmt = DRM_FORMAT_INVALID;
 
        switch (bpp) {
+       case 1:
+               if (depth == 1)
+                       fmt = DRM_FORMAT_C1;
+               break;
+
+       case 2:
+               if (depth == 2)
+                       fmt = DRM_FORMAT_C2;
+               break;
+
+       case 4:
+               if (depth == 4)
+                       fmt = DRM_FORMAT_C4;
+               break;
+
        case 8:
                if (depth == 8)
                        fmt = DRM_FORMAT_C8;
@@ -132,6 +147,12 @@ EXPORT_SYMBOL(drm_driver_legacy_fb_format);
 const struct drm_format_info *__drm_format_info(u32 format)
 {
        static const struct drm_format_info formats[] = {
+               { .format = DRM_FORMAT_C1,              .depth = 1,  .num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 8, }, .block_h = { 1, }, .hsub = 1, .vsub = 1, .is_color_indexed = true },
+               { .format = DRM_FORMAT_C2,              .depth = 2,  .num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 4, }, .block_h = { 1, }, .hsub = 1, .vsub = 1, .is_color_indexed = true },
+               { .format = DRM_FORMAT_C4,              .depth = 4,  .num_planes = 1,
+                 .char_per_block = { 1, }, .block_w = { 2, }, .block_h = { 1, }, .hsub = 1, .vsub = 1, .is_color_indexed = true },
                { .format = DRM_FORMAT_C8,              .depth = 8,  .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1, .is_color_indexed = true },
                { .format = DRM_FORMAT_R8,              .depth = 8,  .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 },
                { .format = DRM_FORMAT_R10,             .depth = 10, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
index c1b4cfda7507521c2ec262b952ddff95afd9a71a..b9c746c3ebbc6decae8439334487f93ab885e026 100644 (file)
@@ -99,6 +99,9 @@ extern "C" {
 #define DRM_FORMAT_INVALID     0
 
 /* color index */
+#define DRM_FORMAT_C1          fourcc_code('C', '1', ' ', ' ') /* [7:0] C0:C1:C2:C3:C4:C5:C6:C7 1:1:1:1:1:1:1:1 eight pixels/byte */
+#define DRM_FORMAT_C2          fourcc_code('C', '2', ' ', ' ') /* [7:0] C0:C1:C2:C3 2:2:2:2 four pixels/byte */
+#define DRM_FORMAT_C4          fourcc_code('C', '4', ' ', ' ') /* [7:0] C0:C1 4:4 two pixels/byte */
 #define DRM_FORMAT_C8          fourcc_code('C', '8', ' ', ' ') /* [7:0] C */
 
 /* 8 bpp Red */