summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-06-28 14:47:43 -0700
committerEric Anholt <eric@anholt.net>2010-06-28 14:49:59 -0700
commitf9ffccb06bcc90c862f20f8849b824022fbeebbf (patch)
treed084dff92941419e49fd6c5685de80e5ffdde1da
parentad8ad338f45c43fe9039d0069d3f3405ede756aa (diff)
ir_to_mesa: Support user-defined varyings using the linker's locations.
Fixes glsl-reload-source.
-rw-r--r--src/mesa/shader/ir_to_mesa.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/mesa/shader/ir_to_mesa.cpp b/src/mesa/shader/ir_to_mesa.cpp
index d371e35f9c..0f035b9e0e 100644
--- a/src/mesa/shader/ir_to_mesa.cpp
+++ b/src/mesa/shader/ir_to_mesa.cpp
@@ -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,