layers: LX255, Print readable version of VkAccessFlags
Also update related validation messages to indicate src/dest accessMask
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 9686b22..0c2efc7 100644
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -4550,64 +4550,71 @@
// 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
-VkBool32 ValidateMaskBits(const layer_data* my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags& accessMask, const VkImageLayout& layout, VkAccessFlags required_bit, VkAccessFlags optional_bits) {
+VkBool32 ValidateMaskBits(const layer_data* my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags& accessMask, const VkImageLayout& layout,
+ VkAccessFlags required_bit, VkAccessFlags optional_bits, const char* type) {
VkBool32 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_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_BARRIER, "DS",
- "Additional bits in accessMask %d are specified when layout is %s.", accessMask, string_VkImageLayout(layout));
+ "Additional bits in %s accessMask %d %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_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_BARRIER, "DS",
- "AccessMask %d must contain at least one of access bits %d when layout is %s.",
- accessMask, optional_bits, string_VkImageLayout(layout));
+ "%s AccessMask %d %s must contain at least one of access bits %d %s when layout is %s.",
+ type, accessMask, string_VkAccessFlags(accessMask).c_str(), optional_bits,
+ string_VkAccessFlags(optional_bits).c_str(), string_VkImageLayout(layout));
} else {
skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_BARRIER, "DS",
- "AccessMask %d must have required access bit %d and may have optional bits %d when layout is %s.",
- accessMask, required_bit, optional_bits,string_VkImageLayout(layout));
+ "%s AccessMask %d %s must have required access bit %d %s and may have optional bits %d %s when layout is %s.",
+ type, accessMask, string_VkAccessFlags(accessMask).c_str(),
+ required_bit, string_VkAccessFlags(required_bit).c_str(),
+ optional_bits, string_VkAccessFlags(optional_bits).c_str(), string_VkImageLayout(layout));
}
}
return skip_call;
}
-VkBool32 ValidateMaskBitsFromLayouts(const layer_data* my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags& accessMask, const VkImageLayout& layout) {
+VkBool32 ValidateMaskBitsFromLayouts(const layer_data* my_data, VkCommandBuffer cmdBuffer, const VkAccessFlags& accessMask, const VkImageLayout& layout, const char* type) {
VkBool32 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);
+ skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_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);
+ skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, VK_ACCESS_DEPTH_STENCIL_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);
+ skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_TRANSFER_WRITE_BIT, 0, type);
break;
}
case VK_IMAGE_LAYOUT_PREINITIALIZED: {
- skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_HOST_WRITE_BIT, 0);
+ skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_HOST_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);
+ skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, 0, VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_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);
+ 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);
+ skip_call |= ValidateMaskBits(my_data, cmdBuffer, accessMask, layout, VK_ACCESS_TRANSFER_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_WARN_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_BARRIER, "DS",
- "Additional bits in accessMask %d are specified when layout is %s.", accessMask, string_VkImageLayout(layout));
+ "Additional bits in %s accessMask %d %s are specified when layout is %s.", type, accessMask, string_VkAccessFlags(accessMask).c_str(),
+ string_VkImageLayout(layout));
}
break;
}
@@ -4641,8 +4648,8 @@
auto mem_barrier = reinterpret_cast<const VkMemoryBarrier*>(ppMemBarriers[i]);
if (mem_barrier && mem_barrier->sType == VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER) {
auto image_mem_barrier = reinterpret_cast<const VkImageMemoryBarrier*>(mem_barrier);
- skip_call |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, image_mem_barrier->srcAccessMask, image_mem_barrier->oldLayout);
- skip_call |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, image_mem_barrier->dstAccessMask, image_mem_barrier->newLayout);
+ skip_call |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, image_mem_barrier->srcAccessMask, image_mem_barrier->oldLayout, "Source");
+ skip_call |= ValidateMaskBitsFromLayouts(dev_data, cmdBuffer, image_mem_barrier->dstAccessMask, image_mem_barrier->newLayout, "Dest");
}
}
diff --git a/layers/vk_layer_utils.cpp b/layers/vk_layer_utils.cpp
index a96c97e..568d3b0 100644
--- a/layers/vk_layer_utils.cpp
+++ b/layers/vk_layer_utils.cpp
@@ -25,8 +25,10 @@
*/
#include <string.h>
+#include <string>
#include "vulkan/vulkan.h"
#include "vk_layer_utils.h"
+#include "vk_enum_string_helper.h"
typedef struct _VULKAN_FORMAT_INFO {
size_t size;
@@ -575,3 +577,24 @@
{
return vk_format_table[format].channel_count;
}
+
+// Print readable FlagBits in FlagMask
+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;
+}
diff --git a/layers/vk_layer_utils.h b/layers/vk_layer_utils.h
index 52a615f..62b1c3d 100644
--- a/layers/vk_layer_utils.h
+++ b/layers/vk_layer_utils.h
@@ -59,6 +59,8 @@
bool vk_format_is_srgb(VkFormat format);
bool vk_format_is_compressed(VkFormat format);
size_t vk_format_get_size(VkFormat format);
+std::string string_VkAccessFlags(VkAccessFlags accessMask);
+
static inline int u_ffs(int val)
{
diff --git a/vk-layer-generate.py b/vk-layer-generate.py
index 69edb1a..a14024d 100755
--- a/vk-layer-generate.py
+++ b/vk-layer-generate.py
@@ -1725,7 +1725,7 @@
'}' % (qual, decl, proto.c_call()))
return "".join(funcs)
# Temporarily prevent DestroySurface call from being generated until WSI layer support is fleshed out
- elif 'DestroyInstance' in proto.name or 'DestroyDevice' in proto.name: # LUGMAL or 'SurfaceKHR' in proto.name:
+ elif 'DestroyInstance' in proto.name or 'DestroyDevice' in proto.name:
return ""
else:
if 'Create' in proto.name or 'Alloc' in proto.name: