From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <ffmpeg-devel-bounces@ffmpeg.org> Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 792D44D2BA for <ffmpegdev@gitmailbox.com>; Wed, 16 Apr 2025 13:26:26 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BF6DB687D66; Wed, 16 Apr 2025 16:26:21 +0300 (EEST) Received: from vidala.pars.ee (vidala.pars.ee [116.203.72.101]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8DD8F687CEA for <ffmpeg-devel@ffmpeg.org>; Wed, 16 Apr 2025 16:26:14 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; s=202405r; d=lynne.ee; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1744809973; bh=HWVQYKO8wCqITIRinuxhWl6 sH5GVyOJqgRsDmSioU9A=; b=Xilphd5OqQE+1ax8ProZSE2ntN8gziRpJONH68Zqfw5Pivfh04 TvH7sxo9dFw1mCxJlgUFKoCxrJXVVIPDvqQHrR0NV94DifxC/Px+RETp2VMrxd9rXo1CQ9OiKyU k1b09twOsBd2ib+wKuNi14L5/7qzAFyDSjyeOqlCj2BJw0NkNZRUkABxhiebKNBhQRam8lUeoNo /a3CQaO452CU+7t6dAYz03uhK4Xl2GT6lBU7YUZ6SN9KF7aEmOYUACf5EuP//KNv1bSdl655u4O DWoIHQcdA2LZoHE4vQmZI6c863vrNWwIFaGo3p+XZgiYXFjLZM1JfPRx1K/Rn63KvVQ==; DKIM-Signature: v=1; a=ed25519-sha256; s=202405e; d=lynne.ee; c=relaxed/relaxed; h=Message-ID:Date:Subject:To:From; t=1744809973; bh=HWVQYKO8wCqITIRinuxhWl6 sH5GVyOJqgRsDmSioU9A=; b=uK7dqiYlmASETekgs11q/8Q/Xtnjev/4MDQG/E+3Zy28IHI8Zn T+RHmifUTCI/Eudx7s5F5531kyeEDEQ7yEBg==; From: Lynne <dev@lynne.ee> To: ffmpeg-devel@ffmpeg.org Date: Wed, 16 Apr 2025 15:26:06 +0200 Message-ID: <20250416132612.19085-1-dev@lynne.ee> X-Mailer: git-send-email 2.49.0.395.g12beb8f557c MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] vulkan: use a single command buffer per command buffer pool X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches <ffmpeg-devel.ffmpeg.org> List-Unsubscribe: <https://ffmpeg.org/mailman/options/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=unsubscribe> List-Archive: <https://ffmpeg.org/pipermail/ffmpeg-devel> List-Post: <mailto:ffmpeg-devel@ffmpeg.org> List-Help: <mailto:ffmpeg-devel-request@ffmpeg.org?subject=help> List-Subscribe: <https://ffmpeg.org/mailman/listinfo/ffmpeg-devel>, <mailto:ffmpeg-devel-request@ffmpeg.org?subject=subscribe> Reply-To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Cc: Lynne <dev@lynne.ee> Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" <ffmpeg-devel-bounces@ffmpeg.org> Archived-At: <https://master.gitmailbox.com/ffmpegdev/20250416132612.19085-1-dev@lynne.ee/> List-Archive: <https://master.gitmailbox.com/ffmpegdev/> List-Post: <mailto:ffmpegdev@gitmailbox.com> We violated the spec, which, despite the actual command buffer pool *not* being involved in any functions which require external synchronization of the pool, *require* external synchronization even if only the command buffers are used. This also has the effect of *significantly* speeding up execution in case command buffers are contended. --- libavutil/hwcontext_vulkan.c | 1 - libavutil/vulkan.c | 78 +++++++++++++++++++++--------------- libavutil/vulkan.h | 2 +- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 32203b2f06..d7822d4629 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -673,7 +673,6 @@ static VkBool32 VKAPI_CALL vk_dbg_callback(VkDebugUtilsMessageSeverityFlagBitsEX case 0xfd92477a: /* BestPractices-vkAllocateMemory-small-allocation */ case 0x618ab1e7: /* VUID-VkImageViewCreateInfo-usage-02275 */ case 0x30f4ac70: /* VUID-VkImageCreateInfo-pNext-06811 */ - case 0xa05b236e: /* UNASSIGNED-Threading-MultipleThreads-Write */ return VK_FALSE; default: break; diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index d880d52272..8f444b2dfe 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -280,15 +280,19 @@ void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool) av_freep(&sd->desc_sets); } - if (pool->cmd_bufs) - vk->FreeCommandBuffers(s->hwctx->act_dev, pool->cmd_buf_pool, - pool->pool_size, pool->cmd_bufs); - if (pool->cmd_buf_pool) - vk->DestroyCommandPool(s->hwctx->act_dev, pool->cmd_buf_pool, s->hwctx->alloc); + for (int i = 0; i < pool->pool_size; i++) { + if (pool->cmd_buf_pools[i]) + vk->FreeCommandBuffers(s->hwctx->act_dev, pool->cmd_buf_pools[i], + 1, &pool->cmd_bufs[i]); + + if (pool->cmd_buf_pools[i]) + vk->DestroyCommandPool(s->hwctx->act_dev, pool->cmd_buf_pools[i], s->hwctx->alloc); + } if (pool->query_pool) vk->DestroyQueryPool(s->hwctx->act_dev, pool->query_pool, s->hwctx->alloc); av_free(pool->query_data); + av_free(pool->cmd_buf_pools); av_free(pool->cmd_bufs); av_free(pool->contexts); } @@ -316,19 +320,10 @@ int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, return AVERROR(EINVAL); } - /* Create command pool */ - cqueue_create = (VkCommandPoolCreateInfo) { - .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, - .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | - VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, - .queueFamilyIndex = qf->idx, - }; - ret = vk->CreateCommandPool(s->hwctx->act_dev, &cqueue_create, - s->hwctx->alloc, &pool->cmd_buf_pool); - if (ret != VK_SUCCESS) { - av_log(s, AV_LOG_ERROR, "Command pool creation failure: %s\n", - ff_vk_ret2str(ret)); - err = AVERROR_EXTERNAL; + /* Allocate space for command buffer pools */ + pool->cmd_buf_pools = av_malloc(nb_contexts*sizeof(*pool->cmd_buf_pools)); + if (!pool->cmd_buf_pools) { + err = AVERROR(ENOMEM); goto fail; } @@ -339,20 +334,39 @@ int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, goto fail; } - /* Allocate command buffer */ - cbuf_create = (VkCommandBufferAllocateInfo) { - .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, - .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, - .commandPool = pool->cmd_buf_pool, - .commandBufferCount = nb_contexts, - }; - ret = vk->AllocateCommandBuffers(s->hwctx->act_dev, &cbuf_create, - pool->cmd_bufs); - if (ret != VK_SUCCESS) { - av_log(s, AV_LOG_ERROR, "Command buffer alloc failure: %s\n", - ff_vk_ret2str(ret)); - err = AVERROR_EXTERNAL; - goto fail; + for (int i = 0; i < nb_contexts; i++) { + /* Create command pool */ + cqueue_create = (VkCommandPoolCreateInfo) { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | + VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, + .queueFamilyIndex = qf->idx, + }; + + ret = vk->CreateCommandPool(s->hwctx->act_dev, &cqueue_create, + s->hwctx->alloc, &pool->cmd_buf_pools[i]); + if (ret != VK_SUCCESS) { + av_log(s, AV_LOG_ERROR, "Command pool creation failure: %s\n", + ff_vk_ret2str(ret)); + err = AVERROR_EXTERNAL; + goto fail; + } + + /* Allocate command buffer */ + cbuf_create = (VkCommandBufferAllocateInfo) { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandPool = pool->cmd_buf_pools[i], + .commandBufferCount = 1, + }; + ret = vk->AllocateCommandBuffers(s->hwctx->act_dev, &cbuf_create, + &pool->cmd_bufs[i]); + if (ret != VK_SUCCESS) { + av_log(s, AV_LOG_ERROR, "Command buffer alloc failure: %s\n", + ff_vk_ret2str(ret)); + err = AVERROR_EXTERNAL; + goto fail; + } } /* Query pool */ diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h index 4ea68e3ecc..2fb7f7c2de 100644 --- a/libavutil/vulkan.h +++ b/libavutil/vulkan.h @@ -253,7 +253,7 @@ typedef struct FFVkExecPool { FFVkExecContext *contexts; atomic_uint_least64_t idx; - VkCommandPool cmd_buf_pool; + VkCommandPool *cmd_buf_pools; VkCommandBuffer *cmd_bufs; int pool_size; -- 2.47.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".