This solves a number of problems. First is the ability to change the number of sources that a texture instruction has. Second, it solves the delema that may occur if a texture instruction has more than 4 sources. --- src/glsl/nir/glsl_to_nir.cpp | 36 ++++++++++++++++---------------- src/glsl/nir/nir.c | 5 +++-- src/glsl/nir/nir.h | 22 +++++++++++-------- src/glsl/nir/nir_lower_samplers.cpp | 11 +++++++--- src/glsl/nir/nir_print.c | 4 ++-- src/glsl/nir/nir_validate.c | 4 ++-- src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 4 ++-- 7 files changed, 48 insertions(+), 38 deletions(-)
diff --git a/src/glsl/nir/glsl_to_nir.cpp b/src/glsl/nir/glsl_to_nir.cpp index a84a06f..744c404 100644 --- a/src/glsl/nir/glsl_to_nir.cpp +++ b/src/glsl/nir/glsl_to_nir.cpp @@ -1667,20 +1667,20 @@ nir_visitor::visit(ir_texture *ir) if (ir->coordinate != NULL) { instr->coord_components = ir->coordinate->type->vector_elements; - instr->src[src_number] = evaluate_rvalue(ir->coordinate); - instr->src_type[src_number] = nir_tex_src_coord; + instr->src[src_number].src = evaluate_rvalue(ir->coordinate); + instr->src[src_number].src_type = nir_tex_src_coord; src_number++; } if (ir->projector != NULL) { - instr->src[src_number] = evaluate_rvalue(ir->projector); - instr->src_type[src_number] = nir_tex_src_projector; + instr->src[src_number].src = evaluate_rvalue(ir->projector); + instr->src[src_number].src_type = nir_tex_src_projector; src_number++; } if (ir->shadow_comparitor != NULL) { - instr->src[src_number] = evaluate_rvalue(ir->shadow_comparitor); - instr->src_type[src_number] = nir_tex_src_comparitor; + instr->src[src_number].src = evaluate_rvalue(ir->shadow_comparitor); + instr->src[src_number].src_type = nir_tex_src_comparitor; src_number++; } @@ -1693,16 +1693,16 @@ nir_visitor::visit(ir_texture *ir) for (unsigned i = 0; i < const_offset->type->vector_elements; i++) instr->const_offset[i] = const_offset->value.i[i]; } else { - instr->src[src_number] = evaluate_rvalue(ir->offset); - instr->src_type[src_number] = nir_tex_src_offset; + instr->src[src_number].src = evaluate_rvalue(ir->offset); + instr->src[src_number].src_type = nir_tex_src_offset; src_number++; } } switch (ir->op) { case ir_txb: - instr->src[src_number] = evaluate_rvalue(ir->lod_info.bias); - instr->src_type[src_number] = nir_tex_src_bias; + instr->src[src_number].src = evaluate_rvalue(ir->lod_info.bias); + instr->src[src_number].src_type = nir_tex_src_bias; src_number++; break; @@ -1710,24 +1710,24 @@ nir_visitor::visit(ir_texture *ir) case ir_txf: case ir_txs: if (ir->lod_info.lod != NULL) { - instr->src[src_number] = evaluate_rvalue(ir->lod_info.lod); - instr->src_type[src_number] = nir_tex_src_lod; + instr->src[src_number].src = evaluate_rvalue(ir->lod_info.lod); + instr->src[src_number].src_type = nir_tex_src_lod; src_number++; } break; case ir_txd: - instr->src[src_number] = evaluate_rvalue(ir->lod_info.grad.dPdx); - instr->src_type[src_number] = nir_tex_src_ddx; + instr->src[src_number].src = evaluate_rvalue(ir->lod_info.grad.dPdx); + instr->src[src_number].src_type = nir_tex_src_ddx; src_number++; - instr->src[src_number] = evaluate_rvalue(ir->lod_info.grad.dPdy); - instr->src_type[src_number] = nir_tex_src_ddy; + instr->src[src_number].src = evaluate_rvalue(ir->lod_info.grad.dPdy); + instr->src[src_number].src_type = nir_tex_src_ddy; src_number++; break; case ir_txf_ms: - instr->src[src_number] = evaluate_rvalue(ir->lod_info.sample_index); - instr->src_type[src_number] = nir_tex_src_ms_index; + instr->src[src_number].src = evaluate_rvalue(ir->lod_info.sample_index); + instr->src[src_number].src_type = nir_tex_src_ms_index; src_number++; break; diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c index d8560c2..6239365 100644 --- a/src/glsl/nir/nir.c +++ b/src/glsl/nir/nir.c @@ -444,8 +444,9 @@ nir_tex_instr_create(void *mem_ctx, unsigned num_srcs) dest_init(&instr->dest); instr->num_srcs = num_srcs; - for (unsigned i = 0; i < 4; i++) - src_init(&instr->src[i]); + instr->src = ralloc_array(mem_ctx, nir_tex_src, num_srcs); + for (unsigned i = 0; i < num_srcs; i++) + src_init(&instr->src[i].src); instr->sampler_index = 0; instr->sampler_array_size = 0; diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h index 93023d3..26d99ee 100644 --- a/src/glsl/nir/nir.h +++ b/src/glsl/nir/nir.h @@ -823,7 +823,12 @@ typedef enum { nir_tex_src_ddy, nir_tex_src_sampler_offset, /* < dynamically uniform indirect offset */ nir_num_texinput_types -} nir_texinput_type; +} nir_tex_src_type; + +typedef struct { + nir_src src; + nir_tex_src_type src_type; +} nir_tex_src; typedef enum { nir_texop_tex, /**< Regular texture look-up */ @@ -846,8 +851,7 @@ typedef struct { nir_texop op; nir_dest dest; - nir_src src[4]; - nir_texinput_type src_type[4]; + nir_tex_src *src; unsigned num_srcs, coord_components; bool is_array, is_shadow; @@ -917,13 +921,13 @@ nir_tex_instr_dest_size(nir_tex_instr *instr) static inline unsigned nir_tex_instr_src_size(nir_tex_instr *instr, unsigned src) { - if (instr->src_type[src] == nir_tex_src_coord) + if (instr->src[src].src_type == nir_tex_src_coord) return instr->coord_components; - if (instr->src_type[src] == nir_tex_src_offset || - instr->src_type[src] == nir_tex_src_ddx || - instr->src_type[src] == nir_tex_src_ddy) { + if (instr->src[src].src_type == nir_tex_src_offset || + instr->src[src].src_type == nir_tex_src_ddx || + instr->src[src].src_type == nir_tex_src_ddy) { if (instr->is_array) return instr->coord_components - 1; else @@ -934,10 +938,10 @@ nir_tex_instr_src_size(nir_tex_instr *instr, unsigned src) } static inline int -nir_tex_instr_src_index(nir_tex_instr *instr, nir_texinput_type type) +nir_tex_instr_src_index(nir_tex_instr *instr, nir_tex_src_type type) { for (unsigned i = 0; i < instr->num_srcs; i++) - if (instr->src_type[i] == type) + if (instr->src[i].src_type == type) return (int) i; return -1; diff --git a/src/glsl/nir/nir_lower_samplers.cpp b/src/glsl/nir/nir_lower_samplers.cpp index 5e90a4c..34b1a2d 100644 --- a/src/glsl/nir/nir_lower_samplers.cpp +++ b/src/glsl/nir/nir_lower_samplers.cpp @@ -96,11 +96,16 @@ lower_sampler(nir_tex_instr *instr, struct gl_shader_program *shader_program, assert(instr->num_srcs < 4); - nir_instr_rewrite_src(&instr->instr, &instr->src[instr->num_srcs], - nir_src_copy(deref_array->indirect, mem_ctx)); - instr->src_type[instr->num_srcs] = nir_tex_src_sampler_offset; + instr->src = reralloc(mem_ctx, instr->src, nir_tex_src, + instr->num_srcs + 1); + memset(&instr->src[instr->num_srcs], 0, sizeof *instr->src); + 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].src, + nir_src_copy(deref_array->indirect, mem_ctx)); + instr->sampler_array_size = glsl_get_length(deref->type); nir_src empty; diff --git a/src/glsl/nir/nir_print.c b/src/glsl/nir/nir_print.c index 502da38..ac1bb92 100644 --- a/src/glsl/nir/nir_print.c +++ b/src/glsl/nir/nir_print.c @@ -403,11 +403,11 @@ print_tex_instr(nir_tex_instr *instr, print_var_state *state, FILE *fp) } for (unsigned i = 0; i < instr->num_srcs; i++) { - print_src(&instr->src[i], fp); + print_src(&instr->src[i].src, fp); fprintf(fp, " "); - switch(instr->src_type[i]) { + switch(instr->src[i].src_type) { case nir_tex_src_coord: fprintf(fp, "(coord)"); break; diff --git a/src/glsl/nir/nir_validate.c b/src/glsl/nir/nir_validate.c index 5b5a7fc..a5ca3bd 100644 --- a/src/glsl/nir/nir_validate.c +++ b/src/glsl/nir/nir_validate.c @@ -393,8 +393,8 @@ validate_tex_instr(nir_tex_instr *instr, validate_state *state) src_type_seen[i] = false; for (unsigned i = 0; i < instr->num_srcs; i++) { - assert(!src_type_seen[instr->src_type[i]]); - src_type_seen[instr->src_type[i]] = true; + assert(!src_type_seen[instr->src[i].src_type]); + src_type_seen[instr->src[i].src_type] = true; validate_src(&instr->src[i], state); } diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp index 845e47f..a520a58 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp @@ -1607,8 +1607,8 @@ fs_visitor::nir_emit_texture(nir_tex_instr *instr) fs_reg coordinate, shadow_comparitor, lod, lod2, sample_index, mcs, offset; for (unsigned i = 0; i < instr->num_srcs; i++) { - fs_reg src = get_nir_src(instr->src[i]); - switch (instr->src_type[i]) { + fs_reg src = get_nir_src(instr->src[i].src); + switch (instr->src[i].src_type) { case nir_tex_src_bias: lod = retype(src, BRW_REGISTER_TYPE_F); break; -- 2.2.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev