ir_to_mesa: Support user-defined varyings using the linker's locations.
authorEric Anholt <eric@anholt.net>
Mon, 28 Jun 2010 21:47:43 +0000 (14:47 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 28 Jun 2010 21:49:59 +0000 (14:49 -0700)
Fixes glsl-reload-source.

src/mesa/shader/ir_to_mesa.cpp

index d371e35f9cfc2b0594cec202b19f8637247a3759..0f035b9e0e9e7a533dc8c0ba51bd3af7ce9e9f61 100644 (file)
@@ -929,15 +929,29 @@ ir_to_mesa_visitor::visit(ir_dereference_variable *ir)
                !(var_in ^ in))
               break;
         }
-        if (i == ARRAY_SIZE(builtin_var_to_mesa_reg)) {
-           printf("Failed to find builtin for %s variable %s\n",
-                  var_in ? "in" : "out",
-                  ir->var->name);
-           abort();
+        if (i != ARRAY_SIZE(builtin_var_to_mesa_reg)) {
+           entry = new(mem_ctx) temp_entry(ir->var,
+                                           builtin_var_to_mesa_reg[i].file,
+                                           builtin_var_to_mesa_reg[i].index);
+           break;
         }
-        entry = new(mem_ctx) temp_entry(ir->var,
-                                        builtin_var_to_mesa_reg[i].file,
-                                        builtin_var_to_mesa_reg[i].index);
+
+        /* If no builtin, then it's a user-generated varying
+         * (FINISHME: or a function argument!)
+         */
+        /* The linker-assigned location is VERT_RESULT_* or FRAG_ATTRIB*
+         */
+        assert(ir->var->location != -1);
+        if (var_in) {
+           entry = new(mem_ctx) temp_entry(ir->var,
+                                           PROGRAM_INPUT,
+                                           ir->var->location);
+        } else {
+           entry = new(mem_ctx) temp_entry(ir->var,
+                                           PROGRAM_OUTPUT,
+                                           ir->var->location);
+        }
+
         break;
       case ir_var_auto:
         entry = new(mem_ctx) temp_entry(ir->var, PROGRAM_TEMPORARY,