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:
parent
a0b1260fe0
commit
d82f8d9772
|
@ -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 ||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue