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 nir_def *
load_primitive_map_ubo(nir_builder * b,struct ir3_shader_variant * v,unsigned components,unsigned offset)13 load_primitive_map_ubo(nir_builder *b, struct ir3_shader_variant *v,
14 unsigned components, unsigned offset)
15 {
16 struct ir3_const_state *const_state = ir3_const_state_mut(v);
17 return ir3_load_driver_ubo(b, components, &const_state->primitive_map_ubo,
18 offset);
19 }
20
21 static nir_def *
load_primitive_param_ubo(nir_builder * b,struct ir3_shader_variant * v,unsigned components,unsigned offset)22 load_primitive_param_ubo(nir_builder *b, struct ir3_shader_variant *v,
23 unsigned components, unsigned offset)
24 {
25 struct ir3_const_state *const_state = ir3_const_state_mut(v);
26 return ir3_load_driver_ubo(b, components, &const_state->primitive_param_ubo,
27 offset);
28 }
29
30 static nir_def *
load_driver_params_ubo(nir_builder * b,struct ir3_shader_variant * v,unsigned components,unsigned offset)31 load_driver_params_ubo(nir_builder *b, struct ir3_shader_variant *v,
32 unsigned components, unsigned offset)
33 {
34 struct ir3_const_state *const_state = ir3_const_state_mut(v);
35 return ir3_load_driver_ubo(b, components, &const_state->driver_params_ubo,
36 offset);
37 }
38
39 static bool
lower_driver_param_to_ubo(nir_builder * b,nir_intrinsic_instr * intr,void * in)40 lower_driver_param_to_ubo(nir_builder *b, nir_intrinsic_instr *intr, void *in)
41 {
42 struct ir3_shader_variant *v = in;
43
44 unsigned components = nir_intrinsic_dest_components(intr);
45
46 b->cursor = nir_before_instr(&intr->instr);
47
48 nir_def *result;
49 switch (intr->intrinsic) {
50 case nir_intrinsic_load_primitive_location_ir3:
51 result = load_primitive_map_ubo(b, v, components,
52 nir_intrinsic_driver_location(intr));
53 break;
54 case nir_intrinsic_load_vs_primitive_stride_ir3:
55 result = load_primitive_param_ubo(b, v, components, 0);
56 break;
57 case nir_intrinsic_load_vs_vertex_stride_ir3:
58 result = load_primitive_param_ubo(b, v, components, 1);
59 break;
60 case nir_intrinsic_load_hs_patch_stride_ir3:
61 result = load_primitive_param_ubo(b, v, components, 2);
62 break;
63 case nir_intrinsic_load_patch_vertices_in:
64 result = load_primitive_param_ubo(b, v, components, 3);
65 break;
66 case nir_intrinsic_load_tess_param_base_ir3:
67 result = load_primitive_param_ubo(b, v, components, 4);
68 break;
69 case nir_intrinsic_load_tess_factor_base_ir3:
70 result = load_primitive_param_ubo(b, v, components, 6);
71 break;
72 /* These are still loaded using CP_LOAD_STATE for compatibility with indirect
73 * draws where the CP does a CP_LOAD_STATE for us internally:
74 */
75 case nir_intrinsic_load_draw_id:
76 case nir_intrinsic_load_base_vertex:
77 case nir_intrinsic_load_first_vertex:
78 case nir_intrinsic_load_base_instance:
79 return false;
80 default: {
81 struct driver_param_info param_info;
82 if (!ir3_get_driver_param_info(b->shader, intr, ¶m_info))
83 return false;
84
85 result = load_driver_params_ubo(b, v, components, param_info.offset);
86 }
87 }
88
89 nir_instr_remove(&intr->instr);
90 nir_def_rewrite_uses(&intr->def, result);
91
92 return true;
93 }
94
95 bool
ir3_nir_lower_driver_params_to_ubo(nir_shader * nir,struct ir3_shader_variant * v)96 ir3_nir_lower_driver_params_to_ubo(nir_shader *nir,
97 struct ir3_shader_variant *v)
98 {
99 bool result = nir_shader_intrinsics_pass(
100 nir, lower_driver_param_to_ubo,
101 nir_metadata_control_flow, v);
102
103 return result;
104 }
105