Vulkan: Fix image tiling when DRM format modifiers are specified
Bug: angleproject:6679
Change-Id: I5198a180608535131b127c135423fb80c6478140
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3292027
Reviewed-by: Craig Stout <cstout@google.com>
Reviewed-by: Tim Van Patten <timvp@google.com>
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index ae75b16..b183c7b 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -4130,6 +4130,11 @@
DeriveCreateInfoPNext(context, actualFormatID, nullptr, &imageFormatListInfoStorage,
&imageListFormatsStorage, &mCreateFlags);
}
+ else
+ {
+ // Derive the tiling for external images.
+ deriveExternalImageTiling(externalImageCreateInfo);
+ }
mYuvConversionSampler.reset();
mExternalFormat = 0;
@@ -4248,6 +4253,22 @@
return pNext;
}
+void ImageHelper::deriveExternalImageTiling(const void *createInfoChain)
+{
+ const VkBaseInStructure *chain = reinterpret_cast<const VkBaseInStructure *>(createInfoChain);
+ while (chain != nullptr)
+ {
+ if (chain->sType == VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT ||
+ chain->sType == VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT)
+ {
+ mTilingMode = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
+ return;
+ }
+
+ chain = reinterpret_cast<const VkBaseInStructure *>(chain->pNext);
+ }
+}
+
void ImageHelper::releaseImage(RendererVk *renderer)
{
renderer->collectGarbageAndReinit(&mUse, &mImage, &mDeviceMemory);
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h
index e92b9e3..df73ee9 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -2114,6 +2114,8 @@
RefCounted<ImageHelper> *image;
};
+ void deriveExternalImageTiling(const void *createInfoChain);
+
// Called from flushStagedUpdates, removes updates that are later superseded by another. This
// cannot be done at the time the updates were staged, as the image is not created (and thus the
// extents are not known).