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:
parent
6bb0f75bb6
commit
d5cd4990cd
|
@ -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'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue