tests: Add VU 792,804 to BindInvalidMemory
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 2ee3195..670b7ca 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -2529,7 +2529,7 @@
     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.tiling = VK_IMAGE_TILING_OPTIMAL;
     image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
     image_create_info.flags = 0;
 
@@ -2631,6 +2631,85 @@
         vkDestroyImage(device(), image, NULL);
         vkDestroyBuffer(device(), buffer, NULL);
     }
+
+    // Try to bind memory to an image created with sparse memory flags
+    {
+        VkImageCreateInfo sparse_image_create_info = image_create_info;
+        sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
+        VkImageFormatProperties image_format_properties = {};
+        err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
+                                                       sparse_image_create_info.imageType, sparse_image_create_info.tiling,
+                                                       sparse_image_create_info.usage, sparse_image_create_info.flags,
+                                                       &image_format_properties);
+        if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
+            // most likely means sparse formats aren't supported here; skip this test.
+        } else {
+            ASSERT_VK_SUCCESS(err);
+            if (image_format_properties.maxExtent.width == 0) {
+                printf("sparse image format not supported; skipped.\n");
+                return;
+            } else {
+                VkImage sparse_image = VK_NULL_HANDLE;
+                err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
+                ASSERT_VK_SUCCESS(err);
+                VkMemoryRequirements sparse_mem_reqs = {};
+                vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
+                if (sparse_mem_reqs.memoryTypeBits != 0) {
+                    VkMemoryAllocateInfo sparse_mem_alloc = {};
+                    sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+                    sparse_mem_alloc.pNext = NULL;
+                    sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
+                    sparse_mem_alloc.memoryTypeIndex = 0;
+                    pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
+                    ASSERT_TRUE(pass);
+                    VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
+                    err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
+                    ASSERT_VK_SUCCESS(err);
+                    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
+                    err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
+                    // This may very well return an error.
+                    (void)err;
+                    m_errorMonitor->VerifyFound();
+                    vkFreeMemory(m_device->device(), sparse_mem, NULL);
+                }
+                vkDestroyImage(m_device->device(), sparse_image, NULL);
+            }
+        }
+    }
+
+    // Try to bind memory to a buffer created with sparse memory flags
+    {
+        VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
+        sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
+        if (!m_device->phy().features().sparseResidencyBuffer) {
+            // most likely means sparse formats aren't supported here; skip this test.
+        } else {
+            VkBuffer sparse_buffer = VK_NULL_HANDLE;
+            err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
+            ASSERT_VK_SUCCESS(err);
+            VkMemoryRequirements sparse_mem_reqs = {};
+            vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
+            if (sparse_mem_reqs.memoryTypeBits != 0) {
+                VkMemoryAllocateInfo sparse_mem_alloc = {};
+                sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+                sparse_mem_alloc.pNext = NULL;
+                sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
+                sparse_mem_alloc.memoryTypeIndex = 0;
+                pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
+                ASSERT_TRUE(pass);
+                VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
+                err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
+                ASSERT_VK_SUCCESS(err);
+                m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
+                err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
+                // This may very well return an error.
+                (void)err;
+                m_errorMonitor->VerifyFound();
+                vkFreeMemory(m_device->device(), sparse_mem, NULL);
+            }
+            vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
+        }
+    }
 }
 
 TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {