xref: /aosp_15_r20/external/mesa3d/src/freedreno/ir3/ir3_nir_lower_driver_params_to_ubo.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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, &param_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