~mmach/netext73/mesa-ryzen

« back to all changes in this revision

Viewing changes to src/intel/compiler/brw_nir_clamp_per_vertex_loads.c

  • Committer: mmach
  • Date: 2023-11-02 21:31:35 UTC
  • Revision ID: netbit73@gmail.com-20231102213135-18d4tzh7tj0uz752
2023-11-02 22:11:57

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
/*
25
25
 * Limit input per vertex input accesses. This is useful for the tesselation stages.
26
26
 * On Gfx12.5+ out of bound accesses generate hangs.
 
27
 *
 
28
 * This pass operates on derefs, it must be called before shader inputs are
 
29
 * lowered.
27
30
 */
28
31
 
29
32
#include "brw_nir.h"
30
33
#include "compiler/nir/nir_builder.h"
31
 
 
32
 
static bool
33
 
lower_instr(nir_builder *b, nir_instr *instr, void *cb_data)
34
 
{
 
34
#include "compiler/nir/nir_deref.h"
 
35
 
 
36
static bool
 
37
clamp_per_vertex_loads_instr(nir_builder *b, nir_instr *instr, void *cb_data)
 
38
{
 
39
   if (instr->type != nir_instr_type_intrinsic)
 
40
      return false;
 
41
 
 
42
   nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
 
43
   if (intrin->intrinsic != nir_intrinsic_load_deref)
 
44
      return false;
 
45
 
 
46
   nir_deref_instr *deref = nir_instr_as_deref(intrin->src[0].ssa->parent_instr);
 
47
   nir_variable *var = nir_deref_instr_get_variable(deref);
 
48
   if (var == NULL || (var->data.mode & nir_var_shader_in) == 0)
 
49
      return false;
 
50
 
 
51
   nir_deref_path path;
 
52
   nir_deref_path_init(&path, deref, cb_data);
 
53
 
 
54
   bool progress = false;
 
55
   for (unsigned i = 0; path.path[i]; i++) {
 
56
      if (path.path[i]->deref_type != nir_deref_type_array)
 
57
         continue;
 
58
 
 
59
      b->cursor = nir_before_instr(&path.path[i]->instr);
 
60
 
 
61
      nir_instr_rewrite_src_ssa(&path.path[i]->instr,
 
62
                                &path.path[i]->arr.index,
 
63
                                nir_umin(b,
 
64
                                         path.path[i]->arr.index.ssa,
 
65
                                         nir_iadd_imm(b, nir_load_patch_vertices_in(b), -1)));
 
66
 
 
67
      progress = true;
 
68
      break;
 
69
   }
 
70
 
 
71
   nir_deref_path_finish(&path);
 
72
 
 
73
   return progress;
 
74
}
 
75
 
 
76
bool
 
77
brw_nir_clamp_per_vertex_loads(nir_shader *shader)
 
78
{
 
79
   void *mem_ctx = ralloc_context(NULL);
 
80
 
 
81
   bool ret = nir_shader_instructions_pass(shader, clamp_per_vertex_loads_instr,
 
82
                                           nir_metadata_block_index |
 
83
                                           nir_metadata_dominance,
 
84
                                           mem_ctx);
 
85
 
 
86
   ralloc_free(mem_ctx);
 
87
 
 
88
   return ret;
 
89
}
 
90
 
 
91
static bool
 
92
lower_patch_vertices_instr(nir_builder *b, nir_instr *instr, void *cb_data)
 
93
{
 
94
   if (instr->type != nir_instr_type_intrinsic)
 
95
      return false;
 
96
 
 
97
   nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
 
98
   if (intrin->intrinsic != nir_intrinsic_load_patch_vertices_in)
 
99
      return false;
 
100
 
35
101
   unsigned *input_vertices = cb_data;
36
102
 
37
 
   if (instr->type != nir_instr_type_intrinsic)
38
 
      return false;
39
 
 
40
 
   nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
41
 
   if (intrin->intrinsic != nir_intrinsic_load_per_vertex_input)
42
 
      return false;
43
 
 
44
103
   b->cursor = nir_before_instr(instr);
45
104
 
46
 
   nir_instr_rewrite_src_ssa(instr,
47
 
                             &intrin->src[0],
48
 
                             nir_imin(b, intrin->src[0].ssa,
49
 
                                         nir_imm_int(b, *input_vertices - 1)));
 
105
   nir_ssa_def_rewrite_uses(&intrin->dest.ssa, nir_imm_int(b, *input_vertices));
50
106
 
51
107
   return true;
52
108
}
53
109
 
54
110
bool
55
 
brw_nir_clamp_per_vertex_loads(nir_shader *shader,
56
 
                               unsigned input_vertices)
 
111
brw_nir_lower_patch_vertices_in(nir_shader *shader, unsigned input_vertices)
57
112
{
58
 
   return nir_shader_instructions_pass(shader, lower_instr,
 
113
   return nir_shader_instructions_pass(shader, lower_patch_vertices_instr,
59
114
                                       nir_metadata_block_index |
60
115
                                       nir_metadata_dominance,
61
116
                                       &input_vertices);