layers: Split CmdResolveImage val/state updates
authorMark Lobodzinski <mark@lunarg.com>
Mon, 6 Feb 2017 17:07:21 +0000 (10:07 -0700)
committerMark Lobodzinski <mark@lunarg.com>
Tue, 7 Feb 2017 21:02:48 +0000 (14:02 -0700)
Change-Id: I60b593da5f2863d7d0ac9c1d1785ff43d3179c6f

layers/core_validation.cpp

index ce66c54..12194cb 100644 (file)
@@ -8446,32 +8446,36 @@ VKAPI_ATTR void VKAPI_CALL CmdResolveImage(VkCommandBuffer commandBuffer, VkImag
     auto cb_node = getCBNode(dev_data, commandBuffer);
     auto src_image_state = getImageState(dev_data, srcImage);
     auto dst_image_state = getImageState(dev_data, dstImage);
+
     if (cb_node && src_image_state && dst_image_state) {
         skip |= ValidateMemoryIsBoundToImage(dev_data, src_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02541);
         skip |= ValidateMemoryIsBoundToImage(dev_data, dst_image_state, "vkCmdResolveImage()", VALIDATION_ERROR_02542);
-        // Update bindings between images and cmd buffer
-        AddCommandBufferBindingImage(dev_data, cb_node, src_image_state);
-        AddCommandBufferBindingImage(dev_data, cb_node, dst_image_state);
-        std::function<bool()> function = [=]() {
-            return ValidateImageMemoryIsValid(dev_data, src_image_state, "vkCmdResolveImage()");
-        };
-        cb_node->validate_functions.push_back(function);
-        function = [=]() {
-            SetImageMemoryValid(dev_data, dst_image_state, true);
-            return false;
-        };
-        cb_node->validate_functions.push_back(function);
-
         skip |= ValidateCmd(dev_data, cb_node, CMD_RESOLVEIMAGE, "vkCmdResolveImage()");
-        UpdateCmdBufferLastCmd(dev_data, cb_node, CMD_RESOLVEIMAGE);
         skip |= insideRenderPass(dev_data, cb_node, "vkCmdResolveImage()", VALIDATION_ERROR_01335);
+
+        if (!skip) {
+            // Update bindings between images and cmd buffer
+            AddCommandBufferBindingImage(dev_data, cb_node, src_image_state);
+            AddCommandBufferBindingImage(dev_data, cb_node, dst_image_state);
+            std::function<bool()> function = [=]() {
+                return ValidateImageMemoryIsValid(dev_data, src_image_state, "vkCmdResolveImage()");
+            };
+            cb_node->validate_functions.push_back(function);
+            function = [=]() {
+                SetImageMemoryValid(dev_data, dst_image_state, true);
+                return false;
+            };
+            cb_node->validate_functions.push_back(function);
+            UpdateCmdBufferLastCmd(dev_data, cb_node, CMD_RESOLVEIMAGE);
+        }
     } else {
         assert(0);
     }
     lock.unlock();
-    if (!skip)
+    if (!skip) {
         dev_data->dispatch_table.CmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
                                                  pRegions);
+    }
 }
 
 bool setEventStageMask(VkQueue queue, VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) {