panfrost: Un/pack RGB565 and RGB5A1
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 14 May 2020 18:49:08 +0000 (14:49 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 1 Jun 2020 15:46:23 +0000 (15:46 +0000)
Basically the same as RGBA4

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5265>

src/panfrost/util/pan_lower_framebuffer.c

index e0c00decab58edf1a7e8179a9320e675d137fc93..cc432c4c69cb7c0c8a0fdbe01ce53a0c85b470d3 100644 (file)
@@ -299,6 +299,40 @@ pan_unpack_unorm_4(nir_builder *b, nir_ssa_def *v)
                         nir_imm_ivec4(b, 4, 4, 4, 4));
 }
 
+/* UNORM RGB5_A1 and RGB565 are similar */
+
+static nir_ssa_def *
+pan_pack_unorm_5551(nir_builder *b, nir_ssa_def *v)
+{
+        return pan_pack_unorm_small(b, v,
+                        nir_imm_vec4_16(b, 31.0, 31.0, 31.0, 1.0),
+                        nir_imm_ivec4(b, 3, 3, 3, 7));
+}
+
+static nir_ssa_def *
+pan_unpack_unorm_5551(nir_builder *b, nir_ssa_def *v)
+{
+        return pan_unpack_unorm_small(b, v,
+                        nir_imm_vec4_16(b, 1.0 / 31.0, 1.0 / 31.0, 1.0 / 31.0, 1.0),
+                        nir_imm_ivec4(b, 3, 3, 3, 7));
+}
+
+static nir_ssa_def *
+pan_pack_unorm_565(nir_builder *b, nir_ssa_def *v)
+{
+        return pan_pack_unorm_small(b, v,
+                        nir_imm_vec4_16(b, 31.0, 63.0, 31.0, 0.0),
+                        nir_imm_ivec4(b, 3, 2, 3, 0));
+}
+
+static nir_ssa_def *
+pan_unpack_unorm_565(nir_builder *b, nir_ssa_def *v)
+{
+        return pan_unpack_unorm_small(b, v,
+                        nir_imm_vec4_16(b, 1.0 / 31.0, 1.0 / 63.0, 1.0 / 31.0, 0.0),
+                        nir_imm_ivec4(b, 3, 2, 3, 0));
+}
+
 /* Generic dispatches for un/pack regardless of format */
 
 static bool
@@ -347,6 +381,15 @@ pan_unpack(nir_builder *b,
                 }
         }
 
+        switch (desc->format) {
+        case PIPE_FORMAT_B5G5R5A1_UNORM:
+                return pan_unpack_unorm_5551(b, packed);
+        case PIPE_FORMAT_B5G6R5_UNORM:
+                return pan_unpack_unorm_565(b, packed);
+        default:
+                break;
+        }
+
         fprintf(stderr, "%s\n", desc->name);
         unreachable("Unknown format");
 }
@@ -381,6 +424,15 @@ pan_pack(nir_builder *b,
                 }
         }
 
+        switch (desc->format) {
+        case PIPE_FORMAT_B5G5R5A1_UNORM:
+                return pan_pack_unorm_5551(b, unpacked);
+        case PIPE_FORMAT_B5G6R5_UNORM:
+                return pan_pack_unorm_565(b, unpacked);
+        default:
+                break;
+        }
+
         fprintf(stderr, "%s\n", desc->name);
         unreachable("Unknown format");
 }