pan,nir: introduce load_attribute_pan

load_attribute_pan is a panfrost-specific intrinsic for loading
vertex attributes. Takes explicit vertex and instance IDs which
we need in order to implement vertex attribute divisor with
non-zero base instance on v9+.

Passes which are used by panvk are modified to be aware of
load_attribute_pan.

Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32039>
This commit is contained in:
Caterina Shablia 2024-12-12 21:22:11 +00:00 committed by Marge Bot
parent ed5a6c1a45
commit f4fcfa8016
9 changed files with 20 additions and 1 deletions

View file

@ -384,6 +384,12 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
is_divergent = true;
}
break;
case nir_intrinsic_load_attribute_pan:
assert(stage == MESA_SHADER_VERTEX);
is_divergent = src_divergent(instr->src[0], state) ||
src_divergent(instr->src[1], state) ||
src_divergent(instr->src[2], state);
break;
case nir_intrinsic_load_per_vertex_input:
is_divergent = src_divergent(instr->src[0], state) ||
src_divergent(instr->src[1], state);

View file

@ -543,6 +543,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader,
case nir_intrinsic_load_input_vertex:
case nir_intrinsic_load_interpolated_input:
case nir_intrinsic_load_per_primitive_input:
case nir_intrinsic_load_attribute_pan:
if (shader->info.stage == MESA_SHADER_TESS_EVAL &&
instr->intrinsic == nir_intrinsic_load_input &&
!is_patch_special) {

View file

@ -1476,6 +1476,12 @@ intrinsic("prefetch_sam_ir3", [1, 1], flags=[CAN_REORDER])
intrinsic("prefetch_tex_ir3", [1], flags=[CAN_REORDER])
intrinsic("prefetch_ubo_ir3", [1], flags=[CAN_REORDER])
# Panfrost-specific intrinsic for loading vertex attributes. Takes explicit
# vertex and instance IDs which we need in order to implement vertex attribute
# divisor with non-zero base instance on v9+.
# src[] = { vertex_id, instance_id, offset }
load("attribute_pan", [1, 1, 1], [BASE, COMPONENT, DEST_TYPE, IO_SEMANTICS], [CAN_ELIMINATE, CAN_REORDER])
# Intrinsics used by the Midgard/Bifrost blend pipeline. These are defined
# within a blend shader to read/write the raw value from the tile buffer,
# without applying any format conversion in the process. If the shader needs

View file

@ -2870,6 +2870,7 @@ nir_get_io_offset_src_number(const nir_intrinsic_instr *instr)
case nir_intrinsic_store_per_vertex_output:
case nir_intrinsic_store_per_view_output:
case nir_intrinsic_store_per_primitive_output:
case nir_intrinsic_load_attribute_pan:
return 2;
default:
return -1;

View file

@ -332,7 +332,8 @@ opt_shrink_vectors_intrinsic(nir_builder *b, nir_intrinsic_instr *instr,
case nir_intrinsic_load_global:
case nir_intrinsic_load_global_constant:
case nir_intrinsic_load_kernel_input:
case nir_intrinsic_load_scratch: {
case nir_intrinsic_load_scratch:
case nir_intrinsic_load_attribute_pan: {
/* Must be a vectorized intrinsic that we can resize. */
assert(instr->num_components != 0);

View file

@ -109,6 +109,7 @@ can_sink_instr(nir_instr *instr, nir_move_options options, bool *can_mov_out_of_
case nir_intrinsic_load_frag_coord:
case nir_intrinsic_load_frag_coord_zw:
case nir_intrinsic_load_pixel_coord:
case nir_intrinsic_load_attribute_pan:
return options & nir_move_load_input;
case nir_intrinsic_load_uniform:
case nir_intrinsic_load_kernel_input:

View file

@ -1364,6 +1364,7 @@ print_intrinsic_instr(nir_intrinsic_instr *instr, print_state *state)
case nir_intrinsic_load_per_vertex_input:
case nir_intrinsic_load_input_vertex:
case nir_intrinsic_load_coefficients_agx:
case nir_intrinsic_load_attribute_pan:
mode = nir_var_shader_in;
break;

View file

@ -621,6 +621,7 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state)
case nir_intrinsic_load_per_view_output:
case nir_intrinsic_load_per_primitive_output:
case nir_intrinsic_load_push_constant:
case nir_intrinsic_load_attribute_pan:
/* All memory load operations must load at least a byte */
validate_assert(state, instr->def.bit_size >= 8);
break;

View file

@ -48,6 +48,7 @@ bi_lower_divergent_indirects_impl(nir_builder *b, nir_intrinsic_instr *intr,
switch (intr->intrinsic) {
case nir_intrinsic_load_input:
case nir_intrinsic_load_interpolated_input:
case nir_intrinsic_load_attribute_pan:
/* Attributes and varyings */
offset = nir_get_io_offset_src(intr);
break;