Lines Matching +full:vulkan +full:- +full:device +full:- +full:select +full:- +full:layer
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
41 #include "vulkan.h"
80 /* Vulkan library and loader functions */
151 list[count - 1] = av_strdup(val); \
152 if (!list[count - 1]) { \
225 /* Lower priority as there's an endianess-dependent overlap between these
250 if (in->sType == stype) in vk_find_struct()
253 in = in->pNext; in vk_find_struct()
265 while (out->pNext) in vk_link_struct()
266 out = out->pNext; in vk_link_struct()
268 out->pNext = in; in vk_link_struct()
274 AVVulkanDeviceContext *hwctx = dev_ctx->hwctx; in pixfmt_is_supported()
275 VulkanDevicePriv *priv = dev_ctx->internal->priv; in pixfmt_is_supported()
276 FFVulkanFunctions *vk = &priv->vkfn; in pixfmt_is_supported()
288 vk->GetPhysicalDeviceFormatProperties2(hwctx->phys_dev, fmt[i], &prop); in pixfmt_is_supported()
300 AVVulkanDeviceContext *hwctx = ctx->hwctx; in load_libvulkan()
301 VulkanDevicePriv *p = ctx->internal->priv; in load_libvulkan()
305 "vulkan-1.dll", in load_libvulkan()
317 p->libvulkan = dlopen(lib_names[i], RTLD_NOW | RTLD_LOCAL); in load_libvulkan()
318 if (p->libvulkan) in load_libvulkan()
322 if (!p->libvulkan) { in load_libvulkan()
327 hwctx->get_proc_addr = (PFN_vkGetInstanceProcAddr)dlsym(p->libvulkan, "vkGetInstanceProcAddr"); in load_libvulkan()
416 av_log(ctx, l, "%s\n", data->pMessage); in vk_dbg_callback()
417 for (int i = 0; i < data->cmdBufLabelCount; i++) in vk_dbg_callback()
418 av_log(ctx, l, "\t%i: %s\n", i, data->pCmdBufLabels[i].pLabelName); in vk_dbg_callback()
428 VulkanDevicePriv *p = ctx->internal->priv; in check_extensions()
429 FFVulkanFunctions *vk = &p->vkfn; in check_extensions()
430 AVVulkanDeviceContext *hwctx = ctx->hwctx; in check_extensions()
447 user_exts_str = av_strdup(user_exts->value); in check_extensions()
453 vk->EnumerateInstanceExtensionProperties(NULL, &sup_ext_count, NULL); in check_extensions()
457 vk->EnumerateInstanceExtensionProperties(NULL, &sup_ext_count, sup_ext); in check_extensions()
459 mod = "device"; in check_extensions()
464 user_exts_str = av_strdup(user_exts->value); in check_extensions()
470 vk->EnumerateDeviceExtensionProperties(hwctx->phys_dev, NULL, in check_extensions()
475 vk->EnumerateDeviceExtensionProperties(hwctx->phys_dev, NULL, in check_extensions()
492 p->extensions |= optional_exts[i].flag; in check_extensions()
508 p->extensions |= FF_VK_EXT_DEBUG_UTILS; in check_extensions()
559 VulkanDevicePriv *priv = ctx->internal->priv; in check_validation_layers()
560 FFVulkanFunctions *vk = &priv->vkfn; in check_validation_layers()
573 int debug = debug_opt && strtol(debug_opt->value, NULL, 10); in check_validation_layers()
579 vk->EnumerateInstanceLayerProperties(&sup_layer_count, NULL); in check_validation_layers()
583 vk->EnumerateInstanceLayerProperties(&sup_layer_count, sup_layers); in check_validation_layers()
589 /* If `debug=1` is specified, enable the standard validation layer extension */ in check_validation_layers()
595 av_log(ctx, AV_LOG_VERBOSE, "Default validation layer %s is enabled\n", in check_validation_layers()
607 user_layers_str = av_strdup(user_layers->value); in check_validation_layers()
633 av_log(ctx, AV_LOG_VERBOSE, "Requested Validation Layer: %s\n", token); in check_validation_layers()
637 "Validation Layer \"%s\" not support.\n", token); in check_validation_layers()
666 VulkanDevicePriv *p = ctx->internal->priv; in create_instance()
667 FFVulkanFunctions *vk = &p->vkfn; in create_instance()
668 AVVulkanDeviceContext *hwctx = ctx->hwctx; in create_instance()
682 if (!hwctx->get_proc_addr) { in create_instance()
688 err = ff_vk_load_functions(ctx, vk, p->extensions, 0, 0); in create_instance()
702 hwctx->enabled_inst_extensions = inst_props.ppEnabledExtensionNames; in create_instance()
703 hwctx->nb_enabled_inst_extensions = inst_props.enabledExtensionCount; in create_instance()
708 ret = vk->CreateInstance(&inst_props, hwctx->alloc, &hwctx->inst); in create_instance()
718 err = ff_vk_load_functions(ctx, vk, p->extensions, 1, 0); in create_instance()
738 vk->CreateDebugUtilsMessengerEXT(hwctx->inst, &dbg, in create_instance()
739 hwctx->alloc, &p->debug_ctx); in create_instance()
769 /* Finds a device */
770 static int find_device(AVHWDeviceContext *ctx, VulkanDeviceSelection *select) in find_device() argument
772 int err = 0, choice = -1; in find_device()
775 VulkanDevicePriv *p = ctx->internal->priv; in find_device()
776 FFVulkanFunctions *vk = &p->vkfn; in find_device()
780 AVVulkanDeviceContext *hwctx = ctx->hwctx; in find_device()
782 ret = vk->EnumeratePhysicalDevices(hwctx->inst, &num, NULL); in find_device()
792 ret = vk->EnumeratePhysicalDevices(hwctx->inst, &num, devices); in find_device()
818 vk->GetPhysicalDeviceProperties2(devices[i], &prop[i]); in find_device()
825 if (select->has_uuid) { in find_device()
827 if (!strncmp(idp[i].deviceUUID, select->uuid, VK_UUID_SIZE)) { in find_device()
832 av_log(ctx, AV_LOG_ERROR, "Unable to find device by given UUID!\n"); in find_device()
835 } else if (select->name) { in find_device()
836 av_log(ctx, AV_LOG_VERBOSE, "Requested device: %s\n", select->name); in find_device()
838 if (strstr(prop[i].properties.deviceName, select->name)) { in find_device()
843 av_log(ctx, AV_LOG_ERROR, "Unable to find device \"%s\"!\n", in find_device()
844 select->name); in find_device()
847 } else if (select->pci_device) { in find_device()
848 av_log(ctx, AV_LOG_VERBOSE, "Requested device: 0x%x\n", select->pci_device); in find_device()
850 if (select->pci_device == prop[i].properties.deviceID) { in find_device()
855 av_log(ctx, AV_LOG_ERROR, "Unable to find device with PCI ID 0x%x!\n", in find_device()
856 select->pci_device); in find_device()
859 } else if (select->vendor_id) { in find_device()
860 av_log(ctx, AV_LOG_VERBOSE, "Requested vendor: 0x%x\n", select->vendor_id); in find_device()
862 if (select->vendor_id == prop[i].properties.vendorID) { in find_device()
867 av_log(ctx, AV_LOG_ERROR, "Unable to find device with Vendor ID 0x%x!\n", in find_device()
868 select->vendor_id); in find_device()
872 if (select->index < num) { in find_device()
873 choice = select->index; in find_device()
876 av_log(ctx, AV_LOG_ERROR, "Unable to find device with index %i!\n", in find_device()
877 select->index); in find_device()
883 if (choice > -1) { in find_device()
884 av_log(ctx, AV_LOG_VERBOSE, "Device %d selected: %s (%s) (0x%x)\n", in find_device()
888 hwctx->phys_dev = devices[choice]; in find_device()
898 /* Picks the least used qf with the fewest unneeded flags, or -1 if none found */
902 int index = -1; in pick_queue_family()
916 if (index > -1) in pick_queue_family()
927 VulkanDevicePriv *p = ctx->internal->priv; in setup_queue_families()
928 FFVulkanFunctions *vk = &p->vkfn; in setup_queue_families()
929 AVVulkanDeviceContext *hwctx = ctx->hwctx; in setup_queue_families()
933 vk->GetPhysicalDeviceQueueFamilyProperties(hwctx->phys_dev, &num, NULL); in setup_queue_families()
945 vk->GetPhysicalDeviceQueueFamilyProperties(hwctx->phys_dev, &num, qf); in setup_queue_families()
978 hwctx->queue_family_index = -1; in setup_queue_families()
979 hwctx->queue_family_comp_index = -1; in setup_queue_families()
980 hwctx->queue_family_tx_index = -1; in setup_queue_families()
981 hwctx->queue_family_encode_index = -1; in setup_queue_families()
982 hwctx->queue_family_decode_index = -1; in setup_queue_families()
985 if (qf_idx > -1) { \ in setup_queue_families()
991 hwctx->queue_family_index = fidx; \ in setup_queue_families()
992 hwctx->nb_graphics_queues = qc; \ in setup_queue_families()
993 graph_index = -1; \ in setup_queue_families()
996 hwctx->queue_family_comp_index = fidx; \ in setup_queue_families()
997 hwctx->nb_comp_queues = qc; \ in setup_queue_families()
998 comp_index = -1; \ in setup_queue_families()
1001 hwctx->queue_family_tx_index = fidx; \ in setup_queue_families()
1002 hwctx->nb_tx_queues = qc; \ in setup_queue_families()
1003 tx_index = -1; \ in setup_queue_families()
1006 hwctx->queue_family_encode_index = fidx; \ in setup_queue_families()
1007 hwctx->nb_encode_queues = qc; \ in setup_queue_families()
1008 enc_index = -1; \ in setup_queue_families()
1011 hwctx->queue_family_decode_index = fidx; \ in setup_queue_families()
1012 hwctx->nb_decode_queues = qc; \ in setup_queue_families()
1013 dec_index = -1; \ in setup_queue_families()
1016 pc = av_realloc((void *)cd->pQueueCreateInfos, \ in setup_queue_families()
1017 sizeof(*pc) * (cd->queueCreateInfoCount + 1)); \ in setup_queue_families()
1022 cd->pQueueCreateInfos = pc; \ in setup_queue_families()
1023 pc = &pc[cd->queueCreateInfoCount]; \ in setup_queue_families()
1032 pc->sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; \ in setup_queue_families()
1033 pc->queueFamilyIndex = fidx; \ in setup_queue_families()
1034 pc->queueCount = qc; \ in setup_queue_families()
1035 pc->pQueuePriorities = weights; \ in setup_queue_families()
1040 cd->queueCreateInfoCount++; \ in setup_queue_families()
1060 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in create_exec_ctx()
1061 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in create_exec_ctx()
1062 FFVulkanFunctions *vk = &p->vkfn; in create_exec_ctx()
1075 cmd->nb_queues = num_queues; in create_exec_ctx()
1078 ret = vk->CreateCommandPool(hwctx->act_dev, &cqueue_create, in create_exec_ctx()
1079 hwctx->alloc, &cmd->pool); in create_exec_ctx()
1086 cmd->bufs = av_mallocz(num_queues * sizeof(*cmd->bufs)); in create_exec_ctx()
1087 if (!cmd->bufs) in create_exec_ctx()
1090 cbuf_create.commandPool = cmd->pool; in create_exec_ctx()
1093 ret = vk->AllocateCommandBuffers(hwctx->act_dev, &cbuf_create, cmd->bufs); in create_exec_ctx()
1097 av_freep(&cmd->bufs); in create_exec_ctx()
1101 cmd->queues = av_mallocz(num_queues * sizeof(*cmd->queues)); in create_exec_ctx()
1102 if (!cmd->queues) in create_exec_ctx()
1106 VulkanQueueCtx *q = &cmd->queues[i]; in create_exec_ctx()
1107 vk->GetDeviceQueue(hwctx->act_dev, queue_family_index, i, &q->queue); in create_exec_ctx()
1108 q->was_synchronous = 1; in create_exec_ctx()
1116 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in free_exec_ctx()
1117 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in free_exec_ctx()
1118 FFVulkanFunctions *vk = &p->vkfn; in free_exec_ctx()
1120 if (cmd->queues) { in free_exec_ctx()
1121 for (int i = 0; i < cmd->nb_queues; i++) { in free_exec_ctx()
1122 VulkanQueueCtx *q = &cmd->queues[i]; in free_exec_ctx()
1125 if (q->fence && !q->was_synchronous) { in free_exec_ctx()
1126 vk->WaitForFences(hwctx->act_dev, 1, &q->fence, VK_TRUE, UINT64_MAX); in free_exec_ctx()
1127 vk->ResetFences(hwctx->act_dev, 1, &q->fence); in free_exec_ctx()
1131 if (q->fence) in free_exec_ctx()
1132 vk->DestroyFence(hwctx->act_dev, q->fence, hwctx->alloc); in free_exec_ctx()
1135 for (int j = 0; j < q->nb_buf_deps; j++) in free_exec_ctx()
1136 av_buffer_unref(&q->buf_deps[j]); in free_exec_ctx()
1137 av_free(q->buf_deps); in free_exec_ctx()
1141 if (cmd->bufs) in free_exec_ctx()
1142 vk->FreeCommandBuffers(hwctx->act_dev, cmd->pool, cmd->nb_queues, cmd->bufs); in free_exec_ctx()
1143 if (cmd->pool) in free_exec_ctx()
1144 vk->DestroyCommandPool(hwctx->act_dev, cmd->pool, hwctx->alloc); in free_exec_ctx()
1146 av_freep(&cmd->queues); in free_exec_ctx()
1147 av_freep(&cmd->bufs); in free_exec_ctx()
1148 cmd->pool = VK_NULL_HANDLE; in free_exec_ctx()
1153 return cmd->bufs[cmd->cur_queue_idx]; in get_buf_exec_ctx()
1158 VulkanQueueCtx *q = &cmd->queues[cmd->cur_queue_idx]; in unref_exec_ctx_deps()
1160 for (int j = 0; j < q->nb_buf_deps; j++) in unref_exec_ctx_deps()
1161 av_buffer_unref(&q->buf_deps[j]); in unref_exec_ctx_deps()
1162 q->nb_buf_deps = 0; in unref_exec_ctx_deps()
1168 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in wait_start_exec_ctx()
1169 VulkanQueueCtx *q = &cmd->queues[cmd->cur_queue_idx]; in wait_start_exec_ctx()
1170 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in wait_start_exec_ctx()
1171 FFVulkanFunctions *vk = &p->vkfn; in wait_start_exec_ctx()
1179 if (!q->fence) { in wait_start_exec_ctx()
1183 ret = vk->CreateFence(hwctx->act_dev, &fence_spawn, hwctx->alloc, in wait_start_exec_ctx()
1184 &q->fence); in wait_start_exec_ctx()
1190 } else if (!q->was_synchronous) { in wait_start_exec_ctx()
1191 vk->WaitForFences(hwctx->act_dev, 1, &q->fence, VK_TRUE, UINT64_MAX); in wait_start_exec_ctx()
1192 vk->ResetFences(hwctx->act_dev, 1, &q->fence); in wait_start_exec_ctx()
1198 ret = vk->BeginCommandBuffer(cmd->bufs[cmd->cur_queue_idx], &cmd_start); in wait_start_exec_ctx()
1212 VulkanQueueCtx *q = &cmd->queues[cmd->cur_queue_idx]; in add_buf_dep_exec_ctx()
1217 dst = av_fast_realloc(q->buf_deps, &q->buf_deps_alloc_size, in add_buf_dep_exec_ctx()
1218 (q->nb_buf_deps + nb_deps) * sizeof(*dst)); in add_buf_dep_exec_ctx()
1222 q->buf_deps = dst; in add_buf_dep_exec_ctx()
1225 q->buf_deps[q->nb_buf_deps] = av_buffer_ref(deps[i]); in add_buf_dep_exec_ctx()
1226 if (!q->buf_deps[q->nb_buf_deps]) in add_buf_dep_exec_ctx()
1228 q->nb_buf_deps++; in add_buf_dep_exec_ctx()
1242 VulkanQueueCtx *q = &cmd->queues[cmd->cur_queue_idx]; in submit_exec_ctx()
1243 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in submit_exec_ctx()
1244 FFVulkanFunctions *vk = &p->vkfn; in submit_exec_ctx()
1246 ret = vk->EndCommandBuffer(cmd->bufs[cmd->cur_queue_idx]); in submit_exec_ctx()
1254 s_info->pCommandBuffers = &cmd->bufs[cmd->cur_queue_idx]; in submit_exec_ctx()
1255 s_info->commandBufferCount = 1; in submit_exec_ctx()
1257 ret = vk->QueueSubmit(q->queue, 1, s_info, q->fence); in submit_exec_ctx()
1266 for (int i = 0; i < s_info->signalSemaphoreCount; i++) in submit_exec_ctx()
1267 f->sem_value[i]++; in submit_exec_ctx()
1269 q->was_synchronous = synchronous; in submit_exec_ctx()
1272 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in submit_exec_ctx()
1273 vk->WaitForFences(hwctx->act_dev, 1, &q->fence, VK_TRUE, UINT64_MAX); in submit_exec_ctx()
1274 vk->ResetFences(hwctx->act_dev, 1, &q->fence); in submit_exec_ctx()
1277 cmd->cur_queue_idx = (cmd->cur_queue_idx + 1) % cmd->nb_queues; in submit_exec_ctx()
1285 VulkanDevicePriv *p = ctx->internal->priv; in vulkan_device_free()
1286 FFVulkanFunctions *vk = &p->vkfn; in vulkan_device_free()
1287 AVVulkanDeviceContext *hwctx = ctx->hwctx; in vulkan_device_free()
1289 if (hwctx->act_dev) in vulkan_device_free()
1290 vk->DestroyDevice(hwctx->act_dev, hwctx->alloc); in vulkan_device_free()
1292 if (p->debug_ctx) in vulkan_device_free()
1293 vk->DestroyDebugUtilsMessengerEXT(hwctx->inst, p->debug_ctx, in vulkan_device_free()
1294 hwctx->alloc); in vulkan_device_free()
1296 if (hwctx->inst) in vulkan_device_free()
1297 vk->DestroyInstance(hwctx->inst, hwctx->alloc); in vulkan_device_free()
1299 if (p->libvulkan) in vulkan_device_free()
1300 dlclose(p->libvulkan); in vulkan_device_free()
1302 RELEASE_PROPS(hwctx->enabled_inst_extensions, hwctx->nb_enabled_inst_extensions); in vulkan_device_free()
1303 RELEASE_PROPS(hwctx->enabled_dev_extensions, hwctx->nb_enabled_dev_extensions); in vulkan_device_free()
1313 VulkanDevicePriv *p = ctx->internal->priv; in vulkan_device_create_internal()
1314 FFVulkanFunctions *vk = &p->vkfn; in vulkan_device_create_internal()
1315 AVVulkanDeviceContext *hwctx = ctx->hwctx; in vulkan_device_create_internal()
1340 .pNext = &hwctx->device_features, in vulkan_device_create_internal()
1343 hwctx->device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; in vulkan_device_create_internal()
1344 hwctx->device_features.pNext = &p->device_features_1_1; in vulkan_device_create_internal()
1345 p->device_features_1_1.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES; in vulkan_device_create_internal()
1346 p->device_features_1_1.pNext = &p->device_features_1_2; in vulkan_device_create_internal()
1347 p->device_features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES; in vulkan_device_create_internal()
1348 ctx->free = vulkan_device_free; in vulkan_device_create_internal()
1354 /* Find a device (if not given one) */ in vulkan_device_create_internal()
1358 vk->GetPhysicalDeviceFeatures2(hwctx->phys_dev, &dev_features); in vulkan_device_create_internal()
1362 COPY_FEATURE(hwctx->device_features, shaderImageGatherExtended) in vulkan_device_create_internal()
1363 COPY_FEATURE(hwctx->device_features, shaderStorageImageReadWithoutFormat) in vulkan_device_create_internal()
1364 COPY_FEATURE(hwctx->device_features, shaderStorageImageWriteWithoutFormat) in vulkan_device_create_internal()
1365 COPY_FEATURE(hwctx->device_features, fragmentStoresAndAtomics) in vulkan_device_create_internal()
1366 COPY_FEATURE(hwctx->device_features, vertexPipelineStoresAndAtomics) in vulkan_device_create_internal()
1367 COPY_FEATURE(hwctx->device_features, shaderInt64) in vulkan_device_create_internal()
1372 av_log(ctx, AV_LOG_ERROR, "Device does not support timeline semaphores!\n"); in vulkan_device_create_internal()
1376 p->device_features_1_2.timelineSemaphore = 1; in vulkan_device_create_internal()
1390 ret = vk->CreateDevice(hwctx->phys_dev, &dev_info, hwctx->alloc, in vulkan_device_create_internal()
1391 &hwctx->act_dev); in vulkan_device_create_internal()
1398 av_log(ctx, AV_LOG_ERROR, "Device creation failure: %s\n", in vulkan_device_create_internal()
1410 p->use_linear_images = strtol(opt_d->value, NULL, 10); in vulkan_device_create_internal()
1414 p->contiguous_planes = strtol(opt_d->value, NULL, 10); in vulkan_device_create_internal()
1416 p->contiguous_planes = -1; in vulkan_device_create_internal()
1418 hwctx->enabled_dev_extensions = dev_info.ppEnabledExtensionNames; in vulkan_device_create_internal()
1419 hwctx->nb_enabled_dev_extensions = dev_info.enabledExtensionCount; in vulkan_device_create_internal()
1429 AVVulkanDeviceContext *hwctx = ctx->hwctx; in vulkan_device_init()
1430 VulkanDevicePriv *p = ctx->internal->priv; in vulkan_device_init()
1431 FFVulkanFunctions *vk = &p->vkfn; in vulkan_device_init()
1434 /* Set device extension flags */ in vulkan_device_init()
1435 for (int i = 0; i < hwctx->nb_enabled_dev_extensions; i++) { in vulkan_device_init()
1437 if (!strcmp(hwctx->enabled_dev_extensions[i], in vulkan_device_init()
1439 p->extensions |= optional_device_exts[j].flag; in vulkan_device_init()
1445 err = ff_vk_load_functions(ctx, vk, p->extensions, 1, 1); in vulkan_device_init()
1451 p->props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; in vulkan_device_init()
1452 p->props.pNext = &p->hprops; in vulkan_device_init()
1453 p->hprops.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT; in vulkan_device_init()
1455 vk->GetPhysicalDeviceProperties2(hwctx->phys_dev, &p->props); in vulkan_device_init()
1456 av_log(ctx, AV_LOG_VERBOSE, "Using device: %s\n", in vulkan_device_init()
1457 p->props.properties.deviceName); in vulkan_device_init()
1460 p->props.properties.limits.optimalBufferCopyRowPitchAlignment); in vulkan_device_init()
1462 p->props.properties.limits.minMemoryMapAlignment); in vulkan_device_init()
1463 if (p->extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY) in vulkan_device_init()
1465 p->hprops.minImportedHostPointerAlignment); in vulkan_device_init()
1467 p->dev_is_nvidia = (p->props.properties.vendorID == 0x10de); in vulkan_device_init()
1468 p->dev_is_intel = (p->props.properties.vendorID == 0x8086); in vulkan_device_init()
1470 vk->GetPhysicalDeviceQueueFamilyProperties(hwctx->phys_dev, &queue_num, NULL); in vulkan_device_init()
1476 graph_index = hwctx->queue_family_index; in vulkan_device_init()
1477 comp_index = hwctx->queue_family_comp_index; in vulkan_device_init()
1478 tx_index = hwctx->queue_family_tx_index; in vulkan_device_init()
1479 enc_index = hwctx->queue_family_encode_index; in vulkan_device_init()
1480 dec_index = hwctx->queue_family_decode_index; in vulkan_device_init()
1491 av_log(ctx, AV_LOG_ERROR, "Invalid %s family index %i (device has %i families)!\n", \ in vulkan_device_init()
1504 graph_index = (ctx_qf == graph_index) ? -1 : graph_index; \ in vulkan_device_init()
1505 comp_index = (ctx_qf == comp_index) ? -1 : comp_index; \ in vulkan_device_init()
1506 tx_index = (ctx_qf == tx_index) ? -1 : tx_index; \ in vulkan_device_init()
1507 enc_index = (ctx_qf == enc_index) ? -1 : enc_index; \ in vulkan_device_init()
1508 dec_index = (ctx_qf == dec_index) ? -1 : dec_index; \ in vulkan_device_init()
1509 p->qfs[p->num_qfs++] = ctx_qf; \ in vulkan_device_init()
1512 …CHECK_QUEUE("graphics", 0, graph_index, hwctx->queue_family_index, hwctx->nb_graphics_queue… in vulkan_device_init()
1513 CHECK_QUEUE("upload", 1, tx_index, hwctx->queue_family_tx_index, hwctx->nb_tx_queues); in vulkan_device_init()
1514 … CHECK_QUEUE("compute", 1, comp_index, hwctx->queue_family_comp_index, hwctx->nb_comp_queues); in vulkan_device_init()
1515 …CHECK_QUEUE("encode", 0, enc_index, hwctx->queue_family_encode_index, hwctx->nb_encode_queues); in vulkan_device_init()
1516 …CHECK_QUEUE("decode", 0, dec_index, hwctx->queue_family_decode_index, hwctx->nb_decode_queues); in vulkan_device_init()
1520 /* Get device capabilities */ in vulkan_device_init()
1521 vk->GetPhysicalDeviceMemoryProperties(hwctx->phys_dev, &p->mprops); in vulkan_device_init()
1526 static int vulkan_device_create(AVHWDeviceContext *ctx, const char *device, in vulkan_device_create() argument
1530 if (device && device[0]) { in vulkan_device_create()
1532 dev_select.index = strtol(device, &end, 10); in vulkan_device_create()
1533 if (end == device) { in vulkan_device_create()
1535 dev_select.name = device; in vulkan_device_create()
1548 /* If there's only one device on the system, then even if its not covered in vulkan_device_derive()
1549 * by the following checks (e.g. non-PCIe ARM GPU), having an empty in vulkan_device_derive()
1551 switch(src_ctx->type) { in vulkan_device_derive()
1555 AVVAAPIDeviceContext *src_hwctx = src_ctx->hwctx; in vulkan_device_derive()
1557 const char *vendor = vaQueryVendorString(src_hwctx->display); in vulkan_device_derive()
1559 av_log(ctx, AV_LOG_ERROR, "Unable to get device info from VAAPI!\n"); in vulkan_device_derive()
1572 AVDRMDeviceContext *src_hwctx = src_ctx->hwctx; in vulkan_device_derive()
1575 int err = drmGetDevice(src_hwctx->fd, &drm_dev_info); in vulkan_device_derive()
1577 av_log(ctx, AV_LOG_ERROR, "Unable to get device info from DRM fd!\n"); in vulkan_device_derive()
1581 if (drm_dev_info->bustype == DRM_BUS_PCI) in vulkan_device_derive()
1582 dev_select.pci_device = drm_dev_info->deviceinfo.pci->device_id; in vulkan_device_derive()
1592 AVCUDADeviceContext *src_hwctx = src_ctx->hwctx; in vulkan_device_derive()
1593 AVCUDADeviceContextInternal *cu_internal = src_hwctx->internal; in vulkan_device_derive()
1594 CudaFunctions *cu = cu_internal->cuda_dl; in vulkan_device_derive()
1596 int ret = CHECK_CU(cu->cuDeviceGetUuid((CUuuid *)&dev_select.uuid, in vulkan_device_derive()
1597 cu_internal->cuda_device)); in vulkan_device_derive()
1618 VulkanDevicePriv *p = ctx->internal->priv; in vulkan_frames_get_constraints()
1621 count += pixfmt_is_supported(ctx, i, p->use_linear_images); in vulkan_frames_get_constraints()
1624 if (p->dev_is_nvidia) in vulkan_frames_get_constraints()
1628 constraints->valid_sw_formats = av_malloc_array(count + 1, in vulkan_frames_get_constraints()
1630 if (!constraints->valid_sw_formats) in vulkan_frames_get_constraints()
1635 if (pixfmt_is_supported(ctx, i, p->use_linear_images)) in vulkan_frames_get_constraints()
1636 constraints->valid_sw_formats[count++] = i; in vulkan_frames_get_constraints()
1639 if (p->dev_is_nvidia) in vulkan_frames_get_constraints()
1640 constraints->valid_sw_formats[count++] = AV_PIX_FMT_CUDA; in vulkan_frames_get_constraints()
1642 constraints->valid_sw_formats[count++] = AV_PIX_FMT_NONE; in vulkan_frames_get_constraints()
1644 constraints->min_width = 0; in vulkan_frames_get_constraints()
1645 constraints->min_height = 0; in vulkan_frames_get_constraints()
1646 constraints->max_width = p->props.properties.limits.maxImageDimension2D; in vulkan_frames_get_constraints()
1647 constraints->max_height = p->props.properties.limits.maxImageDimension2D; in vulkan_frames_get_constraints()
1649 constraints->valid_hw_formats = av_malloc_array(2, sizeof(enum AVPixelFormat)); in vulkan_frames_get_constraints()
1650 if (!constraints->valid_hw_formats) in vulkan_frames_get_constraints()
1653 constraints->valid_hw_formats[0] = AV_PIX_FMT_VULKAN; in vulkan_frames_get_constraints()
1654 constraints->valid_hw_formats[1] = AV_PIX_FMT_NONE; in vulkan_frames_get_constraints()
1664 int index = -1; in alloc_mem()
1665 VulkanDevicePriv *p = ctx->internal->priv; in alloc_mem()
1666 FFVulkanFunctions *vk = &p->vkfn; in alloc_mem()
1667 AVVulkanDeviceContext *dev_hwctx = ctx->hwctx; in alloc_mem()
1671 .allocationSize = req->size, in alloc_mem()
1674 /* The vulkan spec requires memory types to be sorted in the "optimal" in alloc_mem()
1676 for (int i = 0; i < p->mprops.memoryTypeCount; i++) { in alloc_mem()
1677 const VkMemoryType *type = &p->mprops.memoryTypes[i]; in alloc_mem()
1680 if (!(req->memoryTypeBits & (1 << i))) in alloc_mem()
1684 if ((type->propertyFlags & req_flags) != req_flags) in alloc_mem()
1688 if (req->size > p->mprops.memoryHeaps[type->heapIndex].size) in alloc_mem()
1704 ret = vk->AllocateMemory(dev_hwctx->act_dev, &alloc_info, in alloc_mem()
1705 dev_hwctx->alloc, mem); in alloc_mem()
1712 *mem_flags |= p->mprops.memoryTypes[index].propertyFlags; in alloc_mem()
1719 AVVkFrameInternal *internal = f->internal; in vulkan_free_internal()
1725 if (internal->cuda_fc_ref) { in vulkan_free_internal()
1726 AVHWFramesContext *cuda_fc = (AVHWFramesContext *)internal->cuda_fc_ref->data; in vulkan_free_internal()
1727 int planes = av_pix_fmt_count_planes(cuda_fc->sw_format); in vulkan_free_internal()
1728 AVHWDeviceContext *cuda_cu = cuda_fc->device_ctx; in vulkan_free_internal()
1729 AVCUDADeviceContext *cuda_dev = cuda_cu->hwctx; in vulkan_free_internal()
1730 AVCUDADeviceContextInternal *cu_internal = cuda_dev->internal; in vulkan_free_internal()
1731 CudaFunctions *cu = cu_internal->cuda_dl; in vulkan_free_internal()
1734 if (internal->cu_sem[i]) in vulkan_free_internal()
1735 CHECK_CU(cu->cuDestroyExternalSemaphore(internal->cu_sem[i])); in vulkan_free_internal()
1736 if (internal->cu_mma[i]) in vulkan_free_internal()
1737 CHECK_CU(cu->cuMipmappedArrayDestroy(internal->cu_mma[i])); in vulkan_free_internal()
1738 if (internal->ext_mem[i]) in vulkan_free_internal()
1739 CHECK_CU(cu->cuDestroyExternalMemory(internal->ext_mem[i])); in vulkan_free_internal()
1741 if (internal->ext_sem_handle[i]) in vulkan_free_internal()
1742 CloseHandle(internal->ext_sem_handle[i]); in vulkan_free_internal()
1743 if (internal->ext_mem_handle[i]) in vulkan_free_internal()
1744 CloseHandle(internal->ext_mem_handle[i]); in vulkan_free_internal()
1748 av_buffer_unref(&internal->cuda_fc_ref); in vulkan_free_internal()
1752 av_freep(&f->internal); in vulkan_free_internal()
1759 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in vulkan_frame_free()
1760 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_frame_free()
1761 FFVulkanFunctions *vk = &p->vkfn; in vulkan_frame_free()
1762 int planes = av_pix_fmt_count_planes(hwfc->sw_format); in vulkan_frame_free()
1764 /* We could use vkWaitSemaphores, but the validation layer seems to have in vulkan_frame_free()
1766 vk->DeviceWaitIdle(hwctx->act_dev); in vulkan_frame_free()
1771 vk->DestroyImage(hwctx->act_dev, f->img[i], hwctx->alloc); in vulkan_frame_free()
1772 vk->FreeMemory(hwctx->act_dev, f->mem[i], hwctx->alloc); in vulkan_frame_free()
1773 vk->DestroySemaphore(hwctx->act_dev, f->sem[i], hwctx->alloc); in vulkan_frame_free()
1784 AVHWDeviceContext *ctx = hwfc->device_ctx; in alloc_bind_mem()
1785 VulkanDevicePriv *p = ctx->internal->priv; in alloc_bind_mem()
1786 FFVulkanFunctions *vk = &p->vkfn; in alloc_bind_mem()
1787 AVVulkanFramesContext *hwfctx = hwfc->hwctx; in alloc_bind_mem()
1788 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in alloc_bind_mem()
1795 AVVulkanDeviceContext *hwctx = ctx->hwctx; in alloc_bind_mem()
1801 .image = f->img[i], in alloc_bind_mem()
1815 vk->GetImageMemoryRequirements2(hwctx->act_dev, &req_desc, &req); in alloc_bind_mem()
1817 if (f->tiling == VK_IMAGE_TILING_LINEAR) in alloc_bind_mem()
1819 p->props.properties.limits.minMemoryMapAlignment); in alloc_bind_mem()
1821 if (hwfctx->flags & AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY) { in alloc_bind_mem()
1824 "device requires dedicated image allocation!\n"); in alloc_bind_mem()
1846 ded_alloc.image = f->img[i]; in alloc_bind_mem()
1850 f->tiling == VK_IMAGE_TILING_LINEAR ? in alloc_bind_mem()
1854 &f->flags, &f->mem[i]))) in alloc_bind_mem()
1857 f->size[i] = req.memoryRequirements.size; in alloc_bind_mem()
1859 bind_info[i].image = f->img[i]; in alloc_bind_mem()
1860 bind_info[i].memory = f->mem[i]; in alloc_bind_mem()
1863 if (hwfctx->flags & AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY) { in alloc_bind_mem()
1868 f->tiling == VK_IMAGE_TILING_LINEAR ? in alloc_bind_mem()
1872 &f->flags, &f->mem[0]))) in alloc_bind_mem()
1875 f->size[0] = cont_memory_requirements.size; in alloc_bind_mem()
1879 bind_info[i].image = f->img[i]; in alloc_bind_mem()
1880 bind_info[i].memory = f->mem[0]; in alloc_bind_mem()
1883 f->offset[i] = bind_info[i].memoryOffset; in alloc_bind_mem()
1889 ret = vk->BindImageMemory2(hwctx->act_dev, planes, bind_info); in alloc_bind_mem()
1912 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in prepare_frame()
1913 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in prepare_frame()
1914 FFVulkanFunctions *vk = &p->vkfn; in prepare_frame()
1928 .pSignalSemaphores = frame->sem, in prepare_frame()
1935 sem_sig_val[i] = frame->sem_value[i] + 1; in prepare_frame()
1950 s_timeline_sem_info.pWaitSemaphoreValues = frame->sem_value; in prepare_frame()
1952 s_info.pWaitSemaphores = frame->sem; in prepare_frame()
1961 s_timeline_sem_info.pWaitSemaphoreValues = frame->sem_value; in prepare_frame()
1963 s_info.pWaitSemaphores = frame->sem; in prepare_frame()
1979 img_bar[i].oldLayout = frame->layout[i]; in prepare_frame()
1983 img_bar[i].image = frame->img[i]; in prepare_frame()
1988 frame->layout[i] = img_bar[i].newLayout; in prepare_frame()
1989 frame->access[i] = img_bar[i].dstAccessMask; in prepare_frame()
1992 vk->CmdPipelineBarrier(get_buf_exec_ctx(hwfc, ectx), in prepare_frame()
2006 if (!plane || (plane == 3) || desc->flags & AV_PIX_FMT_FLAG_RGB || in get_plane_wh()
2007 !(desc->flags & AV_PIX_FMT_FLAG_PLANAR)) { in get_plane_wh()
2013 *w = AV_CEIL_RSHIFT(frame_w, desc->log2_chroma_w); in get_plane_wh()
2014 *h = AV_CEIL_RSHIFT(frame_h, desc->log2_chroma_h); in get_plane_wh()
2023 AVHWDeviceContext *ctx = hwfc->device_ctx; in create_frame()
2024 VulkanDevicePriv *p = ctx->internal->priv; in create_frame()
2025 FFVulkanFunctions *vk = &p->vkfn; in create_frame()
2026 AVVulkanDeviceContext *hwctx = ctx->hwctx; in create_frame()
2027 enum AVPixelFormat format = hwfc->sw_format; in create_frame()
2045 .pNext = p->extensions & FF_VK_EXT_EXTERNAL_WIN32_SEM ? &ext_sem_info : NULL, in create_frame()
2047 .pNext = p->extensions & FF_VK_EXT_EXTERNAL_FD_SEM ? &ext_sem_info : NULL, in create_frame()
2079 .pQueueFamilyIndices = p->qfs, in create_frame()
2080 .queueFamilyIndexCount = p->num_qfs, in create_frame()
2081 .sharingMode = p->num_qfs > 1 ? VK_SHARING_MODE_CONCURRENT : in create_frame()
2086 format, hwfc->width, hwfc->height, i); in create_frame()
2088 ret = vk->CreateImage(hwctx->act_dev, &create_info, in create_frame()
2089 hwctx->alloc, &f->img[i]); in create_frame()
2098 ret = vk->CreateSemaphore(hwctx->act_dev, &sem_spawn, in create_frame()
2099 hwctx->alloc, &f->sem[i]); in create_frame()
2106 f->layout[i] = create_info.initialLayout; in create_frame()
2107 f->access[i] = 0x0; in create_frame()
2108 f->sem_value[i] = 0; in create_frame()
2111 f->flags = 0x0; in create_frame()
2112 f->tiling = tiling; in create_frame()
2129 AVVulkanFramesContext *hwctx = hwfc->hwctx; in try_export_flags()
2130 AVVulkanDeviceContext *dev_hwctx = hwfc->device_ctx->hwctx; in try_export_flags()
2131 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in try_export_flags()
2132 FFVulkanFunctions *vk = &p->vkfn; in try_export_flags()
2135 vk_find_struct(hwctx->create_pnext, in try_export_flags()
2137 int has_mods = hwctx->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT && drm_mod_info; in try_export_flags()
2150 .pQueueFamilyIndices = p->qfs, in try_export_flags()
2151 .queueFamilyIndexCount = p->num_qfs, in try_export_flags()
2152 .sharingMode = p->num_qfs > 1 ? VK_SHARING_MODE_CONCURRENT : in try_export_flags()
2163 .format = av_vkfmt_from_pixfmt(hwfc->sw_format)[0], in try_export_flags()
2165 .tiling = hwctx->tiling, in try_export_flags()
2166 .usage = hwctx->usage, in try_export_flags()
2170 nb_mods = has_mods ? drm_mod_info->drmFormatModifierCount : 1; in try_export_flags()
2173 phy_dev_mod_info.drmFormatModifier = drm_mod_info->pDrmFormatModifiers[i]; in try_export_flags()
2175 ret = vk->GetPhysicalDeviceImageFormatProperties2(dev_hwctx->phys_dev, in try_export_flags()
2191 AVVulkanFramesContext *hwctx = hwfc->hwctx; in vulkan_pool_alloc()
2192 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_pool_alloc()
2193 VulkanFramesPriv *fp = hwfc->internal->priv; in vulkan_pool_alloc()
2199 .pNext = hwctx->create_pnext, in vulkan_pool_alloc()
2203 if (p->extensions & FF_VK_EXT_EXTERNAL_WIN32_MEMORY) in vulkan_pool_alloc()
2208 if (p->extensions & FF_VK_EXT_EXTERNAL_FD_MEMORY) in vulkan_pool_alloc()
2212 if (p->extensions & (FF_VK_EXT_EXTERNAL_DMABUF_MEMORY | FF_VK_EXT_DRM_MODIFIER_FLAGS)) in vulkan_pool_alloc()
2217 for (int i = 0; i < av_pix_fmt_count_planes(hwfc->sw_format); i++) { in vulkan_pool_alloc()
2219 eminfo[i].pNext = hwctx->alloc_pnext[i]; in vulkan_pool_alloc()
2223 err = create_frame(hwfc, &f, hwctx->tiling, hwctx->usage, in vulkan_pool_alloc()
2232 err = prepare_frame(hwfc, &fp->conv_ctx, f, PREP_MODE_WRITE); in vulkan_pool_alloc()
2250 VulkanFramesPriv *fp = hwfc->internal->priv; in vulkan_frames_uninit()
2252 if (fp->modifier_info) { in vulkan_frames_uninit()
2253 if (fp->modifier_info->pDrmFormatModifiers) in vulkan_frames_uninit()
2254 av_freep(&fp->modifier_info->pDrmFormatModifiers); in vulkan_frames_uninit()
2255 av_freep(&fp->modifier_info); in vulkan_frames_uninit()
2258 free_exec_ctx(hwfc, &fp->conv_ctx); in vulkan_frames_uninit()
2259 free_exec_ctx(hwfc, &fp->upload_ctx); in vulkan_frames_uninit()
2260 free_exec_ctx(hwfc, &fp->download_ctx); in vulkan_frames_uninit()
2267 AVVulkanFramesContext *hwctx = hwfc->hwctx; in vulkan_frames_init()
2268 VulkanFramesPriv *fp = hwfc->internal->priv; in vulkan_frames_init()
2269 AVVulkanDeviceContext *dev_hwctx = hwfc->device_ctx->hwctx; in vulkan_frames_init()
2270 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_frames_init()
2272 const int has_modifiers = !!(p->extensions & FF_VK_EXT_DRM_MODIFIER_FLAGS); in vulkan_frames_init()
2275 hwctx->tiling = hwctx->tiling ? hwctx->tiling : in vulkan_frames_init()
2277 p->use_linear_images ? VK_IMAGE_TILING_LINEAR : in vulkan_frames_init()
2280 if (!hwctx->usage) in vulkan_frames_init()
2281 hwctx->usage = FF_VK_DEFAULT_USAGE_FLAGS; in vulkan_frames_init()
2283 if (!(hwctx->flags & AV_VK_FRAME_FLAG_NONE)) { in vulkan_frames_init()
2284 if (p->contiguous_planes == 1 || in vulkan_frames_init()
2285 ((p->contiguous_planes == -1) && p->dev_is_intel)) in vulkan_frames_init()
2286 hwctx->flags |= AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY; in vulkan_frames_init()
2289 modifier_info = vk_find_struct(hwctx->create_pnext, in vulkan_frames_init()
2294 const VkFormat *fmt = av_vkfmt_from_pixfmt(hwfc->sw_format); in vulkan_frames_init()
2296 FFVulkanFunctions *vk = &p->vkfn; in vulkan_frames_init()
2313 vk->GetPhysicalDeviceFormatProperties2(dev_hwctx->phys_dev, fmt[0], &prop); in vulkan_frames_init()
2325 modifier_info->pNext = NULL; in vulkan_frames_init()
2326 modifier_info->sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT; in vulkan_frames_init()
2329 if (!hwctx->create_pnext) in vulkan_frames_init()
2330 hwctx->create_pnext = modifier_info; in vulkan_frames_init()
2332 vk_link_struct(hwctx->create_pnext, (void *)modifier_info); in vulkan_frames_init()
2335 fp->modifier_info = modifier_info; in vulkan_frames_init()
2343 modifier_info->pDrmFormatModifiers = modifiers; in vulkan_frames_init()
2353 /* Finally get all modifiers from the device */ in vulkan_frames_init()
2354 vk->GetPhysicalDeviceFormatProperties2(dev_hwctx->phys_dev, fmt[0], &prop); in vulkan_frames_init()
2358 if (!(mod_props[i].drmFormatModifierTilingFeatures & hwctx->usage)) in vulkan_frames_init()
2371 modifier_info->drmFormatModifierCount = modifier_count; in vulkan_frames_init()
2375 err = create_exec_ctx(hwfc, &fp->conv_ctx, in vulkan_frames_init()
2376 dev_hwctx->queue_family_comp_index, in vulkan_frames_init()
2377 dev_hwctx->nb_comp_queues); in vulkan_frames_init()
2381 err = create_exec_ctx(hwfc, &fp->upload_ctx, in vulkan_frames_init()
2382 dev_hwctx->queue_family_tx_index, in vulkan_frames_init()
2383 dev_hwctx->nb_tx_queues); in vulkan_frames_init()
2387 err = create_exec_ctx(hwfc, &fp->download_ctx, in vulkan_frames_init()
2388 dev_hwctx->queue_family_tx_index, 1); in vulkan_frames_init()
2393 err = create_frame(hwfc, &f, hwctx->tiling, hwctx->usage, in vulkan_frames_init()
2394 hwctx->create_pnext); in vulkan_frames_init()
2400 /* If user did not specify a pool, hwfc->pool will be set to the internal one in vulkan_frames_init()
2402 if (!hwfc->pool) { in vulkan_frames_init()
2403 hwfc->internal->pool_internal = av_buffer_pool_init2(sizeof(AVVkFrame), in vulkan_frames_init()
2406 if (!hwfc->internal->pool_internal) in vulkan_frames_init()
2415 frame->buf[0] = av_buffer_pool_get(hwfc->pool); in vulkan_get_buffer()
2416 if (!frame->buf[0]) in vulkan_get_buffer()
2419 frame->data[0] = frame->buf[0]->data; in vulkan_get_buffer()
2420 frame->format = AV_PIX_FMT_VULKAN; in vulkan_get_buffer()
2421 frame->width = hwfc->width; in vulkan_get_buffer()
2422 frame->height = hwfc->height; in vulkan_get_buffer()
2435 fmts[0] = hwfc->sw_format; in vulkan_transfer_get_formats()
2449 VulkanMapping *map = hwmap->priv; in vulkan_unmap_frame()
2450 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in vulkan_unmap_frame()
2451 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in vulkan_unmap_frame()
2452 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_unmap_frame()
2453 FFVulkanFunctions *vk = &p->vkfn; in vulkan_unmap_frame()
2456 if ((map->flags & AV_HWFRAME_MAP_WRITE) && in vulkan_unmap_frame()
2457 !(map->frame->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { in vulkan_unmap_frame()
2463 flush_ranges[i].memory = map->frame->mem[i]; in vulkan_unmap_frame()
2467 ret = vk->FlushMappedMemoryRanges(hwctx->act_dev, planes, in vulkan_unmap_frame()
2476 vk->UnmapMemory(hwctx->act_dev, map->frame->mem[i]); in vulkan_unmap_frame()
2486 AVVkFrame *f = (AVVkFrame *)src->data[0]; in vulkan_map_frame_to_mem()
2487 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in vulkan_map_frame_to_mem()
2488 AVVulkanFramesContext *hwfctx = hwfc->hwctx; in vulkan_map_frame_to_mem()
2489 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in vulkan_map_frame_to_mem()
2490 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_map_frame_to_mem()
2491 FFVulkanFunctions *vk = &p->vkfn; in vulkan_map_frame_to_mem()
2497 if (src->format != AV_PIX_FMT_VULKAN) { in vulkan_map_frame_to_mem()
2499 av_get_pix_fmt_name(src->format)); in vulkan_map_frame_to_mem()
2504 if (!(f->flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) || in vulkan_map_frame_to_mem()
2505 !(f->tiling == VK_IMAGE_TILING_LINEAR)) { in vulkan_map_frame_to_mem()
2512 dst->width = src->width; in vulkan_map_frame_to_mem()
2513 dst->height = src->height; in vulkan_map_frame_to_mem()
2515 mem_planes = hwfctx->flags & AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY ? 1 : planes; in vulkan_map_frame_to_mem()
2517 ret = vk->MapMemory(hwctx->act_dev, f->mem[i], 0, in vulkan_map_frame_to_mem()
2518 VK_WHOLE_SIZE, 0, (void **)&dst->data[i]); in vulkan_map_frame_to_mem()
2528 if (hwfctx->flags & AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY) { in vulkan_map_frame_to_mem()
2530 dst->data[i] = dst->data[0] + f->offset[i]; in vulkan_map_frame_to_mem()
2535 !(f->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { in vulkan_map_frame_to_mem()
2540 map_mem_ranges[i].memory = f->mem[i]; in vulkan_map_frame_to_mem()
2543 ret = vk->InvalidateMappedMemoryRanges(hwctx->act_dev, planes, in vulkan_map_frame_to_mem()
2558 vk->GetImageSubresourceLayout(hwctx->act_dev, f->img[i], &sub, &layout); in vulkan_map_frame_to_mem()
2559 dst->linesize[i] = layout.rowPitch; in vulkan_map_frame_to_mem()
2562 map->frame = f; in vulkan_map_frame_to_mem()
2563 map->flags = flags; in vulkan_map_frame_to_mem()
2565 err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, in vulkan_map_frame_to_mem()
2574 vk->UnmapMemory(hwctx->act_dev, f->mem[i]); in vulkan_map_frame_to_mem()
2583 AVVkFrame *f = hwmap->priv; in vulkan_unmap_from_drm()
2584 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in vulkan_unmap_from_drm()
2585 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in vulkan_unmap_from_drm()
2586 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_unmap_from_drm()
2587 FFVulkanFunctions *vk = &p->vkfn; in vulkan_unmap_from_drm()
2592 .pSemaphores = f->sem, in vulkan_unmap_from_drm()
2593 .pValues = f->sem_value, in vulkan_unmap_from_drm()
2597 vk->WaitSemaphores(hwctx->act_dev, &wait_info, UINT64_MAX); in vulkan_unmap_from_drm()
2602 vk->DestroyImage(hwctx->act_dev, f->img[i], hwctx->alloc); in vulkan_unmap_from_drm()
2603 vk->FreeMemory(hwctx->act_dev, f->mem[i], hwctx->alloc); in vulkan_unmap_from_drm()
2604 vk->DestroySemaphore(hwctx->act_dev, f->sem[i], hwctx->alloc); in vulkan_unmap_from_drm()
2641 AVHWDeviceContext *ctx = hwfc->device_ctx; in vulkan_map_from_drm_frame_desc()
2642 AVVulkanDeviceContext *hwctx = ctx->hwctx; in vulkan_map_from_drm_frame_desc()
2643 VulkanDevicePriv *p = ctx->internal->priv; in vulkan_map_from_drm_frame_desc()
2644 FFVulkanFunctions *vk = &p->vkfn; in vulkan_map_from_drm_frame_desc()
2645 VulkanFramesPriv *fp = hwfc->internal->priv; in vulkan_map_from_drm_frame_desc()
2646 const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor *)src->data[0]; in vulkan_map_from_drm_frame_desc()
2650 for (int i = 0; i < desc->nb_layers; i++) { in vulkan_map_from_drm_frame_desc()
2651 if (drm_to_vulkan_fmt(desc->layers[i].format) == VK_FORMAT_UNDEFINED) { in vulkan_map_from_drm_frame_desc()
2652 av_log(ctx, AV_LOG_ERROR, "Unsupported DMABUF layer format %#08x!\n", in vulkan_map_from_drm_frame_desc()
2653 desc->layers[i].format); in vulkan_map_from_drm_frame_desc()
2664 f->tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT; in vulkan_map_from_drm_frame_desc()
2666 for (int i = 0; i < desc->nb_layers; i++) { in vulkan_map_from_drm_frame_desc()
2667 const int planes = desc->layers[i].nb_planes; in vulkan_map_from_drm_frame_desc()
2684 .drmFormatModifier = desc->objects[0].format_modifier, in vulkan_map_from_drm_frame_desc()
2697 .format = drm_to_vulkan_fmt(desc->layers[i].format), in vulkan_map_from_drm_frame_desc()
2702 .tiling = f->tiling, in vulkan_map_from_drm_frame_desc()
2707 .pQueueFamilyIndices = p->qfs, in vulkan_map_from_drm_frame_desc()
2708 .queueFamilyIndexCount = p->num_qfs, in vulkan_map_from_drm_frame_desc()
2709 .sharingMode = p->num_qfs > 1 ? VK_SHARING_MODE_CONCURRENT : in vulkan_map_from_drm_frame_desc()
2744 ret = vk->GetPhysicalDeviceImageFormatProperties2(hwctx->phys_dev, in vulkan_map_from_drm_frame_desc()
2747 av_log(ctx, AV_LOG_ERROR, "Cannot map DRM frame to Vulkan: %s\n", in vulkan_map_from_drm_frame_desc()
2755 hwfc->sw_format, src->width, src->height, i); in vulkan_map_from_drm_frame_desc()
2757 /* Set the subresource layout based on the layer properties */ in vulkan_map_from_drm_frame_desc()
2759 ext_img_layouts[j].offset = desc->layers[i].planes[j].offset; in vulkan_map_from_drm_frame_desc()
2760 ext_img_layouts[j].rowPitch = desc->layers[i].planes[j].pitch; in vulkan_map_from_drm_frame_desc()
2767 ret = vk->CreateImage(hwctx->act_dev, &create_info, in vulkan_map_from_drm_frame_desc()
2768 hwctx->alloc, &f->img[i]); in vulkan_map_from_drm_frame_desc()
2776 ret = vk->CreateSemaphore(hwctx->act_dev, &sem_spawn, in vulkan_map_from_drm_frame_desc()
2777 hwctx->alloc, &f->sem[i]); in vulkan_map_from_drm_frame_desc()
2789 f->layout[i] = create_info.initialLayout; in vulkan_map_from_drm_frame_desc()
2790 f->access[i] = 0x0; in vulkan_map_from_drm_frame_desc()
2791 f->sem_value[i] = 0; in vulkan_map_from_drm_frame_desc()
2794 for (int i = 0; i < desc->nb_objects; i++) { in vulkan_map_from_drm_frame_desc()
2798 .image = f->img[i], in vulkan_map_from_drm_frame_desc()
2814 .fd = dup(desc->objects[i].fd), in vulkan_map_from_drm_frame_desc()
2824 ret = vk->GetMemoryFdPropertiesKHR(hwctx->act_dev, in vulkan_map_from_drm_frame_desc()
2835 vk->GetImageMemoryRequirements2(hwctx->act_dev, &req_desc, &req2); in vulkan_map_from_drm_frame_desc()
2845 &f->flags, &f->mem[i]); in vulkan_map_from_drm_frame_desc()
2851 f->size[i] = req2.memoryRequirements.size; in vulkan_map_from_drm_frame_desc()
2854 for (int i = 0; i < desc->nb_layers; i++) { in vulkan_map_from_drm_frame_desc()
2855 const int planes = desc->layers[i].nb_planes; in vulkan_map_from_drm_frame_desc()
2867 bind_info[bind_counts].image = f->img[i]; in vulkan_map_from_drm_frame_desc()
2868 bind_info[bind_counts].memory = f->mem[desc->layers[i].planes[j].object_index]; in vulkan_map_from_drm_frame_desc()
2878 ret = vk->BindImageMemory2(hwctx->act_dev, bind_counts, bind_info); in vulkan_map_from_drm_frame_desc()
2886 err = prepare_frame(hwfc, &fp->conv_ctx, f, PREP_MODE_EXTERNAL_IMPORT); in vulkan_map_from_drm_frame_desc()
2895 for (int i = 0; i < desc->nb_layers; i++) { in vulkan_map_from_drm_frame_desc()
2896 vk->DestroyImage(hwctx->act_dev, f->img[i], hwctx->alloc); in vulkan_map_from_drm_frame_desc()
2897 vk->DestroySemaphore(hwctx->act_dev, f->sem[i], hwctx->alloc); in vulkan_map_from_drm_frame_desc()
2899 for (int i = 0; i < desc->nb_objects; i++) in vulkan_map_from_drm_frame_desc()
2900 vk->FreeMemory(hwctx->act_dev, f->mem[i], hwctx->alloc); in vulkan_map_from_drm_frame_desc()
2917 dst->data[0] = (uint8_t *)f; in vulkan_map_from_drm()
2918 dst->width = src->width; in vulkan_map_from_drm()
2919 dst->height = src->height; in vulkan_map_from_drm()
2921 err = ff_hwframe_map_create(dst->hw_frames_ctx, dst, src, in vulkan_map_from_drm()
2926 av_log(hwfc, AV_LOG_DEBUG, "Mapped DRM object to Vulkan!\n"); in vulkan_map_from_drm()
2931 vulkan_frame_free(hwfc->device_ctx->hwctx, (uint8_t *)f); in vulkan_map_from_drm()
2932 dst->data[0] = NULL; in vulkan_map_from_drm()
2943 AVHWFramesContext *vaapi_fc = (AVHWFramesContext*)src->hw_frames_ctx->data; in vulkan_map_from_vaapi()
2944 AVVAAPIDeviceContext *vaapi_ctx = vaapi_fc->device_ctx->hwctx; in vulkan_map_from_vaapi()
2945 VASurfaceID surface_id = (VASurfaceID)(uintptr_t)src->data[3]; in vulkan_map_from_vaapi()
2951 vaSyncSurface(vaapi_ctx->display, surface_id); in vulkan_map_from_vaapi()
2953 tmp->format = AV_PIX_FMT_DRM_PRIME; in vulkan_map_from_vaapi()
2981 AVHWDeviceContext *ctx = hwfc->device_ctx; in vulkan_export_to_cuda()
2982 AVVulkanDeviceContext *hwctx = ctx->hwctx; in vulkan_export_to_cuda()
2983 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in vulkan_export_to_cuda()
2984 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format); in vulkan_export_to_cuda()
2985 VulkanDevicePriv *p = ctx->internal->priv; in vulkan_export_to_cuda()
2986 FFVulkanFunctions *vk = &p->vkfn; in vulkan_export_to_cuda()
2988 AVHWFramesContext *cuda_fc = (AVHWFramesContext*)cuda_hwfc->data; in vulkan_export_to_cuda()
2989 AVHWDeviceContext *cuda_cu = cuda_fc->device_ctx; in vulkan_export_to_cuda()
2990 AVCUDADeviceContext *cuda_dev = cuda_cu->hwctx; in vulkan_export_to_cuda()
2991 AVCUDADeviceContextInternal *cu_internal = cuda_dev->internal; in vulkan_export_to_cuda()
2992 CudaFunctions *cu = cu_internal->cuda_dl; in vulkan_export_to_cuda()
2993 CUarray_format cufmt = desc->comp[0].depth > 8 ? CU_AD_FORMAT_UNSIGNED_INT16 : in vulkan_export_to_cuda()
2996 dst_f = (AVVkFrame *)frame->data[0]; in vulkan_export_to_cuda()
2998 dst_int = dst_f->internal; in vulkan_export_to_cuda()
2999 if (!dst_int || !dst_int->cuda_fc_ref) { in vulkan_export_to_cuda()
3000 if (!dst_f->internal) in vulkan_export_to_cuda()
3001 dst_f->internal = dst_int = av_mallocz(sizeof(*dst_f->internal)); in vulkan_export_to_cuda()
3006 dst_int->cuda_fc_ref = av_buffer_ref(cuda_hwfc); in vulkan_export_to_cuda()
3007 if (!dst_int->cuda_fc_ref) { in vulkan_export_to_cuda()
3008 av_freep(&dst_f->internal); in vulkan_export_to_cuda()
3030 .size = dst_f->size[i], in vulkan_export_to_cuda()
3034 .memory = dst_f->mem[i], in vulkan_export_to_cuda()
3041 .semaphore = dst_f->sem[i], in vulkan_export_to_cuda()
3050 ret = vk->GetMemoryWin32HandleKHR(hwctx->act_dev, &export_info, in vulkan_export_to_cuda()
3058 dst_int->ext_mem_handle[i] = ext_desc.handle.win32.handle; in vulkan_export_to_cuda()
3062 .size = dst_f->size[i], in vulkan_export_to_cuda()
3066 .memory = dst_f->mem[i], in vulkan_export_to_cuda()
3071 .semaphore = dst_f->sem[i], in vulkan_export_to_cuda()
3078 ret = vk->GetMemoryFdKHR(hwctx->act_dev, &export_info, in vulkan_export_to_cuda()
3088 ret = CHECK_CU(cu->cuImportExternalMemory(&dst_int->ext_mem[i], &ext_desc)); in vulkan_export_to_cuda()
3097 get_plane_wh(&p_w, &p_h, hwfc->sw_format, hwfc->width, hwfc->height, i); in vulkan_export_to_cuda()
3101 ret = CHECK_CU(cu->cuExternalMemoryGetMappedMipmappedArray(&dst_int->cu_mma[i], in vulkan_export_to_cuda()
3102 dst_int->ext_mem[i], in vulkan_export_to_cuda()
3109 ret = CHECK_CU(cu->cuMipmappedArrayGetLevel(&dst_int->cu_array[i], in vulkan_export_to_cuda()
3110 dst_int->cu_mma[i], 0)); in vulkan_export_to_cuda()
3117 ret = vk->GetSemaphoreWin32HandleKHR(hwctx->act_dev, &sem_export, in vulkan_export_to_cuda()
3120 ret = vk->GetSemaphoreFdKHR(hwctx->act_dev, &sem_export, in vulkan_export_to_cuda()
3130 dst_int->ext_sem_handle[i] = ext_sem_desc.handle.win32.handle; in vulkan_export_to_cuda()
3133 ret = CHECK_CU(cu->cuImportExternalSemaphore(&dst_int->cu_sem[i], in vulkan_export_to_cuda()
3159 VulkanFramesPriv *fp = hwfc->internal->priv; in vulkan_transfer_data_from_cuda()
3160 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in vulkan_transfer_data_from_cuda()
3161 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format); in vulkan_transfer_data_from_cuda()
3163 AVHWFramesContext *cuda_fc = (AVHWFramesContext*)src->hw_frames_ctx->data; in vulkan_transfer_data_from_cuda()
3164 AVHWDeviceContext *cuda_cu = cuda_fc->device_ctx; in vulkan_transfer_data_from_cuda()
3165 AVCUDADeviceContext *cuda_dev = cuda_cu->hwctx; in vulkan_transfer_data_from_cuda()
3166 AVCUDADeviceContextInternal *cu_internal = cuda_dev->internal; in vulkan_transfer_data_from_cuda()
3167 CudaFunctions *cu = cu_internal->cuda_dl; in vulkan_transfer_data_from_cuda()
3171 dst_f = (AVVkFrame *)dst->data[0]; in vulkan_transfer_data_from_cuda()
3173 err = prepare_frame(hwfc, &fp->upload_ctx, dst_f, PREP_MODE_EXTERNAL_EXPORT); in vulkan_transfer_data_from_cuda()
3177 err = CHECK_CU(cu->cuCtxPushCurrent(cuda_dev->cuda_ctx)); in vulkan_transfer_data_from_cuda()
3181 err = vulkan_export_to_cuda(hwfc, src->hw_frames_ctx, dst); in vulkan_transfer_data_from_cuda()
3183 CHECK_CU(cu->cuCtxPopCurrent(&dummy)); in vulkan_transfer_data_from_cuda()
3187 dst_int = dst_f->internal; in vulkan_transfer_data_from_cuda()
3190 s_w_par[i].params.fence.value = dst_f->sem_value[i] + 0; in vulkan_transfer_data_from_cuda()
3191 s_s_par[i].params.fence.value = dst_f->sem_value[i] + 1; in vulkan_transfer_data_from_cuda()
3194 err = CHECK_CU(cu->cuWaitExternalSemaphoresAsync(dst_int->cu_sem, s_w_par, in vulkan_transfer_data_from_cuda()
3195 planes, cuda_dev->stream)); in vulkan_transfer_data_from_cuda()
3202 .srcDevice = (CUdeviceptr)src->data[i], in vulkan_transfer_data_from_cuda()
3203 .srcPitch = src->linesize[i], in vulkan_transfer_data_from_cuda()
3207 .dstArray = dst_int->cu_array[i], in vulkan_transfer_data_from_cuda()
3211 get_plane_wh(&p_w, &p_h, hwfc->sw_format, hwfc->width, hwfc->height, i); in vulkan_transfer_data_from_cuda()
3213 cpy.WidthInBytes = p_w * desc->comp[i].step; in vulkan_transfer_data_from_cuda()
3216 err = CHECK_CU(cu->cuMemcpy2DAsync(&cpy, cuda_dev->stream)); in vulkan_transfer_data_from_cuda()
3221 err = CHECK_CU(cu->cuSignalExternalSemaphoresAsync(dst_int->cu_sem, s_s_par, in vulkan_transfer_data_from_cuda()
3222 planes, cuda_dev->stream)); in vulkan_transfer_data_from_cuda()
3227 dst_f->sem_value[i]++; in vulkan_transfer_data_from_cuda()
3229 CHECK_CU(cu->cuCtxPopCurrent(&dummy)); in vulkan_transfer_data_from_cuda()
3231 av_log(hwfc, AV_LOG_VERBOSE, "Transfered CUDA image to Vulkan!\n"); in vulkan_transfer_data_from_cuda()
3233 return err = prepare_frame(hwfc, &fp->upload_ctx, dst_f, PREP_MODE_EXTERNAL_IMPORT); in vulkan_transfer_data_from_cuda()
3236 CHECK_CU(cu->cuCtxPopCurrent(&dummy)); in vulkan_transfer_data_from_cuda()
3238 dst_f->internal = NULL; in vulkan_transfer_data_from_cuda()
3239 av_buffer_unref(&dst->buf[0]); in vulkan_transfer_data_from_cuda()
3247 av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_map_to()
3249 switch (src->format) { in vulkan_map_to()
3253 if (p->extensions & (FF_VK_EXT_EXTERNAL_DMABUF_MEMORY | FF_VK_EXT_DRM_MODIFIER_FLAGS)) in vulkan_map_to()
3259 if (p->extensions & (FF_VK_EXT_EXTERNAL_DMABUF_MEMORY | FF_VK_EXT_DRM_MODIFIER_FLAGS)) in vulkan_map_to()
3277 AVDRMFrameDescriptor *drm_desc = hwmap->priv; in vulkan_unmap_to_drm()
3279 for (int i = 0; i < drm_desc->nb_objects; i++) in vulkan_unmap_to_drm()
3280 close(drm_desc->objects[i].fd); in vulkan_unmap_to_drm()
3298 AVVkFrame *f = (AVVkFrame *)src->data[0]; in vulkan_map_to_drm()
3299 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_map_to_drm()
3300 FFVulkanFunctions *vk = &p->vkfn; in vulkan_map_to_drm()
3301 VulkanFramesPriv *fp = hwfc->internal->priv; in vulkan_map_to_drm()
3302 AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; in vulkan_map_to_drm()
3303 AVVulkanFramesContext *hwfctx = hwfc->hwctx; in vulkan_map_to_drm()
3304 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in vulkan_map_to_drm()
3318 err = prepare_frame(hwfc, &fp->conv_ctx, f, PREP_MODE_EXTERNAL_EXPORT); in vulkan_map_to_drm()
3323 wait_info.pSemaphores = f->sem; in vulkan_map_to_drm()
3324 wait_info.pValues = f->sem_value; in vulkan_map_to_drm()
3326 vk->WaitSemaphores(hwctx->act_dev, &wait_info, UINT64_MAX); in vulkan_map_to_drm()
3328 err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src, &vulkan_unmap_to_drm, drm_desc); in vulkan_map_to_drm()
3332 ret = vk->GetImageDrmFormatModifierPropertiesEXT(hwctx->act_dev, f->img[0], in vulkan_map_to_drm()
3340 for (int i = 0; (i < planes) && (f->mem[i]); i++) { in vulkan_map_to_drm()
3343 .memory = f->mem[i], in vulkan_map_to_drm()
3347 ret = vk->GetMemoryFdKHR(hwctx->act_dev, &export_info, in vulkan_map_to_drm()
3348 &drm_desc->objects[i].fd); in vulkan_map_to_drm()
3355 drm_desc->nb_objects++; in vulkan_map_to_drm()
3356 drm_desc->objects[i].size = f->size[i]; in vulkan_map_to_drm()
3357 drm_desc->objects[i].format_modifier = drm_mod.drmFormatModifier; in vulkan_map_to_drm()
3360 drm_desc->nb_layers = planes; in vulkan_map_to_drm()
3361 for (int i = 0; i < drm_desc->nb_layers; i++) { in vulkan_map_to_drm()
3366 VkFormat plane_vkfmt = av_vkfmt_from_pixfmt(hwfc->sw_format)[i]; in vulkan_map_to_drm()
3368 drm_desc->layers[i].format = vulkan_fmt_to_drm(plane_vkfmt); in vulkan_map_to_drm()
3369 drm_desc->layers[i].nb_planes = 1; in vulkan_map_to_drm()
3371 if (drm_desc->layers[i].format == DRM_FORMAT_INVALID) { in vulkan_map_to_drm()
3372 av_log(hwfc, AV_LOG_ERROR, "Cannot map to DRM layer, unsupported!\n"); in vulkan_map_to_drm()
3377 drm_desc->layers[i].planes[0].object_index = FFMIN(i, drm_desc->nb_objects - 1); in vulkan_map_to_drm()
3379 if (f->tiling == VK_IMAGE_TILING_OPTIMAL) in vulkan_map_to_drm()
3382 vk->GetImageSubresourceLayout(hwctx->act_dev, f->img[i], &sub, &layout); in vulkan_map_to_drm()
3383 drm_desc->layers[i].planes[0].offset = layout.offset; in vulkan_map_to_drm()
3384 drm_desc->layers[i].planes[0].pitch = layout.rowPitch; in vulkan_map_to_drm()
3386 if (hwfctx->flags & AV_VK_FRAME_FLAG_CONTIGUOUS_MEMORY) in vulkan_map_to_drm()
3387 drm_desc->layers[i].planes[0].offset += f->offset[i]; in vulkan_map_to_drm()
3390 dst->width = src->width; in vulkan_map_to_drm()
3391 dst->height = src->height; in vulkan_map_to_drm()
3392 dst->data[0] = (uint8_t *)drm_desc; in vulkan_map_to_drm()
3412 tmp->format = AV_PIX_FMT_DRM_PRIME; in vulkan_map_to_vaapi()
3434 av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_map_from()
3436 switch (dst->format) { in vulkan_map_from()
3439 if (p->extensions & (FF_VK_EXT_EXTERNAL_DMABUF_MEMORY | FF_VK_EXT_DRM_MODIFIER_FLAGS)) in vulkan_map_from()
3445 if (p->extensions & (FF_VK_EXT_EXTERNAL_DMABUF_MEMORY | FF_VK_EXT_DRM_MODIFIER_FLAGS)) in vulkan_map_from()
3466 AVVulkanDeviceContext *hwctx = ctx->hwctx; in free_buf()
3467 VulkanDevicePriv *p = ctx->internal->priv; in free_buf()
3468 FFVulkanFunctions *vk = &p->vkfn; in free_buf()
3471 if (vkbuf->buf) in free_buf()
3472 vk->DestroyBuffer(hwctx->act_dev, vkbuf->buf, hwctx->alloc); in free_buf()
3473 if (vkbuf->mem) in free_buf()
3474 vk->FreeMemory(hwctx->act_dev, vkbuf->mem, hwctx->alloc); in free_buf()
3482 *stride = FFALIGN(*stride, p->props.properties.limits.optimalBufferCopyRowPitchAlignment); in get_req_buffer_size()
3484 size = FFALIGN(size, p->props.properties.limits.minMemoryMapAlignment); in get_req_buffer_size()
3496 AVVulkanDeviceContext *hwctx = ctx->hwctx; in create_buf()
3497 VulkanDevicePriv *p = ctx->internal->priv; in create_buf()
3498 FFVulkanFunctions *vk = &p->vkfn; in create_buf()
3527 vkbuf->mapped_mem = host_mapped; in create_buf()
3529 ret = vk->CreateBuffer(hwctx->act_dev, &buf_spawn, NULL, &vkbuf->buf); in create_buf()
3537 req_desc.buffer = vkbuf->buf; in create_buf()
3539 vk->GetBufferMemoryRequirements2(hwctx->act_dev, &req_desc, &req); in create_buf()
3545 ded_alloc.buffer = vkbuf->buf; in create_buf()
3553 &vkbuf->flags, &vkbuf->mem); in create_buf()
3557 ret = vk->BindBufferMemory(hwctx->act_dev, vkbuf->buf, vkbuf->mem, 0); in create_buf()
3583 AVVulkanDeviceContext *hwctx = ctx->hwctx; in map_buffers()
3584 VulkanDevicePriv *p = ctx->internal->priv; in map_buffers()
3585 FFVulkanFunctions *vk = &p->vkfn; in map_buffers()
3590 ImageBuffer *vkbuf = (ImageBuffer *)bufs[i]->data; in map_buffers()
3591 if (vkbuf->mapped_mem) in map_buffers()
3594 ret = vk->MapMemory(hwctx->act_dev, vkbuf->mem, 0, in map_buffers()
3607 ImageBuffer *vkbuf = (ImageBuffer *)bufs[i]->data; in map_buffers()
3610 .memory = vkbuf->mem, in map_buffers()
3614 /* For host imported memory Vulkan says to use platform-defined in map_buffers()
3617 * host-mapped pointers which are then mapped again using vkMapMemory, in map_buffers()
3620 if (vkbuf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) in map_buffers()
3627 ret = vk->InvalidateMappedMemoryRanges(hwctx->act_dev, invalidate_count, in map_buffers()
3642 AVVulkanDeviceContext *hwctx = ctx->hwctx; in unmap_buffers()
3643 VulkanDevicePriv *p = ctx->internal->priv; in unmap_buffers()
3644 FFVulkanFunctions *vk = &p->vkfn; in unmap_buffers()
3650 ImageBuffer *vkbuf = (ImageBuffer *)bufs[i]->data; in unmap_buffers()
3653 .memory = vkbuf->mem, in unmap_buffers()
3657 if (vkbuf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) in unmap_buffers()
3665 ret = vk->FlushMappedMemoryRanges(hwctx->act_dev, flush_count, flush_ctx); in unmap_buffers()
3674 ImageBuffer *vkbuf = (ImageBuffer *)bufs[i]->data; in unmap_buffers()
3675 if (vkbuf->mapped_mem) in unmap_buffers()
3678 vk->UnmapMemory(hwctx->act_dev, vkbuf->mem); in unmap_buffers()
3690 AVVkFrame *frame = (AVVkFrame *)f->data[0]; in transfer_image_buf()
3691 VulkanFramesPriv *fp = hwfc->internal->priv; in transfer_image_buf()
3692 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in transfer_image_buf()
3693 FFVulkanFunctions *vk = &p->vkfn; in transfer_image_buf()
3702 VulkanExecCtx *ectx = to_buf ? &fp->download_ctx : &fp->upload_ctx; in transfer_image_buf()
3709 .pWaitSemaphoreValues = frame->sem_value, in transfer_image_buf()
3718 .pSignalSemaphores = frame->sem, in transfer_image_buf()
3719 .pWaitSemaphores = frame->sem, in transfer_image_buf()
3726 sem_signal_values[i] = frame->sem_value[i] + 1; in transfer_image_buf()
3741 if ((frame->layout[i] == new_layout) && (frame->access[i] & new_access)) in transfer_image_buf()
3747 img_bar[bar_num].oldLayout = frame->layout[i]; in transfer_image_buf()
3751 img_bar[bar_num].image = frame->img[i]; in transfer_image_buf()
3756 frame->layout[i] = img_bar[bar_num].newLayout; in transfer_image_buf()
3757 frame->access[i] = img_bar[bar_num].dstAccessMask; in transfer_image_buf()
3763 vk->CmdPipelineBarrier(cmd_buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, in transfer_image_buf()
3769 ImageBuffer *vkbuf = (ImageBuffer *)bufs[i]->data; in transfer_image_buf()
3772 .bufferRowLength = buf_stride[i] / desc->comp[i].step, in transfer_image_buf()
3785 vk->CmdCopyImageToBuffer(cmd_buf, frame->img[i], frame->layout[i], in transfer_image_buf()
3786 vkbuf->buf, 1, &buf_reg); in transfer_image_buf()
3788 vk->CmdCopyBufferToImage(cmd_buf, vkbuf->buf, frame->img[i], in transfer_image_buf()
3789 frame->layout[i], 1, &buf_reg); in transfer_image_buf()
3801 if (!f->buf[ref]) in transfer_image_buf()
3803 if ((err = add_buf_dep_exec_ctx(hwfc, ectx, &f->buf[ref], 1))) in transfer_image_buf()
3819 AVVkFrame *f = (AVVkFrame *)vkf->data[0]; in vulkan_transfer_data()
3820 AVHWDeviceContext *dev_ctx = hwfc->device_ctx; in vulkan_transfer_data()
3821 AVVulkanDeviceContext *hwctx = dev_ctx->hwctx; in vulkan_transfer_data()
3822 VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_transfer_data()
3823 FFVulkanFunctions *vk = &p->vkfn; in vulkan_transfer_data()
3830 const int planes = av_pix_fmt_count_planes(swf->format); in vulkan_transfer_data()
3833 const int map_host = !!(p->extensions & FF_VK_EXT_EXTERNAL_HOST_MEMORY); in vulkan_transfer_data()
3835 if ((swf->format != AV_PIX_FMT_NONE && !av_vkfmt_from_pixfmt(swf->format))) { in vulkan_transfer_data()
3840 if (swf->width > hwfc->width || swf->height > hwfc->height) in vulkan_transfer_data()
3844 if (f->tiling == VK_IMAGE_TILING_LINEAR && in vulkan_transfer_data()
3845 f->flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) { in vulkan_transfer_data()
3849 map->format = swf->format; in vulkan_transfer_data()
3878 get_plane_wh(&p_w, &p_h, swf->format, swf->width, swf->height, i); in vulkan_transfer_data()
3880 tmp.linesize[i] = FFABS(swf->linesize[i]); in vulkan_transfer_data()
3883 if (map_host && swf->linesize[i] > 0) { in vulkan_transfer_data()
3885 offs = (uintptr_t)swf->data[i] % p->hprops.minImportedHostPointerAlignment; in vulkan_transfer_data()
3886 import_desc.pHostPointer = swf->data[i] - offs; in vulkan_transfer_data()
3891 p->hprops.minImportedHostPointerAlignment); in vulkan_transfer_data()
3893 ret = vk->GetMemoryHostPointerPropertiesEXT(hwctx->act_dev, in vulkan_transfer_data()
3927 get_plane_wh(&p_w, &p_h, swf->format, swf->width, swf->height, i); in vulkan_transfer_data()
3930 (const uint8_t *)swf->data[i], swf->linesize[i], in vulkan_transfer_data()
3931 FFMIN(tmp.linesize[i], FFABS(swf->linesize[i])), in vulkan_transfer_data()
3941 swf->width, swf->height, swf->format, from); in vulkan_transfer_data()
3952 get_plane_wh(&p_w, &p_h, swf->format, swf->width, swf->height, i); in vulkan_transfer_data()
3954 av_image_copy_plane_uc_from(swf->data[i], swf->linesize[i], in vulkan_transfer_data()
3956 FFMIN(tmp.linesize[i], FFABS(swf->linesize[i])), in vulkan_transfer_data()
3974 av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_transfer_data_to()
3976 switch (src->format) { in vulkan_transfer_data_to()
3980 if ((p->extensions & FF_VK_EXT_EXTERNAL_WIN32_MEMORY) && in vulkan_transfer_data_to()
3981 (p->extensions & FF_VK_EXT_EXTERNAL_WIN32_SEM)) in vulkan_transfer_data_to()
3983 if ((p->extensions & FF_VK_EXT_EXTERNAL_FD_MEMORY) && in vulkan_transfer_data_to()
3984 (p->extensions & FF_VK_EXT_EXTERNAL_FD_SEM)) in vulkan_transfer_data_to()
3989 if (src->hw_frames_ctx) in vulkan_transfer_data_to()
4004 VulkanFramesPriv *fp = hwfc->internal->priv; in vulkan_transfer_data_to_cuda()
4005 const int planes = av_pix_fmt_count_planes(hwfc->sw_format); in vulkan_transfer_data_to_cuda()
4006 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format); in vulkan_transfer_data_to_cuda()
4008 AVHWFramesContext *cuda_fc = (AVHWFramesContext*)dst->hw_frames_ctx->data; in vulkan_transfer_data_to_cuda()
4009 AVHWDeviceContext *cuda_cu = cuda_fc->device_ctx; in vulkan_transfer_data_to_cuda()
4010 AVCUDADeviceContext *cuda_dev = cuda_cu->hwctx; in vulkan_transfer_data_to_cuda()
4011 AVCUDADeviceContextInternal *cu_internal = cuda_dev->internal; in vulkan_transfer_data_to_cuda()
4012 CudaFunctions *cu = cu_internal->cuda_dl; in vulkan_transfer_data_to_cuda()
4016 dst_f = (AVVkFrame *)src->data[0]; in vulkan_transfer_data_to_cuda()
4018 err = prepare_frame(hwfc, &fp->upload_ctx, dst_f, PREP_MODE_EXTERNAL_EXPORT); in vulkan_transfer_data_to_cuda()
4022 err = CHECK_CU(cu->cuCtxPushCurrent(cuda_dev->cuda_ctx)); in vulkan_transfer_data_to_cuda()
4026 err = vulkan_export_to_cuda(hwfc, dst->hw_frames_ctx, src); in vulkan_transfer_data_to_cuda()
4028 CHECK_CU(cu->cuCtxPopCurrent(&dummy)); in vulkan_transfer_data_to_cuda()
4032 dst_int = dst_f->internal; in vulkan_transfer_data_to_cuda()
4035 s_w_par[i].params.fence.value = dst_f->sem_value[i] + 0; in vulkan_transfer_data_to_cuda()
4036 s_s_par[i].params.fence.value = dst_f->sem_value[i] + 1; in vulkan_transfer_data_to_cuda()
4039 err = CHECK_CU(cu->cuWaitExternalSemaphoresAsync(dst_int->cu_sem, s_w_par, in vulkan_transfer_data_to_cuda()
4040 planes, cuda_dev->stream)); in vulkan_transfer_data_to_cuda()
4047 .dstDevice = (CUdeviceptr)dst->data[i], in vulkan_transfer_data_to_cuda()
4048 .dstPitch = dst->linesize[i], in vulkan_transfer_data_to_cuda()
4052 .srcArray = dst_int->cu_array[i], in vulkan_transfer_data_to_cuda()
4056 get_plane_wh(&w, &h, hwfc->sw_format, hwfc->width, hwfc->height, i); in vulkan_transfer_data_to_cuda()
4058 cpy.WidthInBytes = w * desc->comp[i].step; in vulkan_transfer_data_to_cuda()
4061 err = CHECK_CU(cu->cuMemcpy2DAsync(&cpy, cuda_dev->stream)); in vulkan_transfer_data_to_cuda()
4066 err = CHECK_CU(cu->cuSignalExternalSemaphoresAsync(dst_int->cu_sem, s_s_par, in vulkan_transfer_data_to_cuda()
4067 planes, cuda_dev->stream)); in vulkan_transfer_data_to_cuda()
4072 dst_f->sem_value[i]++; in vulkan_transfer_data_to_cuda()
4074 CHECK_CU(cu->cuCtxPopCurrent(&dummy)); in vulkan_transfer_data_to_cuda()
4076 av_log(hwfc, AV_LOG_VERBOSE, "Transfered Vulkan image to CUDA!\n"); in vulkan_transfer_data_to_cuda()
4078 return prepare_frame(hwfc, &fp->upload_ctx, dst_f, PREP_MODE_EXTERNAL_IMPORT); in vulkan_transfer_data_to_cuda()
4081 CHECK_CU(cu->cuCtxPopCurrent(&dummy)); in vulkan_transfer_data_to_cuda()
4083 dst_f->internal = NULL; in vulkan_transfer_data_to_cuda()
4084 av_buffer_unref(&dst->buf[0]); in vulkan_transfer_data_to_cuda()
4092 av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; in vulkan_transfer_data_from()
4094 switch (dst->format) { in vulkan_transfer_data_from()
4098 if ((p->extensions & FF_VK_EXT_EXTERNAL_WIN32_MEMORY) && in vulkan_transfer_data_from()
4099 (p->extensions & FF_VK_EXT_EXTERNAL_WIN32_SEM)) in vulkan_transfer_data_from()
4101 if ((p->extensions & FF_VK_EXT_EXTERNAL_FD_MEMORY) && in vulkan_transfer_data_from()
4102 (p->extensions & FF_VK_EXT_EXTERNAL_FD_SEM)) in vulkan_transfer_data_from()
4107 if (dst->hw_frames_ctx) in vulkan_transfer_data_from()
4127 .name = "Vulkan",