layers: Add tests for sparse images
Add two tests to verify the checks added around sparse residency
images.
Change-Id: Iedd56acecb34c26f367a099ca6acbea8f6e4dedf
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 26eacef..dc86d89 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -1316,6 +1316,163 @@
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
+ TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
+
+ // Determine which device feature are available
+ VkPhysicalDeviceFeatures available_features;
+ ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
+
+ // Mask out device features we don't want
+ VkPhysicalDeviceFeatures desired_features = available_features;
+ desired_features.sparseResidencyImage2D = VK_FALSE;
+ desired_features.sparseResidencyImage3D = VK_FALSE;
+ ASSERT_NO_FATAL_FAILURE(InitState(&desired_features));
+
+ VkImage image = VK_NULL_HANDLE;
+ VkResult result = VK_RESULT_MAX_ENUM;
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_1D;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.extent.width = 512;
+ image_create_info.extent.height = 1;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
+ image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ image_create_info.queueFamilyIndexCount = 0;
+ image_create_info.pQueueFamilyIndices = NULL;
+ image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
+
+ // 1D image w/ sparse residency is an error
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
+ result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ if (VK_SUCCESS == result) {
+ vkDestroyImage(m_device->device(), image, NULL);
+ image = VK_NULL_HANDLE;
+ }
+
+ // 2D image w/ sparse residency when feature isn't available
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.extent.height = 64;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
+ result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ if (VK_SUCCESS == result) {
+ vkDestroyImage(m_device->device(), image, NULL);
+ image = VK_NULL_HANDLE;
+ }
+
+ // 3D image w/ sparse residency when feature isn't available
+ image_create_info.imageType = VK_IMAGE_TYPE_3D;
+ image_create_info.extent.depth = 8;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
+ result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ if (VK_SUCCESS == result) {
+ vkDestroyImage(m_device->device(), image, NULL);
+ image = VK_NULL_HANDLE;
+ }
+}
+
+TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
+ TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
+
+ // Determine which device feature are available
+ VkPhysicalDeviceFeatures available_features;
+ ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
+
+ // These tests all require that the device support sparse residency for 2D images
+ if (VK_TRUE != available_features.sparseResidencyImage2D) {
+ return;
+ }
+
+ // Mask out device features we don't want
+ VkPhysicalDeviceFeatures desired_features = available_features;
+ desired_features.sparseResidency2Samples = VK_FALSE;
+ desired_features.sparseResidency4Samples = VK_FALSE;
+ desired_features.sparseResidency8Samples = VK_FALSE;
+ desired_features.sparseResidency16Samples = VK_FALSE;
+ ASSERT_NO_FATAL_FAILURE(InitState(&desired_features));
+
+ VkImage image = VK_NULL_HANDLE;
+ VkResult result = VK_RESULT_MAX_ENUM;
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.extent.width = 64;
+ image_create_info.extent.height = 64;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
+ image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
+ image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ image_create_info.queueFamilyIndexCount = 0;
+ image_create_info.pQueueFamilyIndices = NULL;
+ image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
+
+ // 2D image w/ sparse residency and linear tiling is an error
+ m_errorMonitor->SetDesiredFailureMsg(
+ VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
+ result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ if (VK_SUCCESS == result) {
+ vkDestroyImage(m_device->device(), image, NULL);
+ image = VK_NULL_HANDLE;
+ }
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+
+ // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
+ image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
+ result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ if (VK_SUCCESS == result) {
+ vkDestroyImage(m_device->device(), image, NULL);
+ image = VK_NULL_HANDLE;
+ }
+
+ image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
+ result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ if (VK_SUCCESS == result) {
+ vkDestroyImage(m_device->device(), image, NULL);
+ image = VK_NULL_HANDLE;
+ }
+
+ image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
+ result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ if (VK_SUCCESS == result) {
+ vkDestroyImage(m_device->device(), image, NULL);
+ image = VK_NULL_HANDLE;
+ }
+
+ image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
+ result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ if (VK_SUCCESS == result) {
+ vkDestroyImage(m_device->device(), image, NULL);
+ image = VK_NULL_HANDLE;
+ }
+}
+
TEST_F(VkLayerTest, InvalidMemoryAliasing) {
TEST_DESCRIPTION(
"Create a buffer and image, allocate memory, and bind the "