xref: /aosp_15_r20/external/mesa3d/src/intel/shaders/generate_draws.cl (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker/* Copyright © 2023 Intel Corporation
2*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker */
4*61046927SAndroid Build Coastguard Worker
5*61046927SAndroid Build Coastguard Worker#include "libintel_shaders.h"
6*61046927SAndroid Build Coastguard Worker
7*61046927SAndroid Build Coastguard Workerstatic void end_generated_draws(global void *dst_ptr,
8*61046927SAndroid Build Coastguard Worker                                uint32_t item_idx,
9*61046927SAndroid Build Coastguard Worker                                uint32_t draw_id, uint32_t draw_count,
10*61046927SAndroid Build Coastguard Worker                                uint32_t ring_count, uint32_t max_draw_count,
11*61046927SAndroid Build Coastguard Worker                                uint32_t flags,
12*61046927SAndroid Build Coastguard Worker                                uint64_t gen_addr, uint64_t end_addr)
13*61046927SAndroid Build Coastguard Worker{
14*61046927SAndroid Build Coastguard Worker   uint32_t _3dprim_size_B = ((flags >> 16) & 0xff) * 4;
15*61046927SAndroid Build Coastguard Worker   bool indirect_count = (flags & ANV_GENERATED_FLAG_COUNT) != 0;
16*61046927SAndroid Build Coastguard Worker   bool ring_mode = (flags & ANV_GENERATED_FLAG_RING_MODE) != 0;
17*61046927SAndroid Build Coastguard Worker   /* We can have an indirect draw count = 0. */
18*61046927SAndroid Build Coastguard Worker   uint32_t last_draw_id = draw_count == 0 ? 0 : (min(draw_count, max_draw_count) - 1);
19*61046927SAndroid Build Coastguard Worker   global void *jump_dst = draw_count == 0 ? dst_ptr : (dst_ptr + _3dprim_size_B);
20*61046927SAndroid Build Coastguard Worker
21*61046927SAndroid Build Coastguard Worker   if (ring_mode) {
22*61046927SAndroid Build Coastguard Worker      if (draw_id == last_draw_id) {
23*61046927SAndroid Build Coastguard Worker         /* Exit the ring buffer to the next user commands */
24*61046927SAndroid Build Coastguard Worker         genX(write_MI_BATCH_BUFFER_START)(jump_dst, end_addr);
25*61046927SAndroid Build Coastguard Worker      } else if (item_idx == (ring_count - 1)) {
26*61046927SAndroid Build Coastguard Worker         /* Jump back to the generation shader to generate mode draws */
27*61046927SAndroid Build Coastguard Worker         genX(write_MI_BATCH_BUFFER_START)(jump_dst, gen_addr);
28*61046927SAndroid Build Coastguard Worker      }
29*61046927SAndroid Build Coastguard Worker   } else {
30*61046927SAndroid Build Coastguard Worker      if (draw_id == last_draw_id && draw_count < max_draw_count) {
31*61046927SAndroid Build Coastguard Worker         /* Skip forward to the end of the generated draws */
32*61046927SAndroid Build Coastguard Worker         genX(write_MI_BATCH_BUFFER_START)(jump_dst, end_addr);
33*61046927SAndroid Build Coastguard Worker      }
34*61046927SAndroid Build Coastguard Worker   }
35*61046927SAndroid Build Coastguard Worker}
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Workervoid
38*61046927SAndroid Build Coastguard WorkergenX(libanv_write_draw)(global void *dst_base,
39*61046927SAndroid Build Coastguard Worker                        global void *indirect_base,
40*61046927SAndroid Build Coastguard Worker                        global void *draw_id_base,
41*61046927SAndroid Build Coastguard Worker                        uint32_t indirect_stride,
42*61046927SAndroid Build Coastguard Worker                        global uint32_t *_draw_count,
43*61046927SAndroid Build Coastguard Worker                        uint32_t draw_base,
44*61046927SAndroid Build Coastguard Worker                        uint32_t instance_multiplier,
45*61046927SAndroid Build Coastguard Worker                        uint32_t max_draw_count,
46*61046927SAndroid Build Coastguard Worker                        uint32_t flags,
47*61046927SAndroid Build Coastguard Worker                        uint32_t ring_count,
48*61046927SAndroid Build Coastguard Worker                        uint64_t gen_addr,
49*61046927SAndroid Build Coastguard Worker                        uint64_t end_addr,
50*61046927SAndroid Build Coastguard Worker                        uint32_t item_idx)
51*61046927SAndroid Build Coastguard Worker{
52*61046927SAndroid Build Coastguard Worker   uint32_t _3dprim_size_B = ((flags >> 16) & 0xff) * 4;
53*61046927SAndroid Build Coastguard Worker   uint32_t draw_id = draw_base + item_idx;
54*61046927SAndroid Build Coastguard Worker   uint32_t draw_count = *_draw_count;
55*61046927SAndroid Build Coastguard Worker   global void *dst_ptr = dst_base + item_idx * _3dprim_size_B;
56*61046927SAndroid Build Coastguard Worker   global void *indirect_ptr = indirect_base + draw_id * indirect_stride;
57*61046927SAndroid Build Coastguard Worker   global void *draw_id_ptr = draw_id_base + item_idx * 4;
58*61046927SAndroid Build Coastguard Worker
59*61046927SAndroid Build Coastguard Worker   if (draw_id < min(draw_count, max_draw_count)) {
60*61046927SAndroid Build Coastguard Worker      bool is_indexed = (flags & ANV_GENERATED_FLAG_INDEXED) != 0;
61*61046927SAndroid Build Coastguard Worker      bool is_predicated = (flags & ANV_GENERATED_FLAG_PREDICATED) != 0;
62*61046927SAndroid Build Coastguard Worker      bool uses_tbimr = (flags & ANV_GENERATED_FLAG_TBIMR) != 0;
63*61046927SAndroid Build Coastguard Worker      bool uses_base = (flags & ANV_GENERATED_FLAG_BASE) != 0;
64*61046927SAndroid Build Coastguard Worker      bool uses_drawid = (flags & ANV_GENERATED_FLAG_DRAWID) != 0;
65*61046927SAndroid Build Coastguard Worker      uint32_t mocs = (flags >> 8) & 0xff;
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker      genX(write_draw)(dst_ptr, indirect_ptr, draw_id_ptr,
68*61046927SAndroid Build Coastguard Worker                       draw_id, instance_multiplier,
69*61046927SAndroid Build Coastguard Worker                       is_indexed, is_predicated,
70*61046927SAndroid Build Coastguard Worker                       uses_tbimr, uses_base, uses_drawid,
71*61046927SAndroid Build Coastguard Worker                       mocs);
72*61046927SAndroid Build Coastguard Worker   }
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker   end_generated_draws(dst_ptr, item_idx, draw_id, draw_count,
75*61046927SAndroid Build Coastguard Worker                       ring_count, max_draw_count, flags,
76*61046927SAndroid Build Coastguard Worker                       gen_addr, end_addr);
77*61046927SAndroid Build Coastguard Worker}
78