• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2024 Collabora Ltd.
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #ifndef PANVK_CMD_DISPATCH_H
7 #define PANVK_CMD_DISPATCH_H
8 
9 #ifndef PAN_ARCH
10 #error "PAN_ARCH must be defined"
11 #endif
12 
13 enum panvk_cmd_compute_dirty_state {
14    PANVK_CMD_COMPUTE_DIRTY_CS,
15    PANVK_CMD_COMPUTE_DIRTY_DESC_STATE,
16    PANVK_CMD_COMPUTE_DIRTY_PUSH_UNIFORMS,
17    PANVK_CMD_COMPUTE_DIRTY_STATE_COUNT,
18 };
19 
20 struct panvk_cmd_compute_state {
21    struct panvk_descriptor_state desc_state;
22    const struct panvk_shader *shader;
23    struct panvk_compute_sysvals sysvals;
24    uint64_t push_uniforms;
25    struct {
26       struct panvk_shader_desc_state desc;
27    } cs;
28    BITSET_DECLARE(dirty, PANVK_CMD_COMPUTE_DIRTY_STATE_COUNT);
29 };
30 
31 #define compute_state_dirty(__cmdbuf, __name)                                  \
32    BITSET_TEST((__cmdbuf)->state.compute.dirty,                                \
33                PANVK_CMD_COMPUTE_DIRTY_##__name)
34 
35 #define compute_state_set_dirty(__cmdbuf, __name)                              \
36    BITSET_SET((__cmdbuf)->state.compute.dirty, PANVK_CMD_COMPUTE_DIRTY_##__name)
37 
38 #define compute_state_clear_all_dirty(__cmdbuf)                                \
39    BITSET_ZERO((__cmdbuf)->state.compute.dirty)
40 
41 #define clear_dirty_after_dispatch(__cmdbuf)                                   \
42    do {                                                                        \
43       compute_state_clear_all_dirty(__cmdbuf);                                 \
44    } while (0)
45 
46 #define set_compute_sysval(__cmdbuf, __dirty, __name, __val)                   \
47    do {                                                                        \
48       struct panvk_compute_sysvals __new_sysval;                               \
49       __new_sysval.__name = (__val);                                           \
50       if (memcmp(&(__cmdbuf)->state.compute.sysvals.__name,                    \
51                  &__new_sysval.__name, sizeof(__new_sysval.__name))) {         \
52          (__cmdbuf)->state.compute.sysvals.__name = __new_sysval.__name;       \
53          BITSET_SET_RANGE(__dirty, sysval_fau_start(compute, __name),          \
54                           sysval_fau_start(compute, __name));                  \
55       }                                                                        \
56    } while (0)
57 
58 struct panvk_dispatch_info {
59    struct {
60       uint32_t x, y, z;
61    } wg_base;
62 
63    struct {
64       struct {
65          uint32_t x, y, z;
66       } wg_count;
67    } direct;
68 
69    struct {
70       uint64_t buffer_dev_addr;
71    } indirect;
72 };
73 
74 void panvk_per_arch(cmd_prepare_dispatch_sysvals)(
75    struct panvk_cmd_buffer *cmdbuf, const struct panvk_dispatch_info *info);
76 
77 #endif
78