diff options
author | Paul Berry <[email protected]> | 2013-09-28 10:04:41 -0700 |
---|---|---|
committer | Paul Berry <[email protected]> | 2013-10-10 14:27:38 -0700 |
commit | 84b9fa83a07552ff0c0f7b2ea6386377334289ef (patch) | |
tree | 55220b3987bb98e4dccc605aaef2c250db945e14 /src | |
parent | fc2330b0be3d8461abc0a1a12a40df2c0bf831b8 (diff) |
glsl: Support redeclaration of GS gl_PerVertex input.
Fixes piglit test
spec/glsl-1.50/execution/redeclare-pervertex-subset-vs-to-gs.
Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/ast_to_hir.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 3c788de6f53..d64d5480bfe 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -4724,6 +4724,19 @@ ast_interface_block::hir(exec_list *instructions, */ return NULL; } + + /* Copy locations from the old gl_PerVertex interface block. */ + for (unsigned i = 0; i < num_variables; i++) { + int j = earlier_per_vertex->field_index(fields[i].name); + if (j == -1) { + _mesa_glsl_error(&loc, state, + "redeclaration of gl_PerVertex must be a subset " + "of the built-in members of gl_PerVertex"); + } else { + fields[i].location = + earlier_per_vertex->fields.structure[j].location; + } + } } const glsl_type *block_type = @@ -4814,8 +4827,14 @@ ast_interface_block::hir(exec_list *instructions, if (state->target == geometry_shader && var_mode == ir_var_shader_in) handle_geometry_shader_input_decl(state, loc, var); - if (state->symbols->get_variable(this->instance_name)) { - _mesa_glsl_error(&loc, state, "`%s' redeclared", this->instance_name); + if (ir_variable *earlier = + state->symbols->get_variable(this->instance_name)) { + if (!redeclaring_per_vertex) { + _mesa_glsl_error(&loc, state, "`%s' redeclared", + this->instance_name); + } + earlier->type = var->type; + earlier->reinit_interface_type(block_type); delete var; } else { state->symbols->add_variable(var); |