From: Lynne <dev@lynne.ee>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH] avutil/hwcontext_vulkan: disable host transfers if ReBAR is disabled
Date: Sat, 21 Jun 2025 01:30:39 +0900
Message-ID: <f6cb34d0-e193-4a9e-9372-b92d3a6d2342@lynne.ee> (raw)
In-Reply-To: <20250620124320.43327-1-ffmpeg@haasn.xyz>
On 20/06/2025 21:43, Niklas Haas wrote:
> From: Niklas Haas <git@haasn.dev>
>
> This feature fundamentally relies on host-visible VRAM, which restricts the
> set of available memory types to (typically) host-visible device-local ones.
>
> When resizable BAR is disabled, this memory type is usually limited to
> e.g. 256 MiB in size, which is just plain insufficient for allocation of
> general purpose GPU images, causing OOM errors on even the simplest of
> commands.
>
> The easiest solution is to disable host transfers entirely on machines
> without host-addressable VRAM. In theory, we could try and recover the use
> of host transfers for images which are *not* restricted to device-local
> memory types, but this is rarely the case in practice, and the effort
> required would exceed the benefit, especially since ReBAR is a standard
> feature on all platforms recent enough to have Vulkan drivers, and only
> occasionally disabled in the UEFI for by default for some hare-brained
> notion of "backwards compatibiility" with ancient software.
> ---
> libavutil/hwcontext_vulkan.c | 25 +++++++++++++++++++++----
> 1 file changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
> index edff89af26..b0a765e370 100644
> --- a/libavutil/hwcontext_vulkan.c
> +++ b/libavutil/hwcontext_vulkan.c
> @@ -144,6 +144,9 @@ typedef struct VulkanDevicePriv {
> /* Disable multiplane images */
> int disable_multiplane;
>
> + /* Disable host image transfer */
> + int disable_host_transfer;
> +
> /* Maximum queues */
> int limit_queues;
>
> @@ -1694,6 +1697,23 @@ static int vulkan_device_create_internal(AVHWDeviceContext *ctx,
> goto end;
> }
>
> + /* Get device memory properties */
> + vk->GetPhysicalDeviceMemoryProperties(hwctx->phys_dev, &p->mprops);
> + VkDeviceSize max_vram = 0, max_visible_vram = 0;
> + for (int i = 0; i < p->mprops.memoryTypeCount; i++) {
> + const VkMemoryType type = p->mprops.memoryTypes[i];
> + const VkMemoryHeap heap = p->mprops.memoryHeaps[type.heapIndex];
> + if (!(type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT))
> + continue;
> + max_vram = FFMAX(max_vram, heap.size);
> + if (type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)
> + max_visible_vram = FFMAX(max_visible_vram, heap.size);
> + }
> +
> + /* Only use host image transfers if ReBAR is enabled */
> + const int has_rebar = max_vram - max_visible_vram < 1024; /* 1 kB tolerance */
> + p->disable_host_transfer = !has_rebar;
> +
> /* Get all supported features for the physical device */
> device_features_init(ctx, &supported_feats);
> vk->GetPhysicalDeviceFeatures2(hwctx->phys_dev, &supported_feats.device);
> @@ -1990,9 +2010,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
> if (!hwctx->unlock_queue)
> hwctx->unlock_queue = unlock_queue;
>
> - /* Get device capabilities */
> - vk->GetPhysicalDeviceMemoryProperties(hwctx->phys_dev, &p->mprops);
> -
> p->vkctx.device = ctx;
> p->vkctx.hwctx = hwctx;
>
> @@ -2835,7 +2852,7 @@ static int vulkan_frames_init(AVHWFramesContext *hwfc)
> VK_IMAGE_USAGE_STORAGE_BIT |
> VK_IMAGE_USAGE_SAMPLED_BIT);
>
> - if (p->vkctx.extensions & FF_VK_EXT_HOST_IMAGE_COPY)
> + if ((p->vkctx.extensions & FF_VK_EXT_HOST_IMAGE_COPY) && !p->disable_host_transfer)
> hwctx->usage |= supported_usage & VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT;
>
> /* Enables encoding of images, if supported by format and extensions */
LGTM
Thanks
_______________________________________________
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".
prev parent reply other threads:[~2025-06-20 16:30 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-20 12:43 Niklas Haas
2025-06-20 16:30 ` Lynne [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f6cb34d0-e193-4a9e-9372-b92d3a6d2342@lynne.ee \
--to=dev@lynne.ee \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git