anv/image: Check DISJOINT in vkGetPhysicalDeviceImageFormatProperties2 (v2)
The code did not return error when VK_IMAGE_CREATE_DISJOINT_BIT was
incompatible with the other input params.
If the Vulkan spec forbids a set of input params for vkCreateImage,
but permits them for vkGetPhysicalDeviceImageFormatProperties2,
then vkGetPhysicalDeviceImageFormatProperties2 must reject those input
params with failure.
- v2: Clearer commit message.
CC: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> (v2)
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
(cherry picked from commit 51a19c83b000407a31b5cd17b996084a6b58a4ff)
diff --git a/.pick_status.json b/.pick_status.json
index 2509e22..387b08b 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -211,7 +211,7 @@
"description": "anv/image: Check DISJOINT in vkGetPhysicalDeviceImageFormatProperties2 (v2)",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"master_sha": null,
"because_sha": null
},
diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c
index 6cbbc77..a8d847a 100644
--- a/src/intel/vulkan/anv_formats.c
+++ b/src/intel/vulkan/anv_formats.c
@@ -923,6 +923,31 @@
}
}
+ if (info->flags & VK_IMAGE_CREATE_DISJOINT_BIT) {
+ /* From the Vulkan 1.2.149 spec, VkImageCreateInfo:
+ *
+ * If format is a multi-planar format, and if imageCreateFormatFeatures
+ * (as defined in Image Creation Limits) does not contain
+ * VK_FORMAT_FEATURE_DISJOINT_BIT, then flags must not contain
+ * VK_IMAGE_CREATE_DISJOINT_BIT.
+ */
+ if (format->n_planes > 1 &&
+ !(format_feature_flags & VK_FORMAT_FEATURE_DISJOINT_BIT)) {
+ goto unsupported;
+ }
+
+ /* From the Vulkan 1.2.149 spec, VkImageCreateInfo:
+ *
+ * If format is not a multi-planar format, and flags does not include
+ * VK_IMAGE_CREATE_ALIAS_BIT, flags must not contain
+ * VK_IMAGE_CREATE_DISJOINT_BIT.
+ */
+ if (format->n_planes == 1 &&
+ !(info->flags & VK_IMAGE_CREATE_ALIAS_BIT)) {
+ goto unsupported;
+ }
+ }
+
if (info->usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) {
/* Nothing to check. */
}