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 if (v->binning_pass) {
17 return ir3_load_shared_driver_ubo(
18 b, components, &ir3_const_state(v)->primitive_map_ubo, offset);
19 }
20 struct ir3_const_state *const_state = ir3_const_state_mut(v);
21 return ir3_load_driver_ubo(b, components, &const_state->primitive_map_ubo,
22 offset);
23 }
24
25 static nir_def *
load_primitive_param_ubo(nir_builder * b,struct ir3_shader_variant * v,unsigned components,unsigned offset)26 load_primitive_param_ubo(nir_builder *b, struct ir3_shader_variant *v,
27 unsigned components, unsigned offset)
28 {
29 if (v->binning_pass) {
30 return ir3_load_shared_driver_ubo(
31 b, components, &ir3_const_state(v)->primitive_param_ubo, offset);
32 }
33 struct ir3_const_state *const_state = ir3_const_state_mut(v);
34 return ir3_load_driver_ubo(b, components, &const_state->primitive_param_ubo,
35 offset);
36 }
37
38 static nir_def *
load_driver_params_ubo(nir_builder * b,struct ir3_shader_variant * v,unsigned components,unsigned offset)39 load_driver_params_ubo(nir_builder *b, struct ir3_shader_variant *v,
40 unsigned components, unsigned offset)
41 {
42 if (v->binning_pass) {
43 return ir3_load_shared_driver_ubo(
44 b, components, &ir3_const_state(v)->driver_params_ubo, offset);
45 }
46 struct ir3_const_state *const_state = ir3_const_state_mut(v);
47 return ir3_load_driver_ubo(b, components, &const_state->driver_params_ubo,
48 offset);
49 }
50
51 static bool
lower_driver_param_to_ubo(nir_builder * b,nir_intrinsic_instr * intr,void * in)52 lower_driver_param_to_ubo(nir_builder *b, nir_intrinsic_instr *intr, void *in)
53 {
54 struct ir3_shader_variant *v = in;
55
56 unsigned components = nir_intrinsic_dest_components(intr);
57
58 b->cursor = nir_before_instr(&intr->instr);
59
60 nir_def *result;
61 switch (intr->intrinsic) {
62 case nir_intrinsic_load_primitive_location_ir3:
63 result = load_primitive_map_ubo(b, v, components,
64 nir_intrinsic_driver_location(intr));
65 break;
66 case nir_intrinsic_load_vs_primitive_stride_ir3:
67 result = load_primitive_param_ubo(b, v, components, 0);
68 break;
69 case nir_intrinsic_load_vs_vertex_stride_ir3:
70 result = load_primitive_param_ubo(b, v, components, 1);
71 break;
72 case nir_intrinsic_load_hs_patch_stride_ir3:
73 result = load_primitive_param_ubo(b, v, components, 2);
74 break;
75 case nir_intrinsic_load_patch_vertices_in:
76 result = load_primitive_param_ubo(b, v, components, 3);
77 break;
78 case nir_intrinsic_load_tess_param_base_ir3:
79 result = load_primitive_param_ubo(b, v, components, 4);
80 break;
81 case nir_intrinsic_load_tess_factor_base_ir3:
82 result = load_primitive_param_ubo(b, v, components, 6);
83 break;
84 default: {
85 /* On current hw these are still pushed the old way for VS, because of
86 * the way SQE patches draw_id/base_vertex/first_vertex/base_instance.
87 */
88 if (v->type == MESA_SHADER_VERTEX)
89 return false;
90
91 struct driver_param_info param_info;
92 if (!ir3_get_driver_param_info(b->shader, intr, ¶m_info))
93 return false;
94
95 result = load_driver_params_ubo(b, v, components, param_info.offset);
96 }
97 }
98
99 nir_instr_remove(&intr->instr);
100 nir_def_rewrite_uses(&intr->def, result);
101
102 return true;
103 }
104
105 bool
ir3_nir_lower_driver_params_to_ubo(nir_shader * nir,struct ir3_shader_variant * v)106 ir3_nir_lower_driver_params_to_ubo(nir_shader *nir,
107 struct ir3_shader_variant *v)
108 {
109 bool result = nir_shader_intrinsics_pass(
110 nir, lower_driver_param_to_ubo,
111 nir_metadata_control_flow, v);
112
113 if (result) {
114 const struct ir3_const_state *const_state = ir3_const_state(v);
115
116 ir3_update_driver_ubo(nir, &const_state->primitive_map_ubo, "$primitive_map");
117 ir3_update_driver_ubo(nir, &const_state->primitive_param_ubo, "$primitive_param");
118 ir3_update_driver_ubo(nir, &const_state->driver_params_ubo, "$driver_params");
119 }
120
121 return result;
122 }
123