From de3705edb0368c376abe7fc2f660f9c5a5a5dcbf Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Wed, 8 Jan 2020 13:54:47 -0800 Subject: [PATCH] nir: Add nir_var_mem_image Reviewed-by: Jason Ekstrand Part-of: --- src/compiler/nir/nir.c | 1 + src/compiler/nir/nir.h | 5 +++-- src/compiler/nir/nir_divergence_analysis.c | 1 + src/compiler/nir/nir_gather_info.c | 2 +- src/compiler/nir/nir_opt_access.c | 12 ++++++++---- src/compiler/nir/nir_opt_peephole_select.c | 1 + src/compiler/nir/nir_print.c | 13 ++++++++----- src/compiler/nir/nir_serialize.c | 5 ++--- src/compiler/nir/nir_validate.c | 3 ++- 9 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 4451089c0d7..494527a6ac9 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -189,6 +189,7 @@ nir_shader_add_variable(nir_shader *shader, nir_variable *var) case nir_var_uniform: case nir_var_mem_ubo: case nir_var_mem_ssbo: + case nir_var_mem_image: case nir_var_mem_shared: case nir_var_system_value: case nir_var_mem_push_const: diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 2bc17548d4a..f3b65d6e9c3 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -140,6 +140,7 @@ typedef enum { nir_var_shader_call_data = (1 << 12), /** Ray hit attributes */ nir_var_ray_hit_attrib = (1 << 13), + nir_var_mem_image = (1 << 14), nir_var_read_only_modes = nir_var_shader_in | nir_var_uniform | nir_var_system_value | nir_var_mem_constant | nir_var_mem_ubo, @@ -147,7 +148,7 @@ typedef enum { nir_var_vec_indexable_modes = nir_var_mem_ubo | nir_var_mem_ssbo | nir_var_mem_shared | nir_var_mem_global | nir_var_mem_push_const, - nir_num_variable_modes = 14, + nir_num_variable_modes = 15, nir_var_all = (1 << nir_num_variable_modes) - 1, } nir_variable_mode; MESA_DEFINE_CPP_ENUM_BITFIELD_OPERATORS(nir_variable_mode) @@ -356,7 +357,7 @@ typedef struct nir_variable { * * \sa nir_variable_mode */ - unsigned mode:14; + unsigned mode:15; /** * Is the variable read-only? diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 79d4e9ec565..06b92f26408 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -603,6 +603,7 @@ nir_variable_mode_is_uniform(nir_variable_mode mode) { case nir_var_mem_ssbo: case nir_var_mem_shared: case nir_var_mem_global: + case nir_var_mem_image: return true; default: return false; diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c index b44a04bf2ab..327ff857b79 100644 --- a/src/compiler/nir/nir_gather_info.c +++ b/src/compiler/nir/nir_gather_info.c @@ -834,7 +834,7 @@ nir_shader_gather_info(nir_shader *shader, nir_function_impl *entrypoint) shader->info.bit_sizes_float = 0; shader->info.bit_sizes_int = 0; - nir_foreach_uniform_variable(var, shader) { + nir_foreach_variable_with_modes(var, shader, nir_var_mem_image | nir_var_uniform) { /* Bindless textures and images don't use non-bindless slots. * Interface blocks imply inputs, outputs, UBO, or SSBO, which can only * mean bindless. diff --git a/src/compiler/nir/nir_opt_access.c b/src/compiler/nir/nir_opt_access.c index cc0e8025b2b..59276d2504d 100644 --- a/src/compiler/nir/nir_opt_access.c +++ b/src/compiler/nir/nir_opt_access.c @@ -115,9 +115,11 @@ gather_intrinsic(struct access_state *state, nir_intrinsic_instr *instr) state->images_written |= write; } - if (var->data.mode == nir_var_uniform && read) + if ((var->data.mode == nir_var_uniform || + var->data.mode == nir_var_mem_image) && read) _mesa_set_add(state->vars_read, var); - if (var->data.mode == nir_var_uniform && write) + if ((var->data.mode == nir_var_uniform || + var->data.mode == nir_var_mem_image) && write) _mesa_set_add(state->vars_written, var); break; @@ -187,7 +189,8 @@ process_variable(struct access_state *state, nir_variable *var) { const struct glsl_type *type = glsl_without_array(var->type); if (var->data.mode != nir_var_mem_ssbo && - !(var->data.mode == nir_var_uniform && glsl_type_is_image(type))) + !(var->data.mode == nir_var_uniform && glsl_type_is_image(type)) && + var->data.mode != nir_var_mem_image) return false; /* Ignore variables we've already marked */ @@ -343,7 +346,8 @@ nir_opt_access(nir_shader *shader, const nir_opt_access_options *options) nir_foreach_variable_with_modes(var, shader, nir_var_uniform | nir_var_mem_ubo | - nir_var_mem_ssbo) + nir_var_mem_ssbo | + nir_var_mem_image) var_progress |= process_variable(&state, var); nir_foreach_function(func, shader) { diff --git a/src/compiler/nir/nir_opt_peephole_select.c b/src/compiler/nir/nir_opt_peephole_select.c index 2403bf5f6c7..bf0332aa328 100644 --- a/src/compiler/nir/nir_opt_peephole_select.c +++ b/src/compiler/nir/nir_opt_peephole_select.c @@ -104,6 +104,7 @@ block_check_for_allowed_instrs(nir_block *block, unsigned *count, switch (deref->modes) { case nir_var_shader_in: case nir_var_uniform: + case nir_var_mem_image: /* Don't try to remove flow control around an indirect load * because that flow control may be trying to avoid invalid * loads. diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c index 74671cc1c2d..31c838dd74f 100644 --- a/src/compiler/nir/nir_print.c +++ b/src/compiler/nir/nir_print.c @@ -464,6 +464,8 @@ get_variable_mode_str(nir_variable_mode mode, bool want_local_global_mode) return "push_const"; case nir_var_mem_constant: return "constant"; + case nir_var_mem_image: + return "image"; case nir_var_shader_temp: return want_local_global_mode ? "shader_temp" : ""; case nir_var_function_temp: @@ -522,11 +524,12 @@ print_var_decl(nir_variable *var, print_state *state) fprintf(fp, "%s %s", glsl_get_type_name(var->type), get_var_name(var, state)); - if (var->data.mode == nir_var_shader_in || - var->data.mode == nir_var_shader_out || - var->data.mode == nir_var_uniform || - var->data.mode == nir_var_mem_ubo || - var->data.mode == nir_var_mem_ssbo) { + if (var->data.mode & (nir_var_shader_in | + nir_var_shader_out | + nir_var_uniform | + nir_var_mem_ubo | + nir_var_mem_ssbo | + nir_var_mem_image)) { const char *loc = NULL; char buf[4]; diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c index 7b8cba6ce2a..b6108ef9e7f 100644 --- a/src/compiler/nir/nir_serialize.c +++ b/src/compiler/nir/nir_serialize.c @@ -627,9 +627,8 @@ union packed_instr { unsigned instr_type:4; unsigned deref_type:3; unsigned cast_type_same_as_last:1; - unsigned modes:14; /* deref_var redefines this */ + unsigned modes:15; /* deref_var redefines this */ unsigned packed_src_ssa_16bit:1; /* deref_var redefines this */ - unsigned _pad:1; /* deref_var redefines this */ unsigned dest:8; } deref; struct { @@ -970,7 +969,7 @@ static void write_deref(write_ctx *ctx, const nir_deref_instr *deref) { assert(deref->deref_type < 8); - assert(deref->modes < (1 << 14)); + assert(deref->modes < (1 << 15)); union packed_instr header; header.u32 = 0; diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c index 62b23b00bad..cb572038837 100644 --- a/src/compiler/nir/nir_validate.c +++ b/src/compiler/nir/nir_validate.c @@ -1747,7 +1747,8 @@ nir_validate_shader(nir_shader *shader, const char *when) nir_var_mem_ssbo | nir_var_mem_shared | nir_var_mem_push_const | - nir_var_mem_constant; + nir_var_mem_constant | + nir_var_mem_image; if (gl_shader_stage_is_callable(shader->info.stage)) valid_modes |= nir_var_shader_call_data;