diff --git a/src/panfrost/util/pan_ir.h b/src/panfrost/util/pan_ir.h index e1eb104d93f..76b328beb49 100644 --- a/src/panfrost/util/pan_ir.h +++ b/src/panfrost/util/pan_ir.h @@ -392,6 +392,8 @@ bool pan_nir_lower_image_ms(nir_shader *shader); bool pan_nir_lower_frag_coord_zw(nir_shader *shader); bool pan_nir_lower_noperspective_vs(nir_shader *shader); bool pan_nir_lower_noperspective_fs(nir_shader *shader); +bool pan_nir_lower_static_noperspective(nir_shader *shader, + uint32_t noperspective_varyings); bool pan_lower_helper_invocation(nir_shader *shader); bool pan_lower_sample_pos(nir_shader *shader); diff --git a/src/panfrost/util/pan_lower_noperspective.c b/src/panfrost/util/pan_lower_noperspective.c index 51ba3124e71..6cc0b4996a5 100644 --- a/src/panfrost/util/pan_lower_noperspective.c +++ b/src/panfrost/util/pan_lower_noperspective.c @@ -290,3 +290,31 @@ pan_nir_lower_noperspective_fs(nir_shader *shader) return true; } + +static bool +lower_static_noperspective(nir_builder *b, nir_intrinsic_instr *intrin, + void *data) +{ + uint32_t *noperspective_varyings = data; + + if (intrin->intrinsic != nir_intrinsic_load_noperspective_varyings_pan) + return false; + + b->cursor = nir_after_instr(&intrin->instr); + nir_def *val = nir_imm_int(b, *noperspective_varyings); + nir_def_replace(&intrin->def, val); + + return true; +} + +/** + * Lower loads from the noperspective_varyings_pan sysval to a constant. + */ +bool +pan_nir_lower_static_noperspective(nir_shader *shader, + uint32_t noperspective_varyings) +{ + return nir_shader_intrinsics_pass(shader, lower_static_noperspective, + nir_metadata_control_flow, + (void *)&noperspective_varyings); +}