1 /*
2 * Copyright © 2024 Collabora Ltd.
3 * Copyright © 2024 Arm Ltd.
4 *
5 * SPDX-License-Identifier: MIT
6 */
7
8 #include "panvk_cmd_buffer.h"
9 #include "panvk_cmd_dispatch.h"
10
11 void
panvk_per_arch(cmd_prepare_dispatch_sysvals)12 panvk_per_arch(cmd_prepare_dispatch_sysvals)(
13 struct panvk_cmd_buffer *cmdbuf, const struct panvk_dispatch_info *info)
14 {
15 const struct panvk_shader *shader = cmdbuf->state.compute.shader;
16 BITSET_DECLARE(dirty_sysvals, MAX_SYSVAL_FAUS) = {0};
17
18 /* In indirect case, some sysvals are read from the indirect dispatch
19 * buffer.
20 */
21 if (info->indirect.buffer_dev_addr == 0) {
22 set_compute_sysval(cmdbuf, dirty_sysvals, num_work_groups.x,
23 info->direct.wg_count.x);
24 set_compute_sysval(cmdbuf, dirty_sysvals, num_work_groups.y,
25 info->direct.wg_count.y);
26 set_compute_sysval(cmdbuf, dirty_sysvals, num_work_groups.z,
27 info->direct.wg_count.z);
28 } else {
29 BITSET_SET_RANGE(dirty_sysvals,
30 sysval_fau_start(compute, num_work_groups),
31 sysval_fau_end(compute, num_work_groups));
32 }
33
34 set_compute_sysval(cmdbuf, dirty_sysvals, base.x, info->wg_base.x);
35 set_compute_sysval(cmdbuf, dirty_sysvals, base.y, info->wg_base.y);
36 set_compute_sysval(cmdbuf, dirty_sysvals, base.z, info->wg_base.z);
37 set_compute_sysval(cmdbuf, dirty_sysvals, local_group_size.x,
38 shader->local_size.x);
39 set_compute_sysval(cmdbuf, dirty_sysvals, local_group_size.y,
40 shader->local_size.y);
41 set_compute_sysval(cmdbuf, dirty_sysvals, local_group_size.z,
42 shader->local_size.z);
43
44 #if PAN_ARCH <= 7
45 struct panvk_descriptor_state *desc_state =
46 &cmdbuf->state.compute.desc_state;
47 struct panvk_shader_desc_state *cs_desc_state =
48 &cmdbuf->state.compute.cs.desc;
49
50 if (compute_state_dirty(cmdbuf, CS) ||
51 compute_state_dirty(cmdbuf, DESC_STATE)) {
52 set_compute_sysval(cmdbuf, dirty_sysvals,
53 desc.sets[PANVK_DESC_TABLE_CS_DYN_SSBOS],
54 cs_desc_state->dyn_ssbos);
55 }
56
57 for (uint32_t i = 0; i < MAX_SETS; i++) {
58 if (shader->desc_info.used_set_mask & BITFIELD_BIT(i)) {
59 set_compute_sysval(cmdbuf, dirty_sysvals, desc.sets[i],
60 desc_state->sets[i]->descs.dev);
61 }
62 }
63 #endif
64
65 /* Dirty push_uniforms if the used_sysvals/dirty_sysvals overlap. */
66 BITSET_AND(dirty_sysvals, dirty_sysvals, shader->fau.used_sysvals);
67 if (!BITSET_IS_EMPTY(dirty_sysvals))
68 compute_state_set_dirty(cmdbuf, PUSH_UNIFORMS);
69 }
70