FFmpeg
Loading...
Searching...
No Matches
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 */
29typedef 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_DEVICE_DRM (1ULL << 9) /* VK_EXT_physical_device_drm */
43#define FF_VK_EXT_ATOMIC_FLOAT (1ULL << 10) /* VK_EXT_shader_atomic_float */
44#define FF_VK_EXT_COOP_MATRIX (1ULL << 11) /* VK_KHR_cooperative_matrix */
45#define FF_VK_EXT_OPTICAL_FLOW (1ULL << 12) /* VK_NV_optical_flow */
46#define FF_VK_EXT_SHADER_OBJECT (1ULL << 13) /* VK_EXT_shader_object */
47#define FF_VK_EXT_PUSH_DESCRIPTOR (1ULL << 14) /* VK_KHR_push_descriptor */
48#define FF_VK_EXT_RELAXED_EXTENDED_INSTR (1ULL << 15) /* VK_KHR_shader_relaxed_extended_instruction */
49#define FF_VK_EXT_EXPECT_ASSUME (1ULL << 16) /* VK_KHR_shader_expect_assume */
50#define FF_VK_EXT_SUBGROUP_ROTATE (1ULL << 17) /* VK_KHR_shader_subgroup_rotate */
51#define FF_VK_EXT_HOST_IMAGE_COPY (1ULL << 18) /* VK_EXT_host_image_copy */
52#define FF_VK_EXT_ZERO_INITIALIZE (1ULL << 19) /* VK_EXT_zero_initialize_device_memory */
53#define FF_VK_EXT_EXPLICIT_MEM_LAYOUT (1ULL << 20) /* VK_KHR_workgroup_memory_explicit_layout */
54#define FF_VK_EXT_REPLICATED_COMPOSITES (1ULL << 21) /* VK_EXT_shader_replicated_composites */
55#define FF_VK_EXT_LONG_VECTOR (1ULL << 22) /* VK_EXT_shader_long_vector */
56#define FF_VK_EXT_INTERNAL_QUEUE_SYNC (1ULL << 23) /* VK_KHR_internally_synchronized_queues */
57#define FF_VK_EXT_MAXIMAL_RECONVERGENCE (1ULL << 24) /* VK_KHR_shader_maximal_reconvergence */
58
59/* Video extensions */
60#define FF_VK_EXT_VIDEO_QUEUE (1ULL << 36) /* VK_KHR_video_queue */
61#define FF_VK_EXT_VIDEO_MAINTENANCE_1 (1ULL << 37) /* VK_KHR_video_maintenance1 */
62#define FF_VK_EXT_VIDEO_MAINTENANCE_2 (1ULL << 38) /* VK_KHR_video_maintenance2 */
63
64#define FF_VK_EXT_VIDEO_DECODE_QUEUE (1ULL << 40) /* VK_KHR_video_decode_queue */
65#define FF_VK_EXT_VIDEO_DECODE_H264 (1ULL << 41) /* VK_KHR_video_decode_h264 */
66#define FF_VK_EXT_VIDEO_DECODE_H265 (1ULL << 42) /* VK_KHR_video_decode_h265 */
67#define FF_VK_EXT_VIDEO_DECODE_VP9 (1ULL << 43) /* VK_KHR_video_decode_vp9 */
68#define FF_VK_EXT_VIDEO_DECODE_AV1 (1ULL << 44) /* VK_KHR_video_decode_av1 */
69
70#define FF_VK_EXT_VIDEO_ENCODE_QUEUE (1ULL << 50) /* VK_KHR_video_encode_queue */
71#define FF_VK_EXT_VIDEO_ENCODE_H264 (1ULL << 51) /* VK_KHR_video_encode_h264 */
72#define FF_VK_EXT_VIDEO_ENCODE_H265 (1ULL << 52) /* VK_KHR_video_encode_h265 */
73#define FF_VK_EXT_VIDEO_ENCODE_AV1 (1ULL << 53) /* VK_KHR_video_encode_av1 */
74
75#define FF_VK_EXT_PORTABILITY_SUBSET (1ULL << 62)
76#define FF_VK_EXT_NO_FLAG (1ULL << 63)
77
78/* Macro containing every function that we utilize in our codebase */
79#define FN_LIST(MACRO) \
80 /* Instance */ \
81 MACRO(0, 0, FF_VK_EXT_NO_FLAG, EnumerateInstanceExtensionProperties) \
82 MACRO(0, 0, FF_VK_EXT_NO_FLAG, EnumerateInstanceLayerProperties) \
83 MACRO(0, 0, FF_VK_EXT_NO_FLAG, CreateInstance) \
84 MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyInstance) \
85 \
86 /* Debug */ \
87 MACRO(1, 0, FF_VK_EXT_NO_FLAG, CreateDebugUtilsMessengerEXT) \
88 MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyDebugUtilsMessengerEXT) \
89 \
90 /* Device */ \
91 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetDeviceProcAddr) \
92 MACRO(1, 0, FF_VK_EXT_NO_FLAG, CreateDevice) \
93 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceFeatures2) \
94 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceProperties) \
95 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceExternalSemaphoreProperties) \
96 MACRO(1, 0, FF_VK_EXT_VIDEO_QUEUE, GetPhysicalDeviceVideoCapabilitiesKHR) \
97 MACRO(1, 0, FF_VK_EXT_VIDEO_QUEUE, GetPhysicalDeviceVideoFormatPropertiesKHR) \
98 MACRO(1, 0, FF_VK_EXT_NO_FLAG, DeviceWaitIdle) \
99 MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyDevice) \
100 \
101 MACRO(1, 0, FF_VK_EXT_NO_FLAG, EnumeratePhysicalDevices) \
102 MACRO(1, 0, FF_VK_EXT_NO_FLAG, EnumerateDeviceExtensionProperties) \
103 \
104 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceProperties2) \
105 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceMemoryProperties) \
106 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceFormatProperties2) \
107 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceImageFormatProperties2) \
108 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceQueueFamilyProperties) \
109 MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceQueueFamilyProperties2) \
110 MACRO(1, 0, FF_VK_EXT_COOP_MATRIX, GetPhysicalDeviceCooperativeMatrixPropertiesKHR) \
111 \
112 /* Command pool */ \
113 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateCommandPool) \
114 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyCommandPool) \
115 \
116 /* Command buffer */ \
117 MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateCommandBuffers) \
118 MACRO(1, 1, FF_VK_EXT_NO_FLAG, BeginCommandBuffer) \
119 MACRO(1, 1, FF_VK_EXT_NO_FLAG, EndCommandBuffer) \
120 MACRO(1, 1, FF_VK_EXT_NO_FLAG, FreeCommandBuffers) \
121 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdDispatch) \
122 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdDispatchBase) \
123 \
124 /* Queue */ \
125 MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetDeviceQueue2) \
126 MACRO(1, 1, FF_VK_EXT_NO_FLAG, QueueSubmit) \
127 MACRO(1, 1, FF_VK_EXT_NO_FLAG, QueueSubmit2) \
128 \
129 /* Fences */ \
130 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateFence) \
131 MACRO(1, 1, FF_VK_EXT_NO_FLAG, WaitForFences) \
132 MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetFenceStatus) \
133 MACRO(1, 1, FF_VK_EXT_NO_FLAG, ResetFences) \
134 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyFence) \
135 \
136 /* Semaphores */ \
137 MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_SEM, GetSemaphoreFdKHR) \
138 MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_SEM, ImportSemaphoreFdKHR) \
139 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSemaphore) \
140 MACRO(1, 1, FF_VK_EXT_NO_FLAG, WaitSemaphores) \
141 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySemaphore) \
142 \
143 /* Memory */ \
144 MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_MEMORY, GetMemoryFdKHR) \
145 MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetMemoryFdPropertiesKHR) \
146 MACRO(1, 1, FF_VK_EXT_EXTERNAL_HOST_MEMORY, GetMemoryHostPointerPropertiesEXT) \
147 MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateMemory) \
148 MACRO(1, 1, FF_VK_EXT_NO_FLAG, MapMemory) \
149 MACRO(1, 1, FF_VK_EXT_NO_FLAG, FlushMappedMemoryRanges) \
150 MACRO(1, 1, FF_VK_EXT_NO_FLAG, InvalidateMappedMemoryRanges) \
151 MACRO(1, 1, FF_VK_EXT_NO_FLAG, UnmapMemory) \
152 MACRO(1, 1, FF_VK_EXT_NO_FLAG, FreeMemory) \
153 \
154 /* Commands */ \
155 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBindDescriptorSets) \
156 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPushConstants) \
157 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBindPipeline) \
158 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPipelineBarrier) \
159 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdCopyBufferToImage) \
160 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdCopyImageToBuffer) \
161 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdClearColorImage) \
162 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdCopyBuffer) \
163 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdUpdateBuffer) \
164 \
165 /* Buffer */ \
166 MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetBufferMemoryRequirements2) \
167 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateBuffer) \
168 MACRO(1, 1, FF_VK_EXT_NO_FLAG, BindBufferMemory) \
169 MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetBufferDeviceAddress) \
170 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdFillBuffer) \
171 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyBuffer) \
172 \
173 /* Image */ \
174 MACRO(1, 1, FF_VK_EXT_DRM_MODIFIER_FLAGS, GetImageDrmFormatModifierPropertiesEXT) \
175 MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetImageMemoryRequirements2) \
176 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateImage) \
177 MACRO(1, 1, FF_VK_EXT_NO_FLAG, BindImageMemory2) \
178 MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetImageSubresourceLayout) \
179 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyImage) \
180 \
181 /* ImageView */ \
182 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateImageView) \
183 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyImageView) \
184 \
185 /* DescriptorSet */ \
186 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorSetLayout) \
187 MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateDescriptorSets) \
188 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorPool) \
189 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorPool) \
190 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorSetLayout) \
191 \
192 /* DescriptorUpdateTemplate */ \
193 MACRO(1, 1, FF_VK_EXT_NO_FLAG, UpdateDescriptorSetWithTemplate) \
194 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorUpdateTemplate) \
195 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorUpdateTemplate) \
196 \
197 /* Descriptors */ \
198 MACRO(1, 1, FF_VK_EXT_NO_FLAG, UpdateDescriptorSets) \
199 MACRO(1, 1, FF_VK_EXT_PUSH_DESCRIPTOR, CmdPushDescriptorSetKHR) \
200 \
201 /* Queries */ \
202 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateQueryPool) \
203 MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetQueryPoolResults) \
204 MACRO(1, 1, FF_VK_EXT_NO_FLAG, ResetQueryPool) \
205 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBeginQuery) \
206 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdEndQuery) \
207 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdResetQueryPool) \
208 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyQueryPool) \
209 \
210 /* sync2 */ \
211 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPipelineBarrier2) \
212 \
213 /* Host image copy */ \
214 MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, TransitionImageLayoutEXT) \
215 MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, CopyMemoryToImageEXT) \
216 MACRO(1, 1, FF_VK_EXT_HOST_IMAGE_COPY, CopyImageToMemoryEXT) \
217 \
218 /* Video queue */ \
219 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CreateVideoSessionKHR) \
220 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CreateVideoSessionParametersKHR) \
221 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, GetVideoSessionMemoryRequirementsKHR) \
222 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, BindVideoSessionMemoryKHR) \
223 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdBeginVideoCodingKHR) \
224 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdControlVideoCodingKHR) \
225 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdEndVideoCodingKHR) \
226 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, DestroyVideoSessionParametersKHR) \
227 MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, DestroyVideoSessionKHR) \
228 \
229 /* Video decoding */ \
230 MACRO(1, 1, FF_VK_EXT_VIDEO_DECODE_QUEUE, CmdDecodeVideoKHR) \
231 \
232 /* Video encoding */ \
233 MACRO(1, 1, FF_VK_EXT_VIDEO_ENCODE_QUEUE, CmdEncodeVideoKHR) \
234 MACRO(1, 1, FF_VK_EXT_VIDEO_ENCODE_QUEUE, GetEncodedVideoSessionParametersKHR) \
235 MACRO(1, 0, FF_VK_EXT_VIDEO_ENCODE_QUEUE, GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR) \
236 \
237 /* Pipeline */ \
238 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreatePipelineLayout) \
239 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyPipelineLayout) \
240 \
241 /* PipelineLayout */ \
242 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateComputePipelines) \
243 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyPipeline) \
244 \
245 /* Sampler */ \
246 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSamplerYcbcrConversion) \
247 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySamplerYcbcrConversion) \
248 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSampler) \
249 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySampler) \
250 \
251 /* Optical flow */ \
252 MACRO(1, 1, FF_VK_EXT_OPTICAL_FLOW, BindOpticalFlowSessionImageNV) \
253 MACRO(1, 1, FF_VK_EXT_OPTICAL_FLOW, CmdOpticalFlowExecuteNV) \
254 MACRO(1, 1, FF_VK_EXT_OPTICAL_FLOW, CreateOpticalFlowSessionNV) \
255 MACRO(1, 1, FF_VK_EXT_OPTICAL_FLOW, DestroyOpticalFlowSessionNV) \
256 MACRO(1, 0, FF_VK_EXT_OPTICAL_FLOW, GetPhysicalDeviceOpticalFlowImageFormatsNV)\
257 \
258 /* Shaders */ \
259 MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateShaderModule) \
260 MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyShaderModule) \
261 MACRO(1, 1, FF_VK_EXT_SHADER_OBJECT, CmdBindShadersEXT) \
262 MACRO(1, 1, FF_VK_EXT_SHADER_OBJECT, CreateShadersEXT) \
263 MACRO(1, 1, FF_VK_EXT_SHADER_OBJECT, DestroyShaderEXT) \
264 MACRO(1, 1, FF_VK_EXT_SHADER_OBJECT, GetShaderBinaryDataEXT)
265
266/* Macro containing every win32 specific function that we utilize in our codebase */
267#define FN_LIST_WIN32(MACRO) \
268 MACRO(1, 1, FF_VK_EXT_EXTERNAL_WIN32_SEM, GetSemaphoreWin32HandleKHR) \
269 MACRO(1, 1, FF_VK_EXT_EXTERNAL_WIN32_MEMORY, GetMemoryWin32HandleKHR)
270
271/* Macro to turn a function name into a definition */
272#define PFN_DEF(req_inst, req_dev, ext_flag, name) \
273 PFN_vk##name name;
274
275/* Structure with the definition of all listed functions */
276typedef struct FFVulkanFunctions {
278#ifdef _WIN32
280#endif
282
283#endif /* AVUTIL_VULKAN_FUNCTIONS_H */
API-specific header for AV_HWDEVICE_TYPE_VULKAN.
uint64_t FFVulkanExtensions
#define FN_LIST(MACRO)
#define PFN_DEF(req_inst, req_dev, ext_flag, name)
#define FN_LIST_WIN32(MACRO)