diff options
author | Eric Anholt <eric@anholt.net> | 2010-06-28 14:47:43 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-06-28 14:49:59 -0700 |
commit | f9ffccb06bcc90c862f20f8849b824022fbeebbf (patch) | |
tree | d084dff92941419e49fd6c5685de80e5ffdde1da | |
parent | ad8ad338f45c43fe9039d0069d3f3405ede756aa (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.cpp | 30 |
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, |