panfrost: Use pack for general varying
[mesa.git] / src / gallium / drivers / panfrost / pan_cmdstream.c
index 0ca9439b798cd5992ce65042bb7051c334d6ee30..376705fc844ceec6963debf1d2bb978dce500165 100644 (file)
@@ -1704,8 +1704,9 @@ pan_varying_present(
 
 /* Emitters for varying records */
 
-static struct mali_attr_meta
-pan_emit_vary(unsigned present, enum pan_special_varying buf,
+static void
+pan_emit_vary(struct mali_attribute_packed *out,
+                unsigned present, enum pan_special_varying buf,
                 unsigned quirks, enum mali_format format,
                 unsigned offset)
 {
@@ -1714,22 +1715,21 @@ pan_emit_vary(unsigned present, enum pan_special_varying buf,
                         panfrost_get_default_swizzle(nr_channels) :
                         panfrost_bifrost_swizzle(nr_channels);
 
-        struct mali_attr_meta meta = {
-                .index = pan_varying_index(present, buf),
-                .unknown1 = quirks & IS_BIFROST ? 0x0 : 0x2,
-                .format = (format << 12) | swizzle,
-                .src_offset = offset
-        };
-
-        return meta;
+        pan_pack(out, ATTRIBUTE, cfg) {
+                cfg.buffer_index = pan_varying_index(present, buf);
+                cfg.unknown = quirks & IS_BIFROST ? 0x0 : 0x1;
+                cfg.format = (format << 12) | swizzle;
+                cfg.offset = offset;
+        }
 }
 
 /* General varying that is unused */
 
-static struct mali_attr_meta
-pan_emit_vary_only(unsigned present, unsigned quirks)
+static void
+pan_emit_vary_only(struct mali_attribute_packed *out,
+                unsigned present, unsigned quirks)
 {
-        return pan_emit_vary(present, 0, quirks, MALI_VARYING_DISCARD, 0);
+        pan_emit_vary(out, present, 0, quirks, MALI_VARYING_DISCARD, 0);
 }
 
 /* Special records */
@@ -1742,12 +1742,13 @@ static const enum mali_format pan_varying_formats[PAN_VARY_MAX] = {
         [PAN_VARY_FRAGCOORD]    = MALI_RGBA32F
 };
 
-static struct mali_attr_meta
-pan_emit_vary_special(unsigned present, enum pan_special_varying buf,
+static void
+pan_emit_vary_special(struct mali_attribute_packed *out,
+                unsigned present, enum pan_special_varying buf,
                 unsigned quirks)
 {
         assert(buf < PAN_VARY_MAX);
-        return pan_emit_vary(present, buf, quirks, pan_varying_formats[buf], 0);
+        pan_emit_vary(out, present, buf, quirks, pan_varying_formats[buf], 0);
 }
 
 static enum mali_format
@@ -1763,8 +1764,9 @@ pan_xfb_format(enum mali_format format, unsigned nr)
  * a bitfield) 32-bit, smaller than a 64-bit pointer, so may as well pass by
  * value. */
 
-static struct mali_attr_meta
-pan_emit_vary_xfb(unsigned present,
+static void
+pan_emit_vary_xfb(struct mali_attribute_packed *out,
+                unsigned present,
                 unsigned max_xfb,
                 unsigned *streamout_offsets,
                 unsigned quirks,
@@ -1775,23 +1777,18 @@ pan_emit_vary_xfb(unsigned present,
                         panfrost_get_default_swizzle(o.num_components) :
                         panfrost_bifrost_swizzle(o.num_components);
 
-        /* Otherwise construct a record for it */
-        struct mali_attr_meta meta = {
+        pan_pack(out, ATTRIBUTE, cfg) {
                 /* XFB buffers come after everything else */
-                .index = pan_xfb_base(present) + o.output_buffer,
-
-                /* As usual unknown bit */
-                .unknown1 = quirks & IS_BIFROST ? 0x0 : 0x2,
+                cfg.buffer_index = pan_xfb_base(present) + o.output_buffer;
+                cfg.unknown = quirks & IS_BIFROST ? 0x0 : 0x1;
 
                 /* Override number of channels and precision to highp */
-                .format = (pan_xfb_format(format, o.num_components) << 12) | swizzle,
+                cfg.format = (pan_xfb_format(format, o.num_components) << 12) | swizzle;
 
                 /* Apply given offsets together */
-                .src_offset = (o.dst_offset * 4) /* dwords */
-                        + streamout_offsets[o.output_buffer]
-        };
-
-        return meta;
+                cfg.offset = (o.dst_offset * 4) /* dwords */
+                        + streamout_offsets[o.output_buffer];
+        }
 }
 
 /* Determine if we should capture a varying for XFB. This requires actually
@@ -1809,51 +1806,21 @@ panfrost_xfb_captured(struct panfrost_shader_state *xfb,
         return o->output_buffer < max_xfb;
 }
 
-/* Higher-level wrapper around all of the above, classifying a varying into one
- * of the above types */
-
-static struct mali_attr_meta
-panfrost_emit_varying(
-                struct panfrost_shader_state *stage,
+static void
+pan_emit_general_varying(struct mali_attribute_packed *out,
                 struct panfrost_shader_state *other,
                 struct panfrost_shader_state *xfb,
+                gl_varying_slot loc,
+                enum mali_format format,
                 unsigned present,
-                unsigned max_xfb,
-                unsigned *streamout_offsets,
                 unsigned quirks,
                 unsigned *gen_offsets,
                 enum mali_format *gen_formats,
                 unsigned *gen_stride,
                 unsigned idx,
-                bool should_alloc,
-                bool is_fragment)
+                bool should_alloc)
 {
-        gl_varying_slot loc = stage->varyings_loc[idx];
-        enum mali_format format = stage->varyings[idx];
-
-        /* Override format to match linkage */
-        if (!should_alloc && gen_formats[idx])
-                format = gen_formats[idx];
-
-        if (has_point_coord(stage->point_sprite_mask, loc)) {
-                return pan_emit_vary_special(present, PAN_VARY_PNTCOORD, quirks);
-        } else if (panfrost_xfb_captured(xfb, loc, max_xfb)) {
-                struct pipe_stream_output *o = pan_get_so(&xfb->stream_output, loc);
-                return pan_emit_vary_xfb(present, max_xfb, streamout_offsets, quirks, format, *o);
-        } else if (loc == VARYING_SLOT_POS) {
-                if (is_fragment)
-                        return pan_emit_vary_special(present, PAN_VARY_FRAGCOORD, quirks);
-                else
-                        return pan_emit_vary_special(present, PAN_VARY_POSITION, quirks);
-        } else if (loc == VARYING_SLOT_PSIZ) {
-                return pan_emit_vary_special(present, PAN_VARY_PSIZ, quirks);
-        } else if (loc == VARYING_SLOT_PNTC) {
-                return pan_emit_vary_special(present, PAN_VARY_PNTCOORD, quirks);
-        } else if (loc == VARYING_SLOT_FACE) {
-                return pan_emit_vary_special(present, PAN_VARY_FACE, quirks);
-        }
-
-        /* We've exhausted special cases, so it's otherwise a general varying. Check if we're linked */
+        /* Check if we're linked */
         signed other_idx = -1;
 
         for (unsigned j = 0; j < other->varying_count; ++j) {
@@ -1863,8 +1830,10 @@ panfrost_emit_varying(
                 }
         }
 
-        if (other_idx < 0)
-                return pan_emit_vary_only(present, quirks);
+        if (other_idx < 0) {
+                pan_emit_vary_only(out, present, quirks);
+                return;
+        }
 
         unsigned offset = gen_offsets[other_idx];
 
@@ -1896,8 +1865,57 @@ panfrost_emit_varying(
                 *gen_stride += size;
         }
 
-        return pan_emit_vary(present, PAN_VARY_GENERAL,
-                        quirks, format, offset);
+        pan_emit_vary(out, present, PAN_VARY_GENERAL, quirks, format, offset);
+}
+
+/* Higher-level wrapper around all of the above, classifying a varying into one
+ * of the above types */
+
+static void
+panfrost_emit_varying(
+                struct mali_attribute_packed *out,
+                struct panfrost_shader_state *stage,
+                struct panfrost_shader_state *other,
+                struct panfrost_shader_state *xfb,
+                unsigned present,
+                unsigned max_xfb,
+                unsigned *streamout_offsets,
+                unsigned quirks,
+                unsigned *gen_offsets,
+                enum mali_format *gen_formats,
+                unsigned *gen_stride,
+                unsigned idx,
+                bool should_alloc,
+                bool is_fragment)
+{
+        gl_varying_slot loc = stage->varyings_loc[idx];
+        enum mali_format format = stage->varyings[idx];
+
+        /* Override format to match linkage */
+        if (!should_alloc && gen_formats[idx])
+                format = gen_formats[idx];
+
+        if (has_point_coord(stage->point_sprite_mask, loc)) {
+                pan_emit_vary_special(out, present, PAN_VARY_PNTCOORD, quirks);
+        } else if (panfrost_xfb_captured(xfb, loc, max_xfb)) {
+                struct pipe_stream_output *o = pan_get_so(&xfb->stream_output, loc);
+                pan_emit_vary_xfb(out, present, max_xfb, streamout_offsets, quirks, format, *o);
+        } else if (loc == VARYING_SLOT_POS) {
+                if (is_fragment)
+                        pan_emit_vary_special(out, present, PAN_VARY_FRAGCOORD, quirks);
+                else
+                        pan_emit_vary_special(out, present, PAN_VARY_POSITION, quirks);
+        } else if (loc == VARYING_SLOT_PSIZ) {
+                pan_emit_vary_special(out, present, PAN_VARY_PSIZ, quirks);
+        } else if (loc == VARYING_SLOT_PNTC) {
+                pan_emit_vary_special(out, present, PAN_VARY_PNTCOORD, quirks);
+        } else if (loc == VARYING_SLOT_FACE) {
+                pan_emit_vary_special(out, present, PAN_VARY_FACE, quirks);
+        } else {
+                pan_emit_general_varying(out, other, xfb, loc, format, present,
+                                quirks, gen_offsets, gen_formats, gen_stride,
+                                idx, should_alloc);
+        }
 }
 
 static void
@@ -1968,18 +1986,18 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch,
                                         ctx->streamout.targets[i]);
         }
 
-        struct mali_attr_meta *ovs = (struct mali_attr_meta *)trans.cpu;
-        struct mali_attr_meta *ofs = ovs + vs->varying_count;
+        struct mali_attribute_packed *ovs = (struct mali_attribute_packed *)trans.cpu;
+        struct mali_attribute_packed *ofs = ovs + vs->varying_count;
 
         for (unsigned i = 0; i < vs->varying_count; i++) {
-                ovs[i] = panfrost_emit_varying(vs, fs, vs, present,
+                panfrost_emit_varying(ovs + i, vs, fs, vs, present,
                                 ctx->streamout.num_targets, streamout_offsets,
                                 dev->quirks,
                                 gen_offsets, gen_formats, &gen_stride, i, true, false);
         }
 
         for (unsigned i = 0; i < fs->varying_count; i++) {
-                ofs[i] = panfrost_emit_varying(fs, vs, vs, present,
+                panfrost_emit_varying(ofs + i, fs, vs, vs, present,
                                 ctx->streamout.num_targets, streamout_offsets,
                                 dev->quirks,
                                 gen_offsets, gen_formats, &gen_stride, i, false, true);