summaryrefslogtreecommitdiffstats
path: root/src/panfrost/pandecode/decode.c
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2019-12-19 12:28:42 -0500
committerAlyssa Rosenzweig <[email protected]>2019-12-24 22:54:58 -0500
commit3b3d9653a7e7971a754f8debb8b6680f36e88953 (patch)
treef537983bd693104855864898bcea0c611c756fc3 /src/panfrost/pandecode/decode.c
parentd36ca7c0a38dcae2e63296b38558844084e21d5d (diff)
pan/decode: Handle gl_VertexID/gl_InstanceID
Just like varyings have special records for point coordinates (etc), attributes have special records for vertex/instance ID. We can parse these fairly easily, although they don't line up exactly with normal attribute records. Signed-off-by: Alyssa Rosenzweig <[email protected]>
Diffstat (limited to 'src/panfrost/pandecode/decode.c')
-rw-r--r--src/panfrost/pandecode/decode.c61
1 files changed, 42 insertions, 19 deletions
diff --git a/src/panfrost/pandecode/decode.c b/src/panfrost/pandecode/decode.c
index 5e270f2d93b..73f26402cb0 100644
--- a/src/panfrost/pandecode/decode.c
+++ b/src/panfrost/pandecode/decode.c
@@ -441,9 +441,15 @@ static char *pandecode_attr_mode_short(enum mali_attr_mode mode)
}
static const char *
-pandecode_special_varying(uint64_t v)
+pandecode_special_record(uint64_t v, bool* attribute)
{
switch(v) {
+ case MALI_ATTR_VERTEXID:
+ *attribute = true;
+ return "gl_VertexID";
+ case MALI_ATTR_INSTANCEID:
+ *attribute = true;
+ return "gl_InstanceID";
case MALI_VARYING_FRAG_COORD:
return "gl_FragCoord";
case MALI_VARYING_FRONT_FACING:
@@ -451,7 +457,7 @@ pandecode_special_varying(uint64_t v)
case MALI_VARYING_POINT_COORD:
return "gl_PointCoord";
default:
- pandecode_msg("XXX: invalid special varying %" PRIx64 "\n", v);
+ pandecode_msg("XXX: invalid special record %" PRIx64 "\n", v);
return "";
}
}
@@ -1334,27 +1340,44 @@ pandecode_attributes(const struct pandecode_mapped_memory *mem,
for (int i = 0; i < count; ++i) {
/* First, check for special records */
- if (attr[i].elements < MALI_VARYING_SPECIAL) {
- /* Special records are always varyings */
+ if (attr[i].elements < MALI_RECORD_SPECIAL) {
+ if (attr[i].size)
+ pandecode_msg("XXX: tripped size=%d\n", attr[i].size);
+
+ if (attr[i].stride) {
+ /* gl_InstanceID passes a magic divisor in the
+ * stride field to divide by the padded vertex
+ * count. No other records should do so, so
+ * stride should otherwise be zero. Note that
+ * stride in the usual attribute sense doesn't
+ * apply to special records. */
+
+ bool has_divisor = attr[i].elements == MALI_ATTR_INSTANCEID;
+
+ pandecode_log_cont("/* %smagic divisor = %X */ ",
+ has_divisor ? "" : "XXX: ", attr[i].stride);
+ }
- if (!varying)
- pandecode_msg("XXX: Special varying in attribute field\n");
+ if (attr[i].shift || attr[i].extra_flags) {
+ /* Attributes use these fields for
+ * instancing/padding/etc type issues, but
+ * varyings don't */
- if (job_type != JOB_TYPE_TILER)
- pandecode_msg("XXX: Special varying in non-FS\n");
+ pandecode_log_cont("/* %sshift=%d, extra=%d */ ",
+ varying ? "XXX: " : "",
+ attr[i].shift, attr[i].extra_flags);
+ }
- /* We're special, so all fields should be zero */
- unsigned zero = attr[i].stride | attr[i].size;
- zero |= attr[i].shift | attr[i].extra_flags;
+ /* Print the special record name */
+ bool attribute = false;
+ pandecode_log("%s_%d = %s;\n", prefix, i, pandecode_special_record(attr[i].elements, &attribute));
- if (zero)
- pandecode_msg("XXX: Special varying has non-zero fields\n");
- else {
- /* Print the special varying name */
- pandecode_log("varying_%d = %s;", i, pandecode_special_varying(attr[i].elements));
- continue;
- }
- }
+ /* Sanity check */
+ if (attribute == varying)
+ pandecode_msg("XXX: mismatched special record\n");
+
+ continue;
+ }
enum mali_attr_mode mode = attr[i].elements & 7;