xref: /aosp_15_r20/external/mesa3d/src/freedreno/ir3/ir3_nir_lower_layer_id.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2023 Igalia S.L.
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "compiler/nir/nir_builder.h"
7 #include "ir3_nir.h"
8 
9 static bool
nir_lower_layer_id(nir_builder * b,nir_instr * instr,UNUSED void * cb_data)10 nir_lower_layer_id(nir_builder *b, nir_instr *instr, UNUSED void *cb_data)
11 {
12   if (instr->type != nir_instr_type_intrinsic) {
13     return false;
14   }
15   nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
16   if (intr->intrinsic != nir_intrinsic_load_layer_id)
17     return false;
18   b->cursor = nir_before_instr(&intr->instr);
19 
20   nir_variable *layer = nir_find_variable_with_location(b->shader, nir_var_shader_in, VARYING_SLOT_LAYER);
21 
22   if (!layer) {
23     layer = nir_variable_create(b->shader, nir_var_shader_in, glsl_int_type(), "layer");
24     layer->data.location = VARYING_SLOT_LAYER;
25     layer->data.driver_location = b->shader->num_inputs++;
26   }
27 
28   nir_intrinsic_instr *load_input = nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_input);
29   nir_intrinsic_set_base(load_input, layer->data.driver_location);
30   nir_intrinsic_set_component(load_input, 0);
31   load_input->num_components = 1;
32   load_input->src[0] = nir_src_for_ssa(nir_imm_int(b, 0));
33   nir_intrinsic_set_dest_type(load_input, nir_type_int);
34   nir_io_semantics semantics = {
35     .location = VARYING_SLOT_LAYER,
36     .num_slots = 1,
37   };
38   nir_intrinsic_set_io_semantics(load_input, semantics);
39   nir_def_init(&load_input->instr, &load_input->def, 1, 32);
40   nir_builder_instr_insert(b, &load_input->instr);
41   nir_def_rewrite_uses(&intr->def, &load_input->def);
42   return true;
43 }
44 
ir3_nir_lower_layer_id(nir_shader * shader)45 bool ir3_nir_lower_layer_id(nir_shader *shader)
46 {
47   assert(shader->info.stage == MESA_SHADER_FRAGMENT);
48   return nir_shader_instructions_pass(shader, nir_lower_layer_id,
49                 nir_metadata_control_flow,
50                 NULL);
51 }