21 #define VK_NO_PROTOTYPES 
   22 #define VK_ENABLE_BETA_EXTENSIONS 
   26 #include <versionhelpers.h> 
   53 #include <va/va_drmcommon.h> 
   56 #include <sys/sysmacros.h> 
   60 #include <drm_fourcc.h> 
   64 #if HAVE_LINUX_DMA_BUF_H 
   65 #include <sys/ioctl.h> 
   66 #include <linux/dma-buf.h> 
   72 #define CHECK_CU(x) FF_CUDA_CHECK_DL(cuda_cu, cu, x) 
   85 #ifdef VK_EXT_zero_initialize_device_memory 
   86     VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT zero_initialize;
 
   89 #ifdef VK_KHR_shader_expect_assume 
   90     VkPhysicalDeviceShaderExpectAssumeFeaturesKHR expect_assume;
 
   94 #ifdef VK_KHR_video_maintenance2 
   95     VkPhysicalDeviceVideoMaintenance2FeaturesKHR video_maintenance_2;
 
   97 #ifdef VK_KHR_video_decode_vp9 
   98     VkPhysicalDeviceVideoDecodeVP9FeaturesKHR vp9_decode;
 
  100 #ifdef VK_KHR_video_encode_av1 
  101     VkPhysicalDeviceVideoEncodeAV1FeaturesKHR av1_encode;
 
  109 #ifdef VK_KHR_shader_relaxed_extended_instruction 
  110     VkPhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR relaxed_extended_instruction;
 
  130     VkPhysicalDeviceExternalMemoryHostPropertiesEXT 
hprops;
 
  214     feats->
device = (VkPhysicalDeviceFeatures2) {
 
  215         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
 
  219                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES);
 
  221                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
 
  223                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES);
 
  226                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES);
 
  228                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR);
 
  230                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT);
 
  232 #ifdef VK_EXT_zero_initialize_device_memory 
  234                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT);
 
  237 #ifdef VK_KHR_shader_expect_assume 
  239                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR);
 
  243                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR);
 
  244 #ifdef VK_KHR_video_maintenance2 
  246                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR);
 
  248 #ifdef VK_KHR_video_decode_vp9 
  250                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR);
 
  252 #ifdef VK_KHR_video_encode_av1 
  254                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR);
 
  258                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT);
 
  260                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR);
 
  262                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT);
 
  264                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
 
  266 #ifdef VK_KHR_shader_relaxed_extended_instruction 
  268                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR);
 
  275 #define COPY_VAL(VAL)        \ 
  277         dst->VAL = src->VAL; \ 
  280     COPY_VAL(device.features.shaderImageGatherExtended);
 
  281     COPY_VAL(device.features.shaderStorageImageReadWithoutFormat);
 
  282     COPY_VAL(device.features.shaderStorageImageWriteWithoutFormat);
 
  283     COPY_VAL(device.features.fragmentStoresAndAtomics);
 
  284     COPY_VAL(device.features.vertexPipelineStoresAndAtomics);
 
  285     COPY_VAL(device.features.shaderInt64);
 
  286     COPY_VAL(device.features.shaderInt16);
 
  287     COPY_VAL(device.features.shaderFloat64);
 
  288     COPY_VAL(device.features.shaderStorageImageReadWithoutFormat);
 
  289     COPY_VAL(device.features.shaderStorageImageWriteWithoutFormat);
 
  291     COPY_VAL(vulkan_1_1.samplerYcbcrConversion);
 
  292     COPY_VAL(vulkan_1_1.storagePushConstant16);
 
  293     COPY_VAL(vulkan_1_1.storageBuffer16BitAccess);
 
  294     COPY_VAL(vulkan_1_1.uniformAndStorageBuffer16BitAccess);
 
  296     COPY_VAL(vulkan_1_2.timelineSemaphore);
 
  297     COPY_VAL(vulkan_1_2.scalarBlockLayout);
 
  298     COPY_VAL(vulkan_1_2.bufferDeviceAddress);
 
  299     COPY_VAL(vulkan_1_2.hostQueryReset);
 
  300     COPY_VAL(vulkan_1_2.storagePushConstant8);
 
  302     COPY_VAL(vulkan_1_2.storageBuffer8BitAccess);
 
  303     COPY_VAL(vulkan_1_2.uniformAndStorageBuffer8BitAccess);
 
  305     COPY_VAL(vulkan_1_2.shaderBufferInt64Atomics);
 
  306     COPY_VAL(vulkan_1_2.shaderSharedInt64Atomics);
 
  307     COPY_VAL(vulkan_1_2.vulkanMemoryModel);
 
  308     COPY_VAL(vulkan_1_2.vulkanMemoryModelDeviceScope);
 
  309     COPY_VAL(vulkan_1_2.uniformBufferStandardLayout);
 
  311     COPY_VAL(vulkan_1_3.dynamicRendering);
 
  313     COPY_VAL(vulkan_1_3.synchronization2);
 
  314     COPY_VAL(vulkan_1_3.computeFullSubgroups);
 
  315     COPY_VAL(vulkan_1_3.subgroupSizeControl);
 
  316     COPY_VAL(vulkan_1_3.shaderZeroInitializeWorkgroupMemory);
 
  317     COPY_VAL(vulkan_1_3.dynamicRendering);
 
  319     COPY_VAL(timeline_semaphore.timelineSemaphore);
 
  320     COPY_VAL(subgroup_rotate.shaderSubgroupRotate);
 
  321     COPY_VAL(host_image_copy.hostImageCopy);
 
  323 #ifdef VK_EXT_zero_initialize_device_memory 
  324     COPY_VAL(zero_initialize.zeroInitializeDeviceMemory);
 
  327     COPY_VAL(video_maintenance_1.videoMaintenance1);
 
  328 #ifdef VK_KHR_video_maintenance2 
  329     COPY_VAL(video_maintenance_2.videoMaintenance2);
 
  332 #ifdef VK_KHR_video_decode_vp9 
  333     COPY_VAL(vp9_decode.videoDecodeVP9);
 
  336 #ifdef VK_KHR_video_encode_av1 
  337     COPY_VAL(av1_encode.videoEncodeAV1);
 
  340     COPY_VAL(shader_object.shaderObject);
 
  342     COPY_VAL(cooperative_matrix.cooperativeMatrix);
 
  344     COPY_VAL(descriptor_buffer.descriptorBuffer);
 
  345     COPY_VAL(descriptor_buffer.descriptorBufferPushDescriptors);
 
  347     COPY_VAL(atomic_float.shaderBufferFloat32Atomics);
 
  348     COPY_VAL(atomic_float.shaderBufferFloat32AtomicAdd);
 
  350 #ifdef VK_KHR_shader_relaxed_extended_instruction 
  351     COPY_VAL(relaxed_extended_instruction.shaderRelaxedExtendedInstruction);
 
  354 #ifdef VK_KHR_shader_expect_assume 
  355     COPY_VAL(expect_assume.shaderExpectAssume);
 
  361 #define ASPECT_2PLANE (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT) 
  362 #define ASPECT_3PLANE (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT) 
  374     { VK_FORMAT_R8_UNORM,   
AV_PIX_FMT_GRAY8,   VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8_UNORM   } },
 
  375     { VK_FORMAT_R10X6_UNORM_PACK16,  
AV_PIX_FMT_GRAY10MSB,  VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM  } },
 
  376     { VK_FORMAT_R12X4_UNORM_PACK16,  
AV_PIX_FMT_GRAY12MSB,  VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM  } },
 
  377     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_GRAY16,  VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16_UNORM  } },
 
  378     { VK_FORMAT_R32_UINT,   
AV_PIX_FMT_GRAY32,  VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32_UINT   } },
 
  379     { VK_FORMAT_R32_SFLOAT, 
AV_PIX_FMT_GRAYF32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32_SFLOAT } },
 
  382     { VK_FORMAT_B8G8R8A8_UNORM,           
AV_PIX_FMT_BGRA,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_B8G8R8A8_UNORM           } },
 
  383     { VK_FORMAT_R8G8B8A8_UNORM,           
AV_PIX_FMT_RGBA,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8G8B8A8_UNORM           } },
 
  384     { VK_FORMAT_R8G8B8_UNORM,             
AV_PIX_FMT_RGB24,   VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8G8B8_UNORM             } },
 
  385     { VK_FORMAT_B8G8R8_UNORM,             
AV_PIX_FMT_BGR24,   VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_B8G8R8_UNORM             } },
 
  386     { VK_FORMAT_R16G16B16_UNORM,          
AV_PIX_FMT_RGB48,   VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16_UNORM          } },
 
  387     { VK_FORMAT_R16G16B16A16_UNORM,       
AV_PIX_FMT_RGBA64,  VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM       } },
 
  388     { VK_FORMAT_R5G6B5_UNORM_PACK16,      
AV_PIX_FMT_RGB565,  VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R5G6B5_UNORM_PACK16      } },
 
  389     { VK_FORMAT_B5G6R5_UNORM_PACK16,      
AV_PIX_FMT_BGR565,  VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_B5G6R5_UNORM_PACK16      } },
 
  390     { VK_FORMAT_B8G8R8A8_UNORM,           
AV_PIX_FMT_BGR0,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_B8G8R8A8_UNORM           } },
 
  391     { VK_FORMAT_R8G8B8A8_UNORM,           
AV_PIX_FMT_RGB0,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8G8B8A8_UNORM           } },
 
  392     { VK_FORMAT_A2R10G10B10_UNORM_PACK32, 
AV_PIX_FMT_X2RGB10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2R10G10B10_UNORM_PACK32 } },
 
  393     { VK_FORMAT_A2B10G10R10_UNORM_PACK32, 
AV_PIX_FMT_X2BGR10, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_A2B10G10R10_UNORM_PACK32 } },
 
  394     { VK_FORMAT_R32G32B32_SFLOAT,         
AV_PIX_FMT_RGBF32,  VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32_SFLOAT         } },
 
  395     { VK_FORMAT_R32G32B32A32_SFLOAT,      
AV_PIX_FMT_RGBAF32, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32A32_SFLOAT      } },
 
  396     { VK_FORMAT_R32G32B32_UINT,           
AV_PIX_FMT_RGB96,   VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32_UINT           } },
 
  397     { VK_FORMAT_R32G32B32A32_UINT,        
AV_PIX_FMT_RGBA128, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R32G32B32A32_UINT        } },
 
  400     { VK_FORMAT_R8_UNORM,   
AV_PIX_FMT_GBRP,     VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM   } },
 
  401     { VK_FORMAT_R10X6_UNORM_PACK16,  
AV_PIX_FMT_GBRP10MSB,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  402     { VK_FORMAT_R12X4_UNORM_PACK16,  
AV_PIX_FMT_GBRP12MSB,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  403     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_GBRP16,   VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  404     { VK_FORMAT_R32_SFLOAT, 
AV_PIX_FMT_GBRPF32,  VK_IMAGE_ASPECT_COLOR_BIT, 3, 3, 3, { VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT } },
 
  407     { VK_FORMAT_R8_UNORM,   
AV_PIX_FMT_GBRAP,    VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM   } },
 
  408     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_GBRAP10,  VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  409     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_GBRAP12,  VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  410     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_GBRAP14,  VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  411     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_GBRAP16,  VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  412     { VK_FORMAT_R32_UINT,   
AV_PIX_FMT_GBRAP32,  VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R32_UINT,   VK_FORMAT_R32_UINT,   VK_FORMAT_R32_UINT,   VK_FORMAT_R32_UINT   } },
 
  413     { VK_FORMAT_R32_SFLOAT, 
AV_PIX_FMT_GBRAPF32, VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT } },
 
  420     { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, 
AV_PIX_FMT_P010, 
ASPECT_2PLANE, 2, 1, 2, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16G16_UNORM } },
 
  421     { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16, 
AV_PIX_FMT_P012, 
ASPECT_2PLANE, 2, 1, 2, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16G16_UNORM } },
 
  426     { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, 
AV_PIX_FMT_P210, 
ASPECT_2PLANE, 2, 1, 2, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16G16_UNORM } },
 
  427     { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, 
AV_PIX_FMT_P212, 
ASPECT_2PLANE, 2, 1, 2, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16G16_UNORM } },
 
  432     { VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16, 
AV_PIX_FMT_P410, 
ASPECT_2PLANE, 2, 1, 2, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16G16_UNORM } },
 
  433     { VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16, 
AV_PIX_FMT_P412, 
ASPECT_2PLANE, 2, 1, 2, { VK_FORMAT_R16_UNORM, VK_FORMAT_R16G16_UNORM } },
 
  451     { VK_FORMAT_G8B8G8R8_422_UNORM,                     
AV_PIX_FMT_YUYV422, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8G8B8A8_UNORM     } },
 
  452     { VK_FORMAT_B8G8R8G8_422_UNORM,                     
AV_PIX_FMT_UYVY422, VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R8G8B8A8_UNORM     } },
 
  453     { VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, 
AV_PIX_FMT_Y210,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } },
 
  454     { VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, 
AV_PIX_FMT_Y212,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } },
 
  455     { VK_FORMAT_G16B16G16R16_422_UNORM,                 
AV_PIX_FMT_Y216,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } },
 
  458     { VK_FORMAT_R8_UNORM,   
AV_PIX_FMT_YUVA420P,    VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM   } },
 
  459     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_YUVA420P16,  VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  462     { VK_FORMAT_R8_UNORM,   
AV_PIX_FMT_YUVA422P,    VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM   } },
 
  463     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_YUVA422P16,  VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  466     { VK_FORMAT_R8_UNORM,   
AV_PIX_FMT_YUVA444P,    VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM,   VK_FORMAT_R8_UNORM   } },
 
  467     { VK_FORMAT_R16_UNORM,  
AV_PIX_FMT_YUVA444P16,  VK_IMAGE_ASPECT_COLOR_BIT, 4, 4, 4, { VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM,  VK_FORMAT_R16_UNORM  } },
 
  470     { VK_FORMAT_B8G8R8A8_UNORM,                         
AV_PIX_FMT_UYVA,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_B8G8R8A8_UNORM     } },
 
  471     { VK_FORMAT_A2R10G10B10_UNORM_PACK32,               
AV_PIX_FMT_XV30,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } },
 
  472     { VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,     
AV_PIX_FMT_XV36,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } },
 
  473     { VK_FORMAT_R16G16B16A16_UNORM,                     
AV_PIX_FMT_XV48,    VK_IMAGE_ASPECT_COLOR_BIT, 1, 1, 1, { VK_FORMAT_R16G16B16A16_UNORM } },
 
  494                               VkImageTiling tiling,
 
  497                               VkImageAspectFlags *
aspect,          
 
  498                               VkImageUsageFlags *supported_usage,  
 
  499                               int disable_multiplane, 
int need_storage)
 
  505     const VkFormatFeatureFlagBits2 basic_flags = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT |
 
  506                                                  VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT  |
 
  507                                                  VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT;
 
  511             VkFormatProperties3 fprops = {
 
  512                 .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3,
 
  514             VkFormatProperties2 prop = {
 
  515                 .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
 
  518             VkFormatFeatureFlagBits2 feats_primary, feats_secondary;
 
  519             int basics_primary = 0, basics_secondary = 0;
 
  520             int storage_primary = 0, storage_secondary = 0;
 
  522             vk->GetPhysicalDeviceFormatProperties2(hwctx->
phys_dev,
 
  526             feats_primary = tiling == VK_IMAGE_TILING_LINEAR ?
 
  527                              fprops.linearTilingFeatures : fprops.optimalTilingFeatures;
 
  528             basics_primary = (feats_primary & basic_flags) == basic_flags;
 
  529             storage_primary = !!(feats_primary & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT);
 
  532                 vk->GetPhysicalDeviceFormatProperties2(hwctx->
phys_dev,
 
  535                 feats_secondary = tiling == VK_IMAGE_TILING_LINEAR ?
 
  536                                   fprops.linearTilingFeatures : fprops.optimalTilingFeatures;
 
  537                 basics_secondary = (feats_secondary & basic_flags) == basic_flags;
 
  538                 storage_secondary = !!(feats_secondary & VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT);
 
  540                 basics_secondary = basics_primary;
 
  541                 storage_secondary = storage_primary;
 
  544             if (basics_primary &&
 
  546                 (!need_storage || (need_storage && (storage_primary | storage_secondary)))) {
 
  561                                        ((need_storage && (storage_primary | storage_secondary)) ?
 
  562                                         VK_IMAGE_USAGE_STORAGE_BIT : 0);
 
  564             } 
else if (basics_secondary &&
 
  565                        (!need_storage || (need_storage && storage_secondary))) {
 
  586 #if CONFIG_VULKAN_STATIC 
  587 VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance,
 
  596 #if CONFIG_VULKAN_STATIC 
  599     static const char *lib_names[] = {
 
  602 #elif defined(__APPLE__) 
  613         p->libvulkan = dlopen(lib_names[
i], RTLD_NOW | RTLD_LOCAL);
 
  623     hwctx->
get_proc_addr = (PFN_vkGetInstanceProcAddr)dlsym(
p->libvulkan, 
"vkGetInstanceProcAddr");
 
  651 #ifdef VK_EXT_zero_initialize_device_memory 
  654 #ifdef VK_KHR_shader_expect_assume 
  658 #ifdef VK_KHR_video_maintenance2 
  681 #ifdef VK_KHR_video_decode_vp9 
  684 #ifdef VK_KHR_video_encode_av1 
  690 static VkBool32 VKAPI_CALL 
vk_dbg_callback(VkDebugUtilsMessageSeverityFlagBitsEXT severity,
 
  691                                            VkDebugUtilsMessageTypeFlagsEXT messageType,
 
  692                                            const VkDebugUtilsMessengerCallbackDataEXT *
data,
 
  699     switch (
data->messageIdNumber) {
 
  710     case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT: l = 
AV_LOG_VERBOSE; 
break;
 
  711     case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:    l = 
AV_LOG_INFO;    
break;
 
  712     case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT: l = 
AV_LOG_WARNING; 
break;
 
  713     case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:   l = 
AV_LOG_ERROR;   
break;
 
  718     for (
int i = 0; 
i < 
data->cmdBufLabelCount; 
i++)
 
  724 #define ADD_VAL_TO_LIST(list, count, val)                                      \ 
  726         list = av_realloc_array(list, ++count, sizeof(*list));                 \ 
  728             err = AVERROR(ENOMEM);                                             \ 
  731         list[count - 1] = av_strdup(val);                                      \ 
  732         if (!list[count - 1]) {                                                \ 
  733             err = AVERROR(ENOMEM);                                             \ 
  738 #define RELEASE_PROPS(props, count)                                            \ 
  740         for (int i = 0; i < count; i++)                                        \ 
  741             av_free((void *)((props)[i]));                                     \ 
  742         av_free((void *)props);                                                \ 
  760                             const char * 
const **
dst, uint32_t *num,
 
  764     const char **extension_names = 
NULL;
 
  768     int err = 0, found, extensions_found = 0;
 
  771     int optional_exts_num;
 
  772     uint32_t sup_ext_count;
 
  773     char *user_exts_str = 
NULL;
 
  775     VkExtensionProperties *sup_ext;
 
  785             if (!user_exts_str) {
 
  790         vk->EnumerateInstanceExtensionProperties(
NULL, &sup_ext_count, 
NULL);
 
  791         sup_ext = 
av_malloc_array(sup_ext_count, 
sizeof(VkExtensionProperties));
 
  794         vk->EnumerateInstanceExtensionProperties(
NULL, &sup_ext_count, sup_ext);
 
  802             if (!user_exts_str) {
 
  807         vk->EnumerateDeviceExtensionProperties(hwctx->
phys_dev, 
NULL,
 
  808                                                &sup_ext_count, 
NULL);
 
  809         sup_ext = 
av_malloc_array(sup_ext_count, 
sizeof(VkExtensionProperties));
 
  812         vk->EnumerateDeviceExtensionProperties(hwctx->
phys_dev, 
NULL,
 
  813                                                &sup_ext_count, sup_ext);
 
  816     for (
int i = 0; 
i < optional_exts_num; 
i++) {
 
  817         tstr = optional_exts[
i].
name;
 
  821         if (
p->dprops.driverID == VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA &&
 
  822             !strcmp(tstr, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME))
 
  829             !strcmp(tstr, VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME)) {
 
  833         for (
int j = 0; j < sup_ext_count; j++) {
 
  834             if (!strcmp(tstr, sup_ext[j].extensionName)) {
 
  843         p->vkctx.extensions |= optional_exts[
i].
flag;
 
  851         tstr = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
 
  853         for (
int j = 0; j < sup_ext_count; j++) {
 
  854             if (!strcmp(tstr, sup_ext[j].extensionName)) {
 
  870 #ifdef VK_KHR_shader_relaxed_extended_instruction 
  873         tstr = VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME;
 
  875         for (
int j = 0; j < sup_ext_count; j++) {
 
  876             if (!strcmp(tstr, sup_ext[j].extensionName)) {
 
  894         char *save, *token = 
av_strtok(user_exts_str, 
"+", &save);
 
  897             for (
int j = 0; j < sup_ext_count; j++) {
 
  898                 if (!strcmp(token, sup_ext[j].extensionName)) {
 
  914     *
dst = extension_names;
 
  915     *num = extensions_found;
 
  929                         const char * 
const **
dst, uint32_t *num,
 
  936     static const char layer_standard_validation[] = { 
"VK_LAYER_KHRONOS_validation" };
 
  937     int layer_standard_validation_found = 0;
 
  939     uint32_t sup_layer_count;
 
  940     VkLayerProperties *sup_layers;
 
  943     char *user_layers_str = 
NULL;
 
  946     const char **enabled_layers = 
NULL;
 
  947     uint32_t enabled_layers_count = 0;
 
  955     vk->EnumerateInstanceLayerProperties(&sup_layer_count, 
NULL);
 
  956     sup_layers = 
av_malloc_array(sup_layer_count, 
sizeof(VkLayerProperties));
 
  959     vk->EnumerateInstanceLayerProperties(&sup_layer_count, sup_layers);
 
  962     for (
int i = 0; 
i < sup_layer_count; 
i++)
 
  966     if (!debug_opt && !user_layers)
 
  971         if (!strcmp(debug_opt->
value, 
"profile")) {
 
  973         } 
else if (!strcmp(debug_opt->
value, 
"printf")) {
 
  975         } 
else if (!strcmp(debug_opt->
value, 
"validate")) {
 
  977         } 
else if (!strcmp(debug_opt->
value, 
"practices")) {
 
  980             char *end_ptr = 
NULL;
 
  981             int idx = strtol(debug_opt->
value, &end_ptr, 10);
 
  982             if (end_ptr == debug_opt->
value || end_ptr[0] != 
'\0' ||
 
  997         for (
int i = 0; 
i < sup_layer_count; 
i++) {
 
  998             if (!strcmp(layer_standard_validation, sup_layers[
i].layerName)) {
 
 1000                        layer_standard_validation);
 
 1001                 ADD_VAL_TO_LIST(enabled_layers, enabled_layers_count, layer_standard_validation);
 
 1003                 layer_standard_validation_found = 1;
 
 1007         if (!layer_standard_validation_found) {
 
 1009                    "Validation Layer \"%s\" not supported\n", layer_standard_validation);
 
 1022         if (!user_layers_str) {
 
 1027         token = 
av_strtok(user_layers_str, 
"+", &save);
 
 1032             if (!strcmp(layer_standard_validation, token) && layer_standard_validation_found) {
 
 1038             for (
int j = 0; j < sup_layer_count; j++) {
 
 1039                 if (!strcmp(token, sup_layers[j].layerName)) {
 
 1050                 if (!strcmp(layer_standard_validation, token))
 
 1054                        "Layer \"%s\" not supported\n", token);
 
 1071         *
dst = enabled_layers;
 
 1072         *num = enabled_layers_count;
 
 1087     VkApplicationInfo application_info = {
 
 1088         .sType              = VK_STRUCTURE_TYPE_APPLICATION_INFO,
 
 1089         .pApplicationName   = 
"ffmpeg",
 
 1093         .pEngineName        = 
"libavutil",
 
 1094         .apiVersion         = VK_API_VERSION_1_3,
 
 1099     VkValidationFeaturesEXT validation_features = {
 
 1100         .sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT,
 
 1102     VkInstanceCreateInfo inst_props = {
 
 1103         .sType            = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
 
 1104         .pApplicationInfo = &application_info,
 
 1120                        &inst_props.enabledLayerCount, debug_mode);
 
 1126                            &inst_props.enabledExtensionCount, *debug_mode);
 
 1134         static const VkValidationFeatureEnableEXT feat_list_validate[] = {
 
 1135             VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT,
 
 1136             VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,
 
 1137             VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
 
 1139         validation_features.pEnabledValidationFeatures = feat_list_validate;
 
 1140         validation_features.enabledValidationFeatureCount = 
FF_ARRAY_ELEMS(feat_list_validate);
 
 1141         inst_props.pNext = &validation_features;
 
 1143         static const VkValidationFeatureEnableEXT feat_list_debug[] = {
 
 1144             VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT,
 
 1145             VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,
 
 1146             VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT,
 
 1148         validation_features.pEnabledValidationFeatures = feat_list_debug;
 
 1149         validation_features.enabledValidationFeatureCount = 
FF_ARRAY_ELEMS(feat_list_debug);
 
 1150         inst_props.pNext = &validation_features;
 
 1152         static const VkValidationFeatureEnableEXT feat_list_practices[] = {
 
 1153             VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT,
 
 1154             VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT,
 
 1156         validation_features.pEnabledValidationFeatures = feat_list_practices;
 
 1157         validation_features.enabledValidationFeatureCount = 
FF_ARRAY_ELEMS(feat_list_practices);
 
 1158         inst_props.pNext = &validation_features;
 
 1162     for (
int i = 0; 
i < inst_props.enabledExtensionCount; 
i++) {
 
 1163         if (!strcmp(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME,
 
 1164                     inst_props.ppEnabledExtensionNames[
i])) {
 
 1165             inst_props.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
 
 1172     ret = vk->CreateInstance(&inst_props, hwctx->
alloc, &hwctx->
inst);
 
 1175     if (
ret != VK_SUCCESS) {
 
 1192         VkDebugUtilsMessengerCreateInfoEXT dbg = {
 
 1193             .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
 
 1194             .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
 
 1195                                VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT    |
 
 1196                                VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
 
 1197                                VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT,
 
 1198             .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT    |
 
 1199                            VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
 
 1200                            VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
 
 1205         vk->CreateDebugUtilsMessengerEXT(hwctx->
inst, &dbg,
 
 1206                                          hwctx->
alloc, &
p->debug_ctx);
 
 1212     RELEASE_PROPS(inst_props.ppEnabledLayerNames, inst_props.enabledLayerCount);
 
 1231     case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: 
return "integrated";
 
 1232     case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU:   
return "discrete";
 
 1233     case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU:    
return "virtual";
 
 1234     case VK_PHYSICAL_DEVICE_TYPE_CPU:            
return "software";
 
 1235     default:                                     
return "unknown";
 
 1242     int err = 0, choice = -1;
 
 1248     VkPhysicalDevice *devices = 
NULL;
 
 1249     VkPhysicalDeviceIDProperties *idp = 
NULL;
 
 1250     VkPhysicalDeviceProperties2 *prop = 
NULL;
 
 1251     VkPhysicalDeviceDriverProperties *driver_prop = 
NULL;
 
 1252     VkPhysicalDeviceDrmPropertiesEXT *drm_prop = 
NULL;
 
 1254     ret = vk->EnumeratePhysicalDevices(hwctx->
inst, &num, 
NULL);
 
 1255     if (
ret != VK_SUCCESS || !num) {
 
 1264     ret = vk->EnumeratePhysicalDevices(hwctx->
inst, &num, devices);
 
 1265     if (
ret != VK_SUCCESS) {
 
 1284     driver_prop = 
av_calloc(num, 
sizeof(*driver_prop));
 
 1291         drm_prop = 
av_calloc(num, 
sizeof(*drm_prop));
 
 1299     for (
int i = 0; 
i < num; 
i++) {
 
 1301             drm_prop[
i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT;
 
 1302             driver_prop[
i].pNext = &drm_prop[
i];
 
 1304         driver_prop[
i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
 
 1305         idp[
i].pNext = &driver_prop[
i];
 
 1306         idp[
i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
 
 1307         prop[
i].sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
 
 1308         prop[
i].pNext = &idp[
i];
 
 1310         vk->GetPhysicalDeviceProperties2(devices[
i], &prop[
i]);
 
 1312                prop[
i].properties.deviceName,
 
 1314                prop[
i].properties.deviceID);
 
 1318         for (
int i = 0; 
i < num; 
i++) {
 
 1319             if (!strncmp(idp[
i].deviceUUID, select->
uuid, VK_UUID_SIZE)) {
 
 1328         for (
int i = 0; 
i < num; 
i++) {
 
 1329             if ((select->
drm_major == drm_prop[
i].primaryMajor &&
 
 1330                  select->
drm_minor == drm_prop[
i].primaryMinor) ||
 
 1331                 (select->
drm_major == drm_prop[
i].renderMajor &&
 
 1332                  select->
drm_minor == drm_prop[
i].renderMinor)) {
 
 1341     } 
else if (select->
name) {
 
 1343         for (
int i = 0; 
i < num; 
i++) {
 
 1344             if (strstr(prop[
i].properties.deviceName, select->
name)) {
 
 1355         for (
int i = 0; 
i < num; 
i++) {
 
 1356             if (select->
pci_device == prop[
i].properties.deviceID) {
 
 1367         for (
int i = 0; 
i < num; 
i++) {
 
 1368             if (select->
vendor_id == prop[
i].properties.vendorID) {
 
 1378         if (select->
index < num) {
 
 1379             choice = select->
index;
 
 1391                choice, prop[choice].properties.deviceName,
 
 1393                prop[choice].properties.deviceID);
 
 1395         p->props = prop[choice];
 
 1396         p->props.pNext = 
NULL;
 
 1397         p->dprops = driver_prop[choice];
 
 1398         p->dprops.pNext = 
NULL;
 
 1412                                     VkQueueFlagBits 
flags)
 
 1415     uint32_t min_score = UINT32_MAX;
 
 1417     for (
int i = 0; 
i < num_qf; 
i++) {
 
 1418         VkQueueFlagBits qflags = qf[
i].queueFamilyProperties.queueFlags;
 
 1421         if ((
flags & VK_QUEUE_TRANSFER_BIT) &&
 
 1422             (qflags & (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT)))
 
 1423             qflags |= VK_QUEUE_TRANSFER_BIT;
 
 1425         if (qflags & 
flags) {
 
 1426             uint32_t score = 
av_popcount(qflags) + qf[
i].queueFamilyProperties.timestampValidBits;
 
 1427             if (score < min_score) {
 
 1435         qf[
index].queueFamilyProperties.timestampValidBits++;
 
 1441                                           VkQueueFamilyVideoPropertiesKHR *qf_vid, uint32_t num_qf,
 
 1442                                           VkVideoCodecOperationFlagBitsKHR 
flags)
 
 1445     uint32_t min_score = UINT32_MAX;
 
 1447     for (
int i = 0; 
i < num_qf; 
i++) {
 
 1448         const VkQueueFlagBits qflags = qf[
i].queueFamilyProperties.queueFlags;
 
 1449         const VkQueueFlagBits vflags = qf_vid[
i].videoCodecOperations;
 
 1451         if (!(qflags & (VK_QUEUE_VIDEO_ENCODE_BIT_KHR | VK_QUEUE_VIDEO_DECODE_BIT_KHR)))
 
 1454         if (vflags & 
flags) {
 
 1455             uint32_t score = 
av_popcount(vflags) + qf[
i].queueFamilyProperties.timestampValidBits;
 
 1456             if (score < min_score) {
 
 1464         qf[
index].queueFamilyProperties.timestampValidBits++;
 
 1476     VkQueueFamilyProperties2 *qf = 
NULL;
 
 1477     VkQueueFamilyVideoPropertiesKHR *qf_vid = 
NULL;
 
 1480     vk->GetPhysicalDeviceQueueFamilyProperties(hwctx->
phys_dev, &num, 
NULL);
 
 1491     qf_vid = 
av_malloc_array(num, 
sizeof(VkQueueFamilyVideoPropertiesKHR));
 
 1495     for (uint32_t 
i = 0; 
i < num; 
i++) {
 
 1496         qf_vid[
i] = (VkQueueFamilyVideoPropertiesKHR) {
 
 1497             .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR,
 
 1499         qf[
i] = (VkQueueFamilyProperties2) {
 
 1500             .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,
 
 1506     vk->GetPhysicalDeviceQueueFamilyProperties2(hwctx->
phys_dev, &num, qf);
 
 1509     for (
int i = 0; 
i < num; 
i++) {
 
 1511                ((qf[
i].queueFamilyProperties.queueFlags) & VK_QUEUE_GRAPHICS_BIT) ? 
" graphics" : 
"",
 
 1512                ((qf[
i].queueFamilyProperties.queueFlags) & VK_QUEUE_COMPUTE_BIT) ? 
" compute" : 
"",
 
 1513                ((qf[
i].queueFamilyProperties.queueFlags) & VK_QUEUE_TRANSFER_BIT) ? 
" transfer" : 
"",
 
 1514                ((qf[
i].queueFamilyProperties.queueFlags) & VK_QUEUE_VIDEO_ENCODE_BIT_KHR) ? 
" encode" : 
"",
 
 1515                ((qf[
i].queueFamilyProperties.queueFlags) & VK_QUEUE_VIDEO_DECODE_BIT_KHR) ? 
" decode" : 
"",
 
 1516                ((qf[
i].queueFamilyProperties.queueFlags) & VK_QUEUE_SPARSE_BINDING_BIT) ? 
" sparse" : 
"",
 
 1517                ((qf[
i].queueFamilyProperties.queueFlags) & VK_QUEUE_OPTICAL_FLOW_BIT_NV) ? 
" optical_flow" : 
"",
 
 1518                ((qf[
i].queueFamilyProperties.queueFlags) & VK_QUEUE_PROTECTED_BIT) ? 
" protected" : 
"",
 
 1519                qf[
i].queueFamilyProperties.queueCount);
 
 1523         qf[
i].queueFamilyProperties.timestampValidBits = 0;
 
 1529 #define PICK_QF(type, vid_op)                                            \ 
 1535             idx = pick_video_queue_family(qf, qf_vid, num, vid_op);      \ 
 1537             idx = pick_queue_family(qf, num, type);                      \ 
 1542         for (i = 0; i < hwctx->nb_qf; i++) {                             \ 
 1543             if (hwctx->qf[i].idx == idx) {                               \ 
 1544                 hwctx->qf[i].flags |= type;                              \ 
 1545                 hwctx->qf[i].video_caps |= vid_op;                       \ 
 1549         if (i == hwctx->nb_qf) {                                         \ 
 1550             hwctx->qf[i].idx = idx;                                      \ 
 1551             hwctx->qf[i].num = qf[idx].queueFamilyProperties.queueCount; \ 
 1552             if (p->limit_queues ||                                       \ 
 1553                 p->dprops.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY) { \ 
 1554                 int max = p->limit_queues;                               \ 
 1555                 if (type == VK_QUEUE_GRAPHICS_BIT)                       \ 
 1556                     hwctx->qf[i].num = FFMIN(hwctx->qf[i].num,           \ 
 1559                     hwctx->qf[i].num = FFMIN(hwctx->qf[i].num, max);     \ 
 1561             hwctx->qf[i].flags = type;                                   \ 
 1562             hwctx->qf[i].video_caps = vid_op;                            \ 
 1567     PICK_QF(VK_QUEUE_GRAPHICS_BIT, VK_VIDEO_CODEC_OPERATION_NONE_KHR);
 
 1568     PICK_QF(VK_QUEUE_COMPUTE_BIT, VK_VIDEO_CODEC_OPERATION_NONE_KHR);
 
 1569     PICK_QF(VK_QUEUE_TRANSFER_BIT, VK_VIDEO_CODEC_OPERATION_NONE_KHR);
 
 1571     PICK_QF(VK_QUEUE_VIDEO_ENCODE_BIT_KHR, VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR);
 
 1572     PICK_QF(VK_QUEUE_VIDEO_DECODE_BIT_KHR, VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR);
 
 1574     PICK_QF(VK_QUEUE_VIDEO_ENCODE_BIT_KHR, VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR);
 
 1575     PICK_QF(VK_QUEUE_VIDEO_DECODE_BIT_KHR, VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR);
 
 1577 #ifdef VK_KHR_video_decode_vp9 
 1578     PICK_QF(VK_QUEUE_VIDEO_DECODE_BIT_KHR, VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR);
 
 1581 #ifdef VK_KHR_video_encode_av1 
 1582     PICK_QF(VK_QUEUE_VIDEO_ENCODE_BIT_KHR, VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR);
 
 1584     PICK_QF(VK_QUEUE_VIDEO_DECODE_BIT_KHR, VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR);
 
 1592                                             sizeof(VkDeviceQueueCreateInfo));
 
 1593     if (!cd->pQueueCreateInfos)
 
 1596     for (uint32_t 
i = 0; 
i < hwctx->
nb_qf; 
i++) {
 
 1599         VkDeviceQueueCreateInfo *pc;
 
 1600         for (uint32_t j = 0; j < cd->queueCreateInfoCount; j++) {
 
 1601             if (hwctx->
qf[
i].
idx == cd->pQueueCreateInfos[j].queueFamilyIndex) {
 
 1611             for (uint32_t j = 0; j < cd->queueCreateInfoCount; j++)
 
 1612                 av_free((
void *)cd->pQueueCreateInfos[
i].pQueuePriorities);
 
 1613             av_free((
void *)cd->pQueueCreateInfos);
 
 1617         for (uint32_t j = 0; j < hwctx->
qf[
i].
num; j++)
 
 1620         pc = (VkDeviceQueueCreateInfo *)cd->pQueueCreateInfos;
 
 1621         pc[cd->queueCreateInfoCount++] = (VkDeviceQueueCreateInfo) {
 
 1622             .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
 
 1623             .queueFamilyIndex = hwctx->
qf[
i].
idx,
 
 1624             .queueCount = hwctx->
qf[
i].
num,
 
 1629 #if FF_API_VULKAN_FIXED_QUEUES 
 1638 #define SET_OLD_QF(field, nb_field, type)             \ 
 1640         if (field < 0 && hwctx->qf[i].flags & type) { \ 
 1641             field = hwctx->qf[i].idx;                 \ 
 1642             nb_field = hwctx->qf[i].num;              \ 
 1646     for (uint32_t 
i = 0; 
i < hwctx->
nb_qf; 
i++) {
 
 1676         vk->DestroyDebugUtilsMessengerEXT(hwctx->
inst, 
p->debug_ctx,
 
 1680         vk->DestroyInstance(hwctx->
inst, hwctx->
alloc);
 
 1683         dlclose(
p->libvulkan);
 
 1693     for (uint32_t 
i = 0; 
i < 
p->nb_tot_qfs; 
i++) {
 
 1705     VkDeviceSize max_vram = 0, max_visible_vram = 0;
 
 1708     for (
int i = 0; 
i < 
p->mprops.memoryTypeCount; 
i++) {
 
 1709         const VkMemoryType 
type = 
p->mprops.memoryTypes[
i];
 
 1710         const VkMemoryHeap heap = 
p->mprops.memoryHeaps[
type.heapIndex];
 
 1711         if (!(
type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT))
 
 1713         max_vram = 
FFMAX(max_vram, heap.size);
 
 1714         if (
type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
 
 1715             max_visible_vram = 
FFMAX(max_visible_vram, heap.size);
 
 1718     return max_vram - max_visible_vram < 1024; 
 
 1723                                          int disable_multiplane,
 
 1734     VkDeviceCreateInfo dev_info = {
 
 1735         .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
 
 1748                                 &dev_info.enabledExtensionCount, debug_mode))) {
 
 1749         for (
int i = 0; 
i < dev_info.queueCreateInfoCount; 
i++)
 
 1750             av_free((
void *)dev_info.pQueueCreateInfos[
i].pQueuePriorities);
 
 1751         av_free((
void *)dev_info.pQueueCreateInfos);
 
 1756     vk->GetPhysicalDeviceMemoryProperties(hwctx->
phys_dev, &
p->mprops);
 
 1760     vk->GetPhysicalDeviceFeatures2(hwctx->
phys_dev, &supported_feats.
device);
 
 1765     dev_info.pNext = 
p->feats.device.pNext;
 
 1766     dev_info.pEnabledFeatures = &
p->feats.device.features;
 
 1776     for (
int i = 0; 
i < dev_info.queueCreateInfoCount; 
i++)
 
 1777         av_free((
void *)dev_info.pQueueCreateInfos[
i].pQueuePriorities);
 
 1778     av_free((
void *)dev_info.pQueueCreateInfos);
 
 1780     if (
ret != VK_SUCCESS) {
 
 1783         for (
int i = 0; 
i < dev_info.enabledExtensionCount; 
i++)
 
 1784             av_free((
void *)dev_info.ppEnabledExtensionNames[
i]);
 
 1785         av_free((
void *)dev_info.ppEnabledExtensionNames);
 
 1793         p->use_linear_images = strtol(opt_d->
value, 
NULL, 10);
 
 1798         p->limit_queues = strtol(opt_d->
value, 
NULL, 10);
 
 1801     p->disable_multiplane = disable_multiplane;
 
 1802     if (!
p->disable_multiplane) {
 
 1805             p->disable_multiplane = strtol(opt_d->
value, 
NULL, 10);
 
 1809     p->avoid_host_import = 
p->dprops.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY;
 
 1812         p->avoid_host_import = strtol(opt_d->
value, 
NULL, 10);
 
 1847     VkQueueFamilyProperties2 *qf;
 
 1848     VkQueueFamilyVideoPropertiesKHR *qf_vid;
 
 1849     VkPhysicalDeviceExternalSemaphoreInfo ext_sem_props_info;
 
 1850     int graph_index, comp_index, tx_index, enc_index, dec_index;
 
 1869     p->props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
 
 1870     p->props.pNext = &
p->hprops;
 
 1871     p->hprops.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT;
 
 1872     p->hprops.pNext = &
p->dprops;
 
 1873     p->dprops.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
 
 1875     vk->GetPhysicalDeviceProperties2(hwctx->
phys_dev, &
p->props);
 
 1877            p->props.properties.deviceName);
 
 1880            p->props.properties.limits.optimalBufferCopyRowPitchAlignment);
 
 1882            p->props.properties.limits.minMemoryMapAlignment);
 
 1884            p->props.properties.limits.nonCoherentAtomSize);
 
 1887                p->hprops.minImportedHostPointerAlignment);
 
 1889     vk->GetPhysicalDeviceQueueFamilyProperties(hwctx->
phys_dev, &qf_num, 
NULL);
 
 1895     ext_sem_props_info = (VkPhysicalDeviceExternalSemaphoreInfo) {
 
 1896         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO,
 
 1900     ext_sem_props_info.handleType =
 
 1902         IsWindows8OrGreater()
 
 1903             ? VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
 
 1904             : VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT;
 
 1906         VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT;
 
 1908     p->ext_sem_props_opaque.sType = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES;
 
 1909     vk->GetPhysicalDeviceExternalSemaphoreProperties(hwctx->
phys_dev,
 
 1910                                                      &ext_sem_props_info,
 
 1911                                                      &
p->ext_sem_props_opaque);
 
 1917     qf_vid = 
av_malloc_array(qf_num, 
sizeof(VkQueueFamilyVideoPropertiesKHR));
 
 1923     for (uint32_t 
i = 0; 
i < qf_num; 
i++) {
 
 1924         qf_vid[
i] = (VkQueueFamilyVideoPropertiesKHR) {
 
 1925             .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR,
 
 1927         qf[
i] = (VkQueueFamilyProperties2) {
 
 1928             .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,
 
 1933     vk->GetPhysicalDeviceQueueFamilyProperties2(hwctx->
phys_dev, &qf_num, qf);
 
 1935     p->qf_mutex = 
av_calloc(qf_num, 
sizeof(*
p->qf_mutex));
 
 1940     p->nb_tot_qfs = qf_num;
 
 1942     for (uint32_t 
i = 0; 
i < qf_num; 
i++) {
 
 1943         p->qf_mutex[
i] = 
av_calloc(qf[
i].queueFamilyProperties.queueCount,
 
 1944                                    sizeof(**
p->qf_mutex));
 
 1945         if (!
p->qf_mutex[
i]) {
 
 1949         for (uint32_t j = 0; j < qf[
i].queueFamilyProperties.queueCount; j++) {
 
 1960 #if FF_API_VULKAN_FIXED_QUEUES 
 1968 #define CHECK_QUEUE(type, required, fidx, ctx_qf, qc)                                           \ 
 1970         if (ctx_qf < 0 && required) {                                                           \ 
 1971             av_log(ctx, AV_LOG_ERROR, "%s queue family is required, but marked as missing"      \ 
 1972                    " in the context!\n", type);                                                 \ 
 1973             err = AVERROR(EINVAL);                                                              \ 
 1975         } else if (fidx < 0 || ctx_qf < 0) {                                                    \ 
 1977         } else if (ctx_qf >= qf_num) {                                                          \ 
 1978             av_log(ctx, AV_LOG_ERROR, "Invalid %s family index %i (device has %i families)!\n", \ 
 1979                    type, ctx_qf, qf_num);                                                       \ 
 1980             err = AVERROR(EINVAL);                                                              \ 
 1984         av_log(ctx, AV_LOG_VERBOSE, "Using queue family %i (queues: %i)"                        \ 
 1985                " for%s%s%s%s%s\n",                                                              \ 
 1987                ctx_qf == graph_index ? " graphics" : "",                                        \ 
 1988                ctx_qf == comp_index  ? " compute" : "",                                         \ 
 1989                ctx_qf == tx_index    ? " transfers" : "",                                       \ 
 1990                ctx_qf == enc_index   ? " encode" : "",                                          \ 
 1991                ctx_qf == dec_index   ? " decode" : "");                                         \ 
 1992         graph_index = (ctx_qf == graph_index) ? -1 : graph_index;                               \ 
 1993         comp_index  = (ctx_qf == comp_index)  ? -1 : comp_index;                                \ 
 1994         tx_index    = (ctx_qf == tx_index)    ? -1 : tx_index;                                  \ 
 1995         enc_index   = (ctx_qf == enc_index)   ? -1 : enc_index;                                 \ 
 1996         dec_index   = (ctx_qf == dec_index)   ? -1 : dec_index;                                 \ 
 2009     if (!hwctx->
nb_qf) {
 
 2010 #define ADD_QUEUE(ctx_qf, qc, flag)                                    \ 
 2012         if (ctx_qf != -1) {                                            \ 
 2013             hwctx->qf[hwctx->nb_qf++] = (AVVulkanDeviceQueueFamily) {  \ 
 2031     for (
int i = 0; 
i < hwctx->
nb_qf; 
i++) {
 
 2033             hwctx->
qf[
i].
flags & (VK_QUEUE_VIDEO_DECODE_BIT_KHR |
 
 2034                                   VK_QUEUE_VIDEO_ENCODE_BIT_KHR)) {
 
 2041     for (
int i = 0; 
i < hwctx->
nb_qf; 
i++) {
 
 2045         for (
int j = (
i - 1); j >= 0; j--) {
 
 2052             p->img_qfs[
p->nb_img_qfs++] = hwctx->
qf[
i].
idx;
 
 2061     vk->GetPhysicalDeviceMemoryProperties(hwctx->
phys_dev, &
p->mprops);
 
 2063     p->vkctx.device = 
ctx;
 
 2064     p->vkctx.hwctx = hwctx;
 
 2071     vk->GetPhysicalDeviceMemoryProperties(hwctx->
phys_dev, &
p->mprops);
 
 2086     if (device && device[0]) {
 
 2088         dev_select.
index = strtol(device, &end, 10);
 
 2089         if (end == device) {
 
 2090             dev_select.
index = 0;
 
 2091             dev_select.
name  = device;
 
 2107     switch(src_ctx->
type) {
 
 2111         VADisplay dpy = src_hwctx->
display;
 
 2112 #if VA_CHECK_VERSION(1, 15, 0) 
 2114         VADisplayAttribute attr = {
 
 2115             .type = VADisplayPCIID,
 
 2120 #if VA_CHECK_VERSION(1, 15, 0) 
 2121         vas = vaGetDisplayAttributes(dpy, &attr, 1);
 
 2122         if (vas == VA_STATUS_SUCCESS && attr.flags != VA_DISPLAY_ATTRIB_NOT_SUPPORTED)
 
 2123             dev_select.pci_device = (attr.value & 0xFFFF);
 
 2126         if (!dev_select.pci_device) {
 
 2127             vendor = vaQueryVendorString(dpy);
 
 2133             if (strstr(vendor, 
"AMD"))
 
 2134                 dev_select.vendor_id = 0x1002;
 
 2143         struct stat drm_node_info;
 
 2144         drmDevice *drm_dev_info;
 
 2147         err = fstat(src_hwctx->
fd, &drm_node_info);
 
 2154         dev_select.drm_major = major(drm_node_info.st_dev);
 
 2155         dev_select.drm_minor = minor(drm_node_info.st_dev);
 
 2156         dev_select.has_drm   = 1;
 
 2158         err = drmGetDevice(src_hwctx->
fd, &drm_dev_info);
 
 2165         if (drm_dev_info->bustype == DRM_BUS_PCI)
 
 2166             dev_select.pci_device = drm_dev_info->deviceinfo.pci->device_id;
 
 2168         drmFreeDevice(&drm_dev_info);
 
 2178         CudaFunctions *cu = cu_internal->
cuda_dl;
 
 2180         int ret = 
CHECK_CU(cu->cuDeviceGetUuid((CUuuid *)&dev_select.uuid,
 
 2187         dev_select.has_uuid = 1;
 
 2202                                          const void *hwconfig,
 
 2210                                     p->use_linear_images ? VK_IMAGE_TILING_LINEAR :
 
 2211                                                            VK_IMAGE_TILING_OPTIMAL,
 
 2223                                p->use_linear_images ? VK_IMAGE_TILING_LINEAR :
 
 2224                                                       VK_IMAGE_TILING_OPTIMAL,
 
 2234     constraints->
max_width  = 
p->props.properties.limits.maxImageDimension2D;
 
 2235     constraints->
max_height = 
p->props.properties.limits.maxImageDimension2D;
 
 2248                      VkMemoryPropertyFlagBits req_flags, 
const void *alloc_extension,
 
 2249                      VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
 
 2256     VkMemoryAllocateInfo alloc_info = {
 
 2257         .sType          = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
 
 2258         .pNext          = alloc_extension,
 
 2259         .allocationSize = req->size,
 
 2264     for (
int i = 0; 
i < 
p->mprops.memoryTypeCount; 
i++) {
 
 2265         const VkMemoryType *
type = &
p->mprops.memoryTypes[
i];
 
 2268         if (!(req->memoryTypeBits & (1 << 
i)))
 
 2272         if ((
type->propertyFlags & req_flags) != req_flags)
 
 2276         if (req->size > 
p->mprops.memoryHeaps[
type->heapIndex].size)
 
 2290     alloc_info.memoryTypeIndex = 
index;
 
 2292     ret = vk->AllocateMemory(dev_hwctx->
act_dev, &alloc_info,
 
 2293                              dev_hwctx->
alloc, mem);
 
 2294     if (
ret != VK_SUCCESS) {
 
 2300     *mem_flags |= 
p->mprops.memoryTypes[
index].propertyFlags;
 
 2310     if (internal->cuda_fc_ref) {
 
 2316         CudaFunctions *cu = cu_internal->
cuda_dl;
 
 2319             if (internal->cu_sem[
i])
 
 2320                 CHECK_CU(cu->cuDestroyExternalSemaphore(internal->cu_sem[
i]));
 
 2321             if (internal->cu_mma[
i])
 
 2322                 CHECK_CU(cu->cuMipmappedArrayDestroy(internal->cu_mma[
i]));
 
 2323             if (internal->ext_mem[
i])
 
 2324                 CHECK_CU(cu->cuDestroyExternalMemory(internal->ext_mem[
i]));
 
 2326             if (internal->ext_sem_handle[
i])
 
 2327                 CloseHandle(internal->ext_sem_handle[
i]);
 
 2328             if (internal->ext_mem_handle[
i])
 
 2329                 CloseHandle(internal->ext_mem_handle[
i]);
 
 2354             .sType          = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
 
 2356             .pSemaphores    = 
f->sem,
 
 2357             .pValues        = 
f->sem_value,
 
 2358             .semaphoreCount = nb_sems,
 
 2366     for (
int i = 0; 
i < nb_images; 
i++) {
 
 2381                           void *alloc_pnext, 
size_t alloc_pnext_stride)
 
 2383     int img_cnt = 0, err;
 
 2391     while (
f->img[img_cnt]) {
 
 2393         VkImageMemoryRequirementsInfo2 req_desc = {
 
 2394             .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
 
 2395             .image = 
f->img[img_cnt],
 
 2397         VkMemoryDedicatedAllocateInfo ded_alloc = {
 
 2398             .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
 
 2399             .pNext = (
void *)(((uint8_t *)alloc_pnext) + img_cnt*alloc_pnext_stride),
 
 2401         VkMemoryDedicatedRequirements ded_req = {
 
 2402             .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
 
 2404         VkMemoryRequirements2 req = {
 
 2405             .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
 
 2409         vk->GetImageMemoryRequirements2(hwctx->
act_dev, &req_desc, &req);
 
 2411         if (
f->tiling == VK_IMAGE_TILING_LINEAR)
 
 2412             req.memoryRequirements.size = 
FFALIGN(req.memoryRequirements.size,
 
 2413                                                   p->props.properties.limits.minMemoryMapAlignment);
 
 2416         use_ded_mem = ded_req.prefersDedicatedAllocation |
 
 2417                       ded_req.requiresDedicatedAllocation;
 
 2419             ded_alloc.image = 
f->img[img_cnt];
 
 2423                              f->tiling == VK_IMAGE_TILING_LINEAR ?
 
 2424                              VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT :
 
 2425                              VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
 
 2426                              use_ded_mem ? &ded_alloc : (
void *)ded_alloc.pNext,
 
 2427                              &
f->flags, &
f->mem[img_cnt])))
 
 2430         f->size[img_cnt] = req.memoryRequirements.size;
 
 2431         bind_info[img_cnt].sType  = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
 
 2432         bind_info[img_cnt].image  = 
f->img[img_cnt];
 
 2433         bind_info[img_cnt].memory = 
f->mem[img_cnt];
 
 2439     ret = vk->BindImageMemory2(hwctx->
act_dev, img_cnt, bind_info);
 
 2440     if (
ret != VK_SUCCESS) {
 
 2468     uint32_t dst_qf = 
p->nb_img_qfs > 1 ? VK_QUEUE_FAMILY_IGNORED : 
p->img_qfs[0];
 
 2469     VkImageLayout new_layout;
 
 2470     VkAccessFlags2 new_access;
 
 2471     VkPipelineStageFlagBits2 src_stage = VK_PIPELINE_STAGE_2_NONE;
 
 2477         .
data = (uint8_t *)hwfc,
 
 2481         .hw_frames_ctx = &tmp_ref,
 
 2484     VkCommandBuffer cmd_buf;
 
 2486     cmd_buf = exec->
buf;
 
 2490                                    VK_PIPELINE_STAGE_2_NONE,
 
 2491                                    VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT);
 
 2497         new_layout = VK_IMAGE_LAYOUT_GENERAL;
 
 2498         new_access = VK_ACCESS_TRANSFER_WRITE_BIT;
 
 2501         new_layout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
 
 2502         new_access = VK_ACCESS_TRANSFER_WRITE_BIT;
 
 2505         new_layout = VK_IMAGE_LAYOUT_GENERAL;
 
 2506         new_access = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
 
 2509         new_layout = VK_IMAGE_LAYOUT_GENERAL;
 
 2510         new_access = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
 
 2511         dst_qf     = VK_QUEUE_FAMILY_EXTERNAL_KHR;
 
 2512         src_stage  = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
 
 2515         new_layout = VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR;
 
 2516         new_access = VK_ACCESS_TRANSFER_WRITE_BIT;
 
 2519         new_layout = VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR;
 
 2520         new_access = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
 
 2523         new_layout = VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR;
 
 2524         new_access = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
 
 2530                         VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
 
 2531                         new_access, new_layout, dst_qf);
 
 2533     vk->CmdPipelineBarrier2(cmd_buf, &(VkDependencyInfo) {
 
 2534             .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
 
 2535             .pImageMemoryBarriers = img_bar,
 
 2536             .imageMemoryBarrierCount = nb_img_bar,
 
 2550                                 int frame_w, 
int frame_h, 
int plane)
 
 2567                         VkImageTiling tiling, VkImageUsageFlagBits 
usage,
 
 2568                         VkImageCreateFlags 
flags, 
int nb_layers,
 
 2580     VkSemaphoreTypeCreateInfo sem_type_info = {
 
 2581         .sType         = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
 
 2582         .semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
 
 2585     VkSemaphoreCreateInfo sem_spawn = {
 
 2586         .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
 
 2587         .pNext = &sem_type_info,
 
 2590     VkExportSemaphoreCreateInfo ext_sem_info_opaque = {
 
 2591         .sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
 
 2593         .handleTypes = IsWindows8OrGreater()
 
 2594             ? VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
 
 2595             : VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
 
 2597         .handleTypes = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
 
 2602     if (
p->ext_sem_props_opaque.externalSemaphoreFeatures & VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT) {
 
 2616     for (
int i = 0; (hwfc_vk->
format[
i] != VK_FORMAT_UNDEFINED); 
i++) {
 
 2617         VkImageCreateInfo create_info = {
 
 2618             .sType                 = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
 
 2619             .pNext                 = create_pnext,
 
 2620             .imageType             = VK_IMAGE_TYPE_2D,
 
 2624             .arrayLayers           = nb_layers,
 
 2627             .initialLayout         = VK_IMAGE_LAYOUT_UNDEFINED,
 
 2629             .samples               = VK_SAMPLE_COUNT_1_BIT,
 
 2630             .pQueueFamilyIndices   = 
p->img_qfs,
 
 2631             .queueFamilyIndexCount = 
p->nb_img_qfs,
 
 2632             .sharingMode           = 
p->nb_img_qfs > 1 ? VK_SHARING_MODE_CONCURRENT :
 
 2633                                                          VK_SHARING_MODE_EXCLUSIVE,
 
 2636         get_plane_wh(&create_info.extent.width, &create_info.extent.height,
 
 2639         ret = vk->CreateImage(hwctx->
act_dev, &create_info,
 
 2641         if (
ret != VK_SUCCESS) {
 
 2649         ret = vk->CreateSemaphore(hwctx->
act_dev, &sem_spawn,
 
 2651         if (
ret != VK_SUCCESS) {
 
 2658         f->queue_family[
i] = 
p->nb_img_qfs > 1 ? VK_QUEUE_FAMILY_IGNORED : 
p->img_qfs[0];
 
 2659         f->layout[
i] = create_info.initialLayout;
 
 2661         f->sem_value[
i] = 0;
 
 2677                              VkExternalMemoryHandleTypeFlags *comp_handle_types,
 
 2678                              VkExternalMemoryHandleTypeFlagBits *iexp,
 
 2679                              VkExternalMemoryHandleTypeFlagBits 
exp)
 
 2687     const VkImageDrmFormatModifierListCreateInfoEXT *drm_mod_info =
 
 2689                           VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT);
 
 2690     int has_mods = hwctx->
tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT && drm_mod_info;
 
 2693     VkExternalImageFormatProperties eprops = {
 
 2694         .sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR,
 
 2696     VkImageFormatProperties2 props = {
 
 2697         .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,
 
 2700     VkPhysicalDeviceImageDrmFormatModifierInfoEXT phy_dev_mod_info = {
 
 2701         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT,
 
 2703         .pQueueFamilyIndices   = 
p->img_qfs,
 
 2704         .queueFamilyIndexCount = 
p->nb_img_qfs,
 
 2705         .sharingMode           = 
p->nb_img_qfs > 1 ? VK_SHARING_MODE_CONCURRENT :
 
 2706                                                      VK_SHARING_MODE_EXCLUSIVE,
 
 2708     VkPhysicalDeviceExternalImageFormatInfo enext = {
 
 2709         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO,
 
 2711         .pNext = has_mods ? &phy_dev_mod_info : 
NULL,
 
 2713     VkPhysicalDeviceImageFormatInfo2 pinfo = {
 
 2714         .sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
 
 2715         .pNext  = !
exp ? 
NULL : &enext,
 
 2717         .type   = VK_IMAGE_TYPE_2D,
 
 2719         .usage  = hwctx->
usage,
 
 2720         .flags  = VK_IMAGE_CREATE_ALIAS_BIT,
 
 2723     nb_mods = has_mods ? drm_mod_info->drmFormatModifierCount : 1;
 
 2724     for (
int i = 0; 
i < nb_mods; 
i++) {
 
 2726             phy_dev_mod_info.drmFormatModifier = drm_mod_info->pDrmFormatModifiers[
i];
 
 2728         ret = vk->GetPhysicalDeviceImageFormatProperties2(dev_hwctx->
phys_dev,
 
 2731         if (
ret == VK_SUCCESS) {
 
 2733             *comp_handle_types |= eprops.externalMemoryProperties.compatibleHandleTypes;
 
 2747     VkExternalMemoryHandleTypeFlags e = 0x0;
 
 2750     VkExternalMemoryImageCreateInfo eiinfo = {
 
 2751         .sType       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
 
 2758                              ? VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
 
 2759                              : VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT);
 
 2763                          VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT);
 
 2766         hwctx->
tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
 
 2768                          VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT);
 
 2772         eminfo[
i].sType       = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
 
 2774         eminfo[
i].handleTypes = e;
 
 2787     if ( (hwctx->
usage & VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR) &&
 
 2788         !(hwctx->
usage & VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR))
 
 2790     else if (hwctx->
usage & VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)
 
 2792     else if (hwctx->
usage & VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR)
 
 2794     else if (hwctx->
usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT)
 
 2849     VkImageUsageFlagBits supported_usage;
 
 2852     int disable_multiplane = 
p->disable_multiplane ||
 
 2860     if (
p->use_linear_images &&
 
 2861         (hwctx->
tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT))
 
 2862         hwctx->
tiling = VK_IMAGE_TILING_LINEAR;
 
 2872     if (hwctx->
format[0] != VK_FORMAT_UNDEFINED) {
 
 2877                            "for the current sw_format %s!\n",
 
 2889                                  (hwctx->
usage & VK_IMAGE_USAGE_STORAGE_BIT));
 
 2898                                  NULL, &supported_usage,
 
 2901                                  (hwctx->
usage & VK_IMAGE_USAGE_STORAGE_BIT));
 
 2907     if (
p->dprops.driverID == VK_DRIVER_ID_NVIDIA_PROPRIETARY &&
 
 2910         supported_usage &= ~VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT;
 
 2913     hwctx->
usage |= supported_usage & (VK_IMAGE_USAGE_TRANSFER_DST_BIT |
 
 2914                                        VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
 
 2915                                        VK_IMAGE_USAGE_STORAGE_BIT      |
 
 2916                                        VK_IMAGE_USAGE_SAMPLED_BIT);
 
 2919         hwctx->
usage |= supported_usage & VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT;
 
 2922     if ((supported_usage & VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR) &&
 
 2925         hwctx->
usage |= VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR;
 
 2931         int is_lone_dpb = ((hwctx->
usage & VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR) ||
 
 2932                            ((hwctx->
usage & VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR) &&
 
 2933                             !(hwctx->
usage & VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)));
 
 2934         int sampleable = hwctx->
usage & (VK_IMAGE_USAGE_SAMPLED_BIT |
 
 2935                                          VK_IMAGE_USAGE_STORAGE_BIT);
 
 2936         hwctx->
img_flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
 
 2937         if (sampleable && !is_lone_dpb) {
 
 2938             hwctx->
img_flags |= VK_IMAGE_CREATE_ALIAS_BIT;
 
 2940                 hwctx->
img_flags |= VK_IMAGE_CREATE_EXTENDED_USAGE_BIT;
 
 2948     if ((hwctx->
usage & VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR) &&
 
 2951         const VkVideoProfileListInfoKHR *pl;
 
 2954             hwctx->
img_flags |= VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR;
 
 2957             for (
i = 0; 
i < pl->profileCount; 
i++) {
 
 2959                 if (pl->pProfiles[
i].videoCodecOperation & 0xFFFF0000)
 
 2962             if (
i == pl->profileCount)
 
 2963                 hwctx->
img_flags |= VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR;
 
 2974                                p->compute_qf->num, 0, 0, 0, 
NULL);
 
 2979                                p->transfer_qf->num*2, 0, 0, 0, 
NULL);
 
 2984                                p->transfer_qf->num, 0, 0, 0, 
NULL);
 
 2996         VkImageDrmFormatModifierPropertiesEXT drm_mod = {
 
 2997             .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
 
 2999         err = vk->GetImageDrmFormatModifierPropertiesEXT(dev_hwctx->
act_dev, 
f->img[0],
 
 3001         if (err != VK_SUCCESS) {
 
 3007             VkDrmFormatModifierPropertiesListEXT modp;
 
 3008             VkFormatProperties2 fmtp;
 
 3009             VkDrmFormatModifierPropertiesEXT *mod_props = 
NULL;
 
 3011             modp = (VkDrmFormatModifierPropertiesListEXT) {
 
 3012                 .sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
 
 3014             fmtp = (VkFormatProperties2) {
 
 3015                 .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
 
 3020             vk->GetPhysicalDeviceFormatProperties2(dev_hwctx->
phys_dev, fmt->
fallback[
i], &fmtp);
 
 3022             modp.pDrmFormatModifierProperties =
 
 3023                 av_calloc(modp.drmFormatModifierCount, 
sizeof(*modp.pDrmFormatModifierProperties));
 
 3024             if (!modp.pDrmFormatModifierProperties) {
 
 3028             vk->GetPhysicalDeviceFormatProperties2(dev_hwctx->
phys_dev, fmt->
fallback[
i], &fmtp);
 
 3030             for (uint32_t 
i = 0; 
i < modp.drmFormatModifierCount; ++
i) {
 
 3031                 VkDrmFormatModifierPropertiesEXT *m = &modp.pDrmFormatModifierProperties[
i];
 
 3032                 if (m->drmFormatModifier == drm_mod.drmFormatModifier) {
 
 3038             if (mod_props == 
NULL) {
 
 3039                 av_log(hwfc, 
AV_LOG_ERROR, 
"No DRM format modifier properties found for modifier 0x%016"PRIx64
"\n",
 
 3040                           drm_mod.drmFormatModifier);
 
 3041                 av_free(modp.pDrmFormatModifierProperties);
 
 3047             av_free(modp.pDrmFormatModifierProperties);
 
 3111 static const struct {
 
 3112     uint32_t drm_fourcc;
 
 3114 } vulkan_drm_format_map[] = {
 
 3115     { DRM_FORMAT_R8,       VK_FORMAT_R8_UNORM       },
 
 3116     { DRM_FORMAT_R16,      VK_FORMAT_R16_UNORM      },
 
 3117     { DRM_FORMAT_GR88,     VK_FORMAT_R8G8_UNORM     },
 
 3118     { DRM_FORMAT_RG88,     VK_FORMAT_R8G8_UNORM     },
 
 3119     { DRM_FORMAT_GR1616,   VK_FORMAT_R16G16_UNORM   },
 
 3120     { DRM_FORMAT_RG1616,   VK_FORMAT_R16G16_UNORM   },
 
 3121     { DRM_FORMAT_ARGB8888, VK_FORMAT_B8G8R8A8_UNORM },
 
 3122     { DRM_FORMAT_XRGB8888, VK_FORMAT_B8G8R8A8_UNORM },
 
 3123     { DRM_FORMAT_ABGR8888, VK_FORMAT_R8G8B8A8_UNORM },
 
 3124     { DRM_FORMAT_XBGR8888, VK_FORMAT_R8G8B8A8_UNORM },
 
 3125     { DRM_FORMAT_ARGB2101010, VK_FORMAT_A2B10G10R10_UNORM_PACK32 },
 
 3126     { DRM_FORMAT_ABGR2101010, VK_FORMAT_A2R10G10B10_UNORM_PACK32 },
 
 3127     { DRM_FORMAT_XRGB2101010, VK_FORMAT_A2B10G10R10_UNORM_PACK32 },
 
 3128     { DRM_FORMAT_XBGR2101010, VK_FORMAT_A2R10G10B10_UNORM_PACK32 },
 
 3131 #ifdef DRM_FORMAT_XYUV8888 
 3132     { DRM_FORMAT_XYUV8888, VK_FORMAT_R8G8B8A8_UNORM     },
 
 3133     { DRM_FORMAT_XVYU2101010, VK_FORMAT_A2R10G10B10_UNORM_PACK32 } ,
 
 3134     { DRM_FORMAT_XVYU12_16161616, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16 } ,
 
 3135     { DRM_FORMAT_XVYU16161616, VK_FORMAT_R16G16B16A16_UNORM } ,
 
 3139 static inline VkFormat drm_to_vulkan_fmt(uint32_t drm_fourcc)
 
 3142         if (vulkan_drm_format_map[
i].drm_fourcc == drm_fourcc)
 
 3143             return vulkan_drm_format_map[
i].vk_format;
 
 3144     return VK_FORMAT_UNDEFINED;
 
 3153     int bind_counts = 0;
 
 3163         if (drm_to_vulkan_fmt(
desc->layers[
i].format) == VK_FORMAT_UNDEFINED) {
 
 3165                    desc->layers[
i].format);
 
 3176     f->tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
 
 3178     for (
int i = 0; 
i < 
desc->nb_layers; 
i++) {
 
 3182         VkSemaphoreTypeCreateInfo sem_type_info = {
 
 3183             .sType         = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
 
 3184             .semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
 
 3187         VkSemaphoreCreateInfo sem_spawn = {
 
 3188             .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
 
 3189             .pNext = &sem_type_info,
 
 3194         VkImageDrmFormatModifierExplicitCreateInfoEXT ext_img_mod_spec = {
 
 3195             .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT,
 
 3196             .drmFormatModifier = 
desc->objects[0].format_modifier,
 
 3197             .drmFormatModifierPlaneCount = 
planes,
 
 3198             .pPlaneLayouts = (
const VkSubresourceLayout *)&ext_img_layouts,
 
 3200         VkExternalMemoryImageCreateInfo ext_img_spec = {
 
 3201             .sType       = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
 
 3202             .pNext       = &ext_img_mod_spec,
 
 3203             .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
 
 3205         VkImageCreateInfo create_info = {
 
 3206             .sType                 = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
 
 3207             .pNext                 = &ext_img_spec,
 
 3208             .imageType             = VK_IMAGE_TYPE_2D,
 
 3209             .format                = drm_to_vulkan_fmt(
desc->layers[
i].format),
 
 3214             .tiling                = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
 
 3215             .initialLayout         = VK_IMAGE_LAYOUT_UNDEFINED, 
 
 3217             .samples               = VK_SAMPLE_COUNT_1_BIT,
 
 3218             .pQueueFamilyIndices   = 
p->img_qfs,
 
 3219             .queueFamilyIndexCount = 
p->nb_img_qfs,
 
 3220             .sharingMode           = 
p->nb_img_qfs > 1 ? VK_SHARING_MODE_CONCURRENT :
 
 3221                                                          VK_SHARING_MODE_EXCLUSIVE,
 
 3225         VkExternalImageFormatProperties ext_props = {
 
 3226             .sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR,
 
 3228         VkImageFormatProperties2 props_ret = {
 
 3229             .sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,
 
 3230             .pNext = &ext_props,
 
 3232         VkPhysicalDeviceImageDrmFormatModifierInfoEXT props_drm_mod = {
 
 3233             .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT,
 
 3234             .drmFormatModifier = ext_img_mod_spec.drmFormatModifier,
 
 3235             .pQueueFamilyIndices = create_info.pQueueFamilyIndices,
 
 3236             .queueFamilyIndexCount = create_info.queueFamilyIndexCount,
 
 3237             .sharingMode = create_info.sharingMode,
 
 3239         VkPhysicalDeviceExternalImageFormatInfo props_ext = {
 
 3240             .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO,
 
 3241             .pNext = &props_drm_mod,
 
 3242             .handleType = ext_img_spec.handleTypes,
 
 3244         VkPhysicalDeviceImageFormatInfo2 fmt_props;
 
 3247             create_info.usage |= VK_IMAGE_USAGE_SAMPLED_BIT |
 
 3248                                  VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
 
 3250             create_info.usage |= VK_IMAGE_USAGE_STORAGE_BIT |
 
 3251                                  VK_IMAGE_USAGE_TRANSFER_DST_BIT;
 
 3253         fmt_props = (VkPhysicalDeviceImageFormatInfo2) {
 
 3254             .sType  = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
 
 3255             .pNext  = &props_ext,
 
 3256             .format = create_info.format,
 
 3257             .type   = create_info.imageType,
 
 3258             .tiling = create_info.tiling,
 
 3259             .usage  = create_info.usage,
 
 3260             .flags  = create_info.flags,
 
 3264         ret = vk->GetPhysicalDeviceImageFormatProperties2(hwctx->
phys_dev,
 
 3265                                                           &fmt_props, &props_ret);
 
 3266         if (
ret != VK_SUCCESS) {
 
 3274         get_plane_wh(&create_info.extent.width, &create_info.extent.height,
 
 3278         for (
int j = 0; j < 
planes; j++) {
 
 3279             ext_img_layouts[j].offset     = 
desc->layers[
i].planes[j].offset;
 
 3280             ext_img_layouts[j].rowPitch   = 
desc->layers[
i].planes[j].pitch;
 
 3281             ext_img_layouts[j].size       = 0; 
 
 3282             ext_img_layouts[j].arrayPitch = 0;
 
 3283             ext_img_layouts[j].depthPitch = 0;
 
 3287         ret = vk->CreateImage(hwctx->
act_dev, &create_info,
 
 3289         if (
ret != VK_SUCCESS) {
 
 3296         ret = vk->CreateSemaphore(hwctx->
act_dev, &sem_spawn,
 
 3298         if (
ret != VK_SUCCESS) {
 
 3305         f->queue_family[
i] = VK_QUEUE_FAMILY_EXTERNAL;
 
 3306         f->layout[
i] = create_info.initialLayout;
 
 3308         f->sem_value[
i] = 0;
 
 3311     for (
int i = 0; 
i < 
desc->nb_layers; 
i++) {
 
 3313         VkImageMemoryRequirementsInfo2 req_desc = {
 
 3314             .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
 
 3317         VkMemoryDedicatedRequirements ded_req = {
 
 3318             .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
 
 3320         VkMemoryRequirements2 req2 = {
 
 3321             .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
 
 3326         VkMemoryFdPropertiesKHR fdmp = {
 
 3327             .sType = VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR,
 
 3333         VkImportMemoryFdInfoKHR idesc = {
 
 3334             .sType      = VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR,
 
 3335             .fd         = dup(
desc->objects[
desc->layers[
i].planes[0].object_index].fd),
 
 3336             .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
 
 3338         VkMemoryDedicatedAllocateInfo ded_alloc = {
 
 3339             .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
 
 3341             .image = req_desc.image,
 
 3345         ret = vk->GetMemoryFdPropertiesKHR(hwctx->
act_dev,
 
 3346                                            VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
 
 3348         if (
ret != VK_SUCCESS) {
 
 3356         vk->GetImageMemoryRequirements2(hwctx->
act_dev, &req_desc, &req2);
 
 3359         req2.memoryRequirements.memoryTypeBits = fdmp.memoryTypeBits;
 
 3362                         VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
 
 3363                         (ded_req.prefersDedicatedAllocation ||
 
 3364                          ded_req.requiresDedicatedAllocation) ?
 
 3365                             &ded_alloc : ded_alloc.pNext,
 
 3366                         &
f->flags, &
f->mem[
i]);
 
 3372         f->size[
i] = req2.memoryRequirements.size;
 
 3375     for (
int i = 0; 
i < 
desc->nb_layers; 
i++) {
 
 3377         for (
int j = 0; j < 
planes; j++) {
 
 3378             VkImageAspectFlagBits aspect = j == 0 ? VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT :
 
 3379                                            j == 1 ? VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT :
 
 3380                                                     VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
 
 3382             plane_info[bind_counts].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO;
 
 3384             plane_info[bind_counts].planeAspect = aspect;
 
 3386             bind_info[bind_counts].sType  = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
 
 3388             bind_info[bind_counts].image  = 
f->img[
i];
 
 3389             bind_info[bind_counts].memory = 
f->mem[
i];
 
 3392             bind_info[bind_counts].memoryOffset = 0;
 
 3399     ret = vk->BindImageMemory2(hwctx->
act_dev, bind_counts, bind_info);
 
 3400     if (
ret != VK_SUCCESS) {
 
 3430 #ifdef DMA_BUF_IOCTL_EXPORT_SYNC_FILE
 
 3432         VkCommandBuffer cmd_buf;
 
 3438         for (
int i = 0; 
i < 
desc->nb_objects; 
i++) {
 
 3439             VkSemaphoreTypeCreateInfo sem_type_info = {
 
 3440                 .sType         = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
 
 3441                 .semaphoreType = VK_SEMAPHORE_TYPE_BINARY,
 
 3443             VkSemaphoreCreateInfo sem_spawn = {
 
 3444                 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
 
 3445                 .pNext = &sem_type_info,
 
 3447             VkImportSemaphoreFdInfoKHR import_info;
 
 3448             struct dma_buf_export_sync_file implicit_fd_info = {
 
 3449                 .flags = DMA_BUF_SYNC_READ,
 
 3453             if (ioctl(
desc->objects[
i].fd, DMA_BUF_IOCTL_EXPORT_SYNC_FILE,
 
 3454                       &implicit_fd_info)) {
 
 3459                     vk->DestroySemaphore(hwctx->
act_dev, drm_sync_sem[
i], hwctx->
alloc);
 
 3463             ret = vk->CreateSemaphore(hwctx->
act_dev, &sem_spawn,
 
 3464                                       hwctx->
alloc, &drm_sync_sem[
i]);
 
 3465             if (
ret != VK_SUCCESS) {
 
 3470                     vk->DestroySemaphore(hwctx->
act_dev, drm_sync_sem[
i], hwctx->
alloc);
 
 3474             import_info = (VkImportSemaphoreFdInfoKHR) {
 
 3475                 .sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR,
 
 3476                 .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT,
 
 3477                 .flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT,
 
 3478                 .semaphore = drm_sync_sem[
i],
 
 3479                 .fd = implicit_fd_info.fd,
 
 3482             ret = vk->ImportSemaphoreFdKHR(hwctx->
act_dev, &import_info);
 
 3483             if (
ret != VK_SUCCESS) {
 
 3488                     vk->DestroySemaphore(hwctx->
act_dev, drm_sync_sem[
i], hwctx->
alloc);
 
 3494         cmd_buf = exec->
buf;
 
 3500                                           drm_sync_sem, 
desc->nb_objects,
 
 3501                                           VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT, 1);
 
 3506                                        VK_PIPELINE_STAGE_2_NONE,
 
 3507                                        VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT);
 
 3512                             VK_PIPELINE_STAGE_2_NONE,
 
 3513                             VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
 
 3515                              VK_ACCESS_2_SHADER_SAMPLED_READ_BIT : 0x0) |
 
 3517                              VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT : 0x0),
 
 3518                             VK_IMAGE_LAYOUT_GENERAL,
 
 3519                             p->nb_img_qfs > 1 ? VK_QUEUE_FAMILY_IGNORED : 
p->img_qfs[0]);
 
 3521         vk->CmdPipelineBarrier2(cmd_buf, &(VkDependencyInfo) {
 
 3522                 .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
 
 3523                 .pImageMemoryBarriers = img_bar,
 
 3524                 .imageMemoryBarrierCount = nb_img_bar,
 
 3535                                       "image may be corrupted.\n");
 
 3550     if ((err = vulkan_map_from_drm_frame_desc(hwfc, &
f, 
src, 
flags)))
 
 3554     dst->data[0] = (uint8_t *)
f;
 
 3556     dst->height  = 
src->height;
 
 3559                                 &vulkan_unmap_from_drm, 
f);
 
 3563     err = vulkan_map_from_drm_frame_sync(hwfc, 
dst, 
src, 
flags);
 
 3586     VASurfaceID surface_id = (VASurfaceID)(uintptr_t)
src->data[3];
 
 3592     vaSyncSurface(vaapi_ctx->display, surface_id);
 
 3600     err = vulkan_map_from_drm(dst_fc, 
dst, 
tmp, 
flags);
 
 3617                               VkDeviceMemory mem, 
size_t size)
 
 3625     CUDA_EXTERNAL_MEMORY_HANDLE_DESC ext_desc = {
 
 3626         .type = IsWindows8OrGreater()
 
 3627                 ? CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32
 
 3628                 : CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT,
 
 3631     VkMemoryGetWin32HandleInfoKHR export_info = {
 
 3632         .sType      = VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR,
 
 3634         .handleType = IsWindows8OrGreater()
 
 3635             ? VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT
 
 3636             : VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
 
 3639     ret = vk->GetMemoryWin32HandleKHR(hwctx->
act_dev, &export_info,
 
 3640                                       &ext_desc.handle.win32.handle);
 
 3641     if (
ret != VK_SUCCESS) {
 
 3646     dst_int->ext_mem_handle[idx] = ext_desc.handle.win32.handle;
 
 3648     CUDA_EXTERNAL_MEMORY_HANDLE_DESC ext_desc = {
 
 3649         .type = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD,
 
 3652     VkMemoryGetFdInfoKHR export_info = {
 
 3653         .sType      = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
 
 3655         .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR,
 
 3658     ret = vk->GetMemoryFdKHR(hwctx->
act_dev, &export_info,
 
 3659                              &ext_desc.handle.fd);
 
 3660     if (
ret != VK_SUCCESS) {
 
 3667     ret = 
CHECK_CU(cu->cuImportExternalMemory(&dst_int->ext_mem[idx], &ext_desc));
 
 3670         close(ext_desc.handle.fd);
 
 3689     VkSemaphoreGetWin32HandleInfoKHR sem_export = {
 
 3690         .sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR,
 
 3692         .handleType = IsWindows8OrGreater()
 
 3693                       ? VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT
 
 3694                       : VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT,
 
 3696     CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC ext_sem_desc = {
 
 3700     VkSemaphoreGetFdInfoKHR sem_export = {
 
 3701         .sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR,
 
 3703         .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT,
 
 3705     CUDA_EXTERNAL_SEMAPHORE_HANDLE_DESC ext_sem_desc = {
 
 3711     ret = vk->GetSemaphoreWin32HandleKHR(hwctx->
act_dev, &sem_export,
 
 3712                                          &ext_sem_desc.handle.win32.handle);
 
 3714     ret = vk->GetSemaphoreFdKHR(hwctx->
act_dev, &sem_export,
 
 3715                                 &ext_sem_desc.handle.fd);
 
 3717     if (
ret != VK_SUCCESS) {
 
 3723     dst_int->ext_sem_handle[idx] = ext_sem_desc.handle.win32.handle;
 
 3726     ret = 
CHECK_CU(cu->cuImportExternalSemaphore(&dst_int->cu_sem[idx],
 
 3730         close(ext_sem_desc.handle.fd);
 
 3758     CudaFunctions *cu = cu_internal->
cuda_dl;
 
 3759     CUarray_format cufmt = 
desc->comp[0].depth > 8 ? CU_AD_FORMAT_UNSIGNED_INT16 :
 
 3760                                                      CU_AD_FORMAT_UNSIGNED_INT8;
 
 3765     if (!dst_int->cuda_fc_ref) {
 
 3769         if (!dst_int->cuda_fc_ref)
 
 3773         for (
int i = 0; 
i < nb_images; 
i++) {
 
 3774             err = export_mem_to_cuda(
ctx, cuda_cu, cu, dst_int, 
i,
 
 3779             err = export_sem_to_cuda(
ctx, cuda_cu, cu, dst_int, 
i,
 
 3785         if (nb_images != 
planes) {
 
 3787                 VkImageSubresource subres = {
 
 3788                     .aspectMask = 
i == 2 ? VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT :
 
 3789                                   i == 1 ? VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT :
 
 3790                                            VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT
 
 3792                 VkSubresourceLayout 
layout = { 0 };
 
 3793                 vk->GetImageSubresourceLayout(hwctx->
act_dev, dst_f->
img[
FFMIN(
i, nb_images - 1)],
 
 3800             CUDA_EXTERNAL_MEMORY_MIPMAPPED_ARRAY_DESC tex_desc = {
 
 3805                     .NumChannels = 1 + ((
planes == 2) && 
i),
 
 3813             tex_desc.arrayDesc.Width = p_w;
 
 3814             tex_desc.arrayDesc.Height = p_h;
 
 3816             ret = 
CHECK_CU(cu->cuExternalMemoryGetMappedMipmappedArray(&dst_int->cu_mma[
i],
 
 3817                                                                        dst_int->ext_mem[
FFMIN(
i, nb_images - 1)],
 
 3824             ret = 
CHECK_CU(cu->cuMipmappedArrayGetLevel(&dst_int->cu_array[
i],
 
 3825                                                         dst_int->cu_mma[
i], 0));
 
 3856     CudaFunctions *cu = cu_internal->
cuda_dl;
 
 3866     err = 
CHECK_CU(cu->cuCtxPushCurrent(cuda_dev->cuda_ctx));
 
 3870     err = vulkan_export_to_cuda(hwfc, 
src->hw_frames_ctx, 
dst);
 
 3879         s_w_par[
i].params.fence.value = dst_f->
sem_value[
i] + 0;
 
 3880         s_s_par[
i].params.fence.value = dst_f->
sem_value[
i] + 1;
 
 3883     err = 
CHECK_CU(cu->cuWaitExternalSemaphoresAsync(dst_int->cu_sem, s_w_par,
 
 3884                                                      planes, cuda_dev->stream));
 
 3889         CUDA_MEMCPY2D cpy = {
 
 3890             .srcMemoryType = CU_MEMORYTYPE_DEVICE,
 
 3891             .srcDevice     = (CUdeviceptr)
src->data[
i],
 
 3892             .srcPitch      = 
src->linesize[
i],
 
 3895             .dstMemoryType = CU_MEMORYTYPE_ARRAY,
 
 3896             .dstArray      = dst_int->cu_array[
i],
 
 3902         cpy.WidthInBytes = p_w * 
desc->comp[
i].step;
 
 3905         err = 
CHECK_CU(cu->cuMemcpy2DAsync(&cpy, cuda_dev->stream));
 
 3910     err = 
CHECK_CU(cu->cuSignalExternalSemaphoresAsync(dst_int->cu_sem, s_s_par,
 
 3911                                                        planes, cuda_dev->stream));
 
 3937     switch (
src->format) {
 
 3942             return vulkan_map_from_vaapi(hwfc, 
dst, 
src, 
flags);
 
 3948             return vulkan_map_from_drm(hwfc, 
dst, 
src, 
flags);
 
 3958 typedef struct VulkanDRMMapping {
 
 3973 static inline uint32_t vulkan_fmt_to_drm(
VkFormat vkfmt)
 
 3976         if (vulkan_drm_format_map[
i].vk_format == vkfmt)
 
 3977             return vulkan_drm_format_map[
i].drm_fourcc;
 
 3978     return DRM_FORMAT_INVALID;
 
 3981 #define MAX_MEMORY_PLANES 4 
 3982 static VkImageAspectFlags plane_index_to_aspect(
int plane) {
 
 3983     if (plane == 0) 
return VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT;
 
 3984     if (plane == 1) 
return VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
 
 3985     if (plane == 2) 
return VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
 
 3986     if (plane == 3) 
return VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT;
 
 3989     return VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT;
 
 4003     VkImageDrmFormatModifierPropertiesEXT drm_mod = {
 
 4004         .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
 
 4006     VkSemaphoreWaitInfo wait_info = {
 
 4007         .sType          = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
 
 4009         .semaphoreCount = 
planes,
 
 4021     wait_info.pSemaphores = 
f->sem;
 
 4022     wait_info.pValues     = 
f->sem_value;
 
 4024     vk->WaitSemaphores(hwctx->
act_dev, &wait_info, UINT64_MAX);
 
 4030     ret = vk->GetImageDrmFormatModifierPropertiesEXT(hwctx->
act_dev, 
f->img[0],
 
 4032     if (
ret != VK_SUCCESS) {
 
 4038     for (
int i = 0; (
i < 
planes) && (
f->mem[
i]); 
i++) {
 
 4039         VkMemoryGetFdInfoKHR export_info = {
 
 4040             .sType      = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR,
 
 4041             .memory     = 
f->mem[
i],
 
 4042             .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT,
 
 4045         ret = vk->GetMemoryFdKHR(hwctx->
act_dev, &export_info,
 
 4047         if (
ret != VK_SUCCESS) {
 
 4062         drm_desc->
layers[
i].
format = vulkan_fmt_to_drm(plane_vkfmt);
 
 4072             VkSubresourceLayout 
layout;
 
 4073             VkImageSubresource sub = {
 
 4074                 .aspectMask = plane_index_to_aspect(j),
 
 4079             vk->GetImageSubresourceLayout(hwctx->
act_dev, 
f->img[
i], &sub, &
layout);
 
 4091         if (
f->tiling == VK_IMAGE_TILING_OPTIMAL)
 
 4097     dst->height  = 
src->height;
 
 4098     dst->data[0] = (uint8_t *)drm_desc;
 
 4142     switch (
dst->format) {
 
 4152             return vulkan_map_to_vaapi(hwfc, 
dst, 
src, 
flags);
 
 4164                             AVFrame *swf, VkBufferImageCopy *region,
 
 4174     const VkMappedMemoryRange flush_info = {
 
 4175         .sType  = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
 
 4176         .memory = vkbuf->
mem,
 
 4177         .size   = VK_WHOLE_SIZE,
 
 4180     if (!upload && !(vkbuf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
 
 4181         ret = vk->InvalidateMappedMemoryRanges(hwctx->
act_dev, 1,
 
 4183         if (
ret != VK_SUCCESS) {
 
 4193                                 region[
i].bufferRowLength,
 
 4197                                 region[
i].imageExtent.height);
 
 4202                                 vkbuf->mapped_mem + region[
i].bufferOffset,
 
 4203                                 region[
i].bufferRowLength,
 
 4205                                 region[
i].imageExtent.height);
 
 4208     if (upload && !(vkbuf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) {
 
 4209         ret = vk->FlushMappedMemoryRanges(hwctx->
act_dev, 1,
 
 4211         if (
ret != VK_SUCCESS) {
 
 4222                          AVFrame *swf, VkBufferImageCopy *region, 
int upload)
 
 4229     VkBufferUsageFlags buf_usage = upload ? VK_BUFFER_USAGE_TRANSFER_SRC_BIT :
 
 4230                                             VK_BUFFER_USAGE_TRANSFER_DST_BIT;
 
 4232     size_t buf_offset = 0;
 
 4236         region[
i] = (VkBufferImageCopy) {
 
 4237             .bufferOffset = buf_offset,
 
 4239                                        p->props.properties.limits.optimalBufferCopyRowPitchAlignment),
 
 4240             .bufferImageHeight = p_h,
 
 4241             .imageSubresource.layerCount = 1,
 
 4242             .imageExtent = (VkExtent3D){ p_w, p_h, 1 },
 
 4246         buf_offset += 
FFALIGN(p_h*region[
i].bufferRowLength,
 
 4247                               p->props.properties.limits.optimalBufferCopyOffsetAlignment);
 
 4252                                   VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
 
 4253                                   VK_MEMORY_PROPERTY_HOST_CACHED_BIT);
 
 4261                           AVFrame *swf, VkBufferImageCopy *region, 
int upload)
 
 4268     VkBufferUsageFlags buf_usage = upload ? VK_BUFFER_USAGE_TRANSFER_SRC_BIT :
 
 4269                                             VK_BUFFER_USAGE_TRANSFER_DST_BIT;
 
 4278     while (swf->
buf[nb_src_bufs])
 
 4282     if (nb_src_bufs == 1) {
 
 4293     } 
else if (nb_src_bufs == 
planes) { 
 
 4312     for (
int i = 0; 
i < (*nb_bufs); 
i++)
 
 4332     int nb_layout_ch = 0;
 
 4336     for (
int i = 0; 
i < nb_images; 
i++) {
 
 4338         for (
int j = 0; j < 
p->vkctx.host_image_props.copySrcLayoutCount; j++) {
 
 4339             if (hwf_vk->
layout[
i] == 
p->vkctx.host_image_props.pCopySrcLayouts[j]) {
 
 4347         layout_ch_info[nb_layout_ch] = (VkHostImageLayoutTransitionInfoEXT) {
 
 4348             .sType = VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT,
 
 4349             .image = hwf_vk->
img[
i],
 
 4350             .oldLayout = hwf_vk->
layout[
i],
 
 4351             .newLayout = VK_IMAGE_LAYOUT_GENERAL,
 
 4352             .subresourceRange = {
 
 4353                 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
 
 4359         hwf_vk->
layout[
i] = layout_ch_info[nb_layout_ch].newLayout;
 
 4364         .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
 
 4365         .pSemaphores = hwf_vk->
sem,
 
 4367         .semaphoreCount = nb_images,
 
 4373         vk->TransitionImageLayoutEXT(hwctx->
act_dev,
 
 4374                                      nb_layout_ch, layout_ch_info);
 
 4377         VkMemoryToImageCopyEXT region_info = {
 
 4378             .sType = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY_EXT,
 
 4379             .imageSubresource = {
 
 4383         VkCopyMemoryToImageInfoEXT copy_info = {
 
 4384             .sType = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO_EXT,
 
 4385             .flags = VK_HOST_IMAGE_COPY_MEMCPY_EXT,
 
 4387             .pRegions = ®ion_info,
 
 4390             int img_idx = 
FFMIN(
i, (nb_images - 1));
 
 4394             region_info.pHostPointer = swf->
data[
i];
 
 4396             region_info.imageExtent = (VkExtent3D){ p_w, p_h, 1 };
 
 4397             copy_info.dstImage = hwf_vk->
img[img_idx];
 
 4398             copy_info.dstImageLayout = hwf_vk->
layout[img_idx];
 
 4400             vk->CopyMemoryToImageEXT(hwctx->
act_dev, ©_info);
 
 4403         VkImageToMemoryCopyEXT region_info = {
 
 4404             .sType = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY_EXT,
 
 4405             .imageSubresource = {
 
 4409         VkCopyImageToMemoryInfoEXT copy_info = {
 
 4410             .sType = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO_EXT,
 
 4411             .flags = VK_HOST_IMAGE_COPY_MEMCPY_EXT,
 
 4413             .pRegions = ®ion_info,
 
 4416             int img_idx = 
FFMIN(
i, (nb_images - 1));
 
 4420             region_info.pHostPointer = swf->
data[
i];
 
 4422             region_info.imageExtent = (VkExtent3D){ p_w, p_h, 1 };
 
 4423             copy_info.srcImage = hwf_vk->
img[img_idx];
 
 4424             copy_info.srcImageLayout = hwf_vk->
layout[img_idx];
 
 4426             vk->CopyImageToMemoryEXT(hwctx->
act_dev, ©_info);
 
 4445     int host_mapped = 0;
 
 4460     VkCommandBuffer cmd_buf;
 
 4472     if (hwctx->
usage & VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT)
 
 4480         region[
i] = (VkBufferImageCopy) {
 
 4483             .bufferImageHeight = p_h,
 
 4484             .imageSubresource.layerCount = 1,
 
 4485             .imageExtent = (VkExtent3D){ p_w, p_h, 1 },
 
 4511     cmd_buf = exec->
buf;
 
 4517                                    VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
 
 4518                                    VK_PIPELINE_STAGE_2_TRANSFER_BIT);
 
 4542                         VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
 
 4543                         VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR,
 
 4544                         upload ? VK_ACCESS_TRANSFER_WRITE_BIT :
 
 4545                                  VK_ACCESS_TRANSFER_READ_BIT,
 
 4546                         upload ? VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL :
 
 4547                                  VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
 
 4548                         p->nb_img_qfs > 1 ? VK_QUEUE_FAMILY_IGNORED : 
p->img_qfs[0]);
 
 4550     vk->CmdPipelineBarrier2(cmd_buf, &(VkDependencyInfo) {
 
 4551             .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
 
 4552             .pImageMemoryBarriers = img_bar,
 
 4553             .imageMemoryBarrierCount = nb_img_bar,
 
 4557         int buf_idx = 
FFMIN(
i, (nb_bufs - 1));
 
 4558         int img_idx = 
FFMIN(
i, (nb_images - 1));
 
 4561         uint32_t orig_stride = region[
i].bufferRowLength;
 
 4562         region[
i].bufferRowLength /= 
desc->comp[
i].step;
 
 4566             vk->CmdCopyBufferToImage(cmd_buf, vkbuf->
buf,
 
 4567                                      hwf_vk->
img[img_idx],
 
 4568                                      img_bar[img_idx].newLayout,
 
 4571             vk->CmdCopyImageToBuffer(cmd_buf, hwf_vk->
img[img_idx],
 
 4572                                      img_bar[img_idx].newLayout,
 
 4576         region[
i].bufferRowLength = orig_stride;
 
 4582     } 
else if (!upload) {
 
 4589     for (
int i = 0; 
i < nb_bufs; 
i++)
 
 4600     switch (
src->format) {
 
 4610             return vulkan_transfer_data_from_cuda(hwfc, 
dst, 
src);
 
 4613         if (
src->hw_frames_ctx)
 
 4637     CudaFunctions *cu = cu_internal->
cuda_dl;
 
 4648     err = 
CHECK_CU(cu->cuCtxPushCurrent(cuda_dev->cuda_ctx));
 
 4652     err = vulkan_export_to_cuda(hwfc, 
dst->hw_frames_ctx, 
src);
 
 4661         s_w_par[
i].params.fence.value = dst_f->
sem_value[
i] + 0;
 
 4662         s_s_par[
i].params.fence.value = dst_f->
sem_value[
i] + 1;
 
 4665     err = 
CHECK_CU(cu->cuWaitExternalSemaphoresAsync(dst_int->cu_sem, s_w_par,
 
 4666                                                      nb_images, cuda_dev->stream));
 
 4671         CUDA_MEMCPY2D cpy = {
 
 4672             .dstMemoryType = CU_MEMORYTYPE_DEVICE,
 
 4673             .dstDevice     = (CUdeviceptr)
dst->data[
i],
 
 4674             .dstPitch      = 
dst->linesize[
i],
 
 4677             .srcMemoryType = CU_MEMORYTYPE_ARRAY,
 
 4678             .srcArray      = dst_int->cu_array[
i],
 
 4684         cpy.WidthInBytes = 
w * 
desc->comp[
i].step;
 
 4687         err = 
CHECK_CU(cu->cuMemcpy2DAsync(&cpy, cuda_dev->stream));
 
 4692     err = 
CHECK_CU(cu->cuSignalExternalSemaphoresAsync(dst_int->cu_sem, s_s_par,
 
 4693                                                        nb_images, cuda_dev->stream));
 
 4719     switch (
dst->format) {
 
 4729             return vulkan_transfer_data_to_cuda(hwfc, 
dst, 
src);
 
 4732         if (
dst->hw_frames_ctx)