layers: Move MaskBits validation out of CV
authorMark Lobodzinski <mark@lunarg.com>
Tue, 7 Feb 2017 23:55:53 +0000 (16:55 -0700)
committerMark Lobodzinski <mark@lunarg.com>
Wed, 8 Feb 2017 17:25:28 +0000 (10:25 -0700)
Moved ValidateMaskBitsFromLayouts, ValidateMaskBits, and
string_VkAccessFlags from CV into the buffer module.

Change-Id: Ifaf509c59778c54e733c27e7ac0381ad2cb324c0

layers/buffer_validation.cpp
layers/buffer_validation.h
layers/core_validation.cpp

index 5e33725..66525d3 100644 (file)
@@ -1540,3 +1540,124 @@ bool ValidateCmdBufImageLayouts(core_validation::layer_data *device_data, GLOBAL
     }
     return skip;
 }
+
+// Print readable FlagBits in FlagMask
+static std::string string_VkAccessFlags(VkAccessFlags accessMask) {
+    std::string result;
+    std::string separator;
+
+    if (accessMask == 0) {
+        result = "[None]";
+    } else {
+        result = "[";
+        for (auto i = 0; i < 32; i++) {
+            if (accessMask & (1 << i)) {
+                result = result + separator + string_VkAccessFlagBits((VkAccessFlagBits)(1 << i));
+                separator = " | ";
+            }
+        }
+        result = result + "]";
+    }
+    return result;
+}
+
+// AccessFlags MUST have 'required_bit' set, and may have one or more of 'optional_bits' set.
+// If required_bit is zero, accessMask must have at least one of 'optional_bits' set
+// TODO: Add tracking to ensure that at least one barrier has been set for these layout transitions
+static bool ValidateMaskBits(core_validation::layer_data *my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags &accessMask,
+    const VkImageLayout &layout, VkAccessFlags required_bit, VkAccessFlags optional_bits,
+    const char *type) {
+    const debug_report_data *report_data = core_validation::GetReportData(my_data);
+    bool skip_call = false;
+
+    if ((accessMask & required_bit) || (!required_bit && (accessMask & optional_bits))) {
+        if (accessMask & ~(required_bit | optional_bits)) {
+            // TODO: Verify against Valid Use
+            skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
+                DRAWSTATE_INVALID_BARRIER, "DS",
+                "Additional bits in %s accessMask 0x%X %s are specified when layout is %s.", type, accessMask,
+                string_VkAccessFlags(accessMask).c_str(), string_VkImageLayout(layout));
+        }
+    } else {
+        if (!required_bit) {
+            skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
+                DRAWSTATE_INVALID_BARRIER, "DS",
+                "%s AccessMask %d %s must contain at least one of access bits %d "
+                "%s when layout is %s, unless the app has previously added a "
+                "barrier for this transition.",
+                type, accessMask, string_VkAccessFlags(accessMask).c_str(), optional_bits,
+                string_VkAccessFlags(optional_bits).c_str(), string_VkImageLayout(layout));
+        } else {
+            std::string opt_bits;
+            if (optional_bits != 0) {
+                std::stringstream ss;
+                ss << optional_bits;
+                opt_bits = "and may have optional bits " + ss.str() + ' ' + string_VkAccessFlags(optional_bits);
+            }
+            skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
+                DRAWSTATE_INVALID_BARRIER, "DS",
+                "%s AccessMask %d %s must have required access bit %d %s %s when "
+                "layout is %s, unless the app has previously added a barrier for "
+                "this transition.",
+                type, accessMask, string_VkAccessFlags(accessMask).c_str(), required_bit,
+                string_VkAccessFlags(required_bit).c_str(), opt_bits.c_str(), string_VkImageLayout(layout));
+        }
+    }
+    return skip_call;
+}
+
+bool ValidateMaskBitsFromLayouts(core_validation::layer_data *my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags &accessMask,
+    const VkImageLayout &layout, const char *type) {
+    const debug_report_data *report_data = core_validation::GetReportData(my_data);
+
+    bool skip_call = false;
+    switch (layout) {
+    case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: {
+        skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+            VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, type);
+        break;
+    }
+    case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: {
+        skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+            VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, type);
+        break;
+    }
+    case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: {
+        skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_TRANSFER_WRITE_BIT, 0, type);
+        break;
+    }
+    case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: {
+        skip_call |= ValidateMaskBits(
+            my_data, cmdBuffer, accessMask, layout, 0,
+            VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
+            type);
+        break;
+    }
+    case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: {
+        skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, 0,
+            VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT, type);
+        break;
+    }
+    case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: {
+        skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_TRANSFER_READ_BIT, 0, type);
+        break;
+    }
+    case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: {
+        skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_MEMORY_READ_BIT, 0, type);
+        break;
+    }
+    case VK_IMAGE_LAYOUT_UNDEFINED: {
+        if (accessMask != 0) {
+            // TODO: Verify against Valid Use section spec
+            skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0,
+                __LINE__, DRAWSTATE_INVALID_BARRIER, "DS",
+                "Additional bits in %s accessMask 0x%X %s are specified when layout is %s.", type, accessMask,
+                string_VkAccessFlags(accessMask).c_str(), string_VkImageLayout(layout));
+        }
+        break;
+    }
+    case VK_IMAGE_LAYOUT_GENERAL:
+    default: { break; }
+    }
+    return skip_call;
+}
index 7476b0e..f393e7e 100644 (file)
@@ -142,4 +142,7 @@ void PreCallRecordCmdBlitImage(core_validation::layer_data *device_data, GLOBAL_
 
 bool ValidateCmdBufImageLayouts(core_validation::layer_data *dev_data, GLOBAL_CB_NODE *pCB);
 
+bool ValidateMaskBitsFromLayouts(core_validation::layer_data *my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags &accessMask,
+                                 const VkImageLayout &layout, const char *type);
+
 #endif  // CORE_VALIDATION_BUFFER_VALIDATION_H_
index d1a011d..854664f 100644 (file)
@@ -8492,124 +8492,6 @@ VKAPI_ATTR void VKAPI_CALL CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent
     if (!skip_call) dev_data->dispatch_table.CmdResetEvent(commandBuffer, event, stageMask);
 }
 
-// Print readable FlagBits in FlagMask
-static std::string string_VkAccessFlags(VkAccessFlags accessMask) {
-    std::string result;
-    std::string separator;
-
-    if (accessMask == 0) {
-        result = "[None]";
-    } else {
-        result = "[";
-        for (auto i = 0; i < 32; i++) {
-            if (accessMask & (1 << i)) {
-                result = result + separator + string_VkAccessFlagBits((VkAccessFlagBits)(1 << i));
-                separator = " | ";
-            }
-        }
-        result = result + "]";
-    }
-    return result;
-}
-
-// AccessFlags MUST have 'required_bit' set, and may have one or more of 'optional_bits' set.
-// If required_bit is zero, accessMask must have at least one of 'optional_bits' set
-// TODO: Add tracking to ensure that at least one barrier has been set for these layout transitions
-static bool ValidateMaskBits(const layer_data *my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags &accessMask,
-                             const VkImageLayout &layout, VkAccessFlags required_bit, VkAccessFlags optional_bits,
-                             const char *type) {
-    bool skip_call = false;
-
-    if ((accessMask & required_bit) || (!required_bit && (accessMask & optional_bits))) {
-        if (accessMask & ~(required_bit | optional_bits)) {
-            // TODO: Verify against Valid Use
-            skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
-                                 DRAWSTATE_INVALID_BARRIER, "DS",
-                                 "Additional bits in %s accessMask 0x%X %s are specified when layout is %s.", type, accessMask,
-                                 string_VkAccessFlags(accessMask).c_str(), string_VkImageLayout(layout));
-        }
-    } else {
-        if (!required_bit) {
-            skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
-                                 DRAWSTATE_INVALID_BARRIER, "DS",
-                                 "%s AccessMask %d %s must contain at least one of access bits %d "
-                                 "%s when layout is %s, unless the app has previously added a "
-                                 "barrier for this transition.",
-                                 type, accessMask, string_VkAccessFlags(accessMask).c_str(), optional_bits,
-                                 string_VkAccessFlags(optional_bits).c_str(), string_VkImageLayout(layout));
-        } else {
-            std::string opt_bits;
-            if (optional_bits != 0) {
-                std::stringstream ss;
-                ss << optional_bits;
-                opt_bits = "and may have optional bits " + ss.str() + ' ' + string_VkAccessFlags(optional_bits);
-            }
-            skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__,
-                                 DRAWSTATE_INVALID_BARRIER, "DS",
-                                 "%s AccessMask %d %s must have required access bit %d %s %s when "
-                                 "layout is %s, unless the app has previously added a barrier for "
-                                 "this transition.",
-                                 type, accessMask, string_VkAccessFlags(accessMask).c_str(), required_bit,
-                                 string_VkAccessFlags(required_bit).c_str(), opt_bits.c_str(), string_VkImageLayout(layout));
-        }
-    }
-    return skip_call;
-}
-
-static bool ValidateMaskBitsFromLayouts(const layer_data *my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags &accessMask,
-                                        const VkImageLayout &layout, const char *type) {
-    bool skip_call = false;
-    switch (layout) {
-        case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: {
-            skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-                                          VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, type);
-            break;
-        }
-        case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: {
-            skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
-                                          VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, type);
-            break;
-        }
-        case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL: {
-            skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_TRANSFER_WRITE_BIT, 0, type);
-            break;
-        }
-        case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: {
-            skip_call |= ValidateMaskBits(
-                my_data, cmdBuffer, accessMask, layout, 0,
-                VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
-                type);
-            break;
-        }
-        case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL: {
-            skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, 0,
-                                          VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT, type);
-            break;
-        }
-        case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL: {
-            skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_TRANSFER_READ_BIT, 0, type);
-            break;
-        }
-        case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR: {
-            skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_MEMORY_READ_BIT, 0, type);
-            break;
-        }
-        case VK_IMAGE_LAYOUT_UNDEFINED: {
-            if (accessMask != 0) {
-                // TODO: Verify against Valid Use section spec
-                skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0,
-                                     __LINE__, DRAWSTATE_INVALID_BARRIER, "DS",
-                                     "Additional bits in %s accessMask 0x%X %s are specified when layout is %s.", type, accessMask,
-                                     string_VkAccessFlags(accessMask).c_str(), string_VkImageLayout(layout));
-            }
-            break;
-        }
-        case VK_IMAGE_LAYOUT_GENERAL:
-        default: { break; }
-    }
-    return skip_call;
-}
-
 static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, uint32_t memBarrierCount,
                              const VkMemoryBarrier *pMemBarriers, uint32_t bufferBarrierCount,
                              const VkBufferMemoryBarrier *pBufferMemBarriers, uint32_t imageMemBarrierCount,