panfrost: XMLify Bifrost textures
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 6 Aug 2020 22:12:28 +0000 (18:12 -0400)
committerTomeu Vizoso <tomeu.vizoso@collabora.com>
Thu, 13 Aug 2020 06:55:16 +0000 (08:55 +0200)
Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6195>

src/gallium/drivers/panfrost/pan_cmdstream.c
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_context.h
src/panfrost/include/panfrost-job.h
src/panfrost/lib/decode.c
src/panfrost/lib/midgard.xml
src/panfrost/lib/pan_texture.c
src/panfrost/lib/pan_texture.h

index 97a5cff9626194d59ea54bbd007e2be1e0672aa5..f8248f137caec305f967eafc5eadd4de0824122e 100644 (file)
@@ -1269,16 +1269,20 @@ panfrost_emit_texture_descriptors(struct panfrost_batch *batch,
                 return;
 
         if (device->quirks & IS_BIFROST) {
-                struct bifrost_texture_descriptor *descriptors;
+                struct panfrost_transfer T = panfrost_pool_alloc(&batch->pool,
+                                MALI_BIFROST_TEXTURE_LENGTH *
+                                ctx->sampler_view_count[stage]);
 
-                descriptors = malloc(sizeof(struct bifrost_texture_descriptor) *
-                                     ctx->sampler_view_count[stage]);
+                struct mali_bifrost_texture_packed *out =
+                        (struct mali_bifrost_texture_packed *) T.cpu;
 
                 for (int i = 0; i < ctx->sampler_view_count[stage]; ++i) {
                         struct panfrost_sampler_view *view = ctx->sampler_views[stage][i];
                         struct pipe_sampler_view *pview = &view->base;
                         struct panfrost_resource *rsrc = pan_resource(pview->texture);
+
                         panfrost_update_sampler_view(view, &ctx->base);
+                        out[i] = view->bifrost_descriptor;
 
                         /* Add the BOs to the job so they are retained until the job is done. */
 
@@ -1289,16 +1293,9 @@ panfrost_emit_texture_descriptors(struct panfrost_batch *batch,
                         panfrost_batch_add_bo(batch, view->bo,
                                               PAN_BO_ACCESS_SHARED | PAN_BO_ACCESS_READ |
                                               panfrost_bo_access_for_stage(stage));
-
-                        memcpy(&descriptors[i], view->bifrost_descriptor, sizeof(*view->bifrost_descriptor));
                 }
 
-                postfix->textures = panfrost_pool_upload(&batch->pool,
-                                                              descriptors,
-                                                              sizeof(struct bifrost_texture_descriptor) *
-                                                                      ctx->sampler_view_count[stage]);
-
-                free(descriptors);
+                postfix->textures = T.gpu;
         } else {
                 uint64_t trampolines[PIPE_MAX_SHADER_SAMPLER_VIEWS];
 
index 18e6f78cd4b6e1f7117ab86cfcd3d90511c0c07d..0efe0a90fc39e188fab80296c4b9f63a3d12c4fd 100644 (file)
@@ -975,9 +975,8 @@ panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so,
 
                 so->bo = panfrost_bo_create(device, size, 0);
 
-                so->bifrost_descriptor = rzalloc(pctx, struct bifrost_texture_descriptor);
                 panfrost_new_texture_bifrost(
-                                so->bifrost_descriptor,
+                                &so->bifrost_descriptor,
                                 texture->width0, texture->height0,
                                 depth, array_size,
                                 format,
@@ -1078,8 +1077,6 @@ panfrost_sampler_view_destroy(
 
         pipe_resource_reference(&pview->texture, NULL);
         panfrost_bo_unreference(view->bo);
-        if (view->bifrost_descriptor)
-                ralloc_free(view->bifrost_descriptor);
         ralloc_free(view);
 }
 
index 680ff5e64e75eef162f24fa1e5705e8c06678d36..390010ce695637e62bd43837f4d85fec0406a50d 100644 (file)
@@ -277,7 +277,7 @@ struct panfrost_sampler_state {
 struct panfrost_sampler_view {
         struct pipe_sampler_view base;
         struct panfrost_bo *bo;
-        struct bifrost_texture_descriptor *bifrost_descriptor;
+        struct mali_bifrost_texture_packed bifrost_descriptor;
         mali_ptr texture_bo;
         uint64_t modifier;
 };
index 20209e95dc1628be355c102c6447a3931276f956..09ff583ab447b95ce3099001e25f441f55885399 100644 (file)
@@ -1148,39 +1148,6 @@ struct bifrost_payload_fused {
 /* For each pointer, there is an address and optionally also a stride */
 #define MAX_ELEMENTS (2)
 
-/* While Midgard texture descriptors are variable length, Bifrost descriptors
- * are fixed like samplers with more pointers to expand if necessary */
-
-struct bifrost_texture_descriptor {
-        unsigned format_unk : 4; /* 2 */
-        enum mali_texture_dimension type : 2;
-        unsigned zero : 4;
-        unsigned format_swizzle : 12;
-        enum mali_format format : 8;
-        unsigned srgb : 1;
-        unsigned format_unk3 : 1; /* 0 */
-
-        uint16_t width; /* MALI_POSITIVE */
-        uint16_t height; /* MALI_POSITIVE */
-
-        /* OpenGL swizzle */
-        unsigned swizzle : 12;
-        enum mali_texture_layout layout : 4;
-        uint8_t levels : 8; /* Number of levels-1 if mipmapped, 0 if not */
-        unsigned unk1 : 8;
-
-        unsigned levels_unk : 24; /* 0 */
-        unsigned level_2 : 8; /* Number of levels, again? */
-
-        mali_ptr payload;
-
-        uint16_t array_size;
-        uint16_t unk4;
-
-        uint16_t depth;
-        uint16_t unk5;
-} __attribute__((packed));
-
 /* Used for lod encoding. Thanks @urjaman for pointing out these routines can
  * be cleaned up a lot. */
 
index 4589613b4abdcae96341a1bb80cf9c8a8fb7c981..b218595560b9743bfdb9bbc139d15ace70b9b515 100644 (file)
@@ -2109,102 +2109,17 @@ pandecode_texture(mali_ptr u,
 
 static void
 pandecode_bifrost_texture(
-                const struct bifrost_texture_descriptor *t,
+                const void *cl,
                 unsigned job_no,
                 unsigned tex)
 {
-        pandecode_log("struct bifrost_texture_descriptor texture_descriptor_%d_%d = {\n", job_no, tex);
-        pandecode_indent++;
-
-        pandecode_prop("format_unk = 0x%" PRIx32, t->format_unk);
-        pandecode_prop("type = %" PRId32, t->type);
-
-        if (t->zero) {
-                pandecode_msg("XXX: zero tripped\n");
-                pandecode_prop("zero = 0x%" PRIx32, t->zero);
-        }
-
-        pandecode_prop("format_swizzle = 0x%" PRIx32, t->format_swizzle);
-        pandecode_prop("format = 0x%" PRIx32, t->format);
-        pandecode_prop("srgb = 0x%" PRIx32, t->srgb);
-        pandecode_prop("format_unk3 = 0x%" PRIx32, t->format_unk3);
-        pandecode_prop("width = %" PRId32, t->width);
-        pandecode_prop("height = %" PRId32, t->height);
-        pandecode_prop("swizzle = 0x%" PRIx32, t->swizzle);
-        pandecode_prop("levels = %" PRId32, t->levels);
-        pandecode_prop("unk1 = 0x%" PRIx32, t->unk1);
-        pandecode_prop("levels_unk = %" PRId32, t->levels_unk);
-        pandecode_prop("level_2 = %" PRId32, t->level_2);
-        pandecode_prop("payload = 0x%" PRIx64, t->payload);
-        pandecode_prop("array_size = %" PRId32, t->array_size);
-        pandecode_prop("unk4 = 0x%" PRIx32, t->unk4);
-        pandecode_prop("depth = %" PRId32, t->depth);
-        pandecode_prop("unk5 = 0x%" PRIx32, t->unk5);
-        pandecode_log("\n");
-
-        bool is_cube = t->type == MALI_TEXTURE_DIMENSION_CUBE;
-        unsigned dimension = is_cube ? 2 : t->type;
-
-        /* Print the layout. Default is linear; a modifier can denote AFBC or
-         * u-interleaved/tiled modes */
-
-        if (t->layout == MALI_TEXTURE_LAYOUT_AFBC)
-                pandecode_log_cont("afbc");
-        else if (t->layout == MALI_TEXTURE_LAYOUT_TILED)
-                pandecode_log_cont("tiled");
-        else if (t->layout == MALI_TEXTURE_LAYOUT_LINEAR)
-                pandecode_log_cont("linear");
-        else
-                pandecode_msg("XXX: invalid texture layout 0x%X\n", t->layout);
-
-        pandecode_swizzle(t->swizzle, t->format);
-        pandecode_log_cont(" ");
-
-        /* Distinguish cube/2D with modifier */
-
-        if (is_cube)
-                pandecode_log_cont("cube ");
-
-        pandecode_format_short(t->format, t->srgb);
-
-        /* All four width/height/depth/array_size dimensions are present
-         * regardless of the type of texture, but it is an error to have
-         * non-zero dimensions for unused dimensions. Verify this. array_size
-         * can always be set, as can width. */
-
-        if (t->height && dimension < 2)
-                pandecode_msg("XXX: nonzero height for <2D texture\n");
-
-        if (t->depth && dimension < 3)
-                pandecode_msg("XXX: nonzero depth for <2D texture\n");
-
-        /* Print only the dimensions that are actually there */
-
-        pandecode_log_cont(": %d", t->width + 1);
-
-        if (dimension >= 2)
-                pandecode_log_cont("x%u", t->height + 1);
-
-        if (dimension >= 3)
-                pandecode_log_cont("x%u", t->depth + 1);
-
-        if (t->array_size)
-                pandecode_log_cont("[%u]", t->array_size + 1);
+        struct MALI_BIFROST_TEXTURE temp;
+        MALI_BIFROST_TEXTURE_unpack(cl, &temp);
+        MALI_BIFROST_TEXTURE_print(pandecode_dump_stream, &temp, 2);
 
-        if (t->levels)
-                pandecode_log_cont(" mip %u", t->levels);
-
-        pandecode_log_cont("\n");
-
-        struct pandecode_mapped_memory *tmem = pandecode_find_mapped_gpu_mem_containing(t->payload);
-        if (t->payload) {
-                pandecode_texture_payload(t->payload, t->type, t->layout,
-                                          true, t->levels, t->depth,
-                                          t->array_size, tmem);
-        }
-
-        pandecode_indent--;
-        pandecode_log("};\n");
+        struct pandecode_mapped_memory *tmem = pandecode_find_mapped_gpu_mem_containing(temp.surfaces);
+        pandecode_texture_payload(temp.surfaces, temp.dimension, temp.texel_ordering,
+                                  true, temp.levels, 1, 1, tmem);
 }
 
 /* For shader properties like texture_count, we have a claimed property in the shader_meta, and the actual Truth from static analysis (this may just be an upper limit). We validate accordingly */
@@ -2270,23 +2185,21 @@ pandecode_textures(mali_ptr textures, unsigned texture_count, int job_no, bool i
         if (!mmem)
                 return;
 
-        if (is_bifrost) {
-                const struct bifrost_texture_descriptor *PANDECODE_PTR_VAR(t, mmem, textures);
+        pandecode_log("Textures (%"PRIx64"):\n", textures);
 
-                pandecode_log("uint64_t textures_%"PRIx64"_%d[] = {\n", textures, job_no);
-                pandecode_indent++;
-
-                for (unsigned tex = 0; tex < texture_count; ++tex)
-                        pandecode_bifrost_texture(&t[tex], job_no, tex);
+        if (is_bifrost) {
+                const void *cl = pandecode_fetch_gpu_mem(mmem,
+                                textures, MALI_BIFROST_TEXTURE_LENGTH *
+                                texture_count);
 
-                pandecode_indent--;
-                pandecode_log("};\n");
+                for (unsigned tex = 0; tex < texture_count; ++tex) {
+                        pandecode_bifrost_texture(cl +
+                                        MALI_BIFROST_TEXTURE_LENGTH * tex,
+                                        job_no, tex);
+                }
         } else {
                 mali_ptr *PANDECODE_PTR_VAR(u, mmem, textures);
 
-                pandecode_log("uint64_t textures_%"PRIx64"_%d[] = {\n", textures, job_no);
-                pandecode_indent++;
-
                 for (int tex = 0; tex < texture_count; ++tex) {
                         mali_ptr *PANDECODE_PTR_VAR(u, mmem, textures + tex * sizeof(mali_ptr));
                         char *a = pointer_as_memory_reference(*u);
@@ -2294,9 +2207,6 @@ pandecode_textures(mali_ptr textures, unsigned texture_count, int job_no, bool i
                         free(a);
                 }
 
-                pandecode_indent--;
-                pandecode_log("};\n");
-
                 /* Now, finally, descend down into the texture descriptor */
                 for (unsigned tex = 0; tex < texture_count; ++tex) {
                         mali_ptr *PANDECODE_PTR_VAR(u, mmem, textures + tex * sizeof(mali_ptr));
index 9a847741056620a6d2816ea5e2f89c47edee7620..5a9acba2c4c90d55068972f25498fec58fe9d122 100644 (file)
     <field name="LOD bias" size="16" start="2:0" type="uint" default="0"/>
   </struct>
 
+  <struct name="Bifrost Texture" size="8">
+    <field name="Type" size="4" start="0:0" type="uint" default="2"/>
+    <field name="Dimension" size="2" start="0:4" type="Texture Dimension"/>
+    <field name="Format" size="22" start="0:10" type="uint"/>
+    <field name="Width" size="16" start="1:0" type="uint" modifier="minus(1)"/>
+    <field name="Height" size="16" start="1:16" type="uint" modifier="minus(1)"/>
+    <field name="Swizzle" size="12" start="2:0" type="uint"/>
+    <field name="Texel ordering" size="4" start="2:12" type="Texture Layout"/>
+    <field name="Levels" size="5" start="2:16" type="uint"/>
+    <field name="Minimum LOD" size="13" start="3:0" type="uint" default="0"/>
+    <field name="Maximum LOD" size="13" start="3:16" type="uint" default="0"/>
+    <field name="Surfaces" size="64" start="4:0" type="address"/>
+  </struct>
+
   <struct name="Stencil">
     <field name="Reference Value" size="8" start="0" type="uint"/>
     <field name="Mask" size="8" start="8" type="uint" default="0xFF"/>
index 335e143b2e83729fe9f819d09cf9af816f747758..fce120803ac893ab98ef84a4b4d301c5d227da1b 100644 (file)
@@ -352,7 +352,7 @@ panfrost_new_texture(
 
 void
 panfrost_new_texture_bifrost(
-        struct bifrost_texture_descriptor *descriptor,
+        struct mali_bifrost_texture_packed *out,
         uint16_t width, uint16_t height,
         uint16_t depth, uint16_t array_size,
         enum pipe_format format,
@@ -388,24 +388,22 @@ panfrost_new_texture_bifrost(
                 base,
                 slices);
 
-        descriptor->format_unk = 0x2;
-        descriptor->type = dim;
-        descriptor->format = mali_format;
-        descriptor->srgb = (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB);
-        descriptor->format_unk3 = 0x0;
-        descriptor->width = MALI_POSITIVE(u_minify(width, first_level));
-        descriptor->height = MALI_POSITIVE(u_minify(height, first_level));
-        descriptor->swizzle = swizzle;
-        descriptor->layout = panfrost_modifier_to_layout(modifier),
-        descriptor->levels = last_level - first_level;
-        descriptor->unk1 = 0x0;
-        descriptor->levels_unk = 0;
-        descriptor->level_2 = last_level - first_level;
-        descriptor->payload = payload->gpu;
-        descriptor->array_size = MALI_POSITIVE(array_size);
-        descriptor->unk4 = 0x0;
-        descriptor->depth = MALI_POSITIVE(u_minify(depth, first_level));
-        descriptor->unk5 = 0x0;
+        bool srgb = (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB);
+
+        pan_pack(out, BIFROST_TEXTURE, cfg) {
+                cfg.dimension = dim;
+                cfg.format = (mali_format << 12) | (srgb << 20);
+                cfg.width = u_minify(width, first_level);
+                cfg.height = u_minify(height, first_level);
+                cfg.swizzle = swizzle;
+                cfg.texel_ordering = panfrost_modifier_to_layout(modifier);
+                cfg.levels = last_level - first_level;
+                cfg.surfaces = payload->gpu;
+
+                /* Use the sampler descriptor for LOD clamping */
+                cfg.minimum_lod = 0;
+                cfg.maximum_lod = last_level - first_level;
+        }
 }
 
 /* Computes sizes for checksumming, which is 8 bytes per 16x16 tile.
index af12ee1ea649630d987f9c15b1dd66478cd6ffa0..4d2d5478baa6123dec62d4b02c6fd2210adb5506 100644 (file)
@@ -113,7 +113,7 @@ panfrost_new_texture(
 
 void
 panfrost_new_texture_bifrost(
-        struct bifrost_texture_descriptor *descriptor,
+        struct mali_bifrost_texture_packed *out,
         uint16_t width, uint16_t height,
         uint16_t depth, uint16_t array_size,
         enum pipe_format format,