glsl: simplify apply_image_qualifier_to_variable()

This removes one level of indentation and will improve readability
for bindless images.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Samuel Pitoiset 2017-04-12 14:36:32 +02:00
parent 6bb0f75bb6
commit d5cd4990cd
1 changed files with 61 additions and 62 deletions

View File

@ -3303,74 +3303,73 @@ 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 (base_type->is_image()) { if (!base_type->is_image()) {
if (var->data.mode != ir_var_uniform && if (qual->flags.q.read_only ||
var->data.mode != ir_var_function_in) { qual->flags.q.write_only ||
_mesa_glsl_error(loc, state, "image variables may only be declared as " qual->flags.q.coherent ||
"function parameters or uniform-qualified " qual->flags.q._volatile ||
"global variables"); qual->flags.q.restrict_flag ||
qual->flags.q.explicit_image_format) {
_mesa_glsl_error(loc, state, "memory qualifiers may only be applied "
"to images");
}
return;
}
if (var->data.mode != ir_var_uniform &&
var->data.mode != ir_var_function_in) {
_mesa_glsl_error(loc, state, "image variables may only be declared as "
"function parameters or uniform-qualified "
"global variables");
}
var->data.image_read_only |= qual->flags.q.read_only;
var->data.image_write_only |= qual->flags.q.write_only;
var->data.image_coherent |= qual->flags.q.coherent;
var->data.image_volatile |= qual->flags.q._volatile;
var->data.image_restrict |= qual->flags.q.restrict_flag;
var->data.read_only = true;
if (qual->flags.q.explicit_image_format) {
if (var->data.mode == ir_var_function_in) {
_mesa_glsl_error(loc, state, "format qualifiers cannot be used on "
"image function parameters");
} }
var->data.image_read_only |= qual->flags.q.read_only; if (qual->image_base_type != base_type->sampled_type) {
var->data.image_write_only |= qual->flags.q.write_only; _mesa_glsl_error(loc, state, "format qualifier doesn't match the base "
var->data.image_coherent |= qual->flags.q.coherent; "data type of the image");
var->data.image_volatile |= qual->flags.q._volatile;
var->data.image_restrict |= qual->flags.q.restrict_flag;
var->data.read_only = true;
if (qual->flags.q.explicit_image_format) {
if (var->data.mode == ir_var_function_in) {
_mesa_glsl_error(loc, state, "format qualifiers cannot be "
"used on image function parameters");
}
if (qual->image_base_type != base_type->sampled_type) {
_mesa_glsl_error(loc, state, "format qualifier doesn't match the "
"base data type of the image");
}
var->data.image_format = qual->image_format;
} else {
if (var->data.mode == ir_var_uniform) {
if (state->es_shader) {
_mesa_glsl_error(loc, state, "all image uniforms "
"must have a format layout qualifier");
} else if (!qual->flags.q.write_only) {
_mesa_glsl_error(loc, state, "image uniforms not qualified with "
"`writeonly' must have a format layout "
"qualifier");
}
}
var->data.image_format = GL_NONE;
} }
/* From page 70 of the GLSL ES 3.1 specification: var->data.image_format = qual->image_format;
* } else {
* "Except for image variables qualified with the format qualifiers if (var->data.mode == ir_var_uniform) {
* r32f, r32i, and r32ui, image variables must specify either memory if (state->es_shader) {
* qualifier readonly or the memory qualifier writeonly." _mesa_glsl_error(loc, state, "all image uniforms must have a "
*/ "format layout qualifier");
if (state->es_shader && } else if (!qual->flags.q.write_only) {
var->data.image_format != GL_R32F && _mesa_glsl_error(loc, state, "image uniforms not qualified with "
var->data.image_format != GL_R32I && "`writeonly' must have a format layout qualifier");
var->data.image_format != GL_R32UI && }
!var->data.image_read_only &&
!var->data.image_write_only) {
_mesa_glsl_error(loc, state, "image variables of format other than "
"r32f, r32i or r32ui must be qualified `readonly' or "
"`writeonly'");
} }
var->data.image_format = GL_NONE;
}
} else if (qual->flags.q.read_only || /* From page 70 of the GLSL ES 3.1 specification:
qual->flags.q.write_only || *
qual->flags.q.coherent || * "Except for image variables qualified with the format qualifiers r32f,
qual->flags.q._volatile || * r32i, and r32ui, image variables must specify either memory qualifier
qual->flags.q.restrict_flag || * readonly or the memory qualifier writeonly."
qual->flags.q.explicit_image_format) { */
_mesa_glsl_error(loc, state, "memory qualifiers may only be applied to " if (state->es_shader &&
"images"); var->data.image_format != GL_R32F &&
var->data.image_format != GL_R32I &&
var->data.image_format != GL_R32UI &&
!var->data.image_read_only &&
!var->data.image_write_only) {
_mesa_glsl_error(loc, state, "image variables of format other than r32f, "
"r32i or r32ui must be qualified `readonly' or "
"`writeonly'");
} }
} }