Note these are a bit uglier, due to avoidance of GNU C extensions. But drivers which do not need to be built with compilers that don't support the extension can wrap these macros with their own. Signed-off-by: Rob Clark <robclark@freedesktop.org> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>tags/11.2-branchpoint
@@ -1903,12 +1903,46 @@ nir_shader * nir_shader_clone(void *mem_ctx, const nir_shader *s); | |||
void nir_validate_shader(nir_shader *shader); | |||
void nir_metadata_set_validation_flag(nir_shader *shader); | |||
void nir_metadata_check_validation_flag(nir_shader *shader); | |||
#include "util/debug.h" | |||
static inline bool | |||
should_clone_nir(void) | |||
{ | |||
static int should_clone = -1; | |||
if (should_clone < 0) | |||
should_clone = env_var_as_boolean("NIR_TEST_CLONE", false); | |||
return should_clone; | |||
} | |||
#else | |||
static inline void nir_validate_shader(nir_shader *shader) { (void) shader; } | |||
static inline void nir_metadata_set_validation_flag(nir_shader *shader) { (void) shader; } | |||
static inline void nir_metadata_check_validation_flag(nir_shader *shader) { (void) shader; } | |||
static inline bool should_clone_nir(void) { return false; } | |||
#endif /* DEBUG */ | |||
#define _PASS(nir, do_pass) do { \ | |||
do_pass \ | |||
nir_validate_shader(nir); \ | |||
if (should_clone_nir()) { \ | |||
nir_shader *clone = nir_shader_clone(ralloc_parent(nir), nir); \ | |||
ralloc_free(nir); \ | |||
nir = clone; \ | |||
} \ | |||
} while (0) | |||
#define NIR_PASS(progress, nir, pass, ...) _PASS(nir, \ | |||
nir_metadata_set_validation_flag(nir); \ | |||
if (pass(nir, ##__VA_ARGS__)) { \ | |||
progress = true; \ | |||
nir_metadata_check_validation_flag(nir); \ | |||
} \ | |||
) | |||
#define NIR_PASS_V(nir, pass, ...) _PASS(nir, \ | |||
pass(nir, ##__VA_ARGS__); \ | |||
) | |||
void nir_calc_dominance_impl(nir_function_impl *impl); | |||
void nir_calc_dominance(nir_shader *shader); | |||
@@ -405,42 +405,15 @@ brw_nir_lower_uniforms(nir_shader *nir, bool is_scalar) | |||
} | |||
} | |||
#include "util/debug.h" | |||
static bool | |||
should_clone_nir() | |||
{ | |||
static int should_clone = -1; | |||
if (should_clone < 1) | |||
should_clone = env_var_as_boolean("NIR_TEST_CLONE", false); | |||
return should_clone; | |||
} | |||
#define _OPT(do_pass) (({ \ | |||
bool this_progress = true; \ | |||
do_pass \ | |||
nir_validate_shader(nir); \ | |||
if (should_clone_nir()) { \ | |||
nir_shader *clone = nir_shader_clone(ralloc_parent(nir), nir); \ | |||
ralloc_free(nir); \ | |||
nir = clone; \ | |||
} \ | |||
this_progress; \ | |||
})) | |||
#define OPT(pass, ...) _OPT( \ | |||
nir_metadata_set_validation_flag(nir); \ | |||
this_progress = pass(nir ,##__VA_ARGS__); \ | |||
if (this_progress) { \ | |||
progress = true; \ | |||
nir_metadata_check_validation_flag(nir); \ | |||
} \ | |||
) | |||
#define OPT_V(pass, ...) _OPT( \ | |||
pass(nir, ##__VA_ARGS__); \ | |||
) | |||
#define OPT(pass, ...) ({ \ | |||
bool this_progress = false; \ | |||
NIR_PASS(this_progress, nir, pass, ##__VA_ARGS__); \ | |||
if (this_progress) \ | |||
progress = true; \ | |||
this_progress; \ | |||
}) | |||
#define OPT_V(pass, ...) NIR_PASS_V(nir, pass, ##__VA_ARGS__) | |||
static nir_shader * | |||
nir_optimize(nir_shader *nir, bool is_scalar) |