mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2026-11-06 05:17:42 +00:00
avutil/vulkan: add ff_vk_create_imageviews_fmt()
Like ff_vk_create_imageviews(), but with an explicit view format per plane. Signed-off-by: Niklas Haas <git@haasn.dev>
This commit is contained in:
1 parent
687fb754b1
commit
0c9b8145bc
2 files changed
+36
-12
No files matched your search
+27
-12
@@ -2146,16 +2146,16 @@ int ff_vk_create_imageview(FFVulkanContext *s,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e,
|
||||
VkImageView views[AV_NUM_DATA_POINTERS],
|
||||
AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
|
||||
int ff_vk_create_imageviews_fmt(FFVulkanContext *s, FFVkExecContext *e,
|
||||
VkImageView views[AV_NUM_DATA_POINTERS],
|
||||
AVFrame *f,
|
||||
const VkFormat fmts[AV_NUM_DATA_POINTERS])
|
||||
{
|
||||
int err = 0;
|
||||
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);
|
||||
const int nb_planes = av_pix_fmt_count_planes(hwfc->sw_format);
|
||||
@@ -2173,7 +2173,7 @@ int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e,
|
||||
.pNext = &view_usage_info,
|
||||
.image = vkf->img[FFMIN(i, nb_images - 1)],
|
||||
.viewType = VK_IMAGE_VIEW_TYPE_2D,
|
||||
.format = ff_vk_map_fmt_to_rep(rep_fmts[i], rep_fmt),
|
||||
.format = fmts[i],
|
||||
.components = ff_comp_identity_map,
|
||||
.subresourceRange = {
|
||||
.aspectMask = ff_vk_aspect_flag(f, i),
|
||||
@@ -2181,13 +2181,6 @@ int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e,
|
||||
.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[i], rep_fmt);
|
||||
err = AVERROR(EINVAL);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = vk->CreateImageView(s->hwctx->act_dev, &view_create_info,
|
||||
s->hwctx->alloc, &tmp_views[i]);
|
||||
@@ -2215,6 +2208,28 @@ fail:
|
||||
return err;
|
||||
}
|
||||
|
||||
int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e,
|
||||
VkImageView views[AV_NUM_DATA_POINTERS],
|
||||
AVFrame *f, enum FFVkShaderRepFormat rep_fmt)
|
||||
{
|
||||
AVHWFramesContext *hwfc = (AVHWFramesContext *)f->hw_frames_ctx->data;
|
||||
const VkFormat *rep_fmts = av_vkfmt_from_pixfmt(hwfc->sw_format);
|
||||
const int nb_planes = av_pix_fmt_count_planes(hwfc->sw_format);
|
||||
VkFormat fmts[AV_NUM_DATA_POINTERS] = { 0 };
|
||||
|
||||
for (int i = 0; i < nb_planes; i++) {
|
||||
fmts[i] = ff_vk_map_fmt_to_rep(rep_fmts[i], rep_fmt);
|
||||
if (fmts[i] == VK_FORMAT_UNDEFINED) {
|
||||
av_log(s, AV_LOG_ERROR, "Unable to find a compatible representation "
|
||||
"of format %i and mode %i\n",
|
||||
rep_fmts[i], rep_fmt);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
}
|
||||
|
||||
return ff_vk_create_imageviews_fmt(s, e, views, f, fmts);
|
||||
}
|
||||
|
||||
void ff_vk_frame_barrier(FFVulkanContext *s, FFVkExecContext *e,
|
||||
AVFrame *pic, VkImageMemoryBarrier2 *bar, int *nb_bar,
|
||||
VkPipelineStageFlags2 src_stage,
|
||||
|
||||
@@ -582,6 +582,15 @@ int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e,
|
||||
VkImageView views[AV_NUM_DATA_POINTERS],
|
||||
AVFrame *f, enum FFVkShaderRepFormat rep_fmt);
|
||||
|
||||
/**
|
||||
* Same as ff_vk_create_imageviews(), but with an explicit view format for
|
||||
* each plane, which must be compatible with the format of the image.
|
||||
*/
|
||||
int ff_vk_create_imageviews_fmt(FFVulkanContext *s, FFVkExecContext *e,
|
||||
VkImageView views[AV_NUM_DATA_POINTERS],
|
||||
AVFrame *f,
|
||||
const VkFormat fmts[AV_NUM_DATA_POINTERS]);
|
||||
|
||||
#define ff_vk_buf_barrier(dst, vkb, s_stage, s_access, s_access2, \
|
||||
d_stage, d_access, d_access2, offs, bsz) \
|
||||
do { \
|
||||
|
||||
Reference in new issue
Block a user