From f8086c6472c8cced75189f2d81fd7322311da100 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Thu, 7 Aug 2025 11:24:18 -0400 Subject: [PATCH] vulkan/video: Switch vk_video_session_parameters to create/destroy These are never created on the stack or deep inside other objects so it makes sense to use create/destroy instead of init/finish. Reviewed-by: Dave Airlie Reviewed-by: Hyunjun Ko Reviewed-by: David Rosca Part-of: --- src/amd/vulkan/radv_video.c | 14 ++----- src/intel/vulkan/anv_video.c | 19 +++------ src/vulkan/runtime/vk_video.c | 72 +++++++++++++++++------------------ src/vulkan/runtime/vk_video.h | 16 ++++---- 4 files changed, 55 insertions(+), 66 deletions(-) diff --git a/src/amd/vulkan/radv_video.c b/src/amd/vulkan/radv_video.c index 1266213a2ea..ec16d1f13d3 100644 --- a/src/amd/vulkan/radv_video.c +++ b/src/amd/vulkan/radv_video.c @@ -647,18 +647,13 @@ radv_CreateVideoSessionParametersKHR(VkDevice _device, const VkVideoSessionParam VK_FROM_HANDLE(radv_video_session_params, templ, pCreateInfo->videoSessionParametersTemplate); const struct radv_physical_device *pdev = radv_device_physical(device); const struct radv_instance *instance = radv_physical_device_instance(pdev); + struct radv_video_session_params *params = - vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*params), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + vk_video_session_parameters_create(&device->vk, &vid->vk, templ ? &templ->vk : NULL, + pCreateInfo, pAllocator, sizeof(*params)); if (!params) return vk_error(instance, VK_ERROR_OUT_OF_HOST_MEMORY); - VkResult result = - vk_video_session_parameters_init(&device->vk, ¶ms->vk, &vid->vk, templ ? &templ->vk : NULL, pCreateInfo); - if (result != VK_SUCCESS) { - vk_free2(&device->vk.alloc, pAllocator, params); - return result; - } - radv_video_patch_session_parameters(device, ¶ms->vk); *pVideoSessionParameters = radv_video_session_params_to_handle(params); @@ -672,8 +667,7 @@ radv_DestroyVideoSessionParametersKHR(VkDevice _device, VkVideoSessionParameters VK_FROM_HANDLE(radv_device, device, _device); VK_FROM_HANDLE(radv_video_session_params, params, _params); - vk_video_session_parameters_finish(&device->vk, ¶ms->vk); - vk_free2(&device->vk.alloc, pAllocator, params); + vk_video_session_parameters_destroy(&device->vk, pAllocator, ¶ms->vk); } static VkResult diff --git a/src/intel/vulkan/anv_video.c b/src/intel/vulkan/anv_video.c index 2cd13b24fa0..0201810086a 100644 --- a/src/intel/vulkan/anv_video.c +++ b/src/intel/vulkan/anv_video.c @@ -77,21 +77,15 @@ anv_CreateVideoSessionParametersKHR(VkDevice _device, ANV_FROM_HANDLE(anv_device, device, _device); ANV_FROM_HANDLE(anv_video_session, vid, pCreateInfo->videoSession); ANV_FROM_HANDLE(anv_video_session_params, templ, pCreateInfo->videoSessionParametersTemplate); + struct anv_video_session_params *params = - vk_alloc2(&device->vk.alloc, pAllocator, sizeof(*params), 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + vk_video_session_parameters_create(&device->vk, &vid->vk, + templ ? &templ->vk : NULL, + pCreateInfo, pAllocator, + sizeof(*params)); if (!params) return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); - VkResult result = vk_video_session_parameters_init(&device->vk, - ¶ms->vk, - &vid->vk, - templ ? &templ->vk : NULL, - pCreateInfo); - if (result != VK_SUCCESS) { - vk_free2(&device->vk.alloc, pAllocator, params); - return result; - } - *pVideoSessionParameters = anv_video_session_params_to_handle(params); return VK_SUCCESS; } @@ -105,8 +99,7 @@ anv_DestroyVideoSessionParametersKHR(VkDevice _device, ANV_FROM_HANDLE(anv_video_session_params, params, _params); if (!_params) return; - vk_video_session_parameters_finish(&device->vk, ¶ms->vk); - vk_free2(&device->vk.alloc, pAllocator, params); + vk_video_session_parameters_destroy(&device->vk, pAllocator, ¶ms->vk); } VkResult diff --git a/src/vulkan/runtime/vk_video.c b/src/vulkan/runtime/vk_video.c index b54b82f7126..25ce1909f9e 100644 --- a/src/vulkan/runtime/vk_video.c +++ b/src/vulkan/runtime/vk_video.c @@ -451,15 +451,19 @@ vk_video_deep_copy_av1_seq_hdr(struct vk_video_av1_seq_hdr *dst, } } -VkResult -vk_video_session_parameters_init(struct vk_device *device, - struct vk_video_session_parameters *params, - const struct vk_video_session *vid, - const struct vk_video_session_parameters *templ, - const VkVideoSessionParametersCreateInfoKHR *create_info) +void * +vk_video_session_parameters_create(struct vk_device *device, + const struct vk_video_session *vid, + const struct vk_video_session_parameters *templ, + const VkVideoSessionParametersCreateInfoKHR *create_info, + const VkAllocationCallbacks *alloc, + size_t size) { - memset(params, 0, sizeof(*params)); - vk_object_base_init(device, ¶ms->base, VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR); + struct vk_video_session_parameters *params = + vk_object_zalloc(device, alloc, size, + VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR); + if (params == NULL) + return NULL; params->op = vid->op; params->luma_bit_depth = vid->luma_bit_depth; @@ -479,9 +483,8 @@ vk_video_session_parameters_init(struct vk_device *device, params->h264_dec.h264_sps = vk_alloc(&device->alloc, sps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); params->h264_dec.h264_pps = vk_alloc(&device->alloc, pps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!params->h264_dec.h264_sps || !params->h264_dec.h264_pps) { - vk_free(&device->alloc, params->h264_dec.h264_sps); - vk_free(&device->alloc, params->h264_dec.h264_pps); - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + vk_video_session_parameters_destroy(device, alloc, params); + return NULL; } init_add_h264_dec_session_parameters(params, h264_create->pParametersAddInfo, templ); @@ -503,10 +506,8 @@ vk_video_session_parameters_init(struct vk_device *device, params->h265_dec.h265_sps = vk_alloc(&device->alloc, sps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); params->h265_dec.h265_pps = vk_alloc(&device->alloc, pps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!params->h265_dec.h265_sps || !params->h265_dec.h265_pps || !params->h265_dec.h265_vps) { - vk_free(&device->alloc, params->h265_dec.h265_vps); - vk_free(&device->alloc, params->h265_dec.h265_sps); - vk_free(&device->alloc, params->h265_dec.h265_pps); - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + vk_video_session_parameters_destroy(device, alloc, params); + return NULL; } init_add_h265_dec_session_parameters(params, h265_create->pParametersAddInfo, templ); @@ -537,9 +538,8 @@ vk_video_session_parameters_init(struct vk_device *device, params->h264_enc.h264_sps = vk_alloc(&device->alloc, sps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); params->h264_enc.h264_pps = vk_alloc(&device->alloc, pps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!params->h264_enc.h264_sps || !params->h264_enc.h264_pps) { - vk_free(&device->alloc, params->h264_enc.h264_sps); - vk_free(&device->alloc, params->h264_enc.h264_pps); - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + vk_video_session_parameters_destroy(device, alloc, params); + return NULL; } params->h264_enc.profile_idc = vid->h264.profile_idc; @@ -562,10 +562,8 @@ vk_video_session_parameters_init(struct vk_device *device, params->h265_enc.h265_sps = vk_alloc(&device->alloc, sps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); params->h265_enc.h265_pps = vk_alloc(&device->alloc, pps_size, 8, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!params->h265_enc.h265_sps || !params->h265_enc.h265_pps || !params->h265_enc.h265_vps) { - vk_free(&device->alloc, params->h265_enc.h265_vps); - vk_free(&device->alloc, params->h265_enc.h265_sps); - vk_free(&device->alloc, params->h265_enc.h265_pps); - return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY); + vk_video_session_parameters_destroy(device, alloc, params); + return NULL; } init_add_h265_enc_session_parameters(params, h265_create->pParametersAddInfo, templ); @@ -584,36 +582,38 @@ vk_video_session_parameters_init(struct vk_device *device, UNREACHABLE("Unsupported video codec operation"); break; } - return VK_SUCCESS; + + return params; } void -vk_video_session_parameters_finish(struct vk_device *device, - struct vk_video_session_parameters *params) +vk_video_session_parameters_destroy(struct vk_device *device, + const VkAllocationCallbacks *alloc, + struct vk_video_session_parameters *params) { switch (params->op) { case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR: - vk_free(&device->alloc, params->h264_dec.h264_sps); - vk_free(&device->alloc, params->h264_dec.h264_pps); + vk_free2(&device->alloc, alloc, params->h264_dec.h264_sps); + vk_free2(&device->alloc, alloc, params->h264_dec.h264_pps); break; case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR: - vk_free(&device->alloc, params->h265_dec.h265_vps); - vk_free(&device->alloc, params->h265_dec.h265_sps); - vk_free(&device->alloc, params->h265_dec.h265_pps); + vk_free2(&device->alloc, alloc, params->h265_dec.h265_vps); + vk_free2(&device->alloc, alloc, params->h265_dec.h265_sps); + vk_free2(&device->alloc, alloc, params->h265_dec.h265_pps); break; case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: - vk_free(&device->alloc, params->h264_enc.h264_sps); - vk_free(&device->alloc, params->h264_enc.h264_pps); + vk_free2(&device->alloc, alloc, params->h264_enc.h264_sps); + vk_free2(&device->alloc, alloc, params->h264_enc.h264_pps); break; case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: - vk_free(&device->alloc, params->h265_enc.h265_vps); - vk_free(&device->alloc, params->h265_enc.h265_sps); - vk_free(&device->alloc, params->h265_enc.h265_pps); + vk_free2(&device->alloc, alloc, params->h265_enc.h265_vps); + vk_free2(&device->alloc, alloc, params->h265_enc.h265_sps); + vk_free2(&device->alloc, alloc, params->h265_enc.h265_pps); break; default: break; } - vk_object_base_finish(¶ms->base); + vk_object_free(device, alloc, params); } static VkResult diff --git a/src/vulkan/runtime/vk_video.h b/src/vulkan/runtime/vk_video.h index 75c7ed81030..2f272015bbc 100644 --- a/src/vulkan/runtime/vk_video.h +++ b/src/vulkan/runtime/vk_video.h @@ -181,17 +181,19 @@ VkResult vk_video_session_init(struct vk_device *device, struct vk_video_session *vid, const VkVideoSessionCreateInfoKHR *create_info); -VkResult vk_video_session_parameters_init(struct vk_device *device, - struct vk_video_session_parameters *params, - const struct vk_video_session *vid, - const struct vk_video_session_parameters *templ, - const VkVideoSessionParametersCreateInfoKHR *create_info); +void *vk_video_session_parameters_create(struct vk_device *device, + const struct vk_video_session *vid, + const struct vk_video_session_parameters *templ, + const VkVideoSessionParametersCreateInfoKHR *create_info, + const VkAllocationCallbacks *alloc, + size_t size); VkResult vk_video_session_parameters_update(struct vk_video_session_parameters *params, const VkVideoSessionParametersUpdateInfoKHR *update); -void vk_video_session_parameters_finish(struct vk_device *device, - struct vk_video_session_parameters *params); +void vk_video_session_parameters_destroy(struct vk_device *device, + const VkAllocationCallbacks *alloc, + struct vk_video_session_parameters *params); void vk_video_derive_h264_scaling_list(const StdVideoH264SequenceParameterSet *sps, const StdVideoH264PictureParameterSet *pps,