| @@ -280,15 +280,19 @@ void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool) · 279 unmodified lines |
| 280 | 280 | av_freep(&sd->desc_sets); |
| 281 | 281 | } |
| 282 | 282 | |
| 283 | | − if (pool->cmd_bufs) |
| 284 | | − vk->FreeCommandBuffers(s->hwctx->act_dev, pool->cmd_buf_pool, |
| 285 | | − pool->pool_size, pool->cmd_bufs); |
| 286 | | − if (pool->cmd_buf_pool) |
| 287 | | − vk->DestroyCommandPool(s->hwctx->act_dev, pool->cmd_buf_pool, s->hwctx->alloc); |
| 283 | + for (int i = 0; i < pool->pool_size; i++) { |
| 284 | + if (pool->cmd_buf_pools[i]) |
| 285 | + vk->FreeCommandBuffers(s->hwctx->act_dev, pool->cmd_buf_pools[i], |
| 286 | + 1, &pool->cmd_bufs[i]); |
| 287 | + |
| 288 | + if (pool->cmd_buf_pools[i]) |
| 289 | + vk->DestroyCommandPool(s->hwctx->act_dev, pool->cmd_buf_pools[i], s->hwctx->alloc); |
| 290 | + } |
| 288 | 291 | if (pool->query_pool) |
| 289 | 292 | vk->DestroyQueryPool(s->hwctx->act_dev, pool->query_pool, s->hwctx->alloc); |
| 290 | 293 | |
| 291 | 294 | av_free(pool->query_data); |
| 295 | + av_free(pool->cmd_buf_pools); |
| 292 | 296 | av_free(pool->cmd_bufs); |
| 293 | 297 | av_free(pool->contexts); |
| 294 | 298 | } |
| @@ -316,19 +320,10 @@ int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, · 21 unmodified lines |
| 316 | 320 | return AVERROR(EINVAL); |
| 317 | 321 | } |
| 318 | 322 | |
| 319 | | − /* Create command pool */ |
| 320 | | − cqueue_create = (VkCommandPoolCreateInfo) { |
| 321 | | − .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, |
| 322 | | − .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | |
| 323 | | − VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, |
| 324 | | − .queueFamilyIndex = qf->idx, |
| 325 | | − }; |
| 326 | | − ret = vk->CreateCommandPool(s->hwctx->act_dev, &cqueue_create, |
| 327 | | − s->hwctx->alloc, &pool->cmd_buf_pool); |
| 328 | | − if (ret != VK_SUCCESS) { |
| 329 | | − av_log(s, AV_LOG_ERROR, "Command pool creation failure: %s\n", |
| 330 | | − ff_vk_ret2str(ret)); |
| 331 | | − err = AVERROR_EXTERNAL; |
| 323 | + /* Allocate space for command buffer pools */ |
| 324 | + pool->cmd_buf_pools = av_malloc(nb_contexts*sizeof(*pool->cmd_buf_pools)); |
| 325 | + if (!pool->cmd_buf_pools) { |
| 326 | + err = AVERROR(ENOMEM); |
| 332 | 327 | goto fail; |
| 333 | 328 | } |
| 334 | 329 | |
| @@ -339,20 +334,39 @@ int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, · 4 unmodified lines |
| 339 | 334 | goto fail; |
| 340 | 335 | } |
| 341 | 336 | |
| 342 | | − /* Allocate command buffer */ |
| 343 | | − cbuf_create = (VkCommandBufferAllocateInfo) { |
| 344 | | − .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, |
| 345 | | − .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, |
| 346 | | − .commandPool = pool->cmd_buf_pool, |
| 347 | | − .commandBufferCount = nb_contexts, |
| 348 | | − }; |
| 349 | | − ret = vk->AllocateCommandBuffers(s->hwctx->act_dev, &cbuf_create, |
| 350 | | − pool->cmd_bufs); |
| 351 | | − if (ret != VK_SUCCESS) { |
| 352 | | − av_log(s, AV_LOG_ERROR, "Command buffer alloc failure: %s\n", |
| 353 | | − ff_vk_ret2str(ret)); |
| 354 | | − err = AVERROR_EXTERNAL; |
| 355 | | − goto fail; |
| 337 | + for (int i = 0; i < nb_contexts; i++) { |
| 338 | + /* Create command pool */ |
| 339 | + cqueue_create = (VkCommandPoolCreateInfo) { |
| 340 | + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, |
| 341 | + .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | |
| 342 | + VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, |
| 343 | + .queueFamilyIndex = qf->idx, |
| 344 | + }; |
| 345 | + |
| 346 | + ret = vk->CreateCommandPool(s->hwctx->act_dev, &cqueue_create, |
| 347 | + s->hwctx->alloc, &pool->cmd_buf_pools[i]); |
| 348 | + if (ret != VK_SUCCESS) { |
| 349 | + av_log(s, AV_LOG_ERROR, "Command pool creation failure: %s\n", |
| 350 | + ff_vk_ret2str(ret)); |
| 351 | + err = AVERROR_EXTERNAL; |
| 352 | + goto fail; |
| 353 | + } |
| 354 | + |
| 355 | + /* Allocate command buffer */ |
| 356 | + cbuf_create = (VkCommandBufferAllocateInfo) { |
| 357 | + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, |
| 358 | + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, |
| 359 | + .commandPool = pool->cmd_buf_pools[i], |
| 360 | + .commandBufferCount = 1, |
| 361 | + }; |
| 362 | + ret = vk->AllocateCommandBuffers(s->hwctx->act_dev, &cbuf_create, |
| 363 | + &pool->cmd_bufs[i]); |
| 364 | + if (ret != VK_SUCCESS) { |
| 365 | + av_log(s, AV_LOG_ERROR, "Command buffer alloc failure: %s\n", |
| 366 | + ff_vk_ret2str(ret)); |
| 367 | + err = AVERROR_EXTERNAL; |
| 368 | + goto fail; |
| 369 | + } |
| 356 | 370 | } |
| 357 | 371 | |
| 358 | 372 | /* Query pool */ |