diff --git a/libavcodec/ffv1enc_vulkan.c b/libavcodec/ffv1enc_vulkan.c index 41d396fb32..1874a3f42b 100644 --- a/libavcodec/ffv1enc_vulkan.c +++ b/libavcodec/ffv1enc_vulkan.c @@ -58,10 +58,10 @@ typedef struct VulkanEncodeFFv1Context { AVFrame *frame; FFVulkanContext s; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVkExecPool exec_pool; - FFVkQueueFamilyCtx transfer_qf; + AVVulkanDeviceQueueFamily *transfer_qf; FFVkExecPool transfer_exec_pool; VkBufferCopy *buf_regions; @@ -1586,8 +1586,8 @@ static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx) if (err < 0) return err; - err = ff_vk_qf_init(&fv->s, &fv->qf, VK_QUEUE_COMPUTE_BIT); - if (err < 0) { + fv->qf = ff_vk_qf_find(&fv->s, VK_QUEUE_COMPUTE_BIT, 0); + if (!fv->qf) { av_log(avctx, AV_LOG_ERROR, "Device has no compute queues!\n"); return err; } @@ -1626,7 +1626,7 @@ static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx) } if (!fv->async_depth) { - fv->async_depth = FFMIN(fv->qf.nb_queues, FFMAX(max_heap_size / maxsize, 1)); + fv->async_depth = FFMIN(fv->qf->num, FFMAX(max_heap_size / maxsize, 1)); fv->async_depth = FFMAX(fv->async_depth, 1); } @@ -1635,19 +1635,19 @@ static av_cold int vulkan_encode_ffv1_init(AVCodecContext *avctx) (fv->async_depth * maxsize) / (1024*1024), fv->async_depth); - err = ff_vk_exec_pool_init(&fv->s, &fv->qf, &fv->exec_pool, + err = ff_vk_exec_pool_init(&fv->s, fv->qf, &fv->exec_pool, fv->async_depth, 0, 0, 0, NULL); if (err < 0) return err; - err = ff_vk_qf_init(&fv->s, &fv->transfer_qf, VK_QUEUE_TRANSFER_BIT); - if (err < 0) { + fv->transfer_qf = ff_vk_qf_find(&fv->s, VK_QUEUE_TRANSFER_BIT, 0); + if (!fv->transfer_qf) { av_log(avctx, AV_LOG_ERROR, "Device has no transfer queues!\n"); return err; } - err = ff_vk_exec_pool_init(&fv->s, &fv->transfer_qf, &fv->transfer_exec_pool, + err = ff_vk_exec_pool_init(&fv->s, fv->transfer_qf, &fv->transfer_exec_pool, 1, 0, 0, 0, NULL); if (err < 0) diff --git a/libavcodec/vulkan_decode.c b/libavcodec/vulkan_decode.c index 1a5e70b2d6..8fd97a6dea 100644 --- a/libavcodec/vulkan_decode.c +++ b/libavcodec/vulkan_decode.c @@ -1116,21 +1116,19 @@ int ff_vk_decode_init(AVCodecContext *avctx) /* Create queue context */ vk_desc = get_codecdesc(avctx->codec_id); - err = ff_vk_video_qf_init(s, &ctx->qf, - VK_QUEUE_VIDEO_DECODE_BIT_KHR, - vk_desc->decode_op); - if (err < 0) { + ctx->qf = ff_vk_qf_find(s, VK_QUEUE_VIDEO_DECODE_BIT_KHR, vk_desc->decode_op); + if (!ctx->qf) { av_log(avctx, AV_LOG_ERROR, "Decoding of %s is not supported by this device\n", avcodec_get_name(avctx->codec_id)); return err; } - /* Enable queries if supported */ - if (s->query_props[ctx->qf.queue_family].queryResultStatusSupport) + /* Enable queries if supported and usable */ + if (s->query_props[ctx->qf->idx].queryResultStatusSupport) nb_q = 1; session_create.flags = 0x0; - session_create.queueFamilyIndex = ctx->qf.queue_family; + session_create.queueFamilyIndex = ctx->qf->idx; session_create.maxCodedExtent = ctx->caps.maxCodedExtent; session_create.maxDpbSlots = ctx->caps.maxDpbSlots; session_create.maxActiveReferencePictures = ctx->caps.maxActiveReferencePictures; @@ -1142,8 +1140,8 @@ int ff_vk_decode_init(AVCodecContext *avctx) /* Create decode exec context for this specific main thread. * 2 async contexts per thread was experimentally determined to be optimal * for a majority of streams. */ - err = ff_vk_exec_pool_init(s, &ctx->qf, &ctx->exec_pool, - FFMAX(2*ctx->qf.nb_queues, avctx->thread_count), + err = ff_vk_exec_pool_init(s, ctx->qf, &ctx->exec_pool, + FFMAX(2*ctx->qf->num, avctx->thread_count), nb_q, VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR, 0, profile); if (err < 0) diff --git a/libavcodec/vulkan_decode.h b/libavcodec/vulkan_decode.h index f29cc5b162..60f21372c2 100644 --- a/libavcodec/vulkan_decode.h +++ b/libavcodec/vulkan_decode.h @@ -46,7 +46,7 @@ typedef struct FFVulkanDecodeProfileData { typedef struct FFVulkanDecodeShared { FFVulkanContext s; FFVkVideoCommon common; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVkExecPool exec_pool; AVBufferPool *buf_pool; diff --git a/libavcodec/vulkan_encode.c b/libavcodec/vulkan_encode.c index 9ad02e8c52..122dd34f4c 100644 --- a/libavcodec/vulkan_encode.c +++ b/libavcodec/vulkan_encode.c @@ -769,10 +769,8 @@ av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext * return err; /* Create queue context */ - err = ff_vk_video_qf_init(s, &ctx->qf_enc, - VK_QUEUE_VIDEO_ENCODE_BIT_KHR, - vk_desc->encode_op); - if (err < 0) { + ctx->qf_enc = ff_vk_qf_find(s, VK_QUEUE_VIDEO_ENCODE_BIT_KHR, vk_desc->encode_op); + if (!ctx->qf_enc) { av_log(avctx, AV_LOG_ERROR, "Encoding of %s is not supported by this device\n", avcodec_get_name(avctx->codec_id)); return err; @@ -846,7 +844,7 @@ av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext * .encodeFeedbackFlags = ctx->enc_caps.supportedEncodeFeedbackFlags & (~VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR), }; - err = ff_vk_exec_pool_init(s, &ctx->qf_enc, &ctx->enc_pool, base_ctx->async_depth, + err = ff_vk_exec_pool_init(s, ctx->qf_enc, &ctx->enc_pool, base_ctx->async_depth, 1, VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR, 0, &query_create); if (err < 0) @@ -994,7 +992,7 @@ av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext * /* Create session */ session_create.pVideoProfile = &ctx->profile; session_create.flags = 0x0; - session_create.queueFamilyIndex = ctx->qf_enc.queue_family; + session_create.queueFamilyIndex = ctx->qf_enc->idx; session_create.maxCodedExtent = ctx->caps.maxCodedExtent; session_create.maxDpbSlots = ctx->caps.maxDpbSlots; session_create.maxActiveReferencePictures = ctx->caps.maxActiveReferencePictures; diff --git a/libavcodec/vulkan_encode.h b/libavcodec/vulkan_encode.h index a7a02d5fd0..3df06e11d0 100644 --- a/libavcodec/vulkan_encode.h +++ b/libavcodec/vulkan_encode.h @@ -188,7 +188,7 @@ typedef struct FFVulkanEncodeContext { VkVideoEncodeCapabilitiesKHR enc_caps; VkVideoEncodeUsageInfoKHR usage_info; - FFVkQueueFamilyCtx qf_enc; + AVVulkanDeviceQueueFamily *qf_enc; FFVkExecPool enc_pool; FFHWBaseEncodePicture *slots[32]; diff --git a/libavcodec/vulkan_video.c b/libavcodec/vulkan_video.c index c58353246c..183044b3ff 100644 --- a/libavcodec/vulkan_video.c +++ b/libavcodec/vulkan_video.c @@ -268,20 +268,6 @@ int ff_vk_h265_profile_to_av(StdVideoH264ProfileIdc profile) } } -int ff_vk_video_qf_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, - VkQueueFlagBits family, VkVideoCodecOperationFlagBitsKHR caps) -{ - for (int i = 0; i < s->hwctx->nb_qf; i++) { - if ((s->hwctx->qf[i].flags & family) && - (s->hwctx->qf[i].video_caps & caps)) { - qf->queue_family = s->hwctx->qf[i].idx; - qf->nb_queues = s->hwctx->qf[i].num; - return 0; - } - } - return AVERROR(ENOTSUP); -} - int ff_vk_create_view(FFVulkanContext *s, FFVkVideoCommon *common, VkImageView *view, VkImageAspectFlags *aspect, AVVkFrame *src, VkFormat vkf, int is_dpb) diff --git a/libavcodec/vulkan_video.h b/libavcodec/vulkan_video.h index 1ec5f419ed..f791225e12 100644 --- a/libavcodec/vulkan_video.h +++ b/libavcodec/vulkan_video.h @@ -63,12 +63,6 @@ VkVideoChromaSubsamplingFlagBitsKHR ff_vk_subsampling_from_av_desc(const AVPixFm */ VkVideoComponentBitDepthFlagBitsKHR ff_vk_depth_from_av_depth(int depth); -/** - * Chooses a QF and loads it into a context. - */ -int ff_vk_video_qf_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, - VkQueueFlagBits family, VkVideoCodecOperationFlagBitsKHR caps); - /** * Convert level from Vulkan to AV. */ diff --git a/libavfilter/vf_avgblur_vulkan.c b/libavfilter/vf_avgblur_vulkan.c index b070ec1dcc..9fe65353d9 100644 --- a/libavfilter/vf_avgblur_vulkan.c +++ b/libavfilter/vf_avgblur_vulkan.c @@ -31,7 +31,7 @@ typedef struct AvgBlurVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; VkSampler sampler; FFVulkanShader shd; @@ -77,8 +77,14 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_LINEAR)); RET(ff_vk_shader_init(vkctx, &s->shd, "avgblur", VK_SHADER_STAGE_COMPUTE_BIT, diff --git a/libavfilter/vf_blend_vulkan.c b/libavfilter/vf_blend_vulkan.c index 9505ae41f3..ab4c00ebc6 100644 --- a/libavfilter/vf_blend_vulkan.c +++ b/libavfilter/vf_blend_vulkan.c @@ -47,7 +47,7 @@ typedef struct BlendVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVulkanShader shd; VkSampler sampler; @@ -141,8 +141,14 @@ static av_cold int init_filter(AVFilterContext *avctx) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(avctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_NEAREST)); RET(ff_vk_shader_init(vkctx, &s->shd, "blend", VK_SHADER_STAGE_COMPUTE_BIT, diff --git a/libavfilter/vf_bwdif_vulkan.c b/libavfilter/vf_bwdif_vulkan.c index b641d11d0b..3f6d7b72bf 100644 --- a/libavfilter/vf_bwdif_vulkan.c +++ b/libavfilter/vf_bwdif_vulkan.c @@ -33,7 +33,7 @@ typedef struct BWDIFVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; VkSampler sampler; FFVulkanShader shd; } BWDIFVulkanContext; @@ -65,8 +65,14 @@ static av_cold int init_filter(AVFilterContext *ctx) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_NEAREST)); RET(ff_vk_shader_init(vkctx, &s->shd, "bwdif", diff --git a/libavfilter/vf_chromaber_vulkan.c b/libavfilter/vf_chromaber_vulkan.c index 576c3f5757..5fc962ac49 100644 --- a/libavfilter/vf_chromaber_vulkan.c +++ b/libavfilter/vf_chromaber_vulkan.c @@ -31,7 +31,7 @@ typedef struct ChromaticAberrationVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVulkanShader shd; VkSampler sampler; @@ -88,8 +88,14 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 0, VK_FILTER_LINEAR)); RET(ff_vk_shader_init(vkctx, &s->shd, "chromatic_abberation", VK_SHADER_STAGE_COMPUTE_BIT, diff --git a/libavfilter/vf_flip_vulkan.c b/libavfilter/vf_flip_vulkan.c index f07a2b0128..a8e5358ba5 100644 --- a/libavfilter/vf_flip_vulkan.c +++ b/libavfilter/vf_flip_vulkan.c @@ -38,7 +38,7 @@ typedef struct FlipVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVulkanShader shd; VkSampler sampler; } FlipVulkanContext; @@ -62,8 +62,14 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in, enum FlipType return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_LINEAR)); RET(ff_vk_shader_init(vkctx, &s->shd, "flip", VK_SHADER_STAGE_COMPUTE_BIT, diff --git a/libavfilter/vf_gblur_vulkan.c b/libavfilter/vf_gblur_vulkan.c index 0a36121fed..404b432849 100644 --- a/libavfilter/vf_gblur_vulkan.c +++ b/libavfilter/vf_gblur_vulkan.c @@ -36,7 +36,7 @@ typedef struct GBlurVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; VkSampler sampler; FFVulkanShader shd_hor; FFVkBuffer params_hor; @@ -212,8 +212,14 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_LINEAR)); desc = (FFVulkanDescriptorSetBinding []) { diff --git a/libavfilter/vf_nlmeans_vulkan.c b/libavfilter/vf_nlmeans_vulkan.c index 5b0f137a40..c7ce696993 100644 --- a/libavfilter/vf_nlmeans_vulkan.c +++ b/libavfilter/vf_nlmeans_vulkan.c @@ -36,7 +36,7 @@ typedef struct NLMeansVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; VkSampler sampler; AVBufferPool *integral_buf_pool; @@ -652,8 +652,14 @@ static av_cold int init_filter(AVFilterContext *ctx) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, 1, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, 1, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_NEAREST)); RET(init_weights_pipeline(vkctx, &s->e, &s->shd_weights, s->sampler, diff --git a/libavfilter/vf_overlay_vulkan.c b/libavfilter/vf_overlay_vulkan.c index afc87d846c..0f783acf16 100644 --- a/libavfilter/vf_overlay_vulkan.c +++ b/libavfilter/vf_overlay_vulkan.c @@ -33,7 +33,7 @@ typedef struct OverlayVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVulkanShader shd; VkSampler sampler; @@ -101,8 +101,14 @@ static av_cold int init_filter(AVFilterContext *ctx) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_NEAREST)); RET(ff_vk_shader_init(vkctx, &s->shd, "overlay", VK_SHADER_STAGE_COMPUTE_BIT, diff --git a/libavfilter/vf_scale_vulkan.c b/libavfilter/vf_scale_vulkan.c index d675a309a8..82641a3bff 100644 --- a/libavfilter/vf_scale_vulkan.c +++ b/libavfilter/vf_scale_vulkan.c @@ -39,7 +39,7 @@ typedef struct ScaleVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVulkanShader shd; VkSampler sampler; @@ -142,8 +142,14 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 0, sampler_mode)); RET(ff_vk_shader_init(vkctx, &s->shd, "scale", VK_SHADER_STAGE_COMPUTE_BIT, diff --git a/libavfilter/vf_transpose_vulkan.c b/libavfilter/vf_transpose_vulkan.c index 0a07858f5f..fa21704a62 100644 --- a/libavfilter/vf_transpose_vulkan.c +++ b/libavfilter/vf_transpose_vulkan.c @@ -33,7 +33,7 @@ typedef struct TransposeVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVulkanShader shd; VkSampler sampler; @@ -61,8 +61,14 @@ static av_cold int init_filter(AVFilterContext *ctx, AVFrame *in) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_LINEAR)); RET(ff_vk_shader_init(vkctx, &s->shd, "transpose", VK_SHADER_STAGE_COMPUTE_BIT, diff --git a/libavfilter/vf_xfade_vulkan.c b/libavfilter/vf_xfade_vulkan.c index 1eef1918c7..7dd80c7baa 100644 --- a/libavfilter/vf_xfade_vulkan.c +++ b/libavfilter/vf_xfade_vulkan.c @@ -41,7 +41,7 @@ typedef struct XFadeVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVulkanShader shd; VkSampler sampler; @@ -335,8 +335,14 @@ static av_cold int init_vulkan(AVFilterContext *avctx) return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(avctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_NEAREST)); RET(ff_vk_shader_init(vkctx, &s->shd, "xfade", VK_SHADER_STAGE_COMPUTE_BIT, diff --git a/libavfilter/vsrc_testsrc_vulkan.c b/libavfilter/vsrc_testsrc_vulkan.c index fb0d1c3673..a7a801aabe 100644 --- a/libavfilter/vsrc_testsrc_vulkan.c +++ b/libavfilter/vsrc_testsrc_vulkan.c @@ -40,7 +40,7 @@ typedef struct TestSrcVulkanContext { int initialized; FFVkExecPool e; - FFVkQueueFamilyCtx qf; + AVVulkanDeviceQueueFamily *qf; FFVulkanShader shd; /* Only used by color_vulkan */ @@ -82,8 +82,14 @@ static av_cold int init_filter(AVFilterContext *ctx, enum TestSrcVulkanMode mode return AVERROR_EXTERNAL; } - ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT); - RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL)); + s->qf = ff_vk_qf_find(vkctx, VK_QUEUE_COMPUTE_BIT, 0); + if (!s->qf) { + av_log(ctx, AV_LOG_ERROR, "Device has no compute queues\n"); + err = AVERROR(ENOTSUP); + goto fail; + } + + RET(ff_vk_exec_pool_init(vkctx, s->qf, &s->e, s->qf->num*4, 0, 0, 0, NULL)); RET(ff_vk_shader_init(vkctx, &s->shd, "scale", VK_SHADER_STAGE_COMPUTE_BIT, NULL, 0, diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index 6eca097ea3..d32a685383 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -104,8 +104,8 @@ typedef struct VulkanDevicePriv { void *libvulkan; FFVulkanContext vkctx; - FFVkQueueFamilyCtx compute_qf; - FFVkQueueFamilyCtx transfer_qf; + AVVulkanDeviceQueueFamily *compute_qf; + AVVulkanDeviceQueueFamily *transfer_qf; /* Properties */ VkPhysicalDeviceProperties2 props; @@ -1904,8 +1904,8 @@ FF_ENABLE_DEPRECATION_WARNINGS p->vkctx.hwctx = hwctx; ff_vk_load_props(&p->vkctx); - ff_vk_qf_init(&p->vkctx, &p->compute_qf, VK_QUEUE_COMPUTE_BIT); - ff_vk_qf_init(&p->vkctx, &p->transfer_qf, VK_QUEUE_TRANSFER_BIT); + p->compute_qf = ff_vk_qf_find(&p->vkctx, VK_QUEUE_COMPUTE_BIT, 0); + p->transfer_qf = ff_vk_qf_find(&p->vkctx, VK_QUEUE_TRANSFER_BIT, 0); end: av_free(qf_vid); @@ -2789,18 +2789,18 @@ static int vulkan_frames_init(AVHWFramesContext *hwfc) if (!hwctx->unlock_frame) hwctx->unlock_frame = unlock_frame; - err = ff_vk_exec_pool_init(&p->vkctx, &p->compute_qf, &fp->compute_exec, - p->compute_qf.nb_queues, 0, 0, 0, NULL); + err = ff_vk_exec_pool_init(&p->vkctx, p->compute_qf, &fp->compute_exec, + p->compute_qf->num, 0, 0, 0, NULL); if (err) return err; - err = ff_vk_exec_pool_init(&p->vkctx, &p->transfer_qf, &fp->upload_exec, - p->transfer_qf.nb_queues*2, 0, 0, 0, NULL); + err = ff_vk_exec_pool_init(&p->vkctx, p->transfer_qf, &fp->upload_exec, + p->transfer_qf->num*2, 0, 0, 0, NULL); if (err) return err; - err = ff_vk_exec_pool_init(&p->vkctx, &p->transfer_qf, &fp->download_exec, - p->transfer_qf.nb_queues, 0, 0, 0, NULL); + err = ff_vk_exec_pool_init(&p->vkctx, p->transfer_qf, &fp->download_exec, + p->transfer_qf->num, 0, 0, 0, NULL); if (err) return err; diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index 55b039d5ef..7315af928f 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -217,26 +217,17 @@ int ff_vk_load_props(FFVulkanContext *s) return 0; } -static int vk_qf_get_index(FFVulkanContext *s, VkQueueFlagBits dev_family, int *nb) +AVVulkanDeviceQueueFamily *ff_vk_qf_find(FFVulkanContext *s, + VkQueueFlagBits dev_family, + VkVideoCodecOperationFlagBitsKHR vid_ops) { for (int i = 0; i < s->hwctx->nb_qf; i++) { - if (s->hwctx->qf[i].flags & dev_family) { - *nb = s->hwctx->qf[i].num; - return s->hwctx->qf[i].idx; + if ((s->hwctx->qf[i].flags & dev_family) && + (s->hwctx->qf[i].video_caps & vid_ops) == vid_ops) { + return &s->hwctx->qf[i]; } } - - av_assert0(0); /* Should never happen */ -} - -int ff_vk_qf_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, - VkQueueFlagBits dev_family) -{ - /* Fill in queue families from context if not done yet */ - if (!s->nb_qfs) - load_enabled_qfs(s); - - return (qf->queue_family = vk_qf_get_index(s, dev_family, &qf->nb_queues)); + return NULL; } void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool) @@ -302,7 +293,7 @@ void ff_vk_exec_pool_free(FFVulkanContext *s, FFVkExecPool *pool) av_free(pool->contexts); } -int ff_vk_exec_pool_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, +int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, FFVkExecPool *pool, int nb_contexts, int nb_queries, VkQueryType query_type, int query_64bit, const void *query_create_pnext) @@ -330,7 +321,7 @@ int ff_vk_exec_pool_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, .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->queue_family, + .queueFamilyIndex = qf->idx, }; ret = vk->CreateCommandPool(s->hwctx->act_dev, &cqueue_create, s->hwctx->alloc, &pool->cmd_buf_pool); @@ -443,10 +434,9 @@ int ff_vk_exec_pool_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, e->buf = pool->cmd_bufs[i]; /* Queue index distribution */ - e->qi = i % qf->nb_queues; - e->qf = qf->queue_family; - vk->GetDeviceQueue(s->hwctx->act_dev, qf->queue_family, - e->qi, &e->queue); + e->qi = i % qf->num; + e->qf = qf->idx; + vk->GetDeviceQueue(s->hwctx->act_dev, qf->idx, e->qi, &e->queue); } return 0; diff --git a/libavutil/vulkan.h b/libavutil/vulkan.h index 0a166da9eb..41f71df376 100644 --- a/libavutil/vulkan.h +++ b/libavutil/vulkan.h @@ -99,11 +99,6 @@ typedef struct FFVkBuffer { uint8_t *mapped_mem; } FFVkBuffer; -typedef struct FFVkQueueFamilyCtx { - int queue_family; - int nb_queues; -} FFVkQueueFamilyCtx; - typedef struct FFVkExecContext { uint32_t idx; const struct FFVkExecPool *parent; @@ -393,10 +388,11 @@ const char *ff_vk_shader_rep_fmt(enum AVPixelFormat pix_fmt, int ff_vk_load_props(FFVulkanContext *s); /** - * Chooses a QF and loads it into a context. + * Chooses an appropriate QF. */ -int ff_vk_qf_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, - VkQueueFlagBits dev_family); +AVVulkanDeviceQueueFamily *ff_vk_qf_find(FFVulkanContext *s, + VkQueueFlagBits dev_family, + VkVideoCodecOperationFlagBitsKHR vid_ops); /** * Allocates/frees an execution pool. @@ -405,7 +401,7 @@ int ff_vk_qf_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, * ff_vk_exec_pool_init_desc() MUST be called if ff_vk_exec_descriptor_set_add() * has been called. */ -int ff_vk_exec_pool_init(FFVulkanContext *s, FFVkQueueFamilyCtx *qf, +int ff_vk_exec_pool_init(FFVulkanContext *s, AVVulkanDeviceQueueFamily *qf, FFVkExecPool *pool, int nb_contexts, int nb_queries, VkQueryType query_type, int query_64bit, const void *query_create_pnext);