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_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;
|
||||||
|
@@ -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 }.
|
||||||
|
@@ -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)
|
||||||
|
@@ -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:
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user