• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2022 Collabora, LTD
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #ifndef VK_PIPELINE_H
25 #define VK_PIPELINE_H
26 
27 #include "vk_object.h"
28 #include "vk_util.h"
29 
30 #include <stdbool.h>
31 
32 struct nir_shader;
33 struct nir_shader_compiler_options;
34 struct spirv_to_nir_options;
35 struct vk_command_buffer;
36 struct vk_device;
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 #define VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NIR_CREATE_INFO_MESA \
43    (VkStructureType)1000290001
44 
45 #define VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NIR_CREATE_INFO_MESA_cast \
46    VkPipelineShaderStageNirCreateInfoMESA
47 
48 typedef struct VkPipelineShaderStageNirCreateInfoMESA {
49    VkStructureType sType;
50    const void *pNext;
51    struct nir_shader *nir;
52 } VkPipelineShaderStageNirCreateInfoMESA;
53 
54 bool
55 vk_pipeline_shader_stage_is_null(const VkPipelineShaderStageCreateInfo *info);
56 
57 bool
58 vk_pipeline_shader_stage_has_identifier(const VkPipelineShaderStageCreateInfo *info);
59 
60 VkResult
61 vk_pipeline_shader_stage_to_nir(struct vk_device *device,
62                                 VkPipelineCreateFlags2KHR pipeline_flags,
63                                 const VkPipelineShaderStageCreateInfo *info,
64                                 const struct spirv_to_nir_options *spirv_options,
65                                 const struct nir_shader_compiler_options *nir_options,
66                                 void *mem_ctx, struct nir_shader **nir_out);
67 
68 enum gl_subgroup_size
69 vk_get_subgroup_size(uint32_t spirv_version,
70                      gl_shader_stage stage,
71                      const void *info_pNext,
72                      bool allow_varying,
73                      bool require_full);
74 
75 struct vk_pipeline_robustness_state {
76    VkPipelineRobustnessBufferBehaviorEXT storage_buffers;
77    VkPipelineRobustnessBufferBehaviorEXT uniform_buffers;
78    VkPipelineRobustnessBufferBehaviorEXT vertex_inputs;
79    VkPipelineRobustnessImageBehaviorEXT images;
80    bool null_uniform_buffer_descriptor;
81    bool null_storage_buffer_descriptor;
82 };
83 
84 /** Hash VkPipelineShaderStageCreateInfo info
85  *
86  * Returns the hash of a VkPipelineShaderStageCreateInfo:
87  *    SHA1(info->module->sha1,
88  *         info->pName,
89  *         vk_stage_to_mesa_stage(info->stage),
90  *         info->pSpecializationInfo)
91  *
92  * Can only be used if VkPipelineShaderStageCreateInfo::module is a
93  * vk_shader_module object.
94  */
95 void
96 vk_pipeline_hash_shader_stage(VkPipelineCreateFlags2KHR pipeline_flags,
97                               const VkPipelineShaderStageCreateInfo *info,
98                               const struct vk_pipeline_robustness_state *rstate,
99                               unsigned char *stage_sha1);
100 
101 void
102 vk_pipeline_robustness_state_fill(const struct vk_device *device,
103                                   struct vk_pipeline_robustness_state *rs,
104                                   const void *pipeline_pNext,
105                                   const void *shader_stage_pNext);
106 
107 static inline VkPipelineCreateFlags2KHR
vk_compute_pipeline_create_flags(const VkComputePipelineCreateInfo * info)108 vk_compute_pipeline_create_flags(const VkComputePipelineCreateInfo *info)
109 {
110    const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
111       vk_find_struct_const(info->pNext,
112                            PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
113    if (flags2)
114       return flags2->flags;
115    else
116       return info->flags;
117 }
118 
119 static inline VkPipelineCreateFlags2KHR
vk_graphics_pipeline_create_flags(const VkGraphicsPipelineCreateInfo * info)120 vk_graphics_pipeline_create_flags(const VkGraphicsPipelineCreateInfo *info)
121 {
122    const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
123       vk_find_struct_const(info->pNext,
124                            PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
125    if (flags2)
126       return flags2->flags;
127    else
128       return info->flags;
129 }
130 
131 static inline VkPipelineCreateFlags2KHR
vk_rt_pipeline_create_flags(const VkRayTracingPipelineCreateInfoKHR * info)132 vk_rt_pipeline_create_flags(const VkRayTracingPipelineCreateInfoKHR *info)
133 {
134    const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
135       vk_find_struct_const(info->pNext,
136                            PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
137    if (flags2)
138       return flags2->flags;
139    else
140       return info->flags;
141 }
142 
143 #ifdef VK_ENABLE_BETA_EXTENSIONS
144 static inline VkPipelineCreateFlags2KHR
vk_graph_pipeline_create_flags(const VkExecutionGraphPipelineCreateInfoAMDX * info)145 vk_graph_pipeline_create_flags(const VkExecutionGraphPipelineCreateInfoAMDX *info)
146 {
147    const VkPipelineCreateFlags2CreateInfoKHR *flags2 =
148       vk_find_struct_const(info->pNext,
149                            PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR);
150    if (flags2)
151       return flags2->flags;
152    else
153       return info->flags;
154 }
155 #endif
156 
157 struct vk_pipeline_ops;
158 
159 struct vk_pipeline {
160    struct vk_object_base base;
161 
162    const struct vk_pipeline_ops *ops;
163 
164    VkPipelineBindPoint bind_point;
165    VkPipelineCreateFlags2KHR flags;
166    VkShaderStageFlags stages;
167 };
168 
169 VK_DEFINE_NONDISP_HANDLE_CASTS(vk_pipeline, base, VkPipeline,
170                                VK_OBJECT_TYPE_PIPELINE);
171 
172 struct vk_pipeline_ops {
173    void (*destroy)(struct vk_device *device,
174                    struct vk_pipeline *pipeline,
175                    const VkAllocationCallbacks *pAllocator);
176 
177    VkResult (*get_executable_properties)(struct vk_device *device,
178                                          struct vk_pipeline *pipeline,
179                                          uint32_t *executable_count,
180                                          VkPipelineExecutablePropertiesKHR *properties);
181 
182    VkResult (*get_executable_statistics)(struct vk_device *device,
183                                          struct vk_pipeline *pipeline,
184                                          uint32_t executable_index,
185                                          uint32_t *statistic_count,
186                                          VkPipelineExecutableStatisticKHR *statistics);
187 
188    VkResult (*get_internal_representations)(
189       struct vk_device *device,
190       struct vk_pipeline *pipeline,
191       uint32_t executable_index,
192       uint32_t *internal_representation_count,
193       VkPipelineExecutableInternalRepresentationKHR* internal_representations);
194 
195    void (*cmd_bind)(struct vk_command_buffer *cmd_buffer,
196                     struct vk_pipeline *pipeline);
197 
198    struct vk_shader *(*get_shader)(struct vk_pipeline *pipeline,
199                                    gl_shader_stage stage);
200 };
201 
202 void *vk_pipeline_zalloc(struct vk_device *device,
203                          const struct vk_pipeline_ops *ops,
204                          VkPipelineBindPoint bind_point,
205                          VkPipelineCreateFlags2KHR flags,
206                          const VkAllocationCallbacks *alloc,
207                          size_t size);
208 
209 void vk_pipeline_free(struct vk_device *device,
210                       const VkAllocationCallbacks *alloc,
211                       struct vk_pipeline *pipeline);
212 
213 static inline struct vk_shader *
vk_pipeline_get_shader(struct vk_pipeline * pipeline,gl_shader_stage stage)214 vk_pipeline_get_shader(struct vk_pipeline *pipeline,
215                        gl_shader_stage stage)
216 {
217    if (pipeline->ops->get_shader == NULL)
218       return NULL;
219 
220    return pipeline->ops->get_shader(pipeline, stage);
221 }
222 
223 void
224 vk_cmd_unbind_pipelines_for_stages(struct vk_command_buffer *cmd_buffer,
225                                    VkShaderStageFlags stages);
226 
227 #ifdef __cplusplus
228 }
229 #endif
230 
231 #endif /* VK_PIPELINE_H */
232