tests: Update ErrorMonitor - Jira VL72

Change-Id: I66a5fb4bde01389e07e5fbeaaeff70b777e107b5
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 60f43d6..7237531 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -109,84 +109,87 @@
 
 // ErrorMonitor Usage:
 //
-// Call SetDesiredFailureMsg with: a string to be compared against all
+// Call SetDesiredFailureMsg with a string to be compared against all
 // encountered log messages, or a validation error enum identifying
 // desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
 // will match all log messages. logMsg will return true for skipCall
 // only if msg is matched or NULL.
 //
-// Call DesiredMsgFound to determine if the desired failure message
-// was encountered.
+// Call VerifyFound to determine if all desired failure messages
+// were encountered. Call VerifyNotFound to determine if any unexpected
+// failure was encountered.
 class ErrorMonitor {
   public:
     ErrorMonitor() {
-        test_platform_thread_create_mutex(&m_mutex);
-        test_platform_thread_lock_mutex(&m_mutex);
-        m_msgFlags = VK_DEBUG_REPORT_ERROR_BIT_EXT;
-        m_bailout = NULL;
-        test_platform_thread_unlock_mutex(&m_mutex);
+        test_platform_thread_create_mutex(&mutex_);
+        test_platform_thread_lock_mutex(&mutex_);
+        Reset();
+        test_platform_thread_unlock_mutex(&mutex_);
     }
 
-    ~ErrorMonitor() { test_platform_thread_delete_mutex(&m_mutex); }
+    ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
 
-    // ErrorMonitor will look for an error message containing the specified string
+    // Set monitor to pristine state
+    void Reset() {
+        message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
+        bailout_ = NULL;
+        message_found_ = VK_FALSE;
+        failure_message_strings_.clear();
+        desired_message_strings_.clear();
+        desired_message_ids_.clear();
+        other_messages_.clear();
+        message_outstanding_count_ = 0;
+    }
+
+    // ErrorMonitor will look for an error message containing the specified string(s)
     void SetDesiredFailureMsg(VkFlags msgFlags, const char *msgString) {
-        // Also discard all collected messages to this point
-        test_platform_thread_lock_mutex(&m_mutex);
-        m_failure_message_strings.clear();
-        // If we are looking for a matching string, ignore any IDs
-        m_desired_message_ids.clear();
-        m_otherMsgs.clear();
-        m_desired_message_strings.insert(msgString);
-        m_msgFound = VK_FALSE;
-        m_msgFlags = msgFlags;
-        test_platform_thread_unlock_mutex(&m_mutex);
+        test_platform_thread_lock_mutex(&mutex_);
+        desired_message_strings_.insert(msgString);
+        message_flags_ |= msgFlags;
+        message_outstanding_count_++;
+        test_platform_thread_unlock_mutex(&mutex_);
     }
 
-    // ErrorMonitor will look for a message ID matching the specified one
+    // ErrorMonitor will look for a message ID matching the specified one(s)
     void SetDesiredFailureMsg(VkFlags msgFlags, UNIQUE_VALIDATION_ERROR_CODE msg_id) {
-        // Also discard all collected messages to this point
-        test_platform_thread_lock_mutex(&m_mutex);
-        m_failure_message_strings.clear();
-        // If we are looking for IDs don't look for strings
-        m_desired_message_strings.clear();
-        m_otherMsgs.clear();
-        m_desired_message_ids.insert(msg_id);
-        m_msgFound = VK_FALSE;
-        m_msgFlags = msgFlags;
-        test_platform_thread_unlock_mutex(&m_mutex);
+        test_platform_thread_lock_mutex(&mutex_);
+        desired_message_ids_.insert(msg_id);
+        message_flags_ |= msgFlags;
+        message_outstanding_count_++;
+        test_platform_thread_unlock_mutex(&mutex_);
     }
 
     VkBool32 CheckForDesiredMsg(uint32_t message_code, const char *msgString) {
         VkBool32 result = VK_FALSE;
-        test_platform_thread_lock_mutex(&m_mutex);
-        if (m_bailout != NULL) {
-            *m_bailout = true;
+        test_platform_thread_lock_mutex(&mutex_);
+        if (bailout_ != NULL) {
+            *bailout_ = true;
         }
         string errorString(msgString);
         bool found_expected = false;
 
-        for (auto desired_msg : m_desired_message_strings) {
+        for (auto desired_msg : desired_message_strings_) {
             if (desired_msg.length() == 0) {
                 // An empty desired_msg string "" indicates a positive test - not expecting an error.
                 // Return true to avoid calling layers/driver with this error.
                 // And don't erase the "" string, so it remains if another error is found.
                 result = VK_TRUE;
                 found_expected = true;
-                m_msgFound = VK_TRUE;
-                m_failure_message_strings.insert(errorString);
+                message_found_ = VK_TRUE;
+                failure_message_strings_.insert(errorString);
             } else if (errorString.find(desired_msg) != string::npos) {
                 found_expected = true;
-                m_failure_message_strings.insert(errorString);
-                m_msgFound = VK_TRUE;
+                message_outstanding_count_--;
+                failure_message_strings_.insert(errorString);
+                message_found_ = VK_TRUE;
                 result = VK_TRUE;
                 // We only want one match for each expected error so remove from set here
                 // Since we're about the break the loop it's ok to remove from set we're iterating over
-                m_desired_message_strings.erase(desired_msg);
+                desired_message_strings_.erase(desired_msg);
                 break;
             }
         }
-        for (auto desired_id : m_desired_message_ids) {
+        for (auto desired_id : desired_message_ids_) {
             if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
                 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
                 // Return true to avoid calling layers/driver with this error.
@@ -195,9 +198,10 @@
                 // Double-check that the string matches the error enum
                 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
                     found_expected = true;
+                    message_outstanding_count_--;
                     result = VK_TRUE;
-                    m_msgFound = VK_TRUE;
-                    m_desired_message_ids.erase(desired_id);
+                    message_found_ = VK_TRUE;
+                    desired_message_ids_.erase(desired_id);
                     break;
                 } else {
                     // Treat this message as a regular unexpected error, but print a warning jic
@@ -209,19 +213,21 @@
 
         if (!found_expected) {
             printf("Unexpected: %s\n", msgString);
-            m_otherMsgs.push_back(errorString);
+            other_messages_.push_back(errorString);
         }
-        test_platform_thread_unlock_mutex(&m_mutex);
+        test_platform_thread_unlock_mutex(&mutex_);
         return result;
     }
 
-    vector<string> GetOtherFailureMsgs(void) { return m_otherMsgs; }
+    vector<string> GetOtherFailureMsgs(void) { return other_messages_; }
 
-    VkDebugReportFlagsEXT GetMessageFlags(void) { return m_msgFlags; }
+    VkDebugReportFlagsEXT GetMessageFlags(void) { return message_flags_; }
 
-    VkBool32 DesiredMsgFound(void) { return m_msgFound; }
+    VkBool32 AnyDesiredMsgFound(void) { return message_found_; }
 
-    void SetBailout(bool *bailout) { m_bailout = bailout; }
+    VkBool32 AllDesiredMsgsFound(void) { return (0 == message_outstanding_count_); }
+
+    void SetBailout(bool *bailout) { bailout_ = bailout; }
 
     void DumpFailureMsgs(void) {
         vector<string> otherMsgs = GetOtherFailureMsgs();
@@ -237,43 +243,46 @@
 
     // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
     void ExpectSuccess(VkDebugReportFlagsEXT message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
-        m_msgFlags = message_flag_mask;
         // Match ANY message matching specified type
         SetDesiredFailureMsg(message_flag_mask, "");
+        message_flags_ = message_flag_mask; // override mask handling in SetDesired...
     }
 
     void VerifyFound() {
         // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
-        if (!DesiredMsgFound()) {
+        if (!AllDesiredMsgsFound()) {
             DumpFailureMsgs();
-            for (auto desired_msg : m_desired_message_strings) {
+            for (auto desired_msg : desired_message_strings_) {
                 FAIL() << "Did not receive expected error '" << desired_msg << "'";
             }
-            for (auto desired_id : m_desired_message_ids) {
+            for (auto desired_id : desired_message_ids_) {
                 FAIL() << "Did not receive expected error '" << desired_id << "'";
             }
         }
+        Reset();
     }
 
     void VerifyNotFound() {
         // ExpectSuccess() configured us to match anything. Any error is a failure.
-        if (DesiredMsgFound()) {
+        if (AnyDesiredMsgFound()) {
             DumpFailureMsgs();
-            for (auto msg : m_failure_message_strings) {
+            for (auto msg : failure_message_strings_) {
                 FAIL() << "Expected to succeed but got error: " << msg;
             }
         }
+        Reset();
     }
 
   private:
-    VkFlags m_msgFlags;
-    std::unordered_set<uint32_t>m_desired_message_ids;
-    std::unordered_set<string> m_desired_message_strings;
-    std::unordered_set<string> m_failure_message_strings;
-    vector<string> m_otherMsgs;
-    test_platform_thread_mutex m_mutex;
-    bool *m_bailout;
-    VkBool32 m_msgFound;
+    VkFlags                         message_flags_;
+    std::unordered_set<uint32_t>    desired_message_ids_;
+    std::unordered_set<string>      desired_message_strings_;
+    std::unordered_set<string>      failure_message_strings_;
+    vector<string>                  other_messages_;
+    test_platform_thread_mutex      mutex_;
+    bool                            *bailout_;
+    VkBool32                        message_found_;
+    int                             message_outstanding_count_;
 };
 
 static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
@@ -5371,7 +5380,6 @@
     // Now update descriptor to be valid, but then free descriptor
     img_info.imageView = view2;
     vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
-    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
     m_commandBuffer->BeginCommandBuffer();
     m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
     vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
@@ -5382,17 +5390,26 @@
     Draw(1, 0, 0, 0);
     m_commandBuffer->EndRenderPass();
     m_commandBuffer->EndCommandBuffer();
-    // Destroy descriptor set invalidates the cb, causing error on submit
+
+    // Immediately try to destroy the descriptor set in the active command buffer - failure expected
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
     vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
     m_errorMonitor->VerifyFound();
-    // Attempt to submit cmd buffer
+
+    // Try again once the queue is idle - should succeed w/o error
+    // TODO - thought the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
+    vkQueueWaitIdle(m_device->m_queue);
+    vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
+
+    // Attempt to submit cmd buffer containing the freed descriptor set
     submit_info = {};
     submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
     submit_info.commandBufferCount = 1;
     submit_info.pCommandBuffers = &m_commandBuffer->handle();
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
     m_errorMonitor->VerifyFound();
+
     // Cleanup
     vkFreeMemory(m_device->device(), image_memory, NULL);
     vkDestroySampler(m_device->device(), sampler2, NULL);
@@ -8477,9 +8494,6 @@
     // Now exercise barrier aspect bit errors, first DS
     m_errorMonitor->SetDesiredFailureMsg(
         VK_DEBUG_REPORT_ERROR_BIT_EXT,
-        "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
-    m_errorMonitor->SetDesiredFailureMsg(
-        VK_DEBUG_REPORT_ERROR_BIT_EXT,
         "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
     VkDepthStencilObj ds_image(m_device);
     ds_image.Init(m_device, 128, 128, VK_FORMAT_D24_UNORM_S8_UINT);
@@ -8487,35 +8501,53 @@
     img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
     img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
     img_barrier.image = ds_image.handle();
-    // Use of COLOR aspect on DS image is error
-    img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+    // Not having DEPTH or STENCIL set is an error
+    img_barrier.subresourceRange.aspectMask = 0;
     vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
                          nullptr, 0, nullptr, 1, &img_barrier);
     m_errorMonitor->VerifyFound();
+
+    // Having anything other than DEPTH or STENCIL is an error
+    m_errorMonitor->SetDesiredFailureMsg(
+        VK_DEBUG_REPORT_ERROR_BIT_EXT,
+        "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
+    img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
+    vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
+                         nullptr, 0, nullptr, 1, &img_barrier);
+    m_errorMonitor->VerifyFound();
+
     // Now test depth-only
     VkFormatProperties format_props;
-
     vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
     if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
-        m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
-                                             "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
-        m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
-                                             "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
         VkDepthStencilObj d_image(m_device);
         d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
         ASSERT_TRUE(d_image.initialized());
         img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
         img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
         img_barrier.image = d_image.handle();
-        // Use of COLOR aspect on depth image is error
-        img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+        // DEPTH bit must be set
+        m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+                                             "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
+        img_barrier.subresourceRange.aspectMask = 0;
+        vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
+                             0, nullptr, 0, nullptr, 1, &img_barrier);
+        m_errorMonitor->VerifyFound();
+
+        // No bits other than DEPTH may be set
+        m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+                                             "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
+        img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
         vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
                              0, nullptr, 0, nullptr, 1, &img_barrier);
         m_errorMonitor->VerifyFound();
     }
+
+    // Now test stencil-only
     vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
     if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
-        // Now test stencil-only
         m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
                                              "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
         VkDepthStencilObj s_image(m_device);
@@ -8530,19 +8562,27 @@
                              0, nullptr, 0, nullptr, 1, &img_barrier);
         m_errorMonitor->VerifyFound();
     }
+
     // Finally test color
-    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
-                                         "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
-    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
-                                         "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
     VkImageObj c_image(m_device);
     c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
     ASSERT_TRUE(c_image.initialized());
     img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
     img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
     img_barrier.image = c_image.handle();
-    // Set aspect to depth (non-color)
-    img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+
+    // COLOR bit must be set
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+                                         "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
+    img_barrier.subresourceRange.aspectMask = 0;
+    vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
+                         nullptr, 0, nullptr, 1, &img_barrier);
+    m_errorMonitor->VerifyFound();
+
+    // No bits other than COLOR may be set
+    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+                                         "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
+    img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
     vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
                          nullptr, 0, nullptr, 1, &img_barrier);
     m_errorMonitor->VerifyFound();
@@ -10442,15 +10482,11 @@
                      "Use invalid Queue Family Index in vkCreateDevice");
     ASSERT_NO_FATAL_FAILURE(InitState());
 
-    const char *mismatch_count_message = "Call to vkEnumeratePhysicalDevices() "
-                                         "w/ pPhysicalDeviceCount value ";
-
     const char *invalid_queueFamilyIndex_message = "Invalid queue create request in vkCreateDevice(). Invalid "
                                                    "queueFamilyIndex ";
 
     const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
 
-    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, mismatch_count_message);
     // The following test fails with recent NVidia drivers.
     // By the time core_validation is reached, the NVidia
     // driver has sanitized the invalid condition and core_validation
@@ -11184,8 +11220,9 @@
     vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
     vkEndCommandBuffer(m_commandBuffer->handle());
 
-    m_errorMonitor->SetDesiredFailureMsg(0, "");
+    m_errorMonitor->ExpectSuccess(0);
     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+    m_errorMonitor->VerifyNotFound();
 
     command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
     vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
@@ -11285,7 +11322,7 @@
     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
     m_errorMonitor->VerifyFound();
 
-    m_errorMonitor->SetDesiredFailureMsg(0, "");
+    m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
     vkResetCommandBuffer(m_commandBuffer->handle(), 0);
 
     vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
@@ -11381,6 +11418,7 @@
     submit_info.signalSemaphoreCount = 1;
     submit_info.pSignalSemaphores = &semaphore;
     vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
+    m_errorMonitor->Reset(); // resume logmsg processing
 
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
     vkDestroyEvent(m_device->device(), event, nullptr);
@@ -12016,8 +12054,9 @@
     submit_info.signalSemaphoreCount = 1;
     submit_info.pSignalSemaphores = &semaphore;
     vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
-    m_errorMonitor->SetDesiredFailureMsg(0, "");
+    m_errorMonitor->ExpectSuccess(0);
     vkResetCommandBuffer(m_commandBuffer->handle(), 0);
+    m_errorMonitor->VerifyNotFound();
     m_commandBuffer->BeginCommandBuffer();
     m_commandBuffer->EndCommandBuffer();
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
@@ -14773,9 +14812,6 @@
     m_errorMonitor->VerifyFound();
     imgViewInfo.subresourceRange.levelCount = 1;
 
-    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCreateImageView called with 0 in "
-                                                                        "pCreateInfo->subresourceRange."
-                                                                        "layerCount");
     m_errorMonitor->SetDesiredFailureMsg(
         VK_DEBUG_REPORT_ERROR_BIT_EXT,
         "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
@@ -14785,7 +14821,6 @@
     m_errorMonitor->VerifyFound();
     imgViewInfo.subresourceRange.layerCount = 1;
 
-    m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "but both must be color formats");
     m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Formats MUST be IDENTICAL unless "
                                                                         "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
                                                                         "was set on image creation.");