~mmach/netext73/mesa-ryzen

« back to all changes in this revision

Viewing changes to src/intel/vulkan/anv_nir_compute_push_layout.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:
32
32
anv_nir_compute_push_layout(nir_shader *nir,
33
33
                            const struct anv_physical_device *pdevice,
34
34
                            bool robust_buffer_access,
 
35
                            bool fragment_dynamic,
35
36
                            struct brw_stage_prog_data *prog_data,
36
37
                            struct anv_pipeline_bind_map *map,
 
38
                            const struct anv_pipeline_push_map *push_map,
37
39
                            void *mem_ctx)
38
40
{
39
41
   const struct brw_compiler *compiler = pdevice->compiler;
42
44
 
43
45
   bool has_const_ubo = false;
44
46
   unsigned push_start = UINT_MAX, push_end = 0;
45
 
   nir_foreach_function(function, nir) {
46
 
      if (!function->impl)
47
 
         continue;
48
 
 
49
 
      nir_foreach_block(block, function->impl) {
 
47
   nir_foreach_function_impl(impl, nir) {
 
48
      nir_foreach_block(block, impl) {
50
49
         nir_foreach_instr(instr, block) {
51
50
            if (instr->type != nir_instr_type_intrinsic)
52
51
               continue;
54
53
            nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
55
54
            switch (intrin->intrinsic) {
56
55
            case nir_intrinsic_load_ubo:
57
 
               if (nir_src_is_const(intrin->src[0]) &&
 
56
               if (brw_nir_ubo_surface_index_is_pushable(intrin->src[0]) &&
58
57
                   nir_src_is_const(intrin->src[1]))
59
58
                  has_const_ubo = true;
60
59
               break;
67
66
               break;
68
67
            }
69
68
 
70
 
            case nir_intrinsic_load_desc_set_address_intel: {
71
 
               unsigned base = offsetof(struct anv_push_constants, desc_sets);
 
69
            case nir_intrinsic_load_desc_set_address_intel:
 
70
            case nir_intrinsic_load_desc_set_dynamic_index_intel: {
 
71
               unsigned base = offsetof(struct anv_push_constants, desc_offsets);
72
72
               push_start = MIN2(push_start, base);
73
73
               push_end = MAX2(push_end, base +
74
 
                  sizeof_field(struct anv_push_constants, desc_sets));
 
74
                  sizeof_field(struct anv_push_constants, desc_offsets));
75
75
               break;
76
76
            }
77
77
 
102
102
      push_end = MAX2(push_end, push_reg_mask_end);
103
103
   }
104
104
 
 
105
   if (nir->info.stage == MESA_SHADER_FRAGMENT && fragment_dynamic) {
 
106
      const uint32_t fs_msaa_flags_start =
 
107
         offsetof(struct anv_push_constants, gfx.fs_msaa_flags);
 
108
      const uint32_t fs_msaa_flags_end = fs_msaa_flags_start + sizeof(uint32_t);
 
109
      push_start = MIN2(push_start, fs_msaa_flags_start);
 
110
      push_end = MAX2(push_end, fs_msaa_flags_end);
 
111
   }
 
112
 
105
113
   if (nir->info.stage == MESA_SHADER_COMPUTE && devinfo->verx10 < 125) {
106
114
      /* For compute shaders, we always have to have the subgroup ID.  The
107
115
       * back-end compiler will "helpfully" add it for us in the last push
135
143
   };
136
144
 
137
145
   if (has_push_intrinsic) {
138
 
      nir_foreach_function(function, nir) {
139
 
         if (!function->impl)
140
 
            continue;
141
 
 
142
 
         nir_builder build, *b = &build;
143
 
         nir_builder_init(b, function->impl);
144
 
 
145
 
         nir_foreach_block(block, function->impl) {
 
146
      nir_foreach_function_impl(impl, nir) {
 
147
         nir_builder build = nir_builder_create(impl);
 
148
         nir_builder *b = &build;
 
149
 
 
150
         nir_foreach_block(block, impl) {
146
151
            nir_foreach_instr_safe(instr, block) {
147
152
               if (instr->type != nir_instr_type_intrinsic)
148
153
                  continue;
166
171
               }
167
172
 
168
173
               case nir_intrinsic_load_desc_set_address_intel: {
169
 
                  b->cursor = nir_before_instr(&intrin->instr);
170
 
                  nir_ssa_def *pc_load = nir_load_uniform(b, 1, 64,
171
 
                     nir_imul_imm(b, intrin->src[0].ssa, sizeof(uint64_t)),
172
 
                     .base = offsetof(struct anv_push_constants, desc_sets),
173
 
                     .range = sizeof_field(struct anv_push_constants, desc_sets),
174
 
                     .dest_type = nir_type_uint64);
 
174
                  assert(brw_shader_stage_requires_bindless_resources(nir->info.stage));
 
175
                  b->cursor = nir_before_instr(&intrin->instr);
 
176
                  nir_ssa_def *pc_load = nir_load_uniform(b, 1, 32,
 
177
                     nir_imul_imm(b, intrin->src[0].ssa, sizeof(uint32_t)),
 
178
                     .base = offsetof(struct anv_push_constants, desc_offsets),
 
179
                     .range = sizeof_field(struct anv_push_constants, desc_offsets),
 
180
                     .dest_type = nir_type_uint32);
 
181
                  pc_load = nir_iand_imm(b, pc_load, ANV_DESCRIPTOR_SET_OFFSET_MASK);
 
182
                  nir_ssa_def *desc_addr =
 
183
                     nir_pack_64_2x32_split(
 
184
                        b, pc_load,
 
185
                        nir_load_reloc_const_intel(
 
186
                           b, BRW_SHADER_RELOC_DESCRIPTORS_ADDR_HIGH));
 
187
                  nir_ssa_def_rewrite_uses(&intrin->dest.ssa, desc_addr);
 
188
                  break;
 
189
               }
 
190
 
 
191
               case nir_intrinsic_load_desc_set_dynamic_index_intel: {
 
192
                  b->cursor = nir_before_instr(&intrin->instr);
 
193
                  nir_ssa_def *pc_load = nir_load_uniform(b, 1, 32,
 
194
                     nir_imul_imm(b, intrin->src[0].ssa, sizeof(uint32_t)),
 
195
                     .base = offsetof(struct anv_push_constants, desc_offsets),
 
196
                     .range = sizeof_field(struct anv_push_constants, desc_offsets),
 
197
                     .dest_type = nir_type_uint32);
 
198
                  pc_load = nir_iand_imm(
 
199
                     b, pc_load, ANV_DESCRIPTOR_SET_DYNAMIC_INDEX_MASK);
175
200
                  nir_ssa_def_rewrite_uses(&intrin->dest.ssa, pc_load);
176
201
                  break;
177
202
               }
223
248
         if (ubo_range->length == 0)
224
249
            continue;
225
250
 
226
 
         if (n >= 4 || (n == 3 && compiler->constant_buffer_0_is_relative)) {
 
251
         if (n >= 4) {
227
252
            memset(ubo_range, 0, sizeof(*ubo_range));
228
253
            continue;
229
254
         }
230
255
 
 
256
         assert(ubo_range->block < push_map->block_count);
231
257
         const struct anv_pipeline_binding *binding =
232
 
            &map->surface_to_descriptor[ubo_range->block];
 
258
            &push_map->block_to_descriptor[ubo_range->block];
233
259
 
234
260
         map->push_ranges[n++] = (struct anv_push_range) {
235
261
            .set = binding->set,
259
285
      map->push_ranges[0] = push_constant_range;
260
286
   }
261
287
 
 
288
   if (nir->info.stage == MESA_SHADER_FRAGMENT && fragment_dynamic) {
 
289
      struct brw_wm_prog_data *wm_prog_data =
 
290
         container_of(prog_data, struct brw_wm_prog_data, base);
 
291
 
 
292
      const uint32_t fs_msaa_flags_offset =
 
293
         offsetof(struct anv_push_constants, gfx.fs_msaa_flags);
 
294
      assert(fs_msaa_flags_offset >= push_start);
 
295
      wm_prog_data->msaa_flags_param =
 
296
         (fs_msaa_flags_offset - push_start) / 4;
 
297
   }
 
298
 
 
299
#if 0
 
300
   fprintf(stderr, "stage=%s push ranges:\n", gl_shader_stage_name(nir->info.stage));
 
301
   for (unsigned i = 0; i < ARRAY_SIZE(map->push_ranges); i++)
 
302
      fprintf(stderr, "   range%i: %03u-%03u set=%u index=%u\n", i,
 
303
              map->push_ranges[i].start,
 
304
              map->push_ranges[i].length,
 
305
              map->push_ranges[i].set,
 
306
              map->push_ranges[i].index);
 
307
#endif
 
308
 
262
309
   /* Now that we're done computing the push constant portion of the
263
310
    * bind map, hash it.  This lets us quickly determine if the actual
264
311
    * mapping has changed and not just a no-op pipeline change.