panfrost: Use packs for vertex built-ins
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 14 Aug 2020 17:27:51 +0000 (13:27 -0400)
committerMarge Bot <eric+marge@anholt.net>
Mon, 17 Aug 2020 11:43:52 +0000 (11:43 +0000)
These probably need a bigger cleanup at some point but let's handle one
thing at a time.

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/6326>

src/gallium/drivers/panfrost/pan_cmdstream.c
src/panfrost/lib/pan_attributes.c
src/panfrost/lib/pan_encoder.h

index ce6cb7602347fc41d48d38df40e529048810a847..4fce859797088669b949743fb04ff3afc1813b0b 100644 (file)
@@ -1460,14 +1460,14 @@ panfrost_emit_vertex_data(struct panfrost_batch *batch,
 
         /* Add special gl_VertexID/gl_InstanceID buffers */
 
-        panfrost_vertex_id(ctx->padded_count, (union mali_attr *) &bufs[k]);
+        panfrost_vertex_id(ctx->padded_count, &bufs[k], ctx->instance_count > 1);
 
         pan_pack(out + PAN_VERTEX_ID, ATTRIBUTE, cfg) {
                 cfg.buffer_index = k++;
                 cfg.format = so->formats[PAN_VERTEX_ID];
         }
 
-        panfrost_instance_id(ctx->padded_count, (union mali_attr *) &bufs[k]);
+        panfrost_instance_id(ctx->padded_count, &bufs[k], ctx->instance_count > 1);
 
         pan_pack(out + PAN_INSTANCE_ID, ATTRIBUTE, cfg) {
                 cfg.buffer_index = k++;
index acaad11ebee91109e7352e33df728691a1232255..1fe6d8cb47df6c72ff751dfef484cdc9ee4931dd 100644 (file)
@@ -135,38 +135,56 @@ panfrost_compute_magic_divisor(unsigned hw_divisor, unsigned *o_shift, unsigned
 void
 panfrost_vertex_id(
         unsigned padded_count,
-        union mali_attr *attr)
+        struct mali_attribute_buffer_packed *attr,
+        bool instanced)
 {
         /* We factor the padded count as shift/odd and that's it */
-
-        attr->elements = MALI_ATTR_VERTEXID;
-        attr->shift = __builtin_ctz(padded_count);
-        attr->extra_flags = padded_count >> (attr->shift + 1);
-        attr->stride = attr->size = 0;
+        pan_pack(attr, ATTRIBUTE_BUFFER, cfg) {
+                cfg.special = MALI_ATTRIBUTE_SPECIAL_VERTEX_ID;
+                cfg.type = 0;
+
+                if (instanced) {
+                        cfg.divisor_r = __builtin_ctz(padded_count);
+                        cfg.divisor_p = padded_count >> (cfg.divisor_r + 1);
+                } else {
+                        /* Match the blob... */
+                        cfg.divisor_r = 0x1F;
+                        cfg.divisor_p = 0x4;
+                }
+        }
 }
 
 void
 panfrost_instance_id(
         unsigned padded_count,
-        union mali_attr *attr)
+        struct mali_attribute_buffer_packed *attr,
+        bool instanced)
 {
-        attr->elements = MALI_ATTR_INSTANCEID;
-        attr->stride = 0;
-        attr->extra_flags = 0;
-        attr->size = 0;
-        
-        /* POT records have just a shift directly with an off-by-one for
-         * unclear reasons. NPOT records have a magic divisor smushed into the
-         * stride field (which is unused for these special records) */
-
-        if (util_is_power_of_two_or_zero(padded_count)) {
-                attr->shift = __builtin_ctz(padded_count) - 1;
-        } else {
-                unsigned shift = 0, flags = 0;
-
-                attr->stride = panfrost_compute_magic_divisor(padded_count, &shift, &flags);
-                attr->shift = shift;
-                attr->extra_flags = flags;
+        pan_pack(attr, ATTRIBUTE_BUFFER, cfg) {
+                cfg.special = MALI_ATTRIBUTE_SPECIAL_INSTANCE_ID;
+                cfg.type = 0;
+
+                /* POT records have just a shift directly with an off-by-one for
+                 * unclear reasons. NPOT records have a magic divisor smushed into the
+                 * stride field (which is unused for these special records) */
+
+                if (!instanced || padded_count <= 1) {
+                        /* Match the blob... */
+                        cfg.stride = ((1u << 31) - 1);
+                        cfg.divisor_r = 0x1F;
+                        cfg.divisor_e = 0x1;
+                } else if(util_is_power_of_two_or_zero(padded_count)) {
+                        /* By above, padded_count > 1 => padded_count >= 2 so
+                         * since we're a power of two, ctz(padded_count) =
+                         * log2(padded_count) >= log2(2) = 1, so
+                         * ctz(padded_count) - 1 >= 0, so this can't underflow
+                         * */
+
+                        cfg.divisor_r = __builtin_ctz(padded_count) - 1;
+                } else {
+                        cfg.stride = panfrost_compute_magic_divisor(padded_count,
+                                        &cfg.divisor_r, &cfg.divisor_e);
+                }
         }
 }
  
index 7e815a7f2c8d9eaaeaa1d1637f38f0ddc0d5b7a5..a992a4c7427fca2acb1fea10d037b5ba59da20d2 100644 (file)
@@ -95,8 +95,8 @@ panfrost_padded_vertex_count(unsigned vertex_count);
 unsigned
 panfrost_compute_magic_divisor(unsigned hw_divisor, unsigned *o_shift, unsigned *extra_flags);
 
-void panfrost_vertex_id(unsigned padded_count, union mali_attr *attr);
-void panfrost_instance_id(unsigned padded_count, union mali_attr *attr);
+void panfrost_vertex_id(unsigned padded_count, struct mali_attribute_buffer_packed *attr, bool instanced);
+void panfrost_instance_id(unsigned padded_count, struct mali_attribute_buffer_packed *attr, bool instanced);
 
 /* Samplers */