28     .r = VK_COMPONENT_SWIZZLE_IDENTITY,
 
   29     .g = VK_COMPONENT_SWIZZLE_IDENTITY,
 
   30     .b = VK_COMPONENT_SWIZZLE_IDENTITY,
 
   31     .a = VK_COMPONENT_SWIZZLE_IDENTITY,
 
   37 #define CASE(VAL) case VAL: return #VAL 
   45     CASE(VK_ERROR_OUT_OF_HOST_MEMORY);
 
   46     CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY);
 
   47     CASE(VK_ERROR_INITIALIZATION_FAILED);
 
   48     CASE(VK_ERROR_DEVICE_LOST);
 
   49     CASE(VK_ERROR_MEMORY_MAP_FAILED);
 
   50     CASE(VK_ERROR_LAYER_NOT_PRESENT);
 
   51     CASE(VK_ERROR_EXTENSION_NOT_PRESENT);
 
   52     CASE(VK_ERROR_FEATURE_NOT_PRESENT);
 
   53     CASE(VK_ERROR_INCOMPATIBLE_DRIVER);
 
   54     CASE(VK_ERROR_TOO_MANY_OBJECTS);
 
   55     CASE(VK_ERROR_FORMAT_NOT_SUPPORTED);
 
   56     CASE(VK_ERROR_FRAGMENTED_POOL);
 
   57     CASE(VK_ERROR_UNKNOWN);
 
   58     CASE(VK_ERROR_OUT_OF_POOL_MEMORY);
 
   59     CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE);
 
   60     CASE(VK_ERROR_FRAGMENTATION);
 
   61     CASE(VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS);
 
   62     CASE(VK_PIPELINE_COMPILE_REQUIRED);
 
   63     CASE(VK_ERROR_SURFACE_LOST_KHR);
 
   64     CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
 
   65     CASE(VK_SUBOPTIMAL_KHR);
 
   66     CASE(VK_ERROR_OUT_OF_DATE_KHR);
 
   67     CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
 
   68     CASE(VK_ERROR_VALIDATION_FAILED_EXT);
 
   69     CASE(VK_ERROR_INVALID_SHADER_NV);
 
   70     CASE(VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR);
 
   71     CASE(VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR);
 
   72     CASE(VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR);
 
   73     CASE(VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR);
 
   74     CASE(VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR);
 
   75     CASE(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT);
 
   76     CASE(VK_ERROR_NOT_PERMITTED_KHR);
 
   77     CASE(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT);
 
   78     CASE(VK_THREAD_IDLE_KHR);
 
   79     CASE(VK_THREAD_DONE_KHR);
 
   80     CASE(VK_OPERATION_DEFERRED_KHR);
 
   81     CASE(VK_OPERATION_NOT_DEFERRED_KHR);
 
   82     default: 
return "Unknown error";
 
   88 #define FN_MAP_TO(dst_t, dst_name, src_t, src_name)                                 \ 
   89     dst_t ff_vk_map_ ##src_name## _to_ ##dst_name(src_t src) \ 
   92         MAP_TO(VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT,                   \ 
   93                VK_IMAGE_USAGE_SAMPLED_BIT);                             \ 
   94         MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT,                    \ 
   95                VK_IMAGE_USAGE_TRANSFER_SRC_BIT);                        \ 
   96         MAP_TO(VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT,                    \ 
   97                VK_IMAGE_USAGE_TRANSFER_DST_BIT);                        \ 
   98         MAP_TO(VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT,                   \ 
   99                VK_IMAGE_USAGE_STORAGE_BIT);                             \ 
  100         MAP_TO(VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT,                \ 
  101                VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);                    \ 
  102         MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR,         \ 
  103                VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR);                \ 
  104         MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR,            \ 
  105                VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR);                \ 
  106         MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR,            \ 
  107                VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR);                \ 
  108         MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR,          \ 
  109                VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR);                \ 
  110         MAP_TO(VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT,         \ 
  111                VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT);                   \ 
  115 #define MAP_TO(flag1, flag2) if (src & flag2) dst |= flag1; 
  116 FN_MAP_TO(VkFormatFeatureFlagBits2, feats, VkImageUsageFlags, 
usage)
 
  118 #define MAP_TO(flag1, flag2) if (src & flag1) dst |= flag2; 
  119 FN_MAP_TO(VkImageUsageFlags, 
usage, VkFormatFeatureFlagBits2, feats)
 
  126     for (
int i = 0; 
i < 
s->hwctx->nb_qf; 
i++) {
 
  129         for (
int j = 0; j < 
s->nb_qfs; j++) {
 
  130             if (
s->qfs[j] == 
s->hwctx->qf[
i].idx) {
 
  138         s->qfs[
s->nb_qfs++] = 
s->hwctx->qf[
i].idx;
 
  146     s->props = (VkPhysicalDeviceProperties2) {
 
  147         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
 
  151                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES);
 
  153                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES);
 
  155                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES);
 
  158                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR);
 
  160                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT);
 
  162                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR);
 
  164                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT);
 
  166                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV);
 
  168                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT);
 
  170     s->feats = (VkPhysicalDeviceFeatures2) {
 
  171         .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
 
  175                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES);
 
  177                      VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT);
 
  180     s->host_image_copy_layouts = 
av_malloc(
sizeof(*
s->host_image_copy_layouts)*1024);
 
  181     s->host_image_props.pCopySrcLayouts = 
s->host_image_copy_layouts;
 
  182     s->host_image_props.copySrcLayoutCount = 512;
 
  183     s->host_image_props.pCopyDstLayouts = 
s->host_image_copy_layouts + 512;
 
  184     s->host_image_props.copyDstLayoutCount = 512;
 
  186     vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
 
  189     if (
s->host_image_props.copySrcLayoutCount == 512 ||
 
  190         s->host_image_props.copyDstLayoutCount == 512) {
 
  191         VkImageLayout *new_array;
 
  193         s->host_image_props.pCopySrcLayouts =
 
  194         s->host_image_props.pCopyDstLayouts = 
NULL;
 
  195         s->host_image_props.copySrcLayoutCount =
 
  196         s->host_image_props.copyDstLayoutCount = 0;
 
  197         vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
 
  199         new_size = 
s->host_image_props.copySrcLayoutCount +
 
  200                    s->host_image_props.copyDstLayoutCount;
 
  201         new_size *= 
sizeof(*
s->host_image_copy_layouts);
 
  202         new_array = 
av_realloc(
s->host_image_copy_layouts, new_size);
 
  206         s->host_image_copy_layouts = new_array;
 
  207         s->host_image_props.pCopySrcLayouts = new_array;
 
  208         s->host_image_props.pCopyDstLayouts = new_array + 
s->host_image_props.copySrcLayoutCount;
 
  209         vk->GetPhysicalDeviceProperties2(
s->hwctx->phys_dev, &
s->props);
 
  212     vk->GetPhysicalDeviceMemoryProperties(
s->hwctx->phys_dev, &
s->mprops);
 
  213     vk->GetPhysicalDeviceFeatures2(
s->hwctx->phys_dev, &
s->feats);
 
  220     vk->GetPhysicalDeviceQueueFamilyProperties2(
s->hwctx->phys_dev, &
s->tot_nb_qfs, 
NULL);
 
  222     s->qf_props = 
av_calloc(
s->tot_nb_qfs, 
sizeof(*
s->qf_props));
 
  226     s->query_props = 
av_calloc(
s->tot_nb_qfs, 
sizeof(*
s->query_props));
 
  232     s->video_props = 
av_calloc(
s->tot_nb_qfs, 
sizeof(*
s->video_props));
 
  233     if (!
s->video_props) {
 
  239     for (uint32_t 
i = 0; 
i < 
s->tot_nb_qfs; 
i++) {
 
  240         s->qf_props[
i] = (VkQueueFamilyProperties2) {
 
  241             .sType = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,
 
  245                          VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR);
 
  247                          VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR);
 
  250     vk->GetPhysicalDeviceQueueFamilyProperties2(
s->hwctx->phys_dev, &
s->tot_nb_qfs, 
s->qf_props);
 
  253         vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(
s->hwctx->phys_dev,
 
  254                                                             &
s->coop_mat_props_nb, 
NULL);
 
  256         if (
s->coop_mat_props_nb) {
 
  258                                                 sizeof(VkCooperativeMatrixPropertiesKHR));
 
  259             for (
int i = 0; 
i < 
s->coop_mat_props_nb; 
i++) {
 
  260                 s->coop_mat_props[
i] = (VkCooperativeMatrixPropertiesKHR) {
 
  261                     .sType = VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR,
 
  265             vk->GetPhysicalDeviceCooperativeMatrixPropertiesKHR(
s->hwctx->phys_dev,
 
  266                                                                 &
s->coop_mat_props_nb,
 
  275                                          VkQueueFlagBits dev_family,
 
  276                                          VkVideoCodecOperationFlagBitsKHR vid_ops)
 
  278     for (
int i = 0; 
i < 
s->hwctx->nb_qf; 
i++) {
 
  279         if ((
s->hwctx->qf[
i].flags & dev_family) &&
 
  280             (
s->hwctx->qf[
i].video_caps & vid_ops) == vid_ops) {
 
  281             return &
s->hwctx->qf[
i];
 
  296                 vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
 
  297             vk->DestroyFence(
s->hwctx->act_dev, e->
fence, 
s->hwctx->alloc);
 
  329             vk->DestroyDescriptorPool(
s->hwctx->act_dev, sd->
desc_pool,
 
  345             vk->DestroyCommandPool(
s->hwctx->act_dev, pool->
cmd_buf_pools[
i], 
s->hwctx->alloc);
 
  348         vk->DestroyQueryPool(
s->hwctx->act_dev, pool->
query_pool, 
s->hwctx->alloc);
 
  358                          int nb_queries, VkQueryType query_type, 
int query_64bit,
 
  359                          const void *query_create_pnext)
 
  366     VkCommandBufferAllocateInfo cbuf_create;
 
  368     const VkQueryPoolVideoEncodeFeedbackCreateInfoKHR *ef = 
NULL;
 
  372     if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) {
 
  374                                VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR);
 
  393     for (
int i = 0; 
i < nb_contexts; 
i++) {
 
  396             .sType              = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
 
  397             .flags              = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT |
 
  398                                   VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
 
  399             .queueFamilyIndex   = qf->
idx,
 
  404         if (
ret != VK_SUCCESS) {
 
  412         cbuf_create = (VkCommandBufferAllocateInfo) {
 
  413             .sType              = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
 
  414             .level              = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
 
  416             .commandBufferCount = 1,
 
  418         ret = vk->AllocateCommandBuffers(
s->hwctx->act_dev, &cbuf_create,
 
  420         if (
ret != VK_SUCCESS) {
 
  430         VkQueryPoolCreateInfo query_pool_info = {
 
  431             .sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
 
  432             .pNext = query_create_pnext,
 
  433             .queryType = query_type,
 
  434             .queryCount = nb_queries*nb_contexts,
 
  436         ret = vk->CreateQueryPool(
s->hwctx->act_dev, &query_pool_info,
 
  438         if (
ret != VK_SUCCESS) {
 
  451         if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) {
 
  452             int nb_results = 
av_popcount(ef->encodeFeedbackFlags);
 
  455         } 
else if (query_type == VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR) {
 
  482         VkFenceCreateInfo fence_create = {
 
  483             .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
 
  484             .flags = VK_FENCE_CREATE_SIGNALED_BIT,
 
  488         ret = vk->CreateFence(
s->hwctx->act_dev, &fence_create, 
s->hwctx->alloc,
 
  490         if (
ret != VK_SUCCESS) {
 
  509         vk->GetDeviceQueue(
s->hwctx->act_dev, qf->
idx, e->
qi, &e->
queue);
 
  520                               void **
data, VkQueryResultFlagBits 
flags)
 
  524     VkQueryResultFlags qf = 
flags & ~(VK_QUERY_RESULT_64_BIT |
 
  525                                       VK_QUERY_RESULT_WITH_STATUS_BIT_KHR);
 
  529         return VK_INCOMPLETE;
 
  533           VK_QUERY_RESULT_64_BIT : 0x0;
 
  535           VK_QUERY_RESULT_WITH_STATUS_BIT_KHR : 0x0;
 
  540     return vk->GetQueryPoolResults(
s->hwctx->act_dev, pool->
query_pool,
 
  555     vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
 
  565     VkCommandBufferBeginInfo cmd_start = {
 
  566         .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
 
  567         .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
 
  571     vk->WaitForFences(
s->hwctx->act_dev, 1, &e->
fence, VK_TRUE, UINT64_MAX);
 
  572     vk->ResetFences(
s->hwctx->act_dev, 1, &e->
fence);
 
  577     ret = vk->BeginCommandBuffer(e->
buf, &cmd_start);
 
  578     if (
ret != VK_SUCCESS) {
 
  607             vkfc->unlock_frame(hwfc, vkf);
 
  631     for (
int i = 0; 
i < nb_deps; 
i++) {
 
  669 #define ARR_REALLOC(str, arr, alloc_s, cnt)                               \ 
  671         arr = av_fast_realloc(str->arr, alloc_s, (cnt + 1)*sizeof(*arr)); \ 
  673             ff_vk_exec_discard_deps(s, e);                                \ 
  674             return AVERROR(ENOMEM);                                       \ 
  691         vk->DestroySemaphore(
s->hwctx->act_dev, ts->
sem[
i], 
s->hwctx->alloc);
 
  697                                 VkSemaphore sem, uint64_t 
val,
 
  698                                 VkPipelineStageFlagBits2 stage)
 
  704         .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
 
  714                                 VkSemaphore *sem, 
int nb,
 
  715                                 VkPipelineStageFlagBits2 stage,
 
  727         for (
int i = 0; 
i < nb; 
i++) {
 
  728             VkSemaphoreSubmitInfo *sem_sig;
 
  732                 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
 
  741     buf_size = 
sizeof(*ts) + 
sizeof(VkSemaphore)*nb;
 
  748     memcpy(ts->sem, sem, nb*
sizeof(*sem));
 
  764     for (
int i = 0; 
i < nb; 
i++) {
 
  773     for (
int i = 0; 
i < nb; 
i++)
 
  774         vk->DestroySemaphore(
s->hwctx->act_dev, sem[
i], 
s->hwctx->alloc);
 
  780                              VkPipelineStageFlagBits2 wait_stage,
 
  781                              VkPipelineStageFlagBits2 signal_stage)
 
  783     uint8_t *frame_locked;
 
  784     uint8_t *frame_update;
 
  787     VkImageLayout *layout_dst;
 
  788     uint32_t *queue_family_dst;
 
  789     VkAccessFlagBits *access_dst;
 
  824     vkfc->lock_frame(hwfc, vkf);
 
  829     for (
int i = 0; 
i < nb_images; 
i++) {
 
  831         VkSemaphoreSubmitInfo *sem_sig;
 
  832         uint64_t **sem_sig_val_dst;
 
  839             .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
 
  840             .semaphore = vkf->sem[
i],
 
  841             .value = vkf->sem_value[
i],
 
  842             .stageMask = wait_stage,
 
  846             .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
 
  847             .semaphore = vkf->sem[
i],
 
  848             .value = vkf->sem_value[
i] + 1,
 
  849             .stageMask = signal_stage,
 
  860                              VkImageMemoryBarrier2 *bar, uint32_t *nb_img_bar)
 
  879                                 VkSemaphore *
dst, uint64_t *dst_val,
 
  882     uint64_t **sem_sig_val_dst;
 
  908     VkCommandBufferSubmitInfo cmd_buf_info = (VkCommandBufferSubmitInfo) {
 
  909         .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
 
  910         .commandBuffer = e->
buf,
 
  912     VkSubmitInfo2 submit_info = (VkSubmitInfo2) {
 
  913         .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
 
  914         .pCommandBufferInfos = &cmd_buf_info,
 
  915         .commandBufferInfoCount = 1,
 
  918         .pSignalSemaphoreInfos = e->
sem_sig,
 
  922     ret = vk->EndCommandBuffer(e->
buf);
 
  923     if (
ret != VK_SUCCESS) {
 
  930     s->hwctx->lock_queue(
s->device, e->
qf, e->
qi);
 
  932     s->hwctx->unlock_queue(
s->device, e->
qf, e->
qi);
 
  934     if (
ret != VK_SUCCESS) {
 
  954                 for (
int i = 0; 
i < nb_images; 
i++) {
 
  960             vkfc->unlock_frame(hwfc, vkf);
 
  971                     VkMemoryPropertyFlagBits req_flags, 
void *alloc_extension,
 
  972                     VkMemoryPropertyFlagBits *mem_flags, VkDeviceMemory *mem)
 
  978     VkMemoryAllocateInfo alloc_info = {
 
  979         .sType           = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
 
  980         .pNext           = alloc_extension,
 
  983     alloc_info.allocationSize = req->size;
 
  987     for (
int i = 0; 
i < 
s->mprops.memoryTypeCount; 
i++) {
 
  989         if (!(req->memoryTypeBits & (1 << 
i)))
 
  993         if ((req_flags != UINT32_MAX) &&
 
  994             ((
s->mprops.memoryTypes[
i].propertyFlags & req_flags) != req_flags))
 
 1008     alloc_info.memoryTypeIndex = 
index;
 
 1010     ret = vk->AllocateMemory(
s->hwctx->act_dev, &alloc_info,
 
 1011                              s->hwctx->alloc, mem);
 
 1012     if (
ret != VK_SUCCESS)
 
 1016         *mem_flags |= 
s->mprops.memoryTypes[
index].propertyFlags;
 
 1022                      void *pNext, 
void *alloc_pNext,
 
 1023                      VkBufferUsageFlags 
usage, VkMemoryPropertyFlagBits 
flags)
 
 1031     const VkBufferUsageFlags desc_usage =
 
 1032         VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT |
 
 1033         VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
 
 1034         VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
 
 1035         VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
 
 1038         usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
 
 1040     VkBufferCreateInfo buf_spawn = {
 
 1041         .sType       = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
 
 1044         .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
 
 1045         .size        = 
flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT ?
 
 1046                        FFALIGN(
size, 
s->props.properties.limits.minMemoryMapAlignment) :
 
 1050     VkMemoryAllocateFlagsInfo alloc_flags = {
 
 1051         .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
 
 1052         .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
 
 1054     VkBufferMemoryRequirementsInfo2 req_desc = {
 
 1055         .sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
 
 1057     VkMemoryDedicatedAllocateInfo ded_alloc = {
 
 1058         .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
 
 1059         .pNext = alloc_pNext,
 
 1061     VkMemoryDedicatedRequirements ded_req = {
 
 1062         .sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
 
 1064     VkMemoryRequirements2 req = {
 
 1065         .sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
 
 1070                             "usage: 0x%x, flags: 0x%x\n",
 
 1073     ret = vk->CreateBuffer(
s->hwctx->act_dev, &buf_spawn, 
s->hwctx->alloc, &buf->
buf);
 
 1074     if (
ret != VK_SUCCESS) {
 
 1080     req_desc.buffer = buf->
buf;
 
 1082     vk->GetBufferMemoryRequirements2(
s->hwctx->act_dev, &req_desc, &req);
 
 1085     use_ded_mem = ded_req.prefersDedicatedAllocation |
 
 1086                   ded_req.requiresDedicatedAllocation;
 
 1088         ded_alloc.buffer = buf->
buf;
 
 1089         ded_alloc.pNext = alloc_pNext;
 
 1090         alloc_pNext = &ded_alloc;
 
 1093     if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
 
 1094         alloc_flags.pNext = alloc_pNext;
 
 1095         alloc_pNext = &alloc_flags;
 
 1103     ret = vk->BindBufferMemory(
s->hwctx->act_dev, buf->
buf, buf->
mem, 0);
 
 1104     if (
ret != VK_SUCCESS) {
 
 1110     if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
 
 1111         VkBufferDeviceAddressInfo address_info = {
 
 1112             .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
 
 1115         buf->
address = vk->GetBufferDeviceAddress(
s->hwctx->act_dev, &address_info);
 
 1124                       int nb_buffers, 
int invalidate)
 
 1128     VkMappedMemoryRange inval_list[64];
 
 1129     int inval_count = 0;
 
 1131     for (
int i = 0; 
i < nb_buffers; 
i++) {
 
 1133         ret = vk->MapMemory(
s->hwctx->act_dev, buf[
i]->
mem, 0,
 
 1134                             VK_WHOLE_SIZE, 0, &
dst);
 
 1135         if (
ret != VK_SUCCESS) {
 
 1146     for (
int i = 0; 
i < nb_buffers; 
i++) {
 
 1147         const VkMappedMemoryRange ival_buf = {
 
 1148             .sType  = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
 
 1149             .memory = buf[
i]->
mem,
 
 1150             .size   = VK_WHOLE_SIZE,
 
 1152         if (buf[
i]->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
 
 1154         inval_list[inval_count++] = ival_buf;
 
 1158         ret = vk->InvalidateMappedMemoryRanges(
s->hwctx->act_dev, inval_count,
 
 1160         if (
ret != VK_SUCCESS) {
 
 1176     VkMappedMemoryRange flush_list[64];
 
 1177     int flush_count = 0;
 
 1180         for (
int i = 0; 
i < nb_buffers; 
i++) {
 
 1181             const VkMappedMemoryRange flush_buf = {
 
 1182                 .sType  = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
 
 1183                 .memory = buf[
i]->
mem,
 
 1184                 .size   = VK_WHOLE_SIZE,
 
 1188             if (buf[
i]->
flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)
 
 1190             flush_list[flush_count++] = flush_buf;
 
 1195         ret = vk->FlushMappedMemoryRanges(
s->hwctx->act_dev, flush_count,
 
 1197         if (
ret != VK_SUCCESS) {
 
 1204     for (
int i = 0; 
i < nb_buffers; 
i++) {
 
 1205         vk->UnmapMemory(
s->hwctx->act_dev, buf[
i]->
mem);
 
 1216     if (!buf || !
s->hwctx)
 
 1221     if (buf->
buf != VK_NULL_HANDLE)
 
 1222         vk->DestroyBuffer(
s->hwctx->act_dev, buf->
buf, 
s->hwctx->alloc);
 
 1223     if (buf->
mem != VK_NULL_HANDLE)
 
 1224         vk->FreeMemory(
s->hwctx->act_dev, buf->
mem, 
s->hwctx->alloc);
 
 1228     buf->
buf = VK_NULL_HANDLE;
 
 1229     buf->
mem = VK_NULL_HANDLE;
 
 1256                             void *create_pNext, 
size_t size,
 
 1257                             VkMemoryPropertyFlagBits mem_props)
 
 1277     data->stage = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
 
 1278     data->access = VK_ACCESS_2_NONE;
 
 1295     if (mem_props & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) {
 
 1310                                 VkExternalMemoryBufferCreateInfo *create_desc,
 
 1311                                 VkImportMemoryHostPointerInfoEXT *import_desc,
 
 1312                                 VkMemoryHostPointerPropertiesEXT props)
 
 1318     VkBufferCreateInfo buf_spawn = {
 
 1319         .sType       = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO,
 
 1320         .pNext       = create_desc,
 
 1322         .sharingMode = VK_SHARING_MODE_EXCLUSIVE,
 
 1325     VkMemoryRequirements req = {
 
 1327         .alignment      = 
s->hprops.minImportedHostPointerAlignment,
 
 1328         .memoryTypeBits = props.memoryTypeBits,
 
 1332                           VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
 
 1333                           import_desc, &vkb->
flags, &vkb->
mem);
 
 1337     ret = vk->CreateBuffer(
s->hwctx->act_dev, &buf_spawn, 
s->hwctx->alloc, &vkb->
buf);
 
 1338     if (
ret != VK_SUCCESS) {
 
 1339         vk->FreeMemory(
s->hwctx->act_dev, vkb->
mem, 
s->hwctx->alloc);
 
 1343     ret = vk->BindBufferMemory(
s->hwctx->act_dev, vkb->
buf, vkb->
mem, 0);
 
 1344     if (
ret != VK_SUCCESS) {
 
 1345         vk->FreeMemory(
s->hwctx->act_dev, vkb->
mem, 
s->hwctx->alloc);
 
 1346         vk->DestroyBuffer(
s->hwctx->act_dev, vkb->
buf, 
s->hwctx->alloc);
 
 1363                           VkBufferUsageFlags 
usage)
 
 1369     VkExternalMemoryBufferCreateInfo create_desc = {
 
 1370         .sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
 
 1371         .handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
 
 1373     VkMemoryAllocateFlagsInfo alloc_flags = {
 
 1374         .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
 
 1375         .flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT,
 
 1377     VkImportMemoryHostPointerInfoEXT import_desc = {
 
 1378         .sType = VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT,
 
 1379         .handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT,
 
 1380         .pNext = 
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT ? &alloc_flags : 
NULL,
 
 1382     VkMemoryHostPointerPropertiesEXT props;
 
 1392     offs = (uintptr_t)src_data % 
s->hprops.minImportedHostPointerAlignment;
 
 1393     import_desc.pHostPointer = src_data - offs;
 
 1395     props = (VkMemoryHostPointerPropertiesEXT) {
 
 1396         VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT,
 
 1398     ret = vk->GetMemoryHostPointerPropertiesEXT(
s->hwctx->act_dev,
 
 1399                                                 import_desc.handleType,
 
 1400                                                 import_desc.pHostPointer,
 
 1402     if (!(
ret == VK_SUCCESS && props.memoryTypeBits))
 
 1411     const ptrdiff_t src_offset = src_data - src_buf->
data;
 
 1412     buffer_size = offs + (src_buf->
size - src_offset);
 
 1413     buffer_size = 
FFALIGN(buffer_size, 
s->props.properties.limits.minMemoryMapAlignment);
 
 1414     buffer_size = 
FFALIGN(buffer_size, 
s->hprops.minImportedHostPointerAlignment);
 
 1424                                buffer_size, &create_desc, &import_desc,
 
 1432     if (
usage & VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT) {
 
 1433         VkBufferDeviceAddressInfo address_info = {
 
 1434             .sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
 
 1437         vkb->
address = vk->GetBufferDeviceAddress(
s->hwctx->act_dev, &address_info);
 
 1444     vkb->
size           = buffer_size - offs;
 
 1445     vkb->
flags         |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
 
 1460                                 VkShaderStageFlagBits stage)
 
 1462     VkPushConstantRange *pc;
 
 1471     memset(pc, 0, 
sizeof(*pc));
 
 1473     pc->stageFlags = stage;
 
 1481                        int unnorm_coords, VkFilter 
filt)
 
 1486     VkSamplerCreateInfo sampler_info = {
 
 1487         .sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO,
 
 1489         .minFilter = sampler_info.magFilter,
 
 1490         .mipmapMode = unnorm_coords ? VK_SAMPLER_MIPMAP_MODE_NEAREST :
 
 1491                                       VK_SAMPLER_MIPMAP_MODE_LINEAR,
 
 1492         .addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
 
 1493         .addressModeV = sampler_info.addressModeU,
 
 1494         .addressModeW = sampler_info.addressModeU,
 
 1495         .anisotropyEnable = VK_FALSE,
 
 1496         .compareOp = VK_COMPARE_OP_NEVER,
 
 1497         .borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK,
 
 1498         .unnormalizedCoordinates = unnorm_coords,
 
 1501     ret = vk->CreateSampler(
s->hwctx->act_dev, &sampler_info,
 
 1502                             s->hwctx->alloc, sampler);
 
 1503     if (
ret != VK_SUCCESS) {
 
 1519     static const VkImageAspectFlags plane_aspect[] = { VK_IMAGE_ASPECT_PLANE_0_BIT,
 
 1520                                                        VK_IMAGE_ASPECT_PLANE_1_BIT,
 
 1521                                                        VK_IMAGE_ASPECT_PLANE_2_BIT, };
 
 1524         return VK_IMAGE_ASPECT_COLOR_BIT;
 
 1526     return plane_aspect[p];
 
 1581         int lut_tmp[4] = { lut[0], lut[1], lut[2], lut[3] };
 
 1582         for (
int i = 0; 
i < 4; 
i++)
 
 1583             lut[lut_tmp[
i]] = 
i;
 
 1604         const char *rep_tab[] = {
 
 1610         return rep_tab[rep_fmt];
 
 1616         const char *rep_tab[] = {
 
 1622         return rep_tab[rep_fmt];
 
 1630         const char *rep_tab[] = {
 
 1636         return rep_tab[rep_fmt];
 
 1640         const char *rep_tab[] = {
 
 1646         return rep_tab[rep_fmt];
 
 1650         const char *rep_tab[] = {
 
 1656         return rep_tab[rep_fmt];
 
 1667         const char *rep_tab[] = {
 
 1673         return rep_tab[rep_fmt];
 
 1705         const char *rep_tab[] = {
 
 1711         return rep_tab[rep_fmt];
 
 1717         const char *rep_tab[] = {
 
 1723         return rep_tab[rep_fmt];
 
 1726         const char *rep_tab[] = {
 
 1732         return rep_tab[rep_fmt];
 
 1737         const char *rep_tab[] = {
 
 1743         return rep_tab[rep_fmt];
 
 1748         const char *rep_tab[] = {
 
 1754         return rep_tab[rep_fmt];
 
 1762         const char *rep_tab[] = {
 
 1768         return rep_tab[rep_fmt];
 
 1787         vk->DestroyImageView(
s->hwctx->act_dev, iv->
views[
i], 
s->hwctx->alloc);
 
 1794 #define REPS_FMT(fmt) \ 
 1795     [FF_VK_REP_NATIVE] = fmt ## _UINT, \ 
 1796     [FF_VK_REP_FLOAT]  = fmt ## _UNORM, \ 
 1797     [FF_VK_REP_INT]    = fmt ## _SINT, \ 
 1798     [FF_VK_REP_UINT]   = fmt ## _UINT, 
 1800 #define REPS_FMT_PACK(fmt, num) \ 
 1801     [FF_VK_REP_NATIVE] = fmt ## _UINT_PACK ## num, \ 
 1802     [FF_VK_REP_FLOAT]  = fmt ## _UNORM_PACK ## num, \ 
 1803     [FF_VK_REP_INT]    = fmt ## _SINT_PACK ## num, \ 
 1804     [FF_VK_REP_UINT]   = fmt ## _UINT_PACK ## num, 
 1810             VK_FORMAT_B5G6R5_UNORM_PACK16,
 
 1811             VK_FORMAT_B5G6R5_UNORM_PACK16,
 
 1812             VK_FORMAT_UNDEFINED,
 
 1813             VK_FORMAT_UNDEFINED,
 
 1816             VK_FORMAT_R5G6B5_UNORM_PACK16,
 
 1817             VK_FORMAT_R5G6B5_UNORM_PACK16,
 
 1818             VK_FORMAT_UNDEFINED,
 
 1819             VK_FORMAT_UNDEFINED,
 
 1830         { 
REPS_FMT(VK_FORMAT_R16G16B16A16) },
 
 1833             VK_FORMAT_R32_SFLOAT,
 
 1838             VK_FORMAT_R32G32B32_SFLOAT,
 
 1839             VK_FORMAT_R32G32B32_SFLOAT,
 
 1840             VK_FORMAT_UNDEFINED,
 
 1841             VK_FORMAT_UNDEFINED,
 
 1844             VK_FORMAT_R32G32B32A32_SFLOAT,
 
 1845             VK_FORMAT_R32G32B32A32_SFLOAT,
 
 1846             VK_FORMAT_UNDEFINED,
 
 1847             VK_FORMAT_UNDEFINED,
 
 1850             VK_FORMAT_R32G32B32_UINT,
 
 1851             VK_FORMAT_UNDEFINED,
 
 1852             VK_FORMAT_R32G32B32_SINT,
 
 1853             VK_FORMAT_R32G32B32_UINT,
 
 1856             VK_FORMAT_R32G32B32A32_UINT,
 
 1857             VK_FORMAT_UNDEFINED,
 
 1858             VK_FORMAT_R32G32B32A32_SINT,
 
 1859             VK_FORMAT_R32G32B32A32_UINT,
 
 1862 #undef REPS_FMT_PACK 
 1865     if (fmt == VK_FORMAT_UNDEFINED)
 
 1866         return VK_FORMAT_UNDEFINED;
 
 1873             return fmts_map[
i][rep_fmt];
 
 1876     return VK_FORMAT_UNDEFINED;
 
 1880                            VkImageView *img_view, VkImageAspectFlags *aspect,
 
 1891     VkImageViewUsageCreateInfo view_usage_info = {
 
 1892         .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
 
 1893         .usage = vkfc->usage &
 
 1894                  (~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
 
 1895                     VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
 
 1897     VkImageViewCreateInfo view_create_info = {
 
 1898         .sType      = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
 
 1899         .pNext      = &view_usage_info,
 
 1900         .image      = vkf->
img[
FFMIN(plane, nb_images - 1)],
 
 1901         .viewType   = VK_IMAGE_VIEW_TYPE_2D,
 
 1904         .subresourceRange = {
 
 1910     if (view_create_info.format == VK_FORMAT_UNDEFINED) {
 
 1912                                 "of format %i and mode %i\n",
 
 1913                rep_fmts[plane], rep_fmt);
 
 1917     ret = vk->CreateImageView(
s->hwctx->act_dev, &view_create_info,
 
 1918                               s->hwctx->alloc, img_view);
 
 1919     if (
ret != VK_SUCCESS) {
 
 1925     *aspect = view_create_info.subresourceRange.aspectMask;
 
 1946     const size_t buf_size = 
sizeof(*iv) + nb_planes*
sizeof(VkImageView);
 
 1951     for (
int i = 0; 
i < nb_planes; 
i++) {
 
 1952         VkImageViewUsageCreateInfo view_usage_info = {
 
 1953             .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
 
 1954             .usage = vkfc->usage &
 
 1955                      (~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
 
 1956                         VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
 
 1958         VkImageViewCreateInfo view_create_info = {
 
 1959             .sType      = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
 
 1960             .pNext      = &view_usage_info,
 
 1961             .image      = vkf->
img[
FFMIN(
i, nb_images - 1)],
 
 1962             .viewType   = VK_IMAGE_VIEW_TYPE_2D,
 
 1965             .subresourceRange = {
 
 1971         if (view_create_info.format == VK_FORMAT_UNDEFINED) {
 
 1973                                     "of format %i and mode %i\n",
 
 1974                    rep_fmts[
i], rep_fmt);
 
 1979         ret = vk->CreateImageView(
s->hwctx->act_dev, &view_create_info,
 
 1980                                   s->hwctx->alloc, &iv->views[
i]);
 
 1981         if (
ret != VK_SUCCESS) {
 
 2002     memcpy(views, iv->views, nb_planes*
sizeof(*views));
 
 2007     for (
int i = 0; 
i < iv->nb_views; 
i++)
 
 2008         vk->DestroyImageView(
s->hwctx->act_dev, iv->views[
i], 
s->hwctx->alloc);
 
 2014                          AVFrame *pic, VkImageMemoryBarrier2 *bar, 
int *nb_bar,
 
 2015                          VkPipelineStageFlags src_stage,
 
 2016                          VkPipelineStageFlags dst_stage,
 
 2017                          VkAccessFlagBits     new_access,
 
 2018                          VkImageLayout        new_layout,
 
 2031     for (
int i = 0; 
i < nb_images; 
i++) {
 
 2032         bar[*nb_bar] = (VkImageMemoryBarrier2) {
 
 2033             .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2,
 
 2035             .srcStageMask = src_stage,
 
 2036             .dstStageMask = dst_stage,
 
 2038             .dstAccessMask = new_access,
 
 2040             .newLayout = new_layout,
 
 2042             .dstQueueFamilyIndex = new_qf,
 
 2043             .image = vkf->
img[
i],
 
 2044             .subresourceRange = (VkImageSubresourceRange) {
 
 2045                 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
 
 2057                       VkPipelineStageFlags stage,
 
 2058                       const char *extensions[], 
int nb_extensions,
 
 2059                       int lg_x, 
int lg_y, 
int lg_z,
 
 2060                       uint32_t required_subgroup_size)
 
 2070     switch (shd->
stage) {
 
 2071     case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
 
 2072     case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
 
 2073     case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
 
 2074     case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
 
 2075     case VK_SHADER_STAGE_MISS_BIT_KHR:
 
 2076     case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
 
 2077         shd->
bind_point = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR;
 
 2079     case VK_SHADER_STAGE_COMPUTE_BIT:
 
 2080         shd->
bind_point = VK_PIPELINE_BIND_POINT_COMPUTE;
 
 2083         shd->
bind_point = VK_PIPELINE_BIND_POINT_GRAPHICS;
 
 2087     if (required_subgroup_size) {
 
 2088         shd->
subgroup_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO;
 
 2089         shd->
subgroup_info.requiredSubgroupSize = required_subgroup_size;
 
 2093                (stage == VK_SHADER_STAGE_TASK_BIT_EXT ||
 
 2094                 stage == VK_SHADER_STAGE_MESH_BIT_EXT) ?
 
 2096                (shd->
bind_point == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR) ?
 
 2098                (shd->
bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) ?
 
 2099                "Compute" : 
"Graphics",
 
 2105     GLSLC(0, #define IS_WITHIN(v1, v2) ((v1.x < v2.x) && (v1.y < v2.y))       );
 
 2107     GLSLC(0, #extension GL_EXT_scalar_block_layout : require                  );
 
 2108     GLSLC(0, #extension GL_EXT_shader_explicit_arithmetic_types : require     );
 
 2109     GLSLC(0, #extension GL_EXT_control_flow_attributes : require              );
 
 2110     GLSLC(0, #extension GL_EXT_shader_image_load_formatted : require          );
 
 2112         GLSLC(0, #extension GL_EXT_expect_assume : require                    );
 
 2114         GLSLC(0, #define assumeEXT(x) (x)                                     );
 
 2115         GLSLC(0, #define expectEXT(x, 
c) (x)                                  );
 
 2119         GLSLC(0, #extension GL_EXT_debug_printf : require                     );
 
 2123     if (stage == VK_SHADER_STAGE_TASK_BIT_EXT ||
 
 2124         stage == VK_SHADER_STAGE_MESH_BIT_EXT)
 
 2125         GLSLC(0, #extension GL_EXT_mesh_shader : require                      );
 
 2127     for (
int i = 0; 
i < nb_extensions; 
i++)
 
 2128         GLSLF(0, #extension %
s : %
s                  ,extensions[
i], 
"require");
 
 2131     GLSLF(0, 
layout (local_size_x = %
i, local_size_y = %
i, local_size_z = %
i) in;
 
 2141     const char *p = shd->
src.str;
 
 2142     const char *start = p;
 
 2143     const size_t len = strlen(p);
 
 2148     for (
int i = 0; 
i < 
len; 
i++) {
 
 2164     VkPipelineLayoutCreateInfo pipeline_layout_info;
 
 2167     pipeline_layout_info = (VkPipelineLayoutCreateInfo) {
 
 2168         .sType                  = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
 
 2175     ret = vk->CreatePipelineLayout(
s->hwctx->act_dev, &pipeline_layout_info,
 
 2177     if (
ret != VK_SUCCESS) {
 
 2187                                 VkShaderModule *
mod,
 
 2188                                 uint8_t *spirv, 
size_t spirv_len)
 
 2193     VkShaderModuleCreateInfo shader_module_info = {
 
 2194         .sType    = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
 
 2197         .pCode    = (
void *)spirv,
 
 2198         .codeSize = spirv_len,
 
 2201     ret = vk->CreateShaderModule(
s->hwctx->act_dev, &shader_module_info,
 
 2202                                  s->hwctx->alloc, 
mod);
 
 2203     if (
ret != VK_SUCCESS) {
 
 2213                                  VkShaderModule 
mod, 
const char *entrypoint)
 
 2218     VkComputePipelineCreateInfo pipeline_create_info = {
 
 2219         .sType  = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
 
 2221                  VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT : 0x0,
 
 2223         .stage = (VkPipelineShaderStageCreateInfo) {
 
 2224             .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
 
 2227             .pName = entrypoint,
 
 2229                      VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT : 0x0,
 
 2230             .stage = shd->
stage,
 
 2235     ret = vk->CreateComputePipelines(
s->hwctx->act_dev, VK_NULL_HANDLE, 1,
 
 2236                                      &pipeline_create_info,
 
 2238     if (
ret != VK_SUCCESS) {
 
 2248                                 uint8_t *spirv, 
size_t spirv_len,
 
 2249                                 const char *entrypoint)
 
 2253     size_t shader_size = 0;
 
 2255     VkShaderCreateInfoEXT shader_obj_create = {
 
 2256         .sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT,
 
 2258                  VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT : 0x0,
 
 2259         .stage = shd->
stage,
 
 2261         .codeType = VK_SHADER_CODE_TYPE_SPIRV_EXT,
 
 2263         .codeSize = spirv_len,
 
 2264         .pName = entrypoint,
 
 2269         .pSpecializationInfo = 
NULL,
 
 2272     ret = vk->CreateShadersEXT(
s->hwctx->act_dev, 1, &shader_obj_create,
 
 2273                                s->hwctx->alloc, &shd->
object);
 
 2274     if (
ret != VK_SUCCESS) {
 
 2280     if (vk->GetShaderBinaryDataEXT(
s->hwctx->act_dev, shd->
object,
 
 2281                                    &shader_size, 
NULL) == VK_SUCCESS)
 
 2283                shd->
name, shader_size, spirv_len);
 
 2299         int has_singular = 0;
 
 2300         int max_descriptors = 0;
 
 2307                         (max_descriptors <= s->push_desc_props.maxPushDescriptors) &&
 
 2309                         (has_singular == 0);
 
 2314         VkDescriptorSetLayoutCreateInfo desc_layout_create = {
 
 2315             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
 
 2316             .bindingCount = 
set->nb_bindings,
 
 2317             .pBindings = 
set->binding,
 
 2319                      VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT :
 
 2321                      VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR :
 
 2325         ret = vk->CreateDescriptorSetLayout(
s->hwctx->act_dev,
 
 2326                                             &desc_layout_create,
 
 2329         if (
ret != VK_SUCCESS) {
 
 2336             vk->GetDescriptorSetLayoutSizeEXT(
s->hwctx->act_dev, shd->
desc_layout[
i],
 
 2340                                         s->desc_buf_props.descriptorBufferOffsetAlignment);
 
 2342             for (
int j = 0; j < 
set->nb_bindings; j++)
 
 2343                 vk->GetDescriptorSetLayoutBindingOffsetEXT(
s->hwctx->act_dev,
 
 2346                                                            &
set->binding_offset[j]);
 
 2354                       uint8_t *spirv, 
size_t spirv_len,
 
 2355                       const char *entrypoint)
 
 2389         case VK_PIPELINE_BIND_POINT_COMPUTE:
 
 2399         vk->DestroyShaderModule(
s->hwctx->act_dev, 
mod, 
s->hwctx->alloc);
 
 2415     [VK_DESCRIPTOR_TYPE_SAMPLER]                = { 
sizeof(VkDescriptorImageInfo),  
"sampler",       1, 0, 0, 0, },
 
 2416     [VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE]          = { 
sizeof(VkDescriptorImageInfo),  
"texture",       1, 0, 1, 0, },
 
 2417     [VK_DESCRIPTOR_TYPE_STORAGE_IMAGE]          = { 
sizeof(VkDescriptorImageInfo),  
"image",         1, 1, 1, 0, },
 
 2418     [VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT]       = { 
sizeof(VkDescriptorImageInfo),  
"subpassInput",  1, 0, 0, 0, },
 
 2419     [VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] = { 
sizeof(VkDescriptorImageInfo),  
"sampler",       1, 0, 1, 0, },
 
 2420     [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER]         = { 
sizeof(VkDescriptorBufferInfo),  
NULL,           1, 0, 0, 1, },
 
 2421     [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER]         = { 
sizeof(VkDescriptorBufferInfo), 
"buffer",        0, 1, 0, 1, },
 
 2422     [VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] = { 
sizeof(VkDescriptorBufferInfo),  
NULL,           1, 0, 0, 1, },
 
 2423     [VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] = { 
sizeof(VkDescriptorBufferInfo), 
"buffer",        0, 1, 0, 1, },
 
 2424     [VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER]   = { 
sizeof(VkBufferView),           
"samplerBuffer", 1, 0, 0, 0, },
 
 2425     [VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER]   = { 
sizeof(VkBufferView),           
"imageBuffer",   1, 0, 0, 0, },
 
 2430                                     int singular, 
int print_to_shader_only)
 
 2432     int has_sampler = 0;
 
 2435     if (print_to_shader_only)
 
 2447     memset(
set, 0, 
sizeof(*
set));
 
 2454     if (!
set->binding_offset) {
 
 2459     for (
int i = 0; 
i < nb; 
i++) {
 
 2460         set->binding[
i].binding            = 
i;
 
 2461         set->binding[
i].descriptorType     = 
desc[
i].type;
 
 2463         set->binding[
i].stageFlags         = 
desc[
i].stages;
 
 2464         set->binding[
i].pImmutableSamplers = 
desc[
i].samplers;
 
 2466         if (
desc[
i].
type == VK_DESCRIPTOR_TYPE_SAMPLER ||
 
 2467             desc[
i].
type == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
 
 2471     set->usage = VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT |
 
 2472                  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT;
 
 2474         set->usage |= VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT;
 
 2477         for (
int i = 0; 
i < nb; 
i++) {
 
 2479             VkDescriptorPoolSize *desc_pool_size;
 
 2485                                                   sizeof(*desc_pool_size),
 
 2487                 if (!desc_pool_size)
 
 2492                 memset(&desc_pool_size[j], 0, 
sizeof(VkDescriptorPoolSize));
 
 2499     set->singular = singular;
 
 2500     set->nb_bindings = nb;
 
 2505     for (
int i = 0; 
i < nb; 
i++) {
 
 2509         if (
desc[
i].mem_layout &&
 
 2510             (
desc[
i].
type != VK_DESCRIPTOR_TYPE_STORAGE_IMAGE))
 
 2523             if (
desc[
i].
type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) {
 
 2524                 if (
desc[
i].mem_layout) {
 
 2525                     int len = strlen(
desc[
i].mem_layout);
 
 2526                     if (
desc[
i].mem_layout[
len - 1] == 
'i' &&
 
 2527                         desc[
i].mem_layout[
len - 2] == 
'u') {
 
 2529                     } 
else if (
desc[
i].mem_layout[
len - 1] == 
'i') {
 
 2544             if (
desc[
i].buf_elems) {
 
 2551         } 
else if (
desc[
i].elems > 0) {
 
 2580     memset(sd, 0, 
sizeof(*sd));
 
 2600                                    set->aligned_size*nb,
 
 2602                                    VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT |
 
 2603                                    VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
 
 2604                                    VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
 
 2612             sd->
desc_bind[
i] = (VkDescriptorBufferBindingInfoEXT) {
 
 2613                 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT,
 
 2614                 .usage = 
set->usage,
 
 2621         VkDescriptorSetLayout *tmp_layouts;
 
 2622         VkDescriptorSetAllocateInfo set_alloc_info;
 
 2623         VkDescriptorPoolCreateInfo pool_create_info;
 
 2628         pool_create_info = (VkDescriptorPoolCreateInfo) {
 
 2629             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO,
 
 2636         ret = vk->CreateDescriptorPool(
s->hwctx->act_dev, &pool_create_info,
 
 2638         if (
ret != VK_SUCCESS) {
 
 2644         tmp_layouts = 
av_malloc_array(pool_create_info.maxSets, 
sizeof(*tmp_layouts));
 
 2653         set_alloc_info = (VkDescriptorSetAllocateInfo) {
 
 2654             .sType              = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO,
 
 2656             .pSetLayouts        = tmp_layouts,
 
 2657             .descriptorSetCount = pool_create_info.maxSets,
 
 2661                                         sizeof(*tmp_layouts));
 
 2666         ret = vk->AllocateDescriptorSets(
s->hwctx->act_dev, &set_alloc_info,
 
 2669         if (
ret != VK_SUCCESS) {
 
 2691                                          int bind_idx, 
int array_idx,
 
 2692                                          VkDescriptorGetInfoEXT *desc_get_info,
 
 2703                  array_idx*desc_size;                 
 
 2705     vk->GetDescriptorEXT(
s->hwctx->act_dev, desc_get_info, desc_size, 
desc);
 
 2710                                          VkWriteDescriptorSet *write_info)
 
 2719             vk->UpdateDescriptorSets(
s->hwctx->act_dev, 1, write_info, 0, 
NULL);
 
 2723             vk->CmdPushDescriptorSetKHR(e->
buf,
 
 2730             vk->UpdateDescriptorSets(
s->hwctx->act_dev, 1, write_info, 0, 
NULL);
 
 2737                             VkImageView view, VkImageLayout 
layout,
 
 2743         VkDescriptorGetInfoEXT desc_get_info = {
 
 2744             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT,
 
 2745             .type = desc_set->
binding[bind].descriptorType,
 
 2747         VkDescriptorImageInfo desc_img_info = {
 
 2754         switch (desc_get_info.type) {
 
 2755         case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
 
 2756             desc_get_info.
data.pSampledImage = &desc_img_info;
 
 2757             desc_size = 
s->desc_buf_props.sampledImageDescriptorSize;
 
 2759         case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
 
 2760             desc_get_info.data.pStorageImage = &desc_img_info;
 
 2761             desc_size = 
s->desc_buf_props.storageImageDescriptorSize;
 
 2763         case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
 
 2764             desc_get_info.data.pInputAttachmentImage = &desc_img_info;
 
 2765             desc_size = 
s->desc_buf_props.inputAttachmentDescriptorSize;
 
 2767         case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
 
 2768             desc_get_info.data.pCombinedImageSampler = &desc_img_info;
 
 2769             desc_size = 
s->desc_buf_props.combinedImageSamplerDescriptorSize;
 
 2773                    set, bind, desc_get_info.type);
 
 2779                               &desc_get_info, desc_size);
 
 2781         VkDescriptorImageInfo desc_pool_write_info_img = {
 
 2786         VkWriteDescriptorSet desc_pool_write_info = {
 
 2787             .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
 
 2789             .descriptorCount = 1,
 
 2790             .dstArrayElement = offs,
 
 2791             .descriptorType = desc_set->
binding[bind].descriptorType,
 
 2792             .pImageInfo = &desc_pool_write_info_img,
 
 2802                                    VkImageView *views, 
int set, 
int binding,
 
 2803                                    VkImageLayout 
layout, VkSampler sampler)
 
 2808     for (
int i = 0; 
i < nb_planes; 
i++)
 
 2815                                     int set, 
int bind, 
int elem,
 
 2822         VkDescriptorGetInfoEXT desc_get_info = {
 
 2823             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT,
 
 2824             .type = desc_set->
binding[bind].descriptorType,
 
 2826         VkDescriptorAddressInfoEXT desc_buf_info = {
 
 2827             .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
 
 2834         switch (desc_get_info.type) {
 
 2835         case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
 
 2836             desc_get_info.data.pUniformBuffer = &desc_buf_info;
 
 2837             desc_size = 
s->desc_buf_props.uniformBufferDescriptorSize;
 
 2839         case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
 
 2840             desc_get_info.data.pStorageBuffer = &desc_buf_info;
 
 2841             desc_size = 
s->desc_buf_props.storageBufferDescriptorSize;
 
 2843         case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
 
 2844             desc_get_info.data.pUniformTexelBuffer = &desc_buf_info;
 
 2845             desc_size = 
s->desc_buf_props.uniformTexelBufferDescriptorSize;
 
 2847         case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
 
 2848             desc_get_info.data.pStorageTexelBuffer = &desc_buf_info;
 
 2849             desc_size = 
s->desc_buf_props.storageTexelBufferDescriptorSize;
 
 2853                    set, bind, desc_get_info.type);
 
 2860         VkDescriptorBufferInfo desc_pool_write_info_buf = {
 
 2865         VkWriteDescriptorSet desc_pool_write_info = {
 
 2866             .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
 
 2868             .descriptorCount = 1,
 
 2869             .dstArrayElement = elem,
 
 2870             .descriptorType = desc_set->
binding[bind].descriptorType,
 
 2871             .pBufferInfo = &desc_pool_write_info_buf,
 
 2881                                     VkShaderStageFlagBits stage,
 
 2897         VkShaderStageFlagBits stages = shd->
stage;
 
 2898         vk->CmdBindShadersEXT(e->
buf, 1, &stages, &shd->
object);
 
 2930     if (shd->shader.module)
 
 2931         vk->DestroyShaderModule(
s->hwctx->act_dev, shd->shader.module,
 
 2936         vk->DestroyShaderEXT(
s->hwctx->act_dev, shd->
object, 
s->hwctx->alloc);
 
 2938         vk->DestroyPipeline(
s->hwctx->act_dev, shd->
pipeline, 
s->hwctx->alloc);
 
 2952                 vk->DestroyDescriptorSetLayout(
s->hwctx->act_dev, shd->
desc_layout[
i],
 
 2981     static const AVClass vulkan_context_class = {
 
 2987     memset(
s, 0, 
sizeof(*
s));
 
 2988     s->log_parent = log_parent;
 
 2989     s->class      = &vulkan_context_class;
 
 2997         s->hwfc = 
s->frames->hwctx;
 
 2999         device_ref = 
s->frames->device_ref;
 
 3003     if (!
s->device_ref) {
 
 3009     s->hwctx = 
s->device->hwctx;
 
 3012                                              s->hwctx->nb_enabled_dev_extensions);
 
 3014                                               s->hwctx->nb_enabled_inst_extensions);