mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 02:40:11 +01:00
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:
parent
ed5a6c1a45
commit
f4fcfa8016
9 changed files with 20 additions and 1 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue