glsl: Handle patch qualifier on interface blocks.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Kenneth Graunke 2016-06-01 19:27:02 -07:00
parent a0b1260fe0
commit d82f8d9772
3 changed files with 16 additions and 0 deletions

View File

@ -7498,10 +7498,12 @@ ast_interface_block::hir(exec_list *instructions,
_mesa_glsl_error(&loc, state, "geometry shader inputs must be arrays");
} else if ((state->stage == MESA_SHADER_TESS_CTRL ||
state->stage == MESA_SHADER_TESS_EVAL) &&
!this->layout.flags.q.patch &&
this->array_specifier == NULL &&
var_mode == ir_var_shader_in) {
_mesa_glsl_error(&loc, state, "per-vertex tessellation shader inputs must be arrays");
} else if (state->stage == MESA_SHADER_TESS_CTRL &&
!this->layout.flags.q.patch &&
this->array_specifier == NULL &&
var_mode == ir_var_shader_out) {
_mesa_glsl_error(&loc, state, "tessellation control shader outputs must be arrays");
@ -7617,6 +7619,8 @@ ast_interface_block::hir(exec_list *instructions,
if (var_mode == ir_var_shader_in || var_mode == ir_var_uniform)
var->data.read_only = true;
var->data.patch = this->layout.flags.q.patch;
if (state->stage == MESA_SHADER_GEOMETRY && var_mode == ir_var_shader_in)
handle_geometry_shader_input_decl(state, loc, var);
else if ((state->stage == MESA_SHADER_TESS_CTRL ||

View File

@ -2758,6 +2758,17 @@ interface_qualifier:
memset(& $$, 0, sizeof($$));
$$.flags.q.buffer = 1;
}
| auxiliary_storage_qualifier interface_qualifier
{
if (!$1.flags.q.patch) {
_mesa_glsl_error(&@1, state, "invalid interface qualifier");
}
if ($2.has_auxiliary_storage()) {
_mesa_glsl_error(&@1, state, "duplicate patch qualifier");
}
$$ = $2;
$$.flags.q.patch = 1;
}
;
instance_name_opt:

View File

@ -959,6 +959,7 @@ _mesa_ast_process_interface_block(YYLTYPE *locp,
temp_type_qualifier.flags.q.in = true;
temp_type_qualifier.flags.q.out = true;
temp_type_qualifier.flags.q.buffer = true;
temp_type_qualifier.flags.q.patch = true;
interface_type_mask = temp_type_qualifier.flags.i;
/* Get the block's interface qualifier. The interface_qualifier