diff options
-rw-r--r-- | libavutil/hwcontext_vulkan.c | 109 |
1 files changed, 56 insertions, 53 deletions
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 0bf1c22862..b3da3dc028 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -81,6 +81,11 @@ typedef struct VulkanQueueCtx { } VulkanQueueCtx; typedef struct VulkanDevicePriv { + /** + * The public AVVulkanDeviceContext. See hwcontext_vulkan.h for it. + */ + AVVulkanDeviceContext p; + /* Vulkan library and loader functions */ void *libvulkan; @@ -288,8 +293,8 @@ static int vkfmt_from_pixfmt2(AVHWDeviceContext *dev_ctx, enum AVPixelFormat p, VkImageUsageFlags *supported_usage, /* Output supported usage */ int disable_multiplane, int need_storage) { - AVVulkanDeviceContext *hwctx = dev_ctx->hwctx; - VulkanDevicePriv *priv = dev_ctx->internal->priv; + VulkanDevicePriv *priv = dev_ctx->hwctx; + AVVulkanDeviceContext *hwctx = &priv->p; FFVulkanFunctions *vk = &priv->vkctx.vkfn; const VkFormatFeatureFlagBits2 basic_flags = VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT | @@ -369,8 +374,8 @@ static int vkfmt_from_pixfmt2(AVHWDeviceContext *dev_ctx, enum AVPixelFormat p, static int load_libvulkan(AVHWDeviceContext *ctx) { - AVVulkanDeviceContext *hwctx = ctx->hwctx; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; static const char *lib_names[] = { #if defined(_WIN32) @@ -488,9 +493,9 @@ static int check_extensions(AVHWDeviceContext *ctx, int dev, AVDictionary *opts, { const char *tstr; const char **extension_names = NULL; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; - AVVulkanDeviceContext *hwctx = ctx->hwctx; int err = 0, found, extensions_found = 0; const char *mod; @@ -619,7 +624,7 @@ static int check_validation_layers(AVHWDeviceContext *ctx, AVDictionary *opts, static const char default_layer[] = { "VK_LAYER_KHRONOS_validation" }; int found = 0, err = 0; - VulkanDevicePriv *priv = ctx->internal->priv; + VulkanDevicePriv *priv = ctx->hwctx; FFVulkanFunctions *vk = &priv->vkctx.vkfn; uint32_t sup_layer_count; @@ -726,9 +731,9 @@ static int create_instance(AVHWDeviceContext *ctx, AVDictionary *opts) { int err = 0, debug_mode = 0; VkResult ret; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; - AVVulkanDeviceContext *hwctx = ctx->hwctx; VkApplicationInfo application_info = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pApplicationName = "ffmpeg", @@ -866,13 +871,13 @@ static int find_device(AVHWDeviceContext *ctx, VulkanDeviceSelection *select) int err = 0, choice = -1; uint32_t num; VkResult ret; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; VkPhysicalDevice *devices = NULL; VkPhysicalDeviceIDProperties *idp = NULL; VkPhysicalDeviceProperties2 *prop = NULL; VkPhysicalDeviceDrmPropertiesEXT *drm_prop = NULL; - AVVulkanDeviceContext *hwctx = ctx->hwctx; ret = vk->EnumeratePhysicalDevices(hwctx->inst, &num, NULL); if (ret != VK_SUCCESS || !num) { @@ -1046,9 +1051,9 @@ static int setup_queue_families(AVHWDeviceContext *ctx, VkDeviceCreateInfo *cd) uint32_t num; float *weights; VkQueueFamilyProperties *qf = NULL; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; - AVVulkanDeviceContext *hwctx = ctx->hwctx; int graph_index, comp_index, tx_index, enc_index, dec_index; /* First get the number of queue families */ @@ -1182,9 +1187,9 @@ static int setup_queue_families(AVHWDeviceContext *ctx, VkDeviceCreateInfo *cd) */ static void vulkan_device_free(AVHWDeviceContext *ctx) { - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; - AVVulkanDeviceContext *hwctx = ctx->hwctx; if (hwctx->act_dev) vk->DestroyDevice(hwctx->act_dev, hwctx->alloc); @@ -1205,7 +1210,7 @@ static void vulkan_device_free(AVHWDeviceContext *ctx) static void vulkan_device_uninit(AVHWDeviceContext *ctx) { - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; for (uint32_t i = 0; i < p->nb_tot_qfs; i++) { pthread_mutex_destroy(p->qf_mutex[i]); @@ -1224,9 +1229,9 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx, int err = 0; VkResult ret; AVDictionaryEntry *opt_d; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; - AVVulkanDeviceContext *hwctx = ctx->hwctx; /* * VkPhysicalDeviceVulkan12Features has a timelineSemaphore field, but @@ -1401,13 +1406,13 @@ end: static void lock_queue(AVHWDeviceContext *ctx, uint32_t queue_family, uint32_t index) { - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; pthread_mutex_lock(&p->qf_mutex[queue_family][index]); } static void unlock_queue(AVHWDeviceContext *ctx, uint32_t queue_family, uint32_t index) { - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; pthread_mutex_unlock(&p->qf_mutex[queue_family][index]); } @@ -1415,8 +1420,8 @@ static int vulkan_device_init(AVHWDeviceContext *ctx) { int err; uint32_t qf_num; - AVVulkanDeviceContext *hwctx = ctx->hwctx; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; VkQueueFamilyProperties *qf; int graph_index, comp_index, tx_index, enc_index, dec_index; @@ -1666,7 +1671,7 @@ static int vulkan_frames_get_constraints(AVHWDeviceContext *ctx, AVHWFramesConstraints *constraints) { int count = 0; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; for (enum AVPixelFormat i = 0; i < nb_vk_formats_list; i++) { count += vkfmt_from_pixfmt2(ctx, vk_formats_list[i].pixfmt, @@ -1713,9 +1718,9 @@ static int alloc_mem(AVHWDeviceContext *ctx, VkMemoryRequirements *req, { VkResult ret; int index = -1; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; FFVulkanFunctions *vk = &p->vkctx.vkfn; - AVVulkanDeviceContext *dev_hwctx = ctx->hwctx; + AVVulkanDeviceContext *dev_hwctx = &p->p; VkMemoryAllocateInfo alloc_info = { .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, .pNext = alloc_extension, @@ -1803,8 +1808,8 @@ static void vulkan_free_internal(AVVkFrame *f) static void vulkan_frame_free(AVHWFramesContext *hwfc, AVVkFrame *f) { - AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; int nb_images = ff_vk_count_images(f); int nb_sems = 0; @@ -1846,12 +1851,11 @@ static int alloc_bind_mem(AVHWFramesContext *hwfc, AVVkFrame *f, int img_cnt = 0, err; VkResult ret; AVHWDeviceContext *ctx = hwfc->device_ctx; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; VkBindImageMemoryInfo bind_info[AV_NUM_DATA_POINTERS] = { { 0 } }; - AVVulkanDeviceContext *hwctx = ctx->hwctx; - while (f->img[img_cnt]) { int use_ded_mem; VkImageMemoryRequirementsInfo2 req_desc = { @@ -1922,7 +1926,7 @@ static int prepare_frame(AVHWFramesContext *hwfc, FFVkExecPool *ectx, AVVkFrame *frame, enum PrepMode pmode) { int err; - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; FFVulkanFunctions *vk = &p->vkctx.vkfn; VkImageMemoryBarrier2 img_bar[AV_NUM_DATA_POINTERS]; int nb_img_bar = 0; @@ -2026,9 +2030,9 @@ static int create_frame(AVHWFramesContext *hwfc, AVVkFrame **frame, VkResult ret; AVVulkanFramesContext *hwfc_vk = hwfc->hwctx; AVHWDeviceContext *ctx = hwfc->device_ctx; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; - AVVulkanDeviceContext *hwctx = ctx->hwctx; VkExportSemaphoreCreateInfo ext_sem_info = { .sType = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, @@ -2133,8 +2137,8 @@ static void try_export_flags(AVHWFramesContext *hwfc, { VkResult ret; AVVulkanFramesContext *hwctx = hwfc->hwctx; - AVVulkanDeviceContext *dev_hwctx = hwfc->device_ctx->hwctx; - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; + AVVulkanDeviceContext *dev_hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; const VkImageDrmFormatModifierListCreateInfoEXT *drm_mod_info = @@ -2195,7 +2199,7 @@ static AVBufferRef *vulkan_pool_alloc(void *opaque, size_t size) AVBufferRef *avbuf = NULL; AVHWFramesContext *hwfc = opaque; AVVulkanFramesContext *hwctx = hwfc->hwctx; - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; VulkanFramesPriv *fp = hwfc->internal->priv; VkExternalMemoryHandleTypeFlags e = 0x0; VkExportMemoryAllocateInfo eminfo[AV_NUM_DATA_POINTERS]; @@ -2266,7 +2270,7 @@ static void unlock_frame(AVHWFramesContext *fc, AVVkFrame *vkf) static void vulkan_frames_uninit(AVHWFramesContext *hwfc) { - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; VulkanFramesPriv *fp = hwfc->internal->priv; if (fp->modifier_info) { @@ -2286,7 +2290,7 @@ static int vulkan_frames_init(AVHWFramesContext *hwfc) AVVkFrame *f; AVVulkanFramesContext *hwctx = hwfc->hwctx; VulkanFramesPriv *fp = hwfc->internal->priv; - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; VkImageUsageFlagBits supported_usage; const struct FFVkFormatEntry *fmt; int disable_multiplane = p->disable_multiplane || @@ -2493,8 +2497,8 @@ static int vulkan_map_from_drm_frame_desc(AVHWFramesContext *hwfc, AVVkFrame **f AVVkFrame *f; int bind_counts = 0; AVHWDeviceContext *ctx = hwfc->device_ctx; - AVVulkanDeviceContext *hwctx = ctx->hwctx; - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; VulkanFramesPriv *fp = hwfc->internal->priv; const AVDRMFrameDescriptor *desc = (AVDRMFrameDescriptor *)src->data[0]; @@ -2832,10 +2836,10 @@ static int vulkan_export_to_cuda(AVHWFramesContext *hwfc, AVVkFrame *dst_f; AVVkFrameInternal *dst_int; AVHWDeviceContext *ctx = hwfc->device_ctx; - AVVulkanDeviceContext *hwctx = ctx->hwctx; const int planes = av_pix_fmt_count_planes(hwfc->sw_format); const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(hwfc->sw_format); - VulkanDevicePriv *p = ctx->internal->priv; + VulkanDevicePriv *p = ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; AVHWFramesContext *cuda_fc = (AVHWFramesContext*)cuda_hwfc->data; @@ -3088,7 +3092,7 @@ fail: static int vulkan_map_to(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src, int flags) { - av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + av_unused VulkanDevicePriv *p = hwfc->device_ctx->hwctx; switch (src->format) { #if CONFIG_LIBDRM @@ -3140,10 +3144,10 @@ static int vulkan_map_to_drm(AVHWFramesContext *hwfc, AVFrame *dst, int err = 0; VkResult ret; AVVkFrame *f = (AVVkFrame *)src->data[0]; - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; VulkanFramesPriv *fp = hwfc->internal->priv; - AVVulkanDeviceContext *hwctx = hwfc->device_ctx->hwctx; AVVulkanFramesContext *hwfctx = hwfc->hwctx; const int planes = av_pix_fmt_count_planes(hwfc->sw_format); VkImageDrmFormatModifierPropertiesEXT drm_mod = { @@ -3275,7 +3279,7 @@ fail: static int vulkan_map_from(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src, int flags) { - av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + av_unused VulkanDevicePriv *p = hwfc->device_ctx->hwctx; switch (dst->format) { #if CONFIG_LIBDRM @@ -3315,7 +3319,7 @@ static int transfer_image_buf(AVHWFramesContext *hwfc, AVFrame *f, int err; AVVkFrame *frame = (AVVkFrame *)f->data[0]; VulkanFramesPriv *fp = hwfc->internal->priv; - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = hwfc->device_ctx->hwctx; FFVulkanFunctions *vk = &p->vkctx.vkfn; VkImageMemoryBarrier2 img_bar[AV_NUM_DATA_POINTERS]; int nb_img_bar = 0; @@ -3405,8 +3409,8 @@ static int vulkan_transfer_data(AVHWFramesContext *hwfc, const AVFrame *vkf, int err = 0; VkResult ret; AVHWDeviceContext *dev_ctx = hwfc->device_ctx; - AVVulkanDeviceContext *hwctx = dev_ctx->hwctx; - VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + VulkanDevicePriv *p = dev_ctx->hwctx; + AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; AVFrame tmp; @@ -3545,7 +3549,7 @@ end: static int vulkan_transfer_data_to(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src) { - av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + av_unused VulkanDevicePriv *p = hwfc->device_ctx->hwctx; switch (src->format) { #if CONFIG_CUDA @@ -3662,7 +3666,7 @@ fail: static int vulkan_transfer_data_from(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src) { - av_unused VulkanDevicePriv *p = hwfc->device_ctx->internal->priv; + av_unused VulkanDevicePriv *p = hwfc->device_ctx->hwctx; switch (dst->format) { #if CONFIG_CUDA @@ -3717,8 +3721,7 @@ const HWContextType ff_hwcontext_type_vulkan = { .type = AV_HWDEVICE_TYPE_VULKAN, .name = "Vulkan", - .device_hwctx_size = sizeof(AVVulkanDeviceContext), - .device_priv_size = sizeof(VulkanDevicePriv), + .device_hwctx_size = sizeof(VulkanDevicePriv), .frames_hwctx_size = sizeof(AVVulkanFramesContext), .frames_priv_size = sizeof(VulkanFramesPriv), |