v3d: Fix up VS output setup during precompiles.
authorEric Anholt <eric@anholt.net>
Thu, 3 Jan 2019 06:48:29 +0000 (22:48 -0800)
committerEric Anholt <eric@anholt.net>
Fri, 4 Jan 2019 23:41:23 +0000 (15:41 -0800)
I noticed that a VS I was debugging was missing all of its output stores
-- outputs_written was for POS, VAR0, VAR3, while the shader's variables
were POS, VAR9, and VAR12.  I'm not sure what outputs_written is supposed
to be doing here, but we can just walk the declared variables and avoid
both this bug and the emission of extra stvpms for less-than-vec4
varyings.

src/gallium/drivers/v3d/v3d_program.c

index e0a77847880b126d921ffd0ac366565ee23fd4a6..03c45fffbdb40ad20537280fc0fcc5577b7c18b7 100644 (file)
@@ -217,13 +217,17 @@ v3d_shader_precompile(struct v3d_context *v3d,
                 v3d_setup_shared_precompile_key(so, &key.base);
 
                 /* Compile VS: All outputs */
-                for (int vary = 0; vary < 64; vary++) {
-                        if (!(s->info.outputs_written & (1ull << vary)))
-                                continue;
-                        for (int i = 0; i < 4; i++) {
+                nir_foreach_variable(var, &s->outputs) {
+                        unsigned array_len = MAX2(glsl_get_length(var->type), 1);
+                        assert(array_len == 1);
+                        (void)array_len;
+
+                        int slot = var->data.location;
+                        for (int i = 0; i < glsl_get_components(var->type); i++) {
+                                int swiz = var->data.location_frac + i;
                                 key.fs_inputs[key.num_fs_inputs++] =
-                                        v3d_slot_from_slot_and_component(vary,
-                                                                         i);
+                                        v3d_slot_from_slot_and_component(slot,
+                                                                         swiz);
                         }
                 }