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 }