| /* |
| * This file is part of FFmpeg. |
| * |
| * FFmpeg is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * FFmpeg is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with FFmpeg; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| #ifndef AVUTIL_VULKAN_FUNCTIONS_H |
| #define AVUTIL_VULKAN_FUNCTIONS_H |
| |
| #define VK_NO_PROTOTYPES |
| #define VK_ENABLE_BETA_EXTENSIONS |
| |
| #include "hwcontext.h" |
| #include "hwcontext_vulkan.h" |
| |
| /* An enum of bitflags for every optional extension we need */ |
| typedef enum FFVulkanExtensions { |
| FF_VK_EXT_EXTERNAL_DMABUF_MEMORY = 1ULL << 0, /* VK_EXT_external_memory_dma_buf */ |
| FF_VK_EXT_DRM_MODIFIER_FLAGS = 1ULL << 1, /* VK_EXT_image_drm_format_modifier */ |
| FF_VK_EXT_EXTERNAL_FD_MEMORY = 1ULL << 2, /* VK_KHR_external_memory_fd */ |
| FF_VK_EXT_EXTERNAL_FD_SEM = 1ULL << 3, /* VK_KHR_external_semaphore_fd */ |
| FF_VK_EXT_EXTERNAL_HOST_MEMORY = 1ULL << 4, /* VK_EXT_external_memory_host */ |
| FF_VK_EXT_DEBUG_UTILS = 1ULL << 5, /* VK_EXT_debug_utils */ |
| #ifdef _WIN32 |
| FF_VK_EXT_EXTERNAL_WIN32_MEMORY = 1ULL << 6, /* VK_KHR_external_memory_win32 */ |
| FF_VK_EXT_EXTERNAL_WIN32_SEM = 1ULL << 7, /* VK_KHR_external_semaphore_win32 */ |
| #endif |
| FF_VK_EXT_DESCRIPTOR_BUFFER = 1ULL << 8, /* VK_EXT_descriptor_buffer */ |
| FF_VK_EXT_DEVICE_DRM = 1ULL << 9, /* VK_EXT_physical_device_drm */ |
| FF_VK_EXT_VIDEO_QUEUE = 1ULL << 10, /* VK_KHR_video_queue */ |
| FF_VK_EXT_VIDEO_DECODE_QUEUE = 1ULL << 11, /* VK_KHR_video_decode_queue */ |
| FF_VK_EXT_VIDEO_DECODE_H264 = 1ULL << 12, /* VK_EXT_video_decode_h264 */ |
| FF_VK_EXT_VIDEO_DECODE_H265 = 1ULL << 13, /* VK_EXT_video_decode_h265 */ |
| FF_VK_EXT_VIDEO_DECODE_AV1 = 1ULL << 14, /* VK_MESA_video_decode_av1 */ |
| FF_VK_EXT_ATOMIC_FLOAT = 1ULL << 15, /* VK_EXT_shader_atomic_float */ |
| FF_VK_EXT_COOP_MATRIX = 1ULL << 16, /* VK_KHR_cooperative_matrix */ |
| |
| FF_VK_EXT_NO_FLAG = 1ULL << 31, |
| } FFVulkanExtensions; |
| |
| /* Macro containing every function that we utilize in our codebase */ |
| #define FN_LIST(MACRO) \ |
| /* Instance */ \ |
| MACRO(0, 0, FF_VK_EXT_NO_FLAG, EnumerateInstanceExtensionProperties) \ |
| MACRO(0, 0, FF_VK_EXT_NO_FLAG, EnumerateInstanceLayerProperties) \ |
| MACRO(0, 0, FF_VK_EXT_NO_FLAG, CreateInstance) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyInstance) \ |
| \ |
| /* Debug */ \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, CreateDebugUtilsMessengerEXT) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyDebugUtilsMessengerEXT) \ |
| \ |
| /* Device */ \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetDeviceProcAddr) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, CreateDevice) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceFeatures2) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceProperties) \ |
| MACRO(1, 0, FF_VK_EXT_VIDEO_QUEUE, GetPhysicalDeviceVideoCapabilitiesKHR) \ |
| MACRO(1, 0, FF_VK_EXT_VIDEO_QUEUE, GetPhysicalDeviceVideoFormatPropertiesKHR) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, DeviceWaitIdle) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, DestroyDevice) \ |
| \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, EnumeratePhysicalDevices) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, EnumerateDeviceExtensionProperties) \ |
| \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceProperties2) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceMemoryProperties) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceFormatProperties2) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceImageFormatProperties2) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceQueueFamilyProperties) \ |
| MACRO(1, 0, FF_VK_EXT_NO_FLAG, GetPhysicalDeviceQueueFamilyProperties2) \ |
| MACRO(1, 0, FF_VK_EXT_COOP_MATRIX, GetPhysicalDeviceCooperativeMatrixPropertiesKHR) \ |
| \ |
| /* Command pool */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateCommandPool) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyCommandPool) \ |
| \ |
| /* Command buffer */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateCommandBuffers) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, BeginCommandBuffer) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, EndCommandBuffer) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, FreeCommandBuffers) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdDispatch) \ |
| \ |
| /* Queue */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetDeviceQueue) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, QueueSubmit) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, QueueSubmit2) \ |
| \ |
| /* Fences */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateFence) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, WaitForFences) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, ResetFences) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyFence) \ |
| \ |
| /* Semaphores */ \ |
| MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_SEM, GetSemaphoreFdKHR) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSemaphore) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, WaitSemaphores) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySemaphore) \ |
| \ |
| /* Memory */ \ |
| MACRO(1, 1, FF_VK_EXT_EXTERNAL_FD_MEMORY, GetMemoryFdKHR) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetMemoryFdPropertiesKHR) \ |
| MACRO(1, 1, FF_VK_EXT_EXTERNAL_HOST_MEMORY, GetMemoryHostPointerPropertiesEXT) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateMemory) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, MapMemory) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, FlushMappedMemoryRanges) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, InvalidateMappedMemoryRanges) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, UnmapMemory) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, FreeMemory) \ |
| \ |
| /* Commands */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBindDescriptorSets) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPushConstants) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBindPipeline) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPipelineBarrier) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdCopyBufferToImage) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdCopyImageToBuffer) \ |
| \ |
| /* Buffer */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetBufferMemoryRequirements2) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateBuffer) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, BindBufferMemory) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetBufferDeviceAddress) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdFillBuffer) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyBuffer) \ |
| \ |
| /* Image */ \ |
| MACRO(1, 1, FF_VK_EXT_DRM_MODIFIER_FLAGS, GetImageDrmFormatModifierPropertiesEXT) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetImageMemoryRequirements2) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateImage) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, BindImageMemory2) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetImageSubresourceLayout) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyImage) \ |
| \ |
| /* ImageView */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateImageView) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyImageView) \ |
| \ |
| /* DescriptorSet */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorSetLayout) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, AllocateDescriptorSets) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorPool) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorPool) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorSetLayout) \ |
| \ |
| /* Descriptor buffers */ \ |
| MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorSetLayoutSizeEXT) \ |
| MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorSetLayoutBindingOffsetEXT) \ |
| MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, GetDescriptorEXT) \ |
| MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, CmdBindDescriptorBuffersEXT) \ |
| MACRO(1, 1, FF_VK_EXT_DESCRIPTOR_BUFFER, CmdSetDescriptorBufferOffsetsEXT) \ |
| \ |
| /* DescriptorUpdateTemplate */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, UpdateDescriptorSetWithTemplate) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateDescriptorUpdateTemplate) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyDescriptorUpdateTemplate) \ |
| \ |
| /* Queries */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateQueryPool) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, GetQueryPoolResults) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, ResetQueryPool) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdBeginQuery) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdEndQuery) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdResetQueryPool) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyQueryPool) \ |
| \ |
| /* sync2 */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CmdPipelineBarrier2) \ |
| \ |
| /* Video queue */ \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CreateVideoSessionKHR) \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CreateVideoSessionParametersKHR) \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, GetVideoSessionMemoryRequirementsKHR) \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, BindVideoSessionMemoryKHR) \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdBeginVideoCodingKHR) \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdControlVideoCodingKHR) \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, CmdEndVideoCodingKHR) \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, DestroyVideoSessionParametersKHR) \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_QUEUE, DestroyVideoSessionKHR) \ |
| \ |
| /* Video decoding */ \ |
| MACRO(1, 1, FF_VK_EXT_VIDEO_DECODE_QUEUE, CmdDecodeVideoKHR) \ |
| \ |
| /* Pipeline */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreatePipelineLayout) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyPipelineLayout) \ |
| \ |
| /* PipelineLayout */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateComputePipelines) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyPipeline) \ |
| \ |
| /* Sampler */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSamplerYcbcrConversion) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySamplerYcbcrConversion) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateSampler) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroySampler) \ |
| \ |
| /* Shaders */ \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, CreateShaderModule) \ |
| MACRO(1, 1, FF_VK_EXT_NO_FLAG, DestroyShaderModule) |
| |
| /* Macro containing every win32 specific function that we utilize in our codebase */ |
| #define FN_LIST_WIN32(MACRO) \ |
| MACRO(1, 1, FF_VK_EXT_EXTERNAL_WIN32_SEM, GetSemaphoreWin32HandleKHR) \ |
| MACRO(1, 1, FF_VK_EXT_EXTERNAL_WIN32_MEMORY, GetMemoryWin32HandleKHR) |
| |
| /* Macro to turn a function name into a definition */ |
| #define PFN_DEF(req_inst, req_dev, ext_flag, name) \ |
| PFN_vk##name name; |
| |
| /* Structure with the definition of all listed functions */ |
| typedef struct FFVulkanFunctions { |
| FN_LIST(PFN_DEF) |
| #ifdef _WIN32 |
| FN_LIST_WIN32(PFN_DEF) |
| #endif |
| } FFVulkanFunctions; |
| |
| #endif /* AVUTIL_VULKAN_FUNCTIONS_H */ |