vc4: Initialize undefined temporaries to 0.
authorEric Anholt <eric@anholt.net>
Thu, 9 Oct 2014 15:49:23 +0000 (17:49 +0200)
committerEric Anholt <eric@anholt.net>
Thu, 9 Oct 2014 19:47:06 +0000 (21:47 +0200)
Under the simulator, reading registers before writing them triggers an
assertion failure.  c->undef gets treated as r0, which will usually be
written, but not if it's used in the first instruction.  We should
definitely not be aborting in this case, and return some sort of undefined
value instead.

Fixes glsl-user-varying-ff.

src/gallium/drivers/vc4/vc4_program.c

index 93f99566c5229a613f31630a2fd487917a1876aa..ec66dae78614dd9f6c9034363e717338b1cc779d 100644 (file)
@@ -957,10 +957,15 @@ emit_tgsi_declaration(struct vc4_compile *c,
                       struct tgsi_full_declaration *decl)
 {
         switch (decl->Declaration.File) {
-        case TGSI_FILE_TEMPORARY:
+        case TGSI_FILE_TEMPORARY: {
+                uint32_t old_size = c->temps_array_size;
                 resize_qreg_array(c, &c->temps, &c->temps_array_size,
                                   (decl->Range.Last + 1) * 4);
+
+                for (int i = old_size; i < c->temps_array_size; i++)
+                        c->temps[i] = qir_uniform_ui(c, 0);
                 break;
+        }
 
         case TGSI_FILE_INPUT:
                 resize_qreg_array(c, &c->inputs, &c->inputs_array_size,