FFmpeg
vulkan_functions.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
4  * FFmpeg is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * FFmpeg is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with FFmpeg; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #ifndef AVUTIL_VULKAN_FUNCTIONS_H
20 #define AVUTIL_VULKAN_FUNCTIONS_H
21 
22 #define VK_NO_PROTOTYPES
23 #define VK_ENABLE_BETA_EXTENSIONS
24 
25 #include "hwcontext.h"
26 #include "hwcontext_vulkan.h"
27 
28 /* An enum of bitflags for every optional extension we need */
29 typedef uint64_t FFVulkanExtensions;
30 
31 /* NOTE: when adding new entries, make sure to update ff_vk_extensions_to_mask */
32 #define FF_VK_EXT_EXTERNAL_DMABUF_MEMORY (1ULL << 0) /* VK_EXT_external_memory_dma_buf */
33 #define FF_VK_EXT_DRM_MODIFIER_FLAGS (1ULL << 1) /* VK_EXT_image_drm_format_modifier */
34 #define FF_VK_EXT_EXTERNAL_FD_MEMORY (1ULL << 2) /* VK_KHR_external_memory_fd */
35 #define FF_VK_EXT_EXTERNAL_FD_SEM (1ULL << 3) /* VK_KHR_external_semaphore_fd */
36 #define FF_VK_EXT_EXTERNAL_HOST_MEMORY (1ULL << 4) /* VK_EXT_external_memory_host */
37 #define FF_VK_EXT_DEBUG_UTILS (1ULL << 5) /* VK_EXT_debug_utils */
38 
39 #define FF_VK_EXT_EXTERNAL_WIN32_MEMORY (1ULL << 6) /* VK_KHR_external_memory_win32 */
40 #define FF_VK_EXT_EXTERNAL_WIN32_SEM (1ULL << 7) /* VK_KHR_external_semaphore_win32 */
41 
42 #define FF_VK_EXT_DESCRIPTOR_BUFFER (1ULL << 8) /* VK_EXT_descriptor_buffer */
43 #define FF_VK_EXT_DEVICE_DRM (1ULL << 9) /* VK_EXT_physical_device_drm */
44 #define FF_VK_EXT_ATOMIC_FLOAT (1ULL << 10) /* VK_EXT_shader_atomic_float */
45 #define FF_VK_EXT_COOP_MATRIX (1ULL << 11) /* VK_KHR_cooperative_matrix */
46 #define FF_VK_EXT_OPTICAL_FLOW (1ULL << 12) /* VK_NV_optical_flow */
47 #define FF_VK_EXT_SHADER_OBJECT (1ULL << 13) /* VK_EXT_shader_object */
48 #define FF_VK_EXT_PUSH_DESCRIPTOR (1ULL << 14) /* VK_KHR_push_descriptor */
49 #define FF_VK_EXT_RELAXED_EXTENDED_INSTR (1ULL << 15) /* VK_KHR_shader_relaxed_extended_instruction */
50 #define FF_VK_EXT_EXPECT_ASSUME (1ULL << 16) /* VK_KHR_shader_expect_assume */
51 #define FF_VK_EXT_SUBGROUP_ROTATE (1ULL << 17) /* VK_KHR_shader_subgroup_rotate */
52 #define FF_VK_EXT_HOST_IMAGE_COPY (1ULL << 18) /* VK_EXT_host_image_copy */
53 #define FF_VK_EXT_ZERO_INITIALIZE (1ULL << 19) /* VK_EXT_zero_initialize_device_memory */
54 #define FF_VK_EXT_EXPLICIT_MEM_LAYOUT (1ULL << 20) /* VK_KHR_workgroup_memory_explicit_layout */
55 #define FF_VK_EXT_REPLICATED_COMPOSITES (1ULL << 21) /* VK_EXT_shader_replicated_composites */
56 #define FF_VK_EXT_LONG_VECTOR (1ULL << 22) /* VK_EXT_shader_long_vector */
57 
58 /* Video extensions */
59 #define FF_VK_EXT_VIDEO_QUEUE (1ULL << 36) /* VK_KHR_video_queue */
60 #define FF_VK_EXT_VIDEO_MAINTENANCE_1 (1ULL << 37) /* VK_KHR_video_maintenance1 */
61 #define FF_VK_EXT_VIDEO_MAINTENANCE_2 (1ULL << 38) /* VK_KHR_video_maintenance2 */
62 
63 #define FF_VK_EXT_VIDEO_DECODE_QUEUE (1ULL << 40) /* VK_KHR_video_decode_queue */
64 #define FF_VK_EXT_VIDEO_DECODE_H264 (1ULL << 41) /* VK_KHR_video_decode_h264 */
65 #define FF_VK_EXT_VIDEO_DECODE_H265 (1ULL << 42) /* VK_KHR_video_decode_h265 */
66 #define FF_VK_EXT_VIDEO_DECODE_VP9 (1ULL << 43) /* VK_KHR_video_decode_vp9 */
67 #define FF_VK_EXT_VIDEO_DECODE_AV1 (1ULL << 44) /* VK_KHR_video_decode_av1 */
68 
69 #define FF_VK_EXT_VIDEO_ENCODE_QUEUE (1ULL << 50) /* VK_KHR_video_encode_queue */
70 #define FF_VK_EXT_VIDEO_ENCODE_H264 (1ULL << 51) /* VK_KHR_video_encode_h264 */
71 #define FF_VK_EXT_VIDEO_ENCODE_H265 (1ULL << 52) /* VK_KHR_video_encode_h265 */
72 #define FF_VK_EXT_VIDEO_ENCODE_AV1 (1ULL << 53) /* VK_KHR_video_encode_av1 */
73 
74 #define FF_VK_EXT_PORTABILITY_SUBSET (1ULL << 62)
75 #define FF_VK_EXT_NO_FLAG (1ULL << 63)
76 
77 /* Macro containing every function that we utilize in our codebase */
78 #define FN_LIST(MACRO) \
79  /* Instance */ \
80  MACRO(0, 0, FF_VK_EXT_NO_FLAG, EnumerateInstanceExtensionProperties) \
81  MACRO(0, 0, FF_VK_EXT_NO_FLAG, EnumerateInstanceLayerProperties) \
82  MACRO(0, 0, FF_VK_EXT_NO_FLAG, CreateInstance) \
83  MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyInstance) \
84  \
85  /* Debug */ \
86  MACRO(1, 0, FF_VK_EXT_NO_FLAG, CreateDebugUtilsMessengerEXT) \
87  MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyDebugUtilsMessengerEXT) \
88  \
89  /* Device */ \
90  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetDeviceProcAddr) \
91  MACRO(1, 0, FF_VK_EXT_NO_FLAG, CreateDevice) \
92  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceFeatures2) \
93  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceProperties) \
94  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceExternalSemaphoreProperties) \
95  MACRO(1, 0, FF_VK_EXT_VIDEO_QUEUE, GetPhysicalDeviceVideoCapabilitiesKHR) \
96  MACRO(1, 0, FF_VK_EXT_VIDEO_QUEUE, GetPhysicalDeviceVideoFormatPropertiesKHR) \
97  MACRO(1, 0, FF_VK_EXT_NO_FLAG, DeviceWaitIdle) \
98  MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyDevice) \
99  \
100  MACRO(1, 0, FF_VK_EXT_NO_FLAG, EnumeratePhysicalDevices) \
101  MACRO(1, 0, FF_VK_EXT_NO_FLAG, EnumerateDeviceExtensionProperties) \
102  \
103  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceProperties2) \
104  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceMemoryProperties) \
105  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceFormatProperties2) \
106  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceImageFormatProperties2) \
107  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceQueueFamilyProperties) \
108  MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceQueueFamilyProperties2) \
109  MACRO(1, 0, FF_VK_EXT_COOP_MATRIX, GetPhysicalDeviceCooperativeMatrixPropertiesKHR) \
110  \
111  /* Command pool */ \
112  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateCommandPool) \
113  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyCommandPool) \
114  \
115  /* Command buffer */ \
116  MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateCommandBuffers) \
117  MACRO(1, 1, FF_VK_EXT_NO_FLAG, BeginCommandBuffer) \
118  MACRO(1, 1, FF_VK_EXT_NO_FLAG, EndCommandBuffer) \
119  MACRO(1, 1, FF_VK_EXT_NO_FLAG, FreeCommandBuffers) \
120  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdDispatch) \
121  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdDispatchBase) \
122  \
123  /* Queue */ \
124  MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetDeviceQueue) \
125  MACRO(1, 1, FF_VK_EXT_NO_FLAG, QueueSubmit) \
126  MACRO(1, 1, FF_VK_EXT_NO_FLAG, QueueSubmit2) \
127  \
128  /* Fences */ \
129  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateFence) \
130  MACRO(1, 1, FF_VK_EXT_NO_FLAG, WaitForFences) \
131  MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetFenceStatus) \
132  MACRO(1, 1, FF_VK_EXT_NO_FLAG, ResetFences) \
133  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyFence) \
134  \
135  /* Semaphores */ \
136  MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_SEM, GetSemaphoreFdKHR) \
137  MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_SEM, ImportSemaphoreFdKHR) \
138  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSemaphore) \
139  MACRO(1, 1, FF_VK_EXT_NO_FLAG, WaitSemaphores) \
140  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySemaphore) \
141  \
142  /* Memory */ \
143  MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_MEMORY, GetMemoryFdKHR) \
144  MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetMemoryFdPropertiesKHR) \
145  MACRO(1, 1, FF_VK_EXT_EXTERNAL_HOST_MEMORY, GetMemoryHostPointerPropertiesEXT) \
146  MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateMemory) \
147  MACRO(1, 1, FF_VK_EXT_NO_FLAG, MapMemory) \
148  MACRO(1, 1, FF_VK_EXT_NO_FLAG, FlushMappedMemoryRanges) \
149  MACRO(1, 1, FF_VK_EXT_NO_FLAG, InvalidateMappedMemoryRanges) \
150  MACRO(1, 1, FF_VK_EXT_NO_FLAG, UnmapMemory) \
151  MACRO(1, 1, FF_VK_EXT_NO_FLAG, FreeMemory) \
152  \
153  /* Commands */ \
154  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBindDescriptorSets) \
155  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPushConstants) \
156  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBindPipeline) \
157  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPipelineBarrier) \
158  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdCopyBufferToImage) \
159  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdCopyImageToBuffer) \
160  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdClearColorImage) \
161  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdCopyBuffer) \
162  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdUpdateBuffer) \
163  \
164  /* Buffer */ \
165  MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetBufferMemoryRequirements2) \
166  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateBuffer) \
167  MACRO(1, 1, FF_VK_EXT_NO_FLAG, BindBufferMemory) \
168  MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetBufferDeviceAddress) \
169  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdFillBuffer) \
170  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyBuffer) \
171  \
172  /* Image */ \
173  MACRO(1, 1, FF_VK_EXT_DRM_MODIFIER_FLAGS, GetImageDrmFormatModifierPropertiesEXT) \
174  MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetImageMemoryRequirements2) \
175  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateImage) \
176  MACRO(1, 1, FF_VK_EXT_NO_FLAG, BindImageMemory2) \
177  MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetImageSubresourceLayout) \
178  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyImage) \
179  \
180  /* ImageView */ \
181  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateImageView) \
182  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyImageView) \
183  \
184  /* DescriptorSet */ \
185  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorSetLayout) \
186  MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateDescriptorSets) \
187  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorPool) \
188  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorPool) \
189  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorSetLayout) \
190  \
191  /* Descriptor buffers */ \
192  MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorSetLayoutSizeEXT) \
193  MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorSetLayoutBindingOffsetEXT) \
194  MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorEXT) \
195  MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, CmdBindDescriptorBuffersEXT) \
196  MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, CmdSetDescriptorBufferOffsetsEXT) \
197  \
198  /* DescriptorUpdateTemplate */ \
199  MACRO(1, 1, FF_VK_EXT_NO_FLAG, UpdateDescriptorSetWithTemplate) \
200  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorUpdateTemplate) \
201  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorUpdateTemplate) \
202  \
203  /* Descriptors */ \
204  MACRO(1, 1, FF_VK_EXT_NO_FLAG, UpdateDescriptorSets) \
205  MACRO(1, 1, FF_VK_EXT_PUSH_DESCRIPTOR, CmdPushDescriptorSetKHR) \
206  \
207  /* Queries */ \
208  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateQueryPool) \
209  MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetQueryPoolResults) \
210  MACRO(1, 1, FF_VK_EXT_NO_FLAG, ResetQueryPool) \
211  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBeginQuery) \
212  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdEndQuery) \
213  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdResetQueryPool) \
214  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyQueryPool) \
215  \
216  /* sync2 */ \
217  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPipelineBarrier2) \
218  \
219  /* Host image copy */ \
220  MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, TransitionImageLayoutEXT) \
221  MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, CopyMemoryToImageEXT) \
222  MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, CopyImageToMemoryEXT) \
223  \
224  /* Video queue */ \
225  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CreateVideoSessionKHR) \
226  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CreateVideoSessionParametersKHR) \
227  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, GetVideoSessionMemoryRequirementsKHR) \
228  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, BindVideoSessionMemoryKHR) \
229  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdBeginVideoCodingKHR) \
230  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdControlVideoCodingKHR) \
231  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdEndVideoCodingKHR) \
232  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, DestroyVideoSessionParametersKHR) \
233  MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, DestroyVideoSessionKHR) \
234  \
235  /* Video decoding */ \
236  MACRO(1, 1, FF_VK_EXT_VIDEO_DECODE_QUEUE, CmdDecodeVideoKHR) \
237  \
238  /* Video encoding */ \
239  MACRO(1, 1, FF_VK_EXT_VIDEO_ENCODE_QUEUE, CmdEncodeVideoKHR) \
240  MACRO(1, 1, FF_VK_EXT_VIDEO_ENCODE_QUEUE, GetEncodedVideoSessionParametersKHR) \
241  MACRO(1, 0, FF_VK_EXT_VIDEO_ENCODE_QUEUE, GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR) \
242  \
243  /* Pipeline */ \
244  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreatePipelineLayout) \
245  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyPipelineLayout) \
246  \
247  /* PipelineLayout */ \
248  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateComputePipelines) \
249  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyPipeline) \
250  \
251  /* Sampler */ \
252  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSamplerYcbcrConversion) \
253  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySamplerYcbcrConversion) \
254  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSampler) \
255  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySampler) \
256  \
257  /* Optical flow */ \
258  MACRO(1, 1, FF_VK_EXT_OPTICAL_FLOW, BindOpticalFlowSessionImageNV) \
259  MACRO(1, 1, FF_VK_EXT_OPTICAL_FLOW, CmdOpticalFlowExecuteNV) \
260  MACRO(1, 1, FF_VK_EXT_OPTICAL_FLOW, CreateOpticalFlowSessionNV) \
261  MACRO(1, 1, FF_VK_EXT_OPTICAL_FLOW, DestroyOpticalFlowSessionNV) \
262  MACRO(1, 0, FF_VK_EXT_OPTICAL_FLOW, GetPhysicalDeviceOpticalFlowImageFormatsNV)\
263  \
264  /* Shaders */ \
265  MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateShaderModule) \
266  MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyShaderModule) \
267  MACRO(1, 1, FF_VK_EXT_SHADER_OBJECT, CmdBindShadersEXT) \
268  MACRO(1, 1, FF_VK_EXT_SHADER_OBJECT, CreateShadersEXT) \
269  MACRO(1, 1, FF_VK_EXT_SHADER_OBJECT, DestroyShaderEXT) \
270  MACRO(1, 1, FF_VK_EXT_SHADER_OBJECT, GetShaderBinaryDataEXT)
271 
272 /* Macro containing every win32 specific function that we utilize in our codebase */
273 #define FN_LIST_WIN32(MACRO) \
274  MACRO(1, 1, FF_VK_EXT_EXTERNAL_WIN32_SEM, GetSemaphoreWin32HandleKHR) \
275  MACRO(1, 1, FF_VK_EXT_EXTERNAL_WIN32_MEMORY, GetMemoryWin32HandleKHR)
276 
277 /* Macro to turn a function name into a definition */
278 #define PFN_DEF(req_inst, req_dev, ext_flag, name) \
279  PFN_vk##name name;
280 
281 /* Structure with the definition of all listed functions */
282 typedef struct FFVulkanFunctions {
284 #ifdef _WIN32
286 #endif
288 
289 #endif /* AVUTIL_VULKAN_FUNCTIONS_H */
FFVulkanExtensions
uint64_t FFVulkanExtensions
Definition: vulkan_functions.h:29
FN_LIST_WIN32
#define FN_LIST_WIN32(MACRO)
Definition: vulkan_functions.h:273
FN_LIST
#define FN_LIST(MACRO)
Definition: vulkan_functions.h:78
hwcontext_vulkan.h
PFN_DEF
#define PFN_DEF(req_inst, req_dev, ext_flag, name)
Definition: vulkan_functions.h:278
hwcontext.h
FFVulkanFunctions
Definition: vulkan_functions.h:282