• 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 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, &param_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