From 4c5a88d73536207db045d92871d01f28778c1c22 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 15 Sep 2021 11:39:12 -0500 Subject: [PATCH] nir: Validate image variable modes We can also significantly simplify the foreach_image_variable helper. Reviewed-by: Caio Marcelo de Oliveira Filho Part-of: --- src/compiler/nir/nir.h | 19 ++----------------- src/compiler/nir/nir_validate.c | 8 ++++++++ 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 7a93770c765..fddfce82978 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -715,26 +715,11 @@ _nir_shader_variable_has_mode(nir_variable *var, unsigned modes) #define nir_foreach_uniform_variable_safe(var, shader) \ nir_foreach_variable_with_modes_safe(var, shader, nir_var_uniform) -static inline bool -_nir_variable_is_image(const nir_variable *var) -{ - if (!glsl_type_contains_image(var->type)) - return false; - - /* GL, Vulkan, and OpenCL only allows arrays of arrays of images */ - assert(glsl_type_is_image(glsl_without_array(var->type))); - return true; -} - #define nir_foreach_image_variable(var, shader) \ - nir_foreach_variable_with_modes(var, shader, nir_var_uniform | \ - nir_var_mem_image) \ - if (_nir_variable_is_image(var)) + nir_foreach_variable_with_modes(var, shader, nir_var_mem_image) #define nir_foreach_image_variable_safe(var, shader) \ - nir_foreach_variable_with_modes_safe(var, shader, nir_var_uniform | \ - nir_var_mem_image) \ - if (_nir_variable_is_image(var)) + nir_foreach_variable_with_modes_safe(var, shader, nir_var_mem_image) static inline bool nir_variable_is_global(const nir_variable *var) diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c index cb572038837..c5283d57af7 100644 --- a/src/compiler/nir/nir_validate.c +++ b/src/compiler/nir/nir_validate.c @@ -1518,6 +1518,14 @@ validate_var_decl(nir_variable *var, nir_variable_mode valid_modes, if (var->constant_initializer) validate_constant(var->constant_initializer, var->type, state); + if (glsl_type_contains_image(var->type) && !var->data.bindless) + validate_assert(state, var->data.mode == nir_var_mem_image); + + if (var->data.mode == nir_var_mem_image) { + validate_assert(state, !var->data.bindless); + validate_assert(state, glsl_type_is_image(glsl_without_array(var->type))); + } + /* * TODO validate some things ir_validate.cpp does (requires more GLSL type * support)