diff options
author | Lynne <dev@lynne.ee> | 2025-06-11 13:41:59 +0900 |
---|---|---|
committer | Lynne <dev@lynne.ee> | 2025-06-11 14:33:01 +0900 |
commit | 3ac7d70291838d71a28cd31a5774bb69745d4216 (patch) | |
tree | fe73e5d75bf798fe8ec28d9431650b0c57706f7e /libavutil | |
parent | 9e9316326812ba62aee8d36c37b1d8fb1fd2ef64 (diff) | |
download | ffmpeg-3ac7d70291838d71a28cd31a5774bb69745d4216.tar.gz |
hwcontext_vulkan: fix image copy
The patch was applied by mistake in an unfinished form.
This fixes the build and lets the code run.
Diffstat (limited to 'libavutil')
-rw-r--r-- | libavutil/hwcontext_vulkan.c | 39 | ||||
-rw-r--r-- | libavutil/vulkan.c | 4 |
2 files changed, 28 insertions, 15 deletions
diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c index e0024585cd..51be0c0d3b 100644 --- a/libavutil/hwcontext_vulkan.c +++ b/libavutil/hwcontext_vulkan.c @@ -2830,14 +2830,13 @@ static int vulkan_frames_init(AVHWFramesContext *hwfc) /* Image usage flags */ if (!hwctx->usage) { - hwctx->usage = supported_usage & (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | - VK_IMAGE_USAGE_STORAGE_BIT | + hwctx->usage = supported_usage & (VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | + VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_SAMPLED_BIT); if (p->vkctx.extensions & FF_VK_EXT_HOST_IMAGE_COPY) hwctx->usage |= supported_usage & VK_IMAGE_USAGE_HOST_TRANSFER_BIT; - else - hwctx->usage |= VK_IMAGE_USAGE_TRANSFER_DST_BIT; /* Enables encoding of images, if supported by format and extensions */ if ((supported_usage & VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR) && @@ -4160,8 +4159,9 @@ fail: static int vulkan_transfer_host(AVHWFramesContext *hwfc, AVFrame *hwf, AVFrame *swf, int upload) { + VulkanFramesPriv *fp = hwfc->hwctx; + AVVulkanFramesContext *hwfc_vk = &fp->p; VulkanDevicePriv *p = hwfc->device_ctx->hwctx; - AVVulkanFramesContext *hwfc_vk = hwfc->hwctx; AVVulkanDeviceContext *hwctx = &p->p; FFVulkanFunctions *vk = &p->vkctx.vkfn; @@ -4170,16 +4170,23 @@ static int vulkan_transfer_host(AVHWFramesContext *hwfc, AVFrame *hwf, const int nb_images = ff_vk_count_images(hwf_vk); VkSemaphoreWaitInfo sem_wait; - VkHostImageLayoutTransitionInfo layout_ch_info[]; + VkHostImageLayoutTransitionInfo layout_ch_info[AV_NUM_DATA_POINTERS]; int nb_layout_ch = 0; hwfc_vk->lock_frame(hwfc, hwf_vk); for (int i = 0; i < nb_images; i++) { - if (hwf_vk->layout[i]) + int compat = 0; + for (int j = 0; j < p->vkctx.host_image_props.copySrcLayoutCount; j++) { + if (hwf_vk->layout[i] == p->vkctx.host_image_props.pCopySrcLayouts[j]) { + compat = 1; + break; + } + } + if (compat) continue; - layout_ch_info[nb_layout_ch++] = (VkHostImageLayoutTransitionInfo) { + layout_ch_info[nb_layout_ch] = (VkHostImageLayoutTransitionInfo) { .sType = VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO, .image = hwf_vk->img[i], .oldLayout = hwf_vk->layout[i], @@ -4188,13 +4195,12 @@ static int vulkan_transfer_host(AVHWFramesContext *hwfc, AVFrame *hwf, .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, .levelCount = 1, .layerCount = 1, - }; + }, }; - } - if (nb_layout_ch) - vk->TransitionImageLayoutEXT(hwctx->act_dev, - nb_layout_ch, layout_ch_info); + hwf_vk->layout[i] = layout_ch_info[nb_layout_ch].newLayout; + nb_layout_ch++; + } sem_wait = (VkSemaphoreWaitInfo) { .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, @@ -4205,6 +4211,10 @@ static int vulkan_transfer_host(AVHWFramesContext *hwfc, AVFrame *hwf, vk->WaitSemaphores(hwctx->act_dev, &sem_wait, UINT64_MAX); + if (nb_layout_ch) + vk->TransitionImageLayoutEXT(hwctx->act_dev, + nb_layout_ch, layout_ch_info); + if (upload) { VkMemoryToImageCopy region_info = { .sType = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY, @@ -4270,6 +4280,7 @@ static int vulkan_transfer_frame(AVHWFramesContext *hwfc, { int err; VulkanFramesPriv *fp = hwfc->hwctx; + AVVulkanFramesContext *hwctx = &fp->p; VulkanDevicePriv *p = hwfc->device_ctx->hwctx; FFVulkanFunctions *vk = &p->vkctx.vkfn; @@ -4300,7 +4311,7 @@ static int vulkan_transfer_frame(AVHWFramesContext *hwfc, if (swf->width > hwfc->width || swf->height > hwfc->height) return AVERROR(EINVAL); - if (p->vkctx.extensions & FF_VK_EXT_HOST_IMAGE_COPY) + if (hwctx->usage & VK_IMAGE_USAGE_HOST_TRANSFER_BIT) return vulkan_transfer_host(hwfc, hwf, swf, upload); for (int i = 0; i < av_pix_fmt_count_planes(swf->format); i++) { diff --git a/libavutil/vulkan.c b/libavutil/vulkan.c index e33dbb2113..015a109b60 100644 --- a/libavutil/vulkan.c +++ b/libavutil/vulkan.c @@ -107,6 +107,8 @@ const char *ff_vk_ret2str(VkResult res) VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR); \ MAP_TO(VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR, \ VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR); \ + MAP_TO(VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT, \ + VK_IMAGE_USAGE_HOST_TRANSFER_BIT); \ return dst; \ } @@ -191,7 +193,7 @@ int ff_vk_load_props(FFVulkanContext *s) s->host_image_props.pCopySrcLayouts = s->host_image_props.pCopyDstLayouts = NULL; s->host_image_props.copySrcLayoutCount = - s->host_image_props.copyDstLayoutCount = NULL; + s->host_image_props.copyDstLayoutCount = 0; vk->GetPhysicalDeviceProperties2(s->hwctx->phys_dev, &s->props); new_size = s->host_image_props.copySrcLayoutCount + |