glsl: rework validate_image_qualifier_for_type()

It makes more sense to have two separate validate functions,
mainly because memory qualifiers are allowed with members of
shader storage blocks.

validate_memory_qualifier_for_type() will be fixed in a
separate patch.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Samuel Pitoiset
2017-05-01 12:34:41 +02:00
parent a5f82db380
commit 9efea874b9

View File

@@ -3293,10 +3293,10 @@ apply_explicit_location(const struct ast_type_qualifier *qual,
} }
static bool static bool
validate_image_qualifier_for_type(struct _mesa_glsl_parse_state *state, validate_memory_qualifier_for_type(struct _mesa_glsl_parse_state *state,
YYLTYPE *loc, YYLTYPE *loc,
const struct ast_type_qualifier *qual, const struct ast_type_qualifier *qual,
const glsl_type *type) const glsl_type *type)
{ {
if (!type->is_image()) { if (!type->is_image()) {
if (qual->flags.q.read_only || if (qual->flags.q.read_only ||
@@ -3306,12 +3306,26 @@ validate_image_qualifier_for_type(struct _mesa_glsl_parse_state *state,
qual->flags.q.restrict_flag) { qual->flags.q.restrict_flag) {
_mesa_glsl_error(loc, state, "memory qualifiers may only be applied " _mesa_glsl_error(loc, state, "memory qualifiers may only be applied "
"to images"); "to images");
return false;
} }
}
return true;
}
if (qual->flags.q.explicit_image_format) { static bool
_mesa_glsl_error(loc, state, "format layout qualifiers may only be " validate_image_format_qualifier_for_type(struct _mesa_glsl_parse_state *state,
"applied to images"); YYLTYPE *loc,
} const struct ast_type_qualifier *qual,
const glsl_type *type)
{
/* From section 4.4.6.2 (Format Layout Qualifiers) of the GLSL 4.50 spec:
*
* "Format layout qualifiers can be used on image variable declarations
* (those declared with a basic type having “image ” in its keyword)."
*/
if (!type->is_image() && qual->flags.q.explicit_image_format) {
_mesa_glsl_error(loc, state, "format layout qualifiers may only be "
"applied to images");
return false; return false;
} }
return true; return true;
@@ -3325,7 +3339,11 @@ apply_image_qualifier_to_variable(const struct ast_type_qualifier *qual,
{ {
const glsl_type *base_type = var->type->without_array(); const glsl_type *base_type = var->type->without_array();
if (!validate_image_qualifier_for_type(state, loc, qual, base_type)) if (!validate_image_format_qualifier_for_type(state, loc, qual, base_type) ||
!validate_memory_qualifier_for_type(state, loc, qual, base_type))
return;
if (!base_type->is_image())
return; return;
if (var->data.mode != ir_var_uniform && if (var->data.mode != ir_var_uniform &&