1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-04 22:03:09 +02:00

hwcontext_vulkan: fix image copy

The patch was applied by mistake in an unfinished form.
This fixes the build and lets the code run.
This commit is contained in:
Lynne
2025-06-11 13:41:59 +09:00
parent 9e93163268
commit 3ac7d70291
2 changed files with 28 additions and 15 deletions

View File

@ -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 |
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++) {

View File

@ -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 +