• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 enum FFVulkanExtensions {
30     FF_VK_EXT_EXTERNAL_DMABUF_MEMORY = 1ULL <<  0, /* VK_EXT_external_memory_dma_buf */
31     FF_VK_EXT_DRM_MODIFIER_FLAGS     = 1ULL <<  1, /* VK_EXT_image_drm_format_modifier */
32     FF_VK_EXT_EXTERNAL_FD_MEMORY     = 1ULL <<  2, /* VK_KHR_external_memory_fd */
33     FF_VK_EXT_EXTERNAL_FD_SEM        = 1ULL <<  3, /* VK_KHR_external_semaphore_fd */
34     FF_VK_EXT_EXTERNAL_HOST_MEMORY   = 1ULL <<  4, /* VK_EXT_external_memory_host */
35     FF_VK_EXT_DEBUG_UTILS            = 1ULL <<  5, /* VK_EXT_debug_utils */
36 #ifdef _WIN32
37     FF_VK_EXT_EXTERNAL_WIN32_MEMORY  = 1ULL <<  6, /* VK_KHR_external_memory_win32 */
38     FF_VK_EXT_EXTERNAL_WIN32_SEM     = 1ULL <<  7, /* VK_KHR_external_semaphore_win32 */
39 #endif
40 
41     FF_VK_EXT_NO_FLAG                = 1ULL << 31,
42 } FFVulkanExtensions;
43 
44 /* Macro containing every function that we utilize in our codebase */
45 #define FN_LIST(MACRO)                                                                   \
46     /* Instance */                                                                       \
47     MACRO(0, 0, FF_VK_EXT_NO_FLAG,              EnumerateInstanceExtensionProperties)    \
48     MACRO(0, 0, FF_VK_EXT_NO_FLAG,              EnumerateInstanceLayerProperties)        \
49     MACRO(0, 0, FF_VK_EXT_NO_FLAG,              CreateInstance)                          \
50     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              DestroyInstance)                         \
51                                                                                          \
52     /* Debug */                                                                          \
53     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              CreateDebugUtilsMessengerEXT)            \
54     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              DestroyDebugUtilsMessengerEXT)           \
55                                                                                          \
56     /* Device */                                                                         \
57     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetDeviceProcAddr)                       \
58     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              CreateDevice)                            \
59     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceFeatures2)              \
60     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceProperties)             \
61     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              DeviceWaitIdle)                          \
62     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              DestroyDevice)                           \
63                                                                                          \
64     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              EnumeratePhysicalDevices)                \
65     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              EnumerateDeviceExtensionProperties)      \
66                                                                                          \
67     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceProperties2)            \
68     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceMemoryProperties)       \
69     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceFormatProperties2)      \
70     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceImageFormatProperties2) \
71     MACRO(1, 0, FF_VK_EXT_NO_FLAG,              GetPhysicalDeviceQueueFamilyProperties)  \
72                                                                                          \
73     /* Command pool */                                                                   \
74     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateCommandPool)                       \
75     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyCommandPool)                      \
76                                                                                          \
77     /* Command buffer */                                                                 \
78     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              AllocateCommandBuffers)                  \
79     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              BeginCommandBuffer)                      \
80     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              EndCommandBuffer)                        \
81     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              FreeCommandBuffers)                      \
82     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CmdDispatch)                             \
83                                                                                          \
84     /* Queue */                                                                          \
85     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              GetDeviceQueue)                          \
86     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              QueueSubmit)                             \
87                                                                                          \
88     /* Fences */                                                                         \
89     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateFence)                             \
90     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              WaitForFences)                           \
91     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              ResetFences)                             \
92     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyFence)                            \
93                                                                                          \
94     /* Semaphores */                                                                     \
95     MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_SEM,      GetSemaphoreFdKHR)                       \
96     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateSemaphore)                         \
97     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              WaitSemaphores)                          \
98     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroySemaphore)                        \
99                                                                                          \
100     /* Memory */                                                                         \
101     MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_MEMORY,   GetMemoryFdKHR)                          \
102     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              GetMemoryFdPropertiesKHR)                \
103     MACRO(1, 1, FF_VK_EXT_EXTERNAL_HOST_MEMORY, GetMemoryHostPointerPropertiesEXT)       \
104     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              AllocateMemory)                          \
105     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              MapMemory)                               \
106     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              FlushMappedMemoryRanges)                 \
107     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              InvalidateMappedMemoryRanges)            \
108     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              UnmapMemory)                             \
109     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              FreeMemory)                              \
110                                                                                          \
111     /* Commands */                                                                       \
112     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CmdBindDescriptorSets)                   \
113     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CmdPushConstants)                        \
114     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CmdBindPipeline)                         \
115     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CmdPipelineBarrier)                      \
116     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CmdCopyBufferToImage)                    \
117     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CmdCopyImageToBuffer)                    \
118                                                                                          \
119     /* Buffer */                                                                         \
120     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              GetBufferMemoryRequirements2)            \
121     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateBuffer)                            \
122     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              BindBufferMemory)                        \
123     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyBuffer)                           \
124                                                                                          \
125     /* Image */                                                                          \
126     MACRO(1, 1, FF_VK_EXT_DRM_MODIFIER_FLAGS,   GetImageDrmFormatModifierPropertiesEXT)  \
127     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              GetImageMemoryRequirements2)             \
128     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateImage)                             \
129     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              BindImageMemory2)                        \
130     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              GetImageSubresourceLayout)               \
131     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyImage)                            \
132                                                                                          \
133     /* ImageView */                                                                      \
134     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateImageView)                         \
135     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyImageView)                        \
136                                                                                          \
137     /* DescriptorSet */                                                                  \
138     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateDescriptorSetLayout)               \
139     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              AllocateDescriptorSets)                  \
140     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateDescriptorPool)                    \
141     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyDescriptorPool)                   \
142     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyDescriptorSetLayout)              \
143                                                                                          \
144     /* DescriptorUpdateTemplate */                                                       \
145     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              UpdateDescriptorSetWithTemplate)         \
146     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateDescriptorUpdateTemplate)          \
147     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyDescriptorUpdateTemplate)         \
148                                                                                          \
149     /* Pipeline */                                                                       \
150     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreatePipelineLayout)                    \
151     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyPipelineLayout)                   \
152                                                                                          \
153     /* PipelineLayout */                                                                 \
154     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateComputePipelines)                  \
155     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyPipeline)                         \
156                                                                                          \
157     /* Sampler */                                                                        \
158     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateSampler)                           \
159     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroySampler)                          \
160                                                                                          \
161     /* Shaders */                                                                        \
162     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              CreateShaderModule)                      \
163     MACRO(1, 1, FF_VK_EXT_NO_FLAG,              DestroyShaderModule)
164 
165 /* Macro containing every win32 specific function that we utilize in our codebase */
166 #define FN_LIST_WIN32(MACRO)                                                             \
167     MACRO(1, 1, FF_VK_EXT_EXTERNAL_WIN32_SEM,    GetSemaphoreWin32HandleKHR)             \
168     MACRO(1, 1, FF_VK_EXT_EXTERNAL_WIN32_MEMORY, GetMemoryWin32HandleKHR)
169 
170 /* Macro to turn a function name into a definition */
171 #define PFN_DEF(req_inst, req_dev, ext_flag, name) \
172     PFN_vk##name name;
173 
174 /* Structure with the definition of all listed functions */
175 typedef struct FFVulkanFunctions {
176     FN_LIST(PFN_DEF)
177 #ifdef _WIN32
178     FN_LIST_WIN32(PFN_DEF)
179 #endif
180 } FFVulkanFunctions;
181 
182 #endif /* AVUTIL_VULKAN_FUNCTIONS_H */
183