diff mbox series

[FFmpeg-devel,12/23] avutil/hwcontext_vulkan: Allocate pub and priv frames hwctx together

Message ID DU0P250MB07474E4BBA78A00629D7E87F8F482@DU0P250MB0747.EURP250.PROD.OUTLOOK.COM
State Accepted
Commit e70e9b655426aacbfa6146f94591fed20e4ce18d
Headers show
Series [FFmpeg-devel,01/23] avutil/hwcontext_opencl: Use proper OpenCLFramesContext | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 fail Make fate failed
andriy/make_x86 success Make finished
andriy/make_fate_x86 fail Make fate failed

Commit Message

Andreas Rheinhardt Feb. 12, 2024, 12:03 a.m. UTC
This is possible because the lifetime of both coincide.
Besides reducing the number of allocations this also simplifies
access to VulkanFramesPriv as one no longer has to
go through AVHWFramesInternal.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavutil/hwcontext_vulkan.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)
diff mbox series

Patch

diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 3d591dedf9..449a6a2fef 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -129,6 +129,11 @@  typedef struct VulkanDevicePriv {
 } VulkanDevicePriv;
 
 typedef struct VulkanFramesPriv {
+    /**
+     * The public AVVulkanFramesContext. See hwcontext_vulkan.h for it.
+     */
+    AVVulkanFramesContext p;
+
     /* Image conversions */
     FFVkExecPool compute_exec;
 
@@ -2191,9 +2196,9 @@  static AVBufferRef *vulkan_pool_alloc(void *opaque, size_t size)
     AVVkFrame *f;
     AVBufferRef *avbuf = NULL;
     AVHWFramesContext *hwfc = opaque;
-    AVVulkanFramesContext *hwctx = hwfc->hwctx;
     VulkanDevicePriv *p = hwfc->device_ctx->hwctx;
-    VulkanFramesPriv *fp = hwfc->internal->priv;
+    VulkanFramesPriv *fp = hwfc->hwctx;
+    AVVulkanFramesContext *hwctx = &fp->p;
     VkExternalMemoryHandleTypeFlags e = 0x0;
     VkExportMemoryAllocateInfo eminfo[AV_NUM_DATA_POINTERS];
 
@@ -2264,7 +2269,7 @@  static void unlock_frame(AVHWFramesContext *fc, AVVkFrame *vkf)
 static void vulkan_frames_uninit(AVHWFramesContext *hwfc)
 {
     VulkanDevicePriv *p = hwfc->device_ctx->hwctx;
-    VulkanFramesPriv *fp = hwfc->internal->priv;
+    VulkanFramesPriv *fp = hwfc->hwctx;
 
     if (fp->modifier_info) {
         if (fp->modifier_info->pDrmFormatModifiers)
@@ -2281,8 +2286,8 @@  static int vulkan_frames_init(AVHWFramesContext *hwfc)
 {
     int err;
     AVVkFrame *f;
-    AVVulkanFramesContext *hwctx = hwfc->hwctx;
-    VulkanFramesPriv *fp = hwfc->internal->priv;
+    VulkanFramesPriv *fp = hwfc->hwctx;
+    AVVulkanFramesContext *hwctx = &fp->p;
     VulkanDevicePriv *p = hwfc->device_ctx->hwctx;
     VkImageUsageFlagBits supported_usage;
     const struct FFVkFormatEntry *fmt;
@@ -2493,7 +2498,7 @@  static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **f
     VulkanDevicePriv *p = ctx->hwctx;
     AVVulkanDeviceContext *hwctx = &p->p;
     FFVulkanFunctions *vk = &p->vkctx.vkfn;
-    VulkanFramesPriv *fp = hwfc->internal->priv;
+    VulkanFramesPriv *fp = hwfc->hwctx;
     const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor *)src->data[0];
     VkBindImageMemoryInfo bind_info[AV_DRM_MAX_PLANES];
     VkBindImagePlaneMemoryInfo plane_info[AV_DRM_MAX_PLANES];
@@ -3004,7 +3009,7 @@  static int vulkan_transfer_data_from_cuda(AVHWFramesContext *hwfc,
     CUcontext dummy;
     AVVkFrame *dst_f;
     AVVkFrameInternal *dst_int;
-    VulkanFramesPriv *fp = hwfc->internal->priv;
+    VulkanFramesPriv *fp = hwfc->hwctx;
     const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format);
 
@@ -3146,8 +3151,8 @@  static int vulkan_map_to_drm(AVHWFramesContext *hwfc, AVFrame *dst,
     VulkanDevicePriv *p = hwfc->device_ctx->hwctx;
     AVVulkanDeviceContext *hwctx = &p->p;
     FFVulkanFunctions *vk = &p->vkctx.vkfn;
-    VulkanFramesPriv *fp = hwfc->internal->priv;
-    AVVulkanFramesContext *hwfctx = hwfc->hwctx;
+    VulkanFramesPriv *fp = hwfc->hwctx;
+    AVVulkanFramesContext *hwfctx = &fp->p;
     const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
     VkImageDrmFormatModifierPropertiesEXT drm_mod = {
         .sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
@@ -3317,7 +3322,7 @@  static int transfer_image_buf(AVHWFramesContext *hwfc, AVFrame *f,
 {
     int err;
     AVVkFrame *frame = (AVVkFrame *)f->data[0];
-    VulkanFramesPriv *fp = hwfc->internal->priv;
+    VulkanFramesPriv *fp = hwfc->hwctx;
     VulkanDevicePriv *p = hwfc->device_ctx->hwctx;
     FFVulkanFunctions *vk = &p->vkctx.vkfn;
     VkImageMemoryBarrier2 img_bar[AV_NUM_DATA_POINTERS];
@@ -3580,7 +3585,7 @@  static int vulkan_transfer_data_to_cuda(AVHWFramesContext *hwfc, AVFrame *dst,
     CUcontext dummy;
     AVVkFrame *dst_f;
     AVVkFrameInternal *dst_int;
-    VulkanFramesPriv *fp = hwfc->internal->priv;
+    VulkanFramesPriv *fp = hwfc->hwctx;
     const int planes = av_pix_fmt_count_planes(hwfc->sw_format);
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format);
 
@@ -3723,8 +3728,7 @@  const HWContextType ff_hwcontext_type_vulkan = {
     .name                   = "Vulkan",
 
     .device_hwctx_size      = sizeof(VulkanDevicePriv),
-    .frames_hwctx_size      = sizeof(AVVulkanFramesContext),
-    .frames_priv_size       = sizeof(VulkanFramesPriv),
+    .frames_hwctx_size      = sizeof(VulkanFramesPriv),
 
     .device_init            = &vulkan_device_init,
     .device_uninit          = &vulkan_device_uninit,