You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-04 22:03:09 +02:00
vulkan: add ff_vk_create_imageview
This commit is contained in:
@ -1560,6 +1560,57 @@ static VkFormat map_fmt_to_rep(VkFormat fmt, enum FFVkShaderRepFormat rep_fmt)
|
|||||||
return VK_FORMAT_UNDEFINED;
|
return VK_FORMAT_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ff_vk_create_imageview(FFVulkanContext *s,
|
||||||
|
VkImageView *img_view, VkImageAspectFlags *aspect,
|
||||||
|
AVFrame *f, int plane, enum FFVkShaderRepFormat rep_fmt)
|
||||||
|
{
|
||||||
|
VkResult ret;
|
||||||
|
FFVulkanFunctions *vk = &s->vkfn;
|
||||||
|
AVHWFramesContext *hwfc = (AVHWFramesContext *)f->hw_frames_ctx->data;
|
||||||
|
AVVulkanFramesContext *vkfc = hwfc->hwctx;
|
||||||
|
const VkFormat *rep_fmts = av_vkfmt_from_pixfmt(hwfc->sw_format);
|
||||||
|
AVVkFrame *vkf = (AVVkFrame *)f->data[0];
|
||||||
|
const int nb_images = ff_vk_count_images(vkf);
|
||||||
|
|
||||||
|
VkImageViewUsageCreateInfo view_usage_info = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
|
||||||
|
.usage = vkfc->usage &
|
||||||
|
(~(VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR |
|
||||||
|
VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR)),
|
||||||
|
};
|
||||||
|
VkImageViewCreateInfo view_create_info = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
||||||
|
.pNext = &view_usage_info,
|
||||||
|
.image = vkf->img[FFMIN(plane, nb_images - 1)],
|
||||||
|
.viewType = VK_IMAGE_VIEW_TYPE_2D,
|
||||||
|
.format = map_fmt_to_rep(rep_fmts[plane], rep_fmt),
|
||||||
|
.components = ff_comp_identity_map,
|
||||||
|
.subresourceRange = {
|
||||||
|
.aspectMask = ff_vk_aspect_flag(f, plane),
|
||||||
|
.levelCount = 1,
|
||||||
|
.layerCount = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
if (view_create_info.format == VK_FORMAT_UNDEFINED) {
|
||||||
|
av_log(s, AV_LOG_ERROR, "Unable to find a compatible representation "
|
||||||
|
"of format %i and mode %i\n",
|
||||||
|
rep_fmts[plane], rep_fmt);
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = vk->CreateImageView(s->hwctx->act_dev, &view_create_info,
|
||||||
|
s->hwctx->alloc, img_view);
|
||||||
|
if (ret != VK_SUCCESS) {
|
||||||
|
av_log(s, AV_LOG_ERROR, "Failed to create imageview: %s\n",
|
||||||
|
ff_vk_ret2str(ret));
|
||||||
|
return AVERROR_EXTERNAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
*aspect = view_create_info.subresourceRange.aspectMask;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e,
|
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e,
|
||||||
VkImageView views[AV_NUM_DATA_POINTERS],
|
VkImageView views[AV_NUM_DATA_POINTERS],
|
||||||
AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
|
AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
|
||||||
|
@ -457,6 +457,13 @@ int ff_vk_exec_mirror_sem_value(FFVulkanContext *s, FFVkExecContext *e,
|
|||||||
AVFrame *f);
|
AVFrame *f);
|
||||||
void ff_vk_exec_discard_deps(FFVulkanContext *s, FFVkExecContext *e);
|
void ff_vk_exec_discard_deps(FFVulkanContext *s, FFVkExecContext *e);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a single imageview for a given plane.
|
||||||
|
*/
|
||||||
|
int ff_vk_create_imageview(FFVulkanContext *s,
|
||||||
|
VkImageView *img_view, VkImageAspectFlags *aspect,
|
||||||
|
AVFrame *f, int plane, enum FFVkShaderRepFormat rep_fmt);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create an imageview and add it as a dependency to an execution.
|
* Create an imageview and add it as a dependency to an execution.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user