--- src/compiler/nir/nir.h | 7 +++++++ src/compiler/nir/nir_intrinsics.h | 6 +++++- src/compiler/nir/nir_lower_io.c | 5 +++++ src/compiler/nir/nir_print.c | 1 + 4 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 36f90fc..f686b74 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -938,6 +938,12 @@ typedef enum { */ NIR_INTRINSIC_UCP_ID = 4, + /** + * The ammount of data, starting from BASE, that this instruction may + * access. This is used to provide bounds if the offset is not constant. + */ + NIR_INTRINSIC_RANGE = 5, + NIR_INTRINSIC_NUM_INDEX_FLAGS, } nir_intrinsic_index_flag; @@ -1001,6 +1007,7 @@ INTRINSIC_IDX_ACCESSORS(write_mask, WRMASK, unsigned) INTRINSIC_IDX_ACCESSORS(base, BASE, int) INTRINSIC_IDX_ACCESSORS(stream_id, STREAM_ID, unsigned) INTRINSIC_IDX_ACCESSORS(ucp_id, UCP_ID, unsigned) +INTRINSIC_IDX_ACCESSORS(range, RANGE, unsigned) /** * \group texture information diff --git a/src/compiler/nir/nir_intrinsics.h b/src/compiler/nir/nir_intrinsics.h index 3ba1563..2d6b7b7 100644 --- a/src/compiler/nir/nir_intrinsics.h +++ b/src/compiler/nir/nir_intrinsics.h @@ -293,6 +293,10 @@ SYSTEM_VALUE(helper_invocation, 1, 0, xx, xx, xx) * of the start of the variable being loaded and and the offset source is a * offset into that variable. * + * Uniform load operations have a second "range" index that specifies the + * range (starting at base) of the data from which we are loading. If + * const_index[1] == 0, then the range is unknown. + * * Some load operations such as UBO/SSBO load and per_vertex loads take an * additional source to specify which UBO/SSBO/vertex to load from. * @@ -306,7 +310,7 @@ SYSTEM_VALUE(helper_invocation, 1, 0, xx, xx, xx) INTRINSIC(load_##name, srcs, ARR(1, 1, 1, 1), true, 0, 0, num_indices, idx0, idx1, idx2, flags) /* src[] = { offset }. const_index[] = { base } */ -LOAD(uniform, 1, 1, BASE, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER) +LOAD(uniform, 1, 2, BASE, RANGE, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER) /* src[] = { buffer_index, offset }. No const_index */ LOAD(ubo, 2, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER) /* src[] = { offset }. const_index[] = { base } */ diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index d9af8bf..508e1ec 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -277,6 +277,11 @@ nir_lower_io_block(nir_block *block, void *void_state) nir_intrinsic_set_base(load, intrin->variables[0]->var->data.driver_location); + if (load->intrinsic == nir_intrinsic_load_uniform) { + nir_intrinsic_set_range(load, + state->type_size(intrin->variables[0]->var->type)); + } + if (per_vertex) load->src[0] = nir_src_for_ssa(vertex_index); diff --git a/src/compiler/nir/nir_print.c b/src/compiler/nir/nir_print.c index d3d5b84..99e85c3 100644 --- a/src/compiler/nir/nir_print.c +++ b/src/compiler/nir/nir_print.c @@ -502,6 +502,7 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state) [NIR_INTRINSIC_WRMASK] = "wrmask", [NIR_INTRINSIC_STREAM_ID] = "stream-id", [NIR_INTRINSIC_UCP_ID] = "ucp-id", + [NIR_INTRINSIC_RANGE] = "range", }; for (unsigned idx = 1; idx < NIR_INTRINSIC_NUM_INDEX_FLAGS; idx++) { if (!info->index_map[idx]) -- 2.5.0.400.gff86faf _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev