nir: Add per-primitive I/O intrinsics

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10600>
This commit is contained in:
Caio Marcelo de Oliveira Filho
2021-05-03 12:04:01 -07:00
committed by Marge Bot
parent f95daad3a2
commit cd394017c8
5 changed files with 19 additions and 5 deletions

View File

@@ -533,6 +533,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
case nir_intrinsic_load_output: case nir_intrinsic_load_output:
case nir_intrinsic_load_per_vertex_output: case nir_intrinsic_load_per_vertex_output:
case nir_intrinsic_load_per_primitive_output:
if (shader->info.stage == MESA_SHADER_TESS_CTRL && if (shader->info.stage == MESA_SHADER_TESS_CTRL &&
instr->intrinsic == nir_intrinsic_load_output) { instr->intrinsic == nir_intrinsic_load_output) {
shader->info.patch_outputs_read |= slot_mask; shader->info.patch_outputs_read |= slot_mask;
@@ -559,6 +560,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
case nir_intrinsic_store_output: case nir_intrinsic_store_output:
case nir_intrinsic_store_per_vertex_output: case nir_intrinsic_store_per_vertex_output:
case nir_intrinsic_store_per_primitive_output:
if (shader->info.stage == MESA_SHADER_TESS_CTRL && if (shader->info.stage == MESA_SHADER_TESS_CTRL &&
instr->intrinsic == nir_intrinsic_store_output) { instr->intrinsic == nir_intrinsic_store_output) {
shader->info.patch_outputs_written |= slot_mask; shader->info.patch_outputs_written |= slot_mask;

View File

@@ -921,6 +921,8 @@ load("ssbo_address", [1], [], [CAN_ELIMINATE, CAN_REORDER])
load("output", [1], [BASE, COMPONENT, DEST_TYPE, IO_SEMANTICS], flags=[CAN_ELIMINATE]) load("output", [1], [BASE, COMPONENT, DEST_TYPE, IO_SEMANTICS], flags=[CAN_ELIMINATE])
# src[] = { vertex, offset }. # src[] = { vertex, offset }.
load("per_vertex_output", [1, 1], [BASE, COMPONENT, DEST_TYPE, IO_SEMANTICS], [CAN_ELIMINATE]) load("per_vertex_output", [1, 1], [BASE, COMPONENT, DEST_TYPE, IO_SEMANTICS], [CAN_ELIMINATE])
# src[] = { primitive, offset }.
load("per_primitive_output", [1, 1], [BASE, COMPONENT, DEST_TYPE, IO_SEMANTICS], [CAN_ELIMINATE])
# src[] = { offset }. # src[] = { offset }.
load("shared", [1], [BASE, ALIGN_MUL, ALIGN_OFFSET], [CAN_ELIMINATE]) load("shared", [1], [BASE, ALIGN_MUL, ALIGN_OFFSET], [CAN_ELIMINATE])
# src[] = { offset }. # src[] = { offset }.
@@ -956,6 +958,8 @@ def store(name, srcs, indices=[], flags=[]):
store("output", [1], [BASE, WRITE_MASK, COMPONENT, SRC_TYPE, IO_SEMANTICS]) store("output", [1], [BASE, WRITE_MASK, COMPONENT, SRC_TYPE, IO_SEMANTICS])
# src[] = { value, vertex, offset }. # src[] = { value, vertex, offset }.
store("per_vertex_output", [1, 1], [BASE, WRITE_MASK, COMPONENT, SRC_TYPE, IO_SEMANTICS]) store("per_vertex_output", [1, 1], [BASE, WRITE_MASK, COMPONENT, SRC_TYPE, IO_SEMANTICS])
# src[] = { value, primitive, offset }.
store("per_primitive_output", [1, 1], [BASE, WRITE_MASK, COMPONENT, SRC_TYPE, IO_SEMANTICS])
# src[] = { value, block_index, offset } # src[] = { value, block_index, offset }
store("ssbo", [-1, 1], [WRITE_MASK, ACCESS, ALIGN_MUL, ALIGN_OFFSET]) store("ssbo", [-1, 1], [WRITE_MASK, ACCESS, ALIGN_MUL, ALIGN_OFFSET])
# src[] = { value, offset }. # src[] = { value, offset }.

View File

@@ -282,8 +282,9 @@ emit_load(struct lower_io_state *state,
} }
break; break;
case nir_var_shader_out: case nir_var_shader_out:
op = array_index ? nir_intrinsic_load_per_vertex_output : op = !array_index ? nir_intrinsic_load_output :
nir_intrinsic_load_output; var->data.per_primitive ? nir_intrinsic_load_per_primitive_output :
nir_intrinsic_load_per_vertex_output;
break; break;
case nir_var_uniform: case nir_var_uniform:
op = nir_intrinsic_load_uniform; op = nir_intrinsic_load_uniform;
@@ -394,8 +395,9 @@ emit_store(struct lower_io_state *state, nir_ssa_def *data,
assert(var->data.mode == nir_var_shader_out); assert(var->data.mode == nir_var_shader_out);
nir_intrinsic_op op = nir_intrinsic_op op =
array_index ? nir_intrinsic_store_per_vertex_output : !array_index ? nir_intrinsic_store_output :
nir_intrinsic_store_output; var->data.per_primitive ? nir_intrinsic_store_per_primitive_output :
nir_intrinsic_store_per_vertex_output;
nir_intrinsic_instr *store = nir_intrinsic_instr *store =
nir_intrinsic_instr_create(state->builder.shader, op); nir_intrinsic_instr_create(state->builder.shader, op);
@@ -2472,6 +2474,7 @@ nir_get_io_offset_src(nir_intrinsic_instr *instr)
case nir_intrinsic_load_input_vertex: case nir_intrinsic_load_input_vertex:
case nir_intrinsic_load_per_vertex_input: case nir_intrinsic_load_per_vertex_input:
case nir_intrinsic_load_per_vertex_output: case nir_intrinsic_load_per_vertex_output:
case nir_intrinsic_load_per_primitive_output:
case nir_intrinsic_load_interpolated_input: case nir_intrinsic_load_interpolated_input:
case nir_intrinsic_store_output: case nir_intrinsic_store_output:
case nir_intrinsic_store_shared: case nir_intrinsic_store_shared:
@@ -2494,6 +2497,7 @@ nir_get_io_offset_src(nir_intrinsic_instr *instr)
return &instr->src[1]; return &instr->src[1];
case nir_intrinsic_store_ssbo: case nir_intrinsic_store_ssbo:
case nir_intrinsic_store_per_vertex_output: case nir_intrinsic_store_per_vertex_output:
case nir_intrinsic_store_per_primitive_output:
return &instr->src[2]; return &instr->src[2];
default: default:
return NULL; return NULL;
@@ -2632,8 +2636,10 @@ is_output(nir_intrinsic_instr *intrin)
{ {
return intrin->intrinsic == nir_intrinsic_load_output || return intrin->intrinsic == nir_intrinsic_load_output ||
intrin->intrinsic == nir_intrinsic_load_per_vertex_output || intrin->intrinsic == nir_intrinsic_load_per_vertex_output ||
intrin->intrinsic == nir_intrinsic_load_per_primitive_output ||
intrin->intrinsic == nir_intrinsic_store_output || intrin->intrinsic == nir_intrinsic_store_output ||
intrin->intrinsic == nir_intrinsic_store_per_vertex_output; intrin->intrinsic == nir_intrinsic_store_per_vertex_output ||
intrin->intrinsic == nir_intrinsic_store_per_primitive_output;
} }
static bool is_dual_slot(nir_intrinsic_instr *intrin) static bool is_dual_slot(nir_intrinsic_instr *intrin)

View File

@@ -137,6 +137,7 @@ opt_undef_store(nir_intrinsic_instr *intrin)
break; break;
case nir_intrinsic_store_output: case nir_intrinsic_store_output:
case nir_intrinsic_store_per_vertex_output: case nir_intrinsic_store_per_vertex_output:
case nir_intrinsic_store_per_primitive_output:
case nir_intrinsic_store_ssbo: case nir_intrinsic_store_ssbo:
case nir_intrinsic_store_shared: case nir_intrinsic_store_shared:
case nir_intrinsic_store_global: case nir_intrinsic_store_global:

View File

@@ -676,6 +676,7 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
case nir_intrinsic_load_interpolated_input: case nir_intrinsic_load_interpolated_input:
case nir_intrinsic_load_output: case nir_intrinsic_load_output:
case nir_intrinsic_load_per_vertex_output: case nir_intrinsic_load_per_vertex_output:
case nir_intrinsic_load_per_primitive_output:
case nir_intrinsic_load_push_constant: case nir_intrinsic_load_push_constant:
/* All memory load operations must load at least a byte */ /* All memory load operations must load at least a byte */
validate_assert(state, nir_dest_bit_size(instr->dest) >= 8); validate_assert(state, nir_dest_bit_size(instr->dest) >= 8);