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