asahi: Hide pixel formats behind an opaque type
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Mon, 31 May 2021 19:08:55 +0000 (15:08 -0400)
committerMarge Bot <eric+marge@anholt.net>
Tue, 1 Jun 2021 01:31:02 +0000 (01:31 +0000)
Convenient for mapping a format table.

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

src/asahi/lib/cmdbuf.xml
src/asahi/lib/gen_pack.py
src/gallium/drivers/asahi/agx_state.c

index 9ec8965..38fc74a 100644 (file)
     <field name="Slot 2" size="8" start="16" type="uint"/>
   </struct>
 
+  <struct name="Format" size="2">
+    <field name="Channels" size="7" start="0" type="Channels"/>
+    <field name="Type" size="3" start="7" type="Texture Type"/>
+  </struct>
+
   <struct name="Render Target" size="16">
     <field name="Unknown" size="4" start="0" type="hex" default="0x2"/>
     <field name="Layout" size="2" start="4" type="Layout"/>
-    <field name="Channels" size="7" start="6" type="Channels"/>
-    <field name="Type" size="3" start="13" type="Texture Type"/>
+    <field name="Format" size="10" start="6" type="Pixel Format"/>
     <field name="Swizzle R" size="2" start="16" type="Channel"/>
     <field name="Swizzle G" size="2" start="18" type="Channel"/>
     <field name="Swizzle B" size="2" start="20" type="Channel"/>
   <struct name="Texture" size="16">
     <field name="Unknown" size="4" start="0" type="hex" default="0x2"/>
     <field name="Layout" size="2" start="4" type="Layout"/>
-    <field name="Channels" size="7" start="6" type="Channels"/>
-    <field name="Type" size="3" start="13" type="Texture Type"/>
+    <field name="Format" size="10" start="6" type="Pixel Format"/>
     <field name="Swizzle R" size="3" start="16" type="Channel" default="R"/>
     <field name="Swizzle G" size="3" start="19" type="Channel" default="G"/>
     <field name="Swizzle B" size="3" start="22" type="Channel" default="B"/>
index 0eaf836..a803147 100644 (file)
@@ -122,6 +122,24 @@ __gen_unpack_sint(const uint8_t *restrict cl, uint32_t start, uint32_t end)
 #define agx_print(fp, T, var, indent)                   \\
         AGX_ ## T ## _print(fp, &(var), indent)
 
+#define agx_pixel_format_print(fp, format) do {\\
+   fprintf(fp, "%*sFormat: ", indent, ""); \\
+   \\
+   if (agx_channels_as_str((enum agx_channels)(format & 0x7F))) \\
+      fputs(agx_channels_as_str((enum agx_channels)(format & 0x7F)), fp); \\
+   else \\
+      fprintf(fp, "unknown channels %02X", format & 0x7F); \\
+   \\
+   fputs(" ", fp); \\
+   \\
+   if (agx_texture_type_as_str((enum agx_texture_type)(format >> 7))) \\
+      fputs(agx_texture_type_as_str((enum agx_texture_type)(format >> 7)), fp); \\
+   else \\
+      fprintf(fp, "unknown type %02X", format >> 7); \\
+   \\
+   fputs("\\n", fp); \\
+} while(0) \\
+
 """
 
 def to_alphanum(name):
@@ -245,7 +263,7 @@ class Field(object):
             type = 'uint64_t'
         elif self.type == 'int':
             type = 'int32_t'
-        elif self.type in ['uint', 'uint/float', 'hex']:
+        elif self.type in ['uint', 'uint/float', 'Pixel Format', 'hex']:
             type = 'uint32_t'
         elif self.type in self.parser.structs:
             type = 'struct ' + self.parser.gen_prefix(safe_name(self.type.upper()))
@@ -401,7 +419,7 @@ class Group(object):
                     elif field.modifier[0] == "log2":
                         value = "util_logbase2({})".format(value)
 
-                if field.type in ["uint", "hex", "address"]:
+                if field.type in ["uint", "hex", "Pixel Format", "address"]:
                     s = "__gen_uint(%s, %d, %d)" % \
                         (value, start, end)
                 elif field.type in self.parser.enums:
@@ -472,7 +490,7 @@ class Group(object):
             args.append(str(fieldref.start))
             args.append(str(fieldref.end))
 
-            if field.type in set(["uint", "uint/float", "address", "hex"]) | self.parser.enums:
+            if field.type in set(["uint", "uint/float", "address", "Pixel Format", "hex"]) | self.parser.enums:
                 convert = "__gen_unpack_uint"
             elif field.type == "int":
                 convert = "__gen_unpack_sint"
@@ -527,6 +545,8 @@ class Group(object):
                 print('   fprintf(fp, "%*s{}: 0x%" PRIx64 "\\n", indent, "", {});'.format(name, val))
             elif field.type == "hex":
                 print('   fprintf(fp, "%*s{}: 0x%" PRIx32 "\\n", indent, "", {});'.format(name, val))
+            elif field.type in "Pixel Format":
+                print('   agx_pixel_format_print(fp, {});'.format(val))
             elif field.type == "uint/float":
                 print('   fprintf(fp, "%*s{}: 0x%X (%f)\\n", indent, "", {}, uif({}));'.format(name, val, val))
             else:
index 2a8c7d7..dbbfdd3 100644 (file)
@@ -268,6 +268,9 @@ agx_bind_sampler_states(struct pipe_context *pctx,
           sizeof(struct agx_bo *) * count);
 }
 
+#define AGX_TEXTURE_FORMAT(channels, type) \
+   ((AGX_CHANNELS_ ## channels) | ((AGX_TEXTURE_TYPE_ ## type) << 7))
+
 /* Channels agree for RGBA but are weird for force 0/1 */
 
 static enum agx_channel
@@ -335,8 +338,7 @@ agx_create_sampler_view(struct pipe_context *pctx,
    agx_pack(so->desc->ptr.cpu, TEXTURE, cfg) {
       assert(state->format == PIPE_FORMAT_B8G8R8A8_UNORM); // TODO: format table
       cfg.layout = agx_translate_layout(rsrc->modifier);
-      cfg.channels = AGX_CHANNELS_R8G8B8A8;
-      cfg.type = AGX_TEXTURE_TYPE_UNORM;
+      cfg.format = AGX_TEXTURE_FORMAT(R8G8B8A8, UNORM);
       cfg.swizzle_r = agx_channel_from_pipe(out_swizzle[0]);
       cfg.swizzle_g = agx_channel_from_pipe(out_swizzle[1]);
       cfg.swizzle_b = agx_channel_from_pipe(out_swizzle[2]);
@@ -578,8 +580,7 @@ agx_set_framebuffer_state(struct pipe_context *pctx,
       agx_pack(ctx->render_target[i], RENDER_TARGET, cfg) {
          assert(surf->format == PIPE_FORMAT_B8G8R8A8_UNORM); // TODO: format table
          cfg.layout = agx_translate_layout(tex->modifier);
-         cfg.channels = AGX_CHANNELS_R8G8B8A8;
-         cfg.type = AGX_TEXTURE_TYPE_UNORM;
+         cfg.format = AGX_TEXTURE_FORMAT(R8G8B8A8, UNORM);
          cfg.swizzle_r = AGX_CHANNEL_B;
          cfg.swizzle_g = AGX_CHANNEL_G;
          cfg.swizzle_b = AGX_CHANNEL_R;