1 /*
2 * Copyright © 2024 Collabora Ltd. and Red Hat Inc.
3 * SPDX-License-Identifier: MIT
4 */
5 #ifndef NVK_INDIRECT_EXECUTION_SET
6 #define NVK_INDIRECT_EXECUTION_SET 1
7
8 #include "nvk_private.h"
9
10 struct nvk_physical_device;
11 struct nvk_shader;
12 struct nvkmd_mem;
13
14 enum nvk_ies_type {
15 NVK_IES_TYPE_CS_QMD,
16 NVK_IES_TYPE_GFX_SHADER,
17 NVK_IES_TYPE_GFX_PIPELINE,
18 };
19
20 PRAGMA_DIAGNOSTIC_PUSH
21 PRAGMA_DIAGNOSTIC_ERROR(-Wpadded)
22 struct nvk_ies_cs_qmd {
23 uint32_t qmd[64];
24 };
25 PRAGMA_DIAGNOSTIC_POP
26
27 static inline uint16_t
nvk_ies_cs_qmd_max_dw_count(struct nvk_physical_device * pdev)28 nvk_ies_cs_qmd_max_dw_count(struct nvk_physical_device *pdev)
29 {
30 return 64;
31 }
32
33 void nvk_ies_cs_qmd_init(struct nvk_physical_device *pdev,
34 struct nvk_ies_cs_qmd *qmd,
35 struct nvk_shader *shader);
36
37 PRAGMA_DIAGNOSTIC_PUSH
38 PRAGMA_DIAGNOSTIC_ERROR(-Wpadded)
39 struct nvk_ies_gfx_shader {
40 uint16_t dw_count;
41 uint16_t vtgm_dw_count;
42 uint32_t push[0];
43 };
44 PRAGMA_DIAGNOSTIC_POP
45 static_assert(sizeof(struct nvk_ies_gfx_shader) == 4,
46 "nvk_ies_gfx_shader has no holes");
47
48 uint16_t nvk_ies_gfx_shader_max_dw_count(struct nvk_physical_device *pdev,
49 VkShaderStageFlags stages,
50 bool last_vtgm);
51
52 PRAGMA_DIAGNOSTIC_PUSH
53 PRAGMA_DIAGNOSTIC_ERROR(-Wpadded)
54 struct nvk_ies_gfx_pipeline {
55 uint32_t dw_count;
56 uint32_t push[0];
57 };
58 PRAGMA_DIAGNOSTIC_POP
59 static_assert(sizeof(struct nvk_ies_gfx_pipeline) == 4,
60 "nvk_ies_gfx_pipeline has no holes");
61
62 uint16_t nvk_ies_gfx_pipeline_max_dw_count(struct nvk_physical_device *pdev,
63 VkShaderStageFlags stages);
64
65 struct nvk_indirect_execution_set {
66 struct vk_object_base base;
67
68 enum nvk_ies_type type;
69 uint32_t stride_B;
70 uint32_t count;
71
72 struct nvkmd_mem *mem;
73 };
74
75 VK_DEFINE_NONDISP_HANDLE_CASTS(nvk_indirect_execution_set, base,
76 VkIndirectExecutionSetEXT,
77 VK_OBJECT_TYPE_INDIRECT_EXECUTION_SET_EXT);
78
79 #endif
80