From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id C89464B6FC for ; Thu, 18 Jul 2024 08:13:48 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A6D9B68D97D; Thu, 18 Jul 2024 11:13:45 +0300 (EEST) Received: from vidala.lynne.ee (vidala.pars.ee [116.203.72.101]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E0AAD68D8EC for ; Thu, 18 Jul 2024 11:13:39 +0300 (EEST) To: ffmpeg-devel@ffmpeg.org Date: Thu, 18 Jul 2024 10:13:29 +0200 Message-ID: <20240718081337.1374330-1-dev@lynne.ee> X-Mailer: git-send-email 2.45.2.753.g447d99e1c3b MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] vulkan_video: remove NIH pooled buffer implementation X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Lynne via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: Lynne Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: The code predates ff_vk_get_pooled_buffer(). --- libavcodec/vulkan_decode.c | 47 +++++++++++++++------- libavcodec/vulkan_decode.h | 2 + libavcodec/vulkan_video.c | 82 -------------------------------------- libavcodec/vulkan_video.h | 7 ---- 4 files changed, 34 insertions(+), 104 deletions(-) diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c index d8c75cd0e6..d871d46772 100644 --- a/libavcodec/vulkan_decode.c +++ b/libavcodec/vulkan_decode.c @@ -260,7 +260,7 @@ int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp, const int nb = *nb_slices; uint8_t *slices; uint32_t *slice_off; - FFVkVideoBuffer *vkbuf; + FFVkBuffer *vkbuf; size_t new_size = vp->slices_size + startcode_len + size + ctx->caps.minBitstreamBufferSizeAlignment; @@ -274,29 +274,44 @@ int ff_vk_decode_add_slice(AVCodecContext *avctx, FFVulkanDecodePicture *vp, *offsets = dec->slice_off = slice_off; slice_off[nb] = vp->slices_size; - vkbuf = vp->slices_buf ? (FFVkVideoBuffer *)vp->slices_buf->data : NULL; - if (!vkbuf || vkbuf->buf.size < new_size) { + vkbuf = vp->slices_buf ? (FFVkBuffer *)vp->slices_buf->data : NULL; + if (!vkbuf || vkbuf->size < new_size) { int err; AVBufferRef *new_ref; - FFVkVideoBuffer *new_buf; - err = ff_vk_video_get_buffer(&ctx->s, &ctx->common, &new_ref, - VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR, - ctx->s.hwfc->create_pnext, new_size); + FFVkBuffer *new_buf; + + /* No point in requesting anything smaller. */ + size_t buf_size = FFMAX(new_size, 1024*1024); + + /* Align buffer to nearest power of two. Makes fragmentation management + * easier, and gives us ample headroom. */ + buf_size--; + buf_size |= buf_size >> 1; + buf_size |= buf_size >> 2; + buf_size |= buf_size >> 4; + buf_size |= buf_size >> 8; + buf_size |= buf_size >> 16; + buf_size++; + + err = ff_vk_get_pooled_buffer(&ctx->s, &ctx->buf_pool, &new_ref, + VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR, + ctx->s.hwfc->create_pnext, buf_size, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); if (err < 0) return err; - new_buf = (FFVkVideoBuffer *)new_ref->data; + new_buf = (FFVkBuffer *)new_ref->data; /* Copy data from the old buffer */ if (vkbuf) { - memcpy(new_buf->mem, vkbuf->mem, vp->slices_size); + memcpy(new_buf->mapped_mem, vkbuf->mapped_mem, vp->slices_size); av_buffer_unref(&vp->slices_buf); } vp->slices_buf = new_ref; vkbuf = new_buf; } - slices = vkbuf->mem; + slices = vkbuf->mapped_mem; /* Startcode */ memcpy(slices + vp->slices_size, startcode_prefix, startcode_len); @@ -347,7 +362,7 @@ int ff_vk_decode_frame(AVCodecContext *avctx, int err; VkResult ret; VkCommandBuffer cmd_buf; - FFVkVideoBuffer *sd_buf; + FFVkBuffer *sd_buf; FFVulkanDecodeContext *dec = avctx->internal->hwaccel_priv_data; FFVulkanDecodeShared *ctx = dec->shared_ctx; @@ -400,13 +415,13 @@ int ff_vk_decode_frame(AVCodecContext *avctx, "Result of previous frame decoding: %"PRId64"\n", prev_sub_res); } - sd_buf = (FFVkVideoBuffer *)vp->slices_buf->data; + sd_buf = (FFVkBuffer *)vp->slices_buf->data; /* Flush if needed */ - if (!(sd_buf->buf.flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { + if (!(sd_buf->flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)) { VkMappedMemoryRange flush_buf = { .sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, - .memory = sd_buf->buf.mem, + .memory = sd_buf->mem, .offset = 0, .size = FFALIGN(vp->slices_size, ctx->s.props.properties.limits.nonCoherentAtomSize), @@ -420,7 +435,7 @@ int ff_vk_decode_frame(AVCodecContext *avctx, } } - vp->decode_info.srcBuffer = sd_buf->buf.buf; + vp->decode_info.srcBuffer = sd_buf->buf; vp->decode_info.srcBufferOffset = 0; vp->decode_info.srcBufferRange = data_size; @@ -621,6 +636,8 @@ static void free_common(FFRefStructOpaque unused, void *obj) ctx->empty_session_params, s->hwctx->alloc); + av_buffer_pool_uninit(&ctx->buf_pool); + ff_vk_video_common_uninit(s, &ctx->common); if (ctx->yuv_sampler) diff --git a/libavcodec/vulkan_decode.h b/libavcodec/vulkan_decode.h index 076af93499..c181277cdc 100644 --- a/libavcodec/vulkan_decode.h +++ b/libavcodec/vulkan_decode.h @@ -48,6 +48,8 @@ typedef struct FFVulkanDecodeShared { FFVkVideoCommon common; FFVkQueueFamilyCtx qf; + AVBufferPool *buf_pool; + VkVideoCapabilitiesKHR caps; VkVideoDecodeCapabilitiesKHR dec_caps; diff --git a/libavcodec/vulkan_video.c b/libavcodec/vulkan_video.c index 412ae9b61e..f2a15d392e 100644 --- a/libavcodec/vulkan_video.c +++ b/libavcodec/vulkan_video.c @@ -177,86 +177,6 @@ int ff_vk_h265_level_to_av(StdVideoH265LevelIdc level) } } -static void free_data_buf(void *opaque, uint8_t *data) -{ - FFVulkanContext *ctx = opaque; - FFVkVideoBuffer *buf = (FFVkVideoBuffer *)data; - ff_vk_unmap_buffer(ctx, &buf->buf, 0); - ff_vk_free_buf(ctx, &buf->buf); - av_free(data); -} - -static AVBufferRef *alloc_data_buf(void *opaque, size_t size) -{ - AVBufferRef *ref; - uint8_t *buf = av_mallocz(size); - if (!buf) - return NULL; - - ref = av_buffer_create(buf, size, free_data_buf, opaque, 0); - if (!ref) - av_free(buf); - return ref; -} - -int ff_vk_video_get_buffer(FFVulkanContext *ctx, FFVkVideoCommon *s, - AVBufferRef **buf, VkBufferUsageFlags usage, - void *create_pNext, size_t size) -{ - int err; - AVBufferRef *ref; - FFVkVideoBuffer *data; - - if (!s->buf_pool) { - s->buf_pool = av_buffer_pool_init2(sizeof(FFVkVideoBuffer), ctx, - alloc_data_buf, NULL); - if (!s->buf_pool) - return AVERROR(ENOMEM); - } - - *buf = ref = av_buffer_pool_get(s->buf_pool); - if (!ref) - return AVERROR(ENOMEM); - - data = (FFVkVideoBuffer *)ref->data; - - if (data->buf.size >= size) - return 0; - - /* No point in requesting anything smaller. */ - size = FFMAX(size, 1024*1024); - - /* Align buffer to nearest power of two. Makes fragmentation management - * easier, and gives us ample headroom. */ - size--; - size |= size >> 1; - size |= size >> 2; - size |= size >> 4; - size |= size >> 8; - size |= size >> 16; - size++; - - ff_vk_free_buf(ctx, &data->buf); - memset(data, 0, sizeof(FFVkVideoBuffer)); - - err = ff_vk_create_buf(ctx, &data->buf, size, - create_pNext, NULL, usage, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); - if (err < 0) { - av_buffer_unref(&ref); - return err; - } - - /* Map the buffer */ - err = ff_vk_map_buffer(ctx, &data->buf, &data->mem, 0); - if (err < 0) { - av_buffer_unref(&ref); - return err; - } - - return 0; -} - av_cold void ff_vk_video_common_uninit(FFVulkanContext *s, FFVkVideoCommon *common) { @@ -273,8 +193,6 @@ av_cold void ff_vk_video_common_uninit(FFVulkanContext *s, vk->FreeMemory(s->hwctx->act_dev, common->mem[i], s->hwctx->alloc); av_freep(&common->mem); - - av_buffer_pool_uninit(&common->buf_pool); } av_cold int ff_vk_video_common_init(void *log, FFVulkanContext *s, diff --git a/libavcodec/vulkan_video.h b/libavcodec/vulkan_video.h index 01a1de7d9d..1f895c21fa 100644 --- a/libavcodec/vulkan_video.h +++ b/libavcodec/vulkan_video.h @@ -32,8 +32,6 @@ typedef struct FFVkVideoSession { VkVideoSessionKHR session; VkDeviceMemory *mem; uint32_t nb_mem; - - AVBufferPool *buf_pool; } FFVkVideoCommon; /** @@ -63,11 +61,6 @@ VkVideoComponentBitDepthFlagBitsKHR ff_vk_depth_from_av_depth(int depth); int ff_vk_h264_level_to_av(StdVideoH264LevelIdc level); int ff_vk_h265_level_to_av(StdVideoH265LevelIdc level); -typedef struct FFVkVideoBuffer { - FFVkBuffer buf; - uint8_t *mem; -} FFVkVideoBuffer; - /** * Get a mapped FFVkPooledBuffer with a specific guaranteed minimum size * from a pool. -- 2.45.2.753.g447d99e1c3b _______________________________________________ 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".