History

vulkan: workaround BGR storage image undefined behaviour

Lynne committed 1 year ago

Commit bbb06f11 parent 3c09aad1 file · +25 −0Browse files

Unified · Split

libavutil/vulkan.c+25−0
@@ -1719,6 +1719,29 @@ static VkFormat map_fmt_to_rep(VkFormat fmt, enum FFVkShaderRepFormat rep_fmt) · 1718 unmodified lines
17191719 return VK_FORMAT_UNDEFINED;
17201720 }
17211721
1722+static void bgr_workaround(AVVulkanFramesContext *vkfc,
1723+ VkImageViewCreateInfo *ci)
1724+{
1725+ if (!(vkfc->usage & VK_IMAGE_USAGE_STORAGE_BIT))
1726+ return;
1727+ switch (ci->format) {
1728+#define REMAP(src, dst) \
1729+ case src: \
1730+ ci->format = dst; \
1731+ return;
1732+ REMAP(VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM)
1733+ REMAP(VK_FORMAT_B8G8R8A8_SINT, VK_FORMAT_R8G8B8A8_SINT)
1734+ REMAP(VK_FORMAT_B8G8R8A8_UINT, VK_FORMAT_R8G8B8A8_UINT)
1735+ REMAP(VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_R8G8B8_UNORM)
1736+ REMAP(VK_FORMAT_B8G8R8_SINT, VK_FORMAT_R8G8B8_SINT)
1737+ REMAP(VK_FORMAT_B8G8R8_UINT, VK_FORMAT_R8G8B8_UINT)
1738+ REMAP(VK_FORMAT_A2B10G10R10_UNORM_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32)
1739+#undef REMAP
1740+ default:
1741+ return;
1742+ }
1743+}
1744+
17221745 int ff_vk_create_imageview(FFVulkanContext *s,
17231746 VkImageView *img_view, VkImageAspectFlags *aspect,
17241747 AVFrame *f, int plane, enum FFVkShaderRepFormat rep_fmt)
@@ -1750,6 +1773,7 @@ int ff_vk_create_imageview(FFVulkanContext *s, · 25 unmodified lines
17501773 .layerCount = 1,
17511774 },
17521775 };
1776+ bgr_workaround(vkfc, &view_create_info);
17531777 if (view_create_info.format == VK_FORMAT_UNDEFINED) {
17541778 av_log(s, AV_LOG_ERROR, "Unable to find a compatible representation "
17551779 "of format %i and mode %i\n",
@@ -1811,6 +1835,7 @@ int ff_vk_create_imageviews(FFVulkanContext *s, FFVkExecContext *e, · 55 unmodified lines
18111835 .layerCount = 1,
18121836 },
18131837 };
1838+ bgr_workaround(vkfc, &view_create_info);
18141839 if (view_create_info.format == VK_FORMAT_UNDEFINED) {
18151840 av_log(s, AV_LOG_ERROR, "Unable to find a compatible representation "
18161841 "of format %i and mode %i\n",

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t