layers: fix a multiplane imageview bug
Change-Id: If11059dca9716a90134d9d362351634fa07a8ecd
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 330e187..36fad74 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -3358,8 +3358,8 @@
image_usage = chained_ivuci_struct->usage;
}
- // Validate VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT state
- if (image_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) {
+ // Validate VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT state, if view/image formats differ
+ if ((image_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT) && (image_format != view_format)) {
if (FormatIsMultiplane(image_format)) {
// View format must match the multiplane compatible format
uint32_t plane = 3; // invalid
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index c5e1415..96e9afb 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -18809,7 +18809,7 @@
}
TEST_F(VkLayerTest, MultiplaneIncompatibleViewFormat) {
- TEST_DESCRIPTION("Postive test of multiplane format compatibility checks");
+ TEST_DESCRIPTION("Postive/negative tests of multiplane imageview format compatibility");
// Enable KHR multiplane req'd extensions
bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
@@ -18900,16 +18900,26 @@
m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_0ac00c64);
vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
m_errorMonitor->VerifyFound();
+ vkDestroyImageView(m_device->device(), imageView, NULL); // VK_NULL_HANDLE allowed
+ imageView = VK_NULL_HANDLE;
// Correct format succeeds
ivci.format = VK_FORMAT_R8_UNORM;
m_errorMonitor->ExpectSuccess();
vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
m_errorMonitor->VerifyNotFound();
+ vkDestroyImageView(m_device->device(), imageView, NULL); // VK_NULL_HANDLE allowed
+ imageView = VK_NULL_HANDLE;
- if (VK_NULL_HANDLE != imageView) {
- vkDestroyImageView(m_device->device(), imageView, NULL);
- }
+ // Try a multiplane imageview
+ ivci.format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ m_errorMonitor->ExpectSuccess();
+ vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
+ m_errorMonitor->VerifyNotFound();
+ vkDestroyImageView(m_device->device(), imageView, NULL); // VK_NULL_HANDLE allowed
+ imageView = VK_NULL_HANDLE;
+
vkFreeMemory(device(), mem_obj, NULL);
vkDestroyImage(m_device->device(), image, NULL);
}