nir: Add another index to load_uniform to specify the range read
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -965,6 +965,12 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
NIR_INTRINSIC_UCP_ID = 4,
|
NIR_INTRINSIC_UCP_ID = 4,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The amount 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_NUM_INDEX_FLAGS,
|
||||||
|
|
||||||
} nir_intrinsic_index_flag;
|
} nir_intrinsic_index_flag;
|
||||||
@@ -1028,6 +1034,7 @@ INTRINSIC_IDX_ACCESSORS(write_mask, WRMASK, unsigned)
|
|||||||
INTRINSIC_IDX_ACCESSORS(base, BASE, int)
|
INTRINSIC_IDX_ACCESSORS(base, BASE, int)
|
||||||
INTRINSIC_IDX_ACCESSORS(stream_id, STREAM_ID, unsigned)
|
INTRINSIC_IDX_ACCESSORS(stream_id, STREAM_ID, unsigned)
|
||||||
INTRINSIC_IDX_ACCESSORS(ucp_id, UCP_ID, unsigned)
|
INTRINSIC_IDX_ACCESSORS(ucp_id, UCP_ID, unsigned)
|
||||||
|
INTRINSIC_IDX_ACCESSORS(range, RANGE, unsigned)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \group texture information
|
* \group texture information
|
||||||
|
@@ -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
|
* of the start of the variable being loaded and and the offset source is a
|
||||||
* offset into that variable.
|
* 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
|
* 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.
|
* 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)
|
INTRINSIC(load_##name, srcs, ARR(1, 1, 1, 1), true, 0, 0, num_indices, idx0, idx1, idx2, flags)
|
||||||
|
|
||||||
/* src[] = { offset }. const_index[] = { base } */
|
/* 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 */
|
/* src[] = { buffer_index, offset }. No const_index */
|
||||||
LOAD(ubo, 2, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
|
LOAD(ubo, 2, 0, xx, xx, xx, NIR_INTRINSIC_CAN_ELIMINATE | NIR_INTRINSIC_CAN_REORDER)
|
||||||
/* src[] = { offset }. const_index[] = { base } */
|
/* src[] = { offset }. const_index[] = { base } */
|
||||||
|
@@ -277,6 +277,11 @@ nir_lower_io_block(nir_block *block, void *void_state)
|
|||||||
nir_intrinsic_set_base(load,
|
nir_intrinsic_set_base(load,
|
||||||
intrin->variables[0]->var->data.driver_location);
|
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)
|
if (per_vertex)
|
||||||
load->src[0] = nir_src_for_ssa(vertex_index);
|
load->src[0] = nir_src_for_ssa(vertex_index);
|
||||||
|
|
||||||
|
@@ -517,6 +517,7 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
|
|||||||
[NIR_INTRINSIC_WRMASK] = "wrmask",
|
[NIR_INTRINSIC_WRMASK] = "wrmask",
|
||||||
[NIR_INTRINSIC_STREAM_ID] = "stream-id",
|
[NIR_INTRINSIC_STREAM_ID] = "stream-id",
|
||||||
[NIR_INTRINSIC_UCP_ID] = "ucp-id",
|
[NIR_INTRINSIC_UCP_ID] = "ucp-id",
|
||||||
|
[NIR_INTRINSIC_RANGE] = "range",
|
||||||
};
|
};
|
||||||
for (unsigned idx = 1; idx < NIR_INTRINSIC_NUM_INDEX_FLAGS; idx++) {
|
for (unsigned idx = 1; idx < NIR_INTRINSIC_NUM_INDEX_FLAGS; idx++) {
|
||||||
if (!info->index_map[idx])
|
if (!info->index_map[idx])
|
||||||
|
Reference in New Issue
Block a user