diff options
author | Timothy Arceri <[email protected]> | 2016-06-01 09:21:01 +1000 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2016-06-01 10:33:57 +1000 |
commit | 98d40b4d1195ebfaa2fd9ed43755ca6896422c1a (patch) | |
tree | fdf3c4112de18b0a0f2bd98552fcf47a1c5cf535 /src/compiler/glsl | |
parent | c1107cec44ab030c7fcc97c67baa12df1cc9d7b5 (diff) |
Revert "glsl: fix xfb_offset unsized array validation"
This reverts commit aac90ba2920cf5ceb4df6dba776dd3952780e456.
The commit caused a regression in:
piglit.spec.glsl-1_50.compiler.gs-input-nonarray-named-block.geom
Also the CTS test it was meant to fix seems like it may be bogus.
Cc: "12.0" <[email protected]>
Diffstat (limited to 'src/compiler/glsl')
-rw-r--r-- | src/compiler/glsl/ast_to_hir.cpp | 23 | ||||
-rw-r--r-- | src/compiler/glsl/ir.cpp | 23 | ||||
-rw-r--r-- | src/compiler/glsl/ir.h | 3 | ||||
-rw-r--r-- | src/compiler/glsl/link_varyings.cpp | 23 |
4 files changed, 31 insertions, 41 deletions
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp index c0cb3d68191..400d3c4e908 100644 --- a/src/compiler/glsl/ast_to_hir.cpp +++ b/src/compiler/glsl/ast_to_hir.cpp @@ -3442,11 +3442,11 @@ apply_layout_qualifier_to_variable(const struct ast_type_qualifier *qual, if (qual->flags.q.explicit_xfb_offset) { unsigned qual_xfb_offset; unsigned component_size = var->type->contains_double() ? 8 : 4; - const glsl_type *t = get_varying_type(var, state->stage); + if (process_qualifier_constant(state, loc, "xfb_offset", qual->offset, &qual_xfb_offset) && validate_xfb_offset_qualifier(loc, state, (int) qual_xfb_offset, - t, component_size)) { + var->type, component_size)) { var->data.offset = qual_xfb_offset; var->data.explicit_xfb_offset = true; } @@ -7336,6 +7336,12 @@ ast_interface_block::hir(exec_list *instructions, packing, this->block_name); + unsigned component_size = block_type->contains_double() ? 8 : 4; + int xfb_offset = + layout.flags.q.explicit_xfb_offset ? (int) qual_xfb_offset : -1; + validate_xfb_offset_qualifier(&loc, state, xfb_offset, block_type, + component_size); + if (!state->symbols->add_interface(block_type->name, block_type, var_mode)) { YYLTYPE loc = this->get_location(); _mesa_glsl_error(&loc, state, "interface block `%s' with type `%s' " @@ -7474,13 +7480,6 @@ ast_interface_block::hir(exec_list *instructions, var_mode); } - unsigned component_size = block_type->contains_double() ? 8 : 4; - int xfb_offset = - layout.flags.q.explicit_xfb_offset ? (int) qual_xfb_offset : -1; - const glsl_type *t = get_varying_type(var, state->stage); - validate_xfb_offset_qualifier(&loc, state, xfb_offset, t, - component_size); - var->data.matrix_layout = matrix_layout == GLSL_MATRIX_LAYOUT_INHERITED ? GLSL_MATRIX_LAYOUT_COLUMN_MAJOR : matrix_layout; @@ -7531,12 +7530,6 @@ ast_interface_block::hir(exec_list *instructions, */ assert(this->array_specifier == NULL); - unsigned component_size = block_type->contains_double() ? 8 : 4; - int xfb_offset = - layout.flags.q.explicit_xfb_offset ? (int) qual_xfb_offset : -1; - validate_xfb_offset_qualifier(&loc, state, xfb_offset, block_type, - component_size); - for (unsigned i = 0; i < num_variables; i++) { ir_variable *var = new(state) ir_variable(fields[i].type, diff --git a/src/compiler/glsl/ir.cpp b/src/compiler/glsl/ir.cpp index 70859a7bd9d..5bb3ac3c214 100644 --- a/src/compiler/glsl/ir.cpp +++ b/src/compiler/glsl/ir.cpp @@ -2021,26 +2021,3 @@ mode_string(const ir_variable *var) assert(!"Should not get here."); return "invalid variable"; } - -/** - * Get the varying type stripped of the outermost array if we're processing - * a stage whose varyings are arrays indexed by a vertex number (such as - * geometry shader inputs). - */ -const glsl_type * -get_varying_type(const ir_variable *var, gl_shader_stage stage) -{ - const glsl_type *type = var->type; - - if (!var->data.patch && - ((var->data.mode == ir_var_shader_out && - stage == MESA_SHADER_TESS_CTRL) || - (var->data.mode == ir_var_shader_in && - (stage == MESA_SHADER_TESS_CTRL || stage == MESA_SHADER_TESS_EVAL || - stage == MESA_SHADER_GEOMETRY)))) { - assert(type->is_array()); - type = type->fields.array; - } - - return type; -} diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h index b1cfd526fef..e8efd27112f 100644 --- a/src/compiler/glsl/ir.h +++ b/src/compiler/glsl/ir.h @@ -2621,9 +2621,6 @@ is_gl_identifier(const char *s) return s && s[0] == 'g' && s[1] == 'l' && s[2] == '_'; } -const glsl_type * -get_varying_type(const ir_variable *var, gl_shader_stage stage); - extern "C" { #endif /* __cplusplus */ diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 34c8906db2f..7c3bedf3574 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -40,6 +40,29 @@ #include "program.h" +/** + * Get the varying type stripped of the outermost array if we're processing + * a stage whose varyings are arrays indexed by a vertex number (such as + * geometry shader inputs). + */ +static const glsl_type * +get_varying_type(const ir_variable *var, gl_shader_stage stage) +{ + const glsl_type *type = var->type; + + if (!var->data.patch && + ((var->data.mode == ir_var_shader_out && + stage == MESA_SHADER_TESS_CTRL) || + (var->data.mode == ir_var_shader_in && + (stage == MESA_SHADER_TESS_CTRL || stage == MESA_SHADER_TESS_EVAL || + stage == MESA_SHADER_GEOMETRY)))) { + assert(type->is_array()); + type = type->fields.array; + } + + return type; +} + static void create_xfb_varying_names(void *mem_ctx, const glsl_type *t, char **name, size_t name_length, unsigned *count, |