• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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