| 355 | } |
| 356 | |
| 357 | int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, |
| 358 | FFVkExecPool *pool, int nb_contexts, |
| 359 | int nb_queries, VkQueryType query_type, int query_64bit, |
| 360 | const void *query_create_pnext) |
| 361 | { |
| 362 | int err; |
| 363 | VkResult ret; |
| 364 | FFVulkanFunctions *vk = &s->vkfn; |
| 365 | |
| 366 | VkCommandPoolCreateInfo cqueue_create; |
| 367 | VkCommandBufferAllocateInfo cbuf_create; |
| 368 | |
| 369 | const VkQueryPoolVideoEncodeFeedbackCreateInfoKHR *ef = NULL; |
| 370 | |
| 371 | atomic_init(&pool->idx, 0); |
| 372 | |
| 373 | if (query_type == VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR) { |
| 374 | ef = ff_vk_find_struct(query_create_pnext, |
| 375 | VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR); |
| 376 | if (!ef) |
| 377 | return AVERROR(EINVAL); |
| 378 | } |
| 379 | |
| 380 | /* Allocate space for command buffer pools */ |
| 381 | pool->cmd_buf_pools = av_malloc(nb_contexts*sizeof(*pool->cmd_buf_pools)); |
| 382 | if (!pool->cmd_buf_pools) { |
| 383 | err = AVERROR(ENOMEM); |
| 384 | goto fail; |
| 385 | } |
| 386 | |
| 387 | /* Allocate space for command buffers */ |
| 388 | pool->cmd_bufs = av_malloc(nb_contexts*sizeof(*pool->cmd_bufs)); |
| 389 | if (!pool->cmd_bufs) { |
| 390 | err = AVERROR(ENOMEM); |
| 391 | goto fail; |
| 392 | } |
| 393 | |
| 394 | for (int i = 0; i < nb_contexts; i++) { |
| 395 | /* Create command pool */ |
| 396 | cqueue_create = (VkCommandPoolCreateInfo) { |
| 397 | .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, |
| 398 | .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | |
| 399 | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, |
| 400 | .queueFamilyIndex = qf->idx, |
| 401 | }; |
| 402 | |
| 403 | ret = vk->CreateCommandPool(s->hwctx->act_dev, &cqueue_create, |
| 404 | s->hwctx->alloc, &pool->cmd_buf_pools[i]); |
| 405 | if (ret != VK_SUCCESS) { |
| 406 | av_log(s, AV_LOG_ERROR, "Command pool creation failure: %s\n", |
| 407 | ff_vk_ret2str(ret)); |
| 408 | err = AVERROR_EXTERNAL; |
| 409 | goto fail; |
| 410 | } |
| 411 | |
| 412 | /* Allocate command buffer */ |
| 413 | cbuf_create = (VkCommandBufferAllocateInfo) { |
| 414 | .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, |