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();
if (base_type->is_image()) {
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");
if (!base_type->is_image()) {
if (qual->flags.q.read_only ||
qual->flags.q.write_only ||
qual->flags.q.coherent ||
qual->flags.q._volatile ||
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;
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");
}
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;
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");
}
/* From page 70 of the GLSL ES 3.1 specification:
*
* "Except for image variables qualified with the format qualifiers
* r32f, r32i, and r32ui, image variables must specify either memory
* qualifier readonly or the memory qualifier writeonly."
*/
if (state->es_shader &&
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'");
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;
}
} else if (qual->flags.q.read_only ||
qual->flags.q.write_only ||
qual->flags.q.coherent ||
qual->flags.q._volatile ||
qual->flags.q.restrict_flag ||
qual->flags.q.explicit_image_format) {
_mesa_glsl_error(loc, state, "memory qualifiers may only be applied to "
"images");
/* From page 70 of the GLSL ES 3.1 specification:
*
* "Except for image variables qualified with the format qualifiers r32f,
* r32i, and r32ui, image variables must specify either memory qualifier
* readonly or the memory qualifier writeonly."
*/
if (state->es_shader &&
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'");
}
}