• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &param_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