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:
@@ -7498,10 +7498,12 @@ ast_interface_block::hir(exec_list *instructions,
|
|||||||
_mesa_glsl_error(&loc, state, "geometry shader inputs must be arrays");
|
_mesa_glsl_error(&loc, state, "geometry shader inputs must be arrays");
|
||||||
} else if ((state->stage == MESA_SHADER_TESS_CTRL ||
|
} else if ((state->stage == MESA_SHADER_TESS_CTRL ||
|
||||||
state->stage == MESA_SHADER_TESS_EVAL) &&
|
state->stage == MESA_SHADER_TESS_EVAL) &&
|
||||||
|
!this->layout.flags.q.patch &&
|
||||||
this->array_specifier == NULL &&
|
this->array_specifier == NULL &&
|
||||||
var_mode == ir_var_shader_in) {
|
var_mode == ir_var_shader_in) {
|
||||||
_mesa_glsl_error(&loc, state, "per-vertex tessellation shader inputs must be arrays");
|
_mesa_glsl_error(&loc, state, "per-vertex tessellation shader inputs must be arrays");
|
||||||
} else if (state->stage == MESA_SHADER_TESS_CTRL &&
|
} else if (state->stage == MESA_SHADER_TESS_CTRL &&
|
||||||
|
!this->layout.flags.q.patch &&
|
||||||
this->array_specifier == NULL &&
|
this->array_specifier == NULL &&
|
||||||
var_mode == ir_var_shader_out) {
|
var_mode == ir_var_shader_out) {
|
||||||
_mesa_glsl_error(&loc, state, "tessellation control shader outputs must be arrays");
|
_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)
|
if (var_mode == ir_var_shader_in || var_mode == ir_var_uniform)
|
||||||
var->data.read_only = true;
|
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)
|
if (state->stage == MESA_SHADER_GEOMETRY && var_mode == ir_var_shader_in)
|
||||||
handle_geometry_shader_input_decl(state, loc, var);
|
handle_geometry_shader_input_decl(state, loc, var);
|
||||||
else if ((state->stage == MESA_SHADER_TESS_CTRL ||
|
else if ((state->stage == MESA_SHADER_TESS_CTRL ||
|
||||||
|
@@ -2758,6 +2758,17 @@ interface_qualifier:
|
|||||||
memset(& $$, 0, sizeof($$));
|
memset(& $$, 0, sizeof($$));
|
||||||
$$.flags.q.buffer = 1;
|
$$.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:
|
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.in = true;
|
||||||
temp_type_qualifier.flags.q.out = true;
|
temp_type_qualifier.flags.q.out = true;
|
||||||
temp_type_qualifier.flags.q.buffer = true;
|
temp_type_qualifier.flags.q.buffer = true;
|
||||||
|
temp_type_qualifier.flags.q.patch = true;
|
||||||
interface_type_mask = temp_type_qualifier.flags.i;
|
interface_type_mask = temp_type_qualifier.flags.i;
|
||||||
|
|
||||||
/* Get the block's interface qualifier. The interface_qualifier
|
/* Get the block's interface qualifier. The interface_qualifier
|
||||||
|
Reference in New Issue
Block a user