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:

committed by
Marge Bot

parent
f95daad3a2
commit
cd394017c8
@@ -533,6 +533,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
|
||||
|
||||
case nir_intrinsic_load_output:
|
||||
case nir_intrinsic_load_per_vertex_output:
|
||||
case nir_intrinsic_load_per_primitive_output:
|
||||
if (shader->info.stage == MESA_SHADER_TESS_CTRL &&
|
||||
instr->intrinsic == nir_intrinsic_load_output) {
|
||||
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_per_vertex_output:
|
||||
case nir_intrinsic_store_per_primitive_output:
|
||||
if (shader->info.stage == MESA_SHADER_TESS_CTRL &&
|
||||
instr->intrinsic == nir_intrinsic_store_output) {
|
||||
shader->info.patch_outputs_written |= slot_mask;
|
||||
|
@@ -921,6 +921,8 @@ load("ssbo_address", [1], [], [CAN_ELIMINATE, CAN_REORDER])
|
||||
load("output", [1], [BASE, COMPONENT, DEST_TYPE, IO_SEMANTICS], flags=[CAN_ELIMINATE])
|
||||
# src[] = { vertex, offset }.
|
||||
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 }.
|
||||
load("shared", [1], [BASE, ALIGN_MUL, ALIGN_OFFSET], [CAN_ELIMINATE])
|
||||
# src[] = { offset }.
|
||||
@@ -956,6 +958,8 @@ def store(name, srcs, indices=[], flags=[]):
|
||||
store("output", [1], [BASE, WRITE_MASK, COMPONENT, SRC_TYPE, IO_SEMANTICS])
|
||||
# src[] = { value, vertex, offset }.
|
||||
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 }
|
||||
store("ssbo", [-1, 1], [WRITE_MASK, ACCESS, ALIGN_MUL, ALIGN_OFFSET])
|
||||
# src[] = { value, offset }.
|
||||
|
@@ -282,8 +282,9 @@ emit_load(struct lower_io_state *state,
|
||||
}
|
||||
break;
|
||||
case nir_var_shader_out:
|
||||
op = array_index ? nir_intrinsic_load_per_vertex_output :
|
||||
nir_intrinsic_load_output;
|
||||
op = !array_index ? nir_intrinsic_load_output :
|
||||
var->data.per_primitive ? nir_intrinsic_load_per_primitive_output :
|
||||
nir_intrinsic_load_per_vertex_output;
|
||||
break;
|
||||
case nir_var_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);
|
||||
nir_intrinsic_op op =
|
||||
array_index ? nir_intrinsic_store_per_vertex_output :
|
||||
nir_intrinsic_store_output;
|
||||
!array_index ? 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_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_per_vertex_input:
|
||||
case nir_intrinsic_load_per_vertex_output:
|
||||
case nir_intrinsic_load_per_primitive_output:
|
||||
case nir_intrinsic_load_interpolated_input:
|
||||
case nir_intrinsic_store_output:
|
||||
case nir_intrinsic_store_shared:
|
||||
@@ -2494,6 +2497,7 @@ nir_get_io_offset_src(nir_intrinsic_instr *instr)
|
||||
return &instr->src[1];
|
||||
case nir_intrinsic_store_ssbo:
|
||||
case nir_intrinsic_store_per_vertex_output:
|
||||
case nir_intrinsic_store_per_primitive_output:
|
||||
return &instr->src[2];
|
||||
default:
|
||||
return NULL;
|
||||
@@ -2632,8 +2636,10 @@ is_output(nir_intrinsic_instr *intrin)
|
||||
{
|
||||
return intrin->intrinsic == nir_intrinsic_load_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_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)
|
||||
|
@@ -137,6 +137,7 @@ opt_undef_store(nir_intrinsic_instr *intrin)
|
||||
break;
|
||||
case nir_intrinsic_store_output:
|
||||
case nir_intrinsic_store_per_vertex_output:
|
||||
case nir_intrinsic_store_per_primitive_output:
|
||||
case nir_intrinsic_store_ssbo:
|
||||
case nir_intrinsic_store_shared:
|
||||
case nir_intrinsic_store_global:
|
||||
|
@@ -676,6 +676,7 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
|
||||
case nir_intrinsic_load_interpolated_input:
|
||||
case nir_intrinsic_load_output:
|
||||
case nir_intrinsic_load_per_vertex_output:
|
||||
case nir_intrinsic_load_per_primitive_output:
|
||||
case nir_intrinsic_load_push_constant:
|
||||
/* All memory load operations must load at least a byte */
|
||||
validate_assert(state, nir_dest_bit_size(instr->dest) >= 8);
|
||||
|
Reference in New Issue
Block a user