1 /*
2 * Copyright © 2023 Igalia S.L.
3 * SPDX-License-Identifier: MIT
4 */
5
6 #include "compiler/nir/nir.h"
7 #include "compiler/nir/nir_builder.h"
8 #include "util/u_math.h"
9 #include "ir3_compiler.h"
10 #include "ir3_nir.h"
11
12 static bool
lower_driver_param_to_ubo(nir_builder * b,nir_intrinsic_instr * intr,void * in)13 lower_driver_param_to_ubo(nir_builder *b, nir_intrinsic_instr *intr, void *in)
14 {
15 struct ir3_const_state *const_state = in;
16
17 if (b->shader->info.stage == MESA_SHADER_VERTEX)
18 return false;
19
20 unsigned components = nir_intrinsic_dest_components(intr);
21
22 b->cursor = nir_before_instr(&intr->instr);
23
24 nir_def *result;
25 switch (intr->intrinsic) {
26 case nir_intrinsic_load_primitive_location_ir3:
27 result = ir3_load_driver_ubo(b, components,
28 &const_state->primitive_map_ubo,
29 nir_intrinsic_driver_location(intr));
30 break;
31 case nir_intrinsic_load_vs_primitive_stride_ir3:
32 result = ir3_load_driver_ubo(b, components,
33 &const_state->primitive_param_ubo, 0);
34 break;
35 case nir_intrinsic_load_vs_vertex_stride_ir3:
36 result = ir3_load_driver_ubo(b, components,
37 &const_state->primitive_param_ubo, 1);
38 break;
39 case nir_intrinsic_load_hs_patch_stride_ir3:
40 result = ir3_load_driver_ubo(b, components,
41 &const_state->primitive_param_ubo, 2);
42 break;
43 case nir_intrinsic_load_patch_vertices_in:
44 result = ir3_load_driver_ubo(b, components,
45 &const_state->primitive_param_ubo, 3);
46 break;
47 case nir_intrinsic_load_tess_param_base_ir3:
48 result = ir3_load_driver_ubo(b, components,
49 &const_state->primitive_param_ubo, 4);
50 break;
51 case nir_intrinsic_load_tess_factor_base_ir3:
52 result = ir3_load_driver_ubo(b, components,
53 &const_state->primitive_param_ubo, 6);
54 break;
55 default: {
56 struct driver_param_info param_info;
57 if (!ir3_get_driver_param_info(b->shader, intr, ¶m_info))
58 return false;
59
60 result = ir3_load_driver_ubo(b, components,
61 &const_state->driver_params_ubo,
62 param_info.offset);
63 }
64 }
65
66 nir_instr_remove(&intr->instr);
67 nir_def_rewrite_uses(&intr->def, result);
68
69 return true;
70 }
71
72 bool
ir3_nir_lower_driver_params_to_ubo(nir_shader * nir,struct ir3_shader_variant * v)73 ir3_nir_lower_driver_params_to_ubo(nir_shader *nir,
74 struct ir3_shader_variant *v)
75 {
76 bool result = nir_shader_intrinsics_pass(
77 nir, lower_driver_param_to_ubo,
78 nir_metadata_block_index | nir_metadata_dominance, ir3_const_state(v));
79
80 return result;
81 }
82