diff options
-rw-r--r-- | src/compiler/nir/nir.c | 22 | ||||
-rw-r--r-- | src/compiler/nir/nir.h | 4 | ||||
-rw-r--r-- | src/compiler/nir/nir_lower_samplers.c | 27 | ||||
-rw-r--r-- | src/intel/vulkan/anv_nir_apply_pipeline_layout.c | 19 |
4 files changed, 29 insertions, 43 deletions
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index afd4d1a7236..5bc07b7e506 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -542,6 +542,28 @@ nir_tex_instr_create(nir_shader *shader, unsigned num_srcs) } void +nir_tex_instr_add_src(nir_tex_instr *tex, + nir_tex_src_type src_type, + nir_src src) +{ + nir_tex_src *new_srcs = rzalloc_array(tex, nir_tex_src, + tex->num_srcs + 1); + + for (unsigned i = 0; i < tex->num_srcs; i++) { + new_srcs[i].src_type = tex->src[i].src_type; + nir_instr_move_src(&tex->instr, &new_srcs[i].src, + &tex->src[i].src); + } + + ralloc_free(tex->src); + tex->src = new_srcs; + + tex->src[tex->num_srcs].src_type = src_type; + nir_instr_rewrite_src(&tex->instr, &tex->src[tex->num_srcs].src, src); + tex->num_srcs++; +} + +void nir_tex_instr_remove_src(nir_tex_instr *tex, unsigned src_idx) { assert(src_idx < tex->num_srcs); diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index bd6035e1f90..70c23c2db99 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1379,6 +1379,10 @@ nir_tex_instr_src_index(const nir_tex_instr *instr, nir_tex_src_type type) return -1; } +void nir_tex_instr_add_src(nir_tex_instr *tex, + nir_tex_src_type src_type, + nir_src src); + void nir_tex_instr_remove_src(nir_tex_instr *tex, unsigned src_idx); typedef struct { diff --git a/src/compiler/nir/nir_lower_samplers.c b/src/compiler/nir/nir_lower_samplers.c index 0c4e91b000f..f75fb1afe88 100644 --- a/src/compiler/nir/nir_lower_samplers.c +++ b/src/compiler/nir/nir_lower_samplers.c @@ -109,32 +109,9 @@ lower_sampler(nir_tex_instr *instr, const struct gl_shader_program *shader_progr assert(array_elements >= 1); indirect = nir_umin(b, indirect, nir_imm_int(b, array_elements - 1)); - /* First, we have to resize the array of texture sources */ - nir_tex_src *new_srcs = rzalloc_array(instr, nir_tex_src, - instr->num_srcs + 2); - - for (unsigned i = 0; i < instr->num_srcs; i++) { - new_srcs[i].src_type = instr->src[i].src_type; - nir_instr_move_src(&instr->instr, &new_srcs[i].src, - &instr->src[i].src); - } - - ralloc_free(instr->src); - instr->src = new_srcs; - - /* Now we can go ahead and move the source over to being a - * first-class texture source. - */ - instr->src[instr->num_srcs].src_type = nir_tex_src_texture_offset; - instr->num_srcs++; - nir_instr_rewrite_src(&instr->instr, - &instr->src[instr->num_srcs - 1].src, + nir_tex_instr_add_src(instr, nir_tex_src_texture_offset, nir_src_for_ssa(indirect)); - - instr->src[instr->num_srcs].src_type = nir_tex_src_sampler_offset; - instr->num_srcs++; - nir_instr_rewrite_src(&instr->instr, - &instr->src[instr->num_srcs - 1].src, + nir_tex_instr_add_src(instr, nir_tex_src_sampler_offset, nir_src_for_ssa(indirect)); instr->texture_array_size = array_elements; diff --git a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c index 26e7dccc79d..1c8651333b3 100644 --- a/src/intel/vulkan/anv_nir_apply_pipeline_layout.c +++ b/src/intel/vulkan/anv_nir_apply_pipeline_layout.c @@ -157,24 +157,7 @@ lower_tex_deref(nir_tex_instr *tex, nir_deref_var *deref, if (state->add_bounds_checks) index = nir_umin(b, index, nir_imm_int(b, array_size - 1)); - nir_tex_src *new_srcs = rzalloc_array(tex, nir_tex_src, - tex->num_srcs + 1); - - for (unsigned i = 0; i < tex->num_srcs; i++) { - new_srcs[i].src_type = tex->src[i].src_type; - nir_instr_move_src(&tex->instr, &new_srcs[i].src, &tex->src[i].src); - } - - ralloc_free(tex->src); - tex->src = new_srcs; - - /* Now we can go ahead and move the source over to being a - * first-class texture source. - */ - tex->src[tex->num_srcs].src_type = src_type; - nir_instr_rewrite_src(&tex->instr, &tex->src[tex->num_srcs].src, - nir_src_for_ssa(index)); - tex->num_srcs++; + nir_tex_instr_add_src(tex, src_type, nir_src_for_ssa(index)); } else { *const_index += MIN2(deref_array->base_offset, array_size - 1); } |