Skip to content

Commit

Permalink
Vulkan: Use syncval extra properties for error suppression
Browse files Browse the repository at this point in the history
Bug: angleproject:391284743
Change-Id: I594a70e7d06f1d73647407dbac1afece666a7c5c
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6180310
Commit-Queue: Shahbaz Youssefi <[email protected]>
Reviewed-by: Roman Lavrov <[email protected]>
Reviewed-by: Shahbaz Youssefi <[email protected]>
artem-lunarg authored and Angle LUCI CQ committed Jan 24, 2025
1 parent d926d80 commit d7ea4b2
Showing 2 changed files with 147 additions and 42 deletions.
181 changes: 141 additions & 40 deletions src/libANGLE/renderer/vulkan/vk_renderer.cpp
Original file line number Diff line number Diff line change
@@ -102,6 +102,9 @@ constexpr uint32_t kPipelineCacheVkUpdatePeriod = 60;
// initialization logic simpler.
constexpr uint32_t kPreferredVulkanAPIVersion = VK_API_VERSION_1_1;

// Development flag for transition period when both old and new syncval fitlers are used
constexpr bool kSyncValCheckExtraProperties = false;

bool IsVulkan11(uint32_t apiVersion)
{
return apiVersion >= VK_API_VERSION_1_1;
@@ -379,31 +382,68 @@ constexpr vk::SkippedSyncvalMessage kSkippedSyncvalMessages[] = {
"ATTACHMENT_"
"READ|SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE",
},
{
"SYNC-HAZARD-WRITE-AFTER-WRITE",
"Access info (usage: SYNC_IMAGE_LAYOUT_TRANSITION, prior_usage: "
"SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, write_barriers: "
"SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ|SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_"
"ATTACHMENT_WRITE",
},
{"SYNC-HAZARD-WRITE-AFTER-WRITE",
"Access info (usage: SYNC_IMAGE_LAYOUT_TRANSITION, prior_usage: "
"SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, write_barriers: "
"SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ|SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_"
"ATTACHMENT_WRITE",
"",
false,
{
"message_type = RenderPassLayoutTransitionError",
"access = SYNC_IMAGE_LAYOUT_TRANSITION", // probably not needed, message_type implies this
"prior_access = "
"VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT(VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT)",
"write_barriers = "
"VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT(VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT|VK_"
"ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT)",
}},
// From: TraceTest.manhattan_31 with SwiftShader and
// VulkanPerformanceCounterTest.NewTextureDoesNotBreakRenderPass for both depth and stencil
// aspect. http://anglebug.com/42265196.
// Additionally hit in the asphalt_9 trace
// https://issuetracker.google.com/316337308
{
"SYNC-HAZARD-WRITE-AFTER-WRITE",
"with loadOp VK_ATTACHMENT_LOAD_OP_DONT_CARE. Access info (usage: "
"SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, prior_usage: "
"SYNC_IMAGE_LAYOUT_TRANSITION",
},
{"SYNC-HAZARD-WRITE-AFTER-WRITE",
"with loadOp VK_ATTACHMENT_LOAD_OP_DONT_CARE. Access info (usage: "
"SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, prior_usage: "
"SYNC_IMAGE_LAYOUT_TRANSITION",
"",
false,
{
"message_type = RenderPassLoadOpError",
"load_op = VK_ATTACHMENT_LOAD_OP_DONT_CARE",
"access = "
"VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT(VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_"
"BIT)",
"prior_access = SYNC_IMAGE_LAYOUT_TRANSITION",
}},
// DifferentStencilMasksTest.DrawWithSameEffectiveMask/ES2_Vulkan_SwiftShader
// Also other errors with similar message structure.
{"SYNC-HAZARD-WRITE-AFTER-WRITE",
"with loadOp VK_ATTACHMENT_LOAD_OP_DONT_CARE. Access info (usage: "
"SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, prior_usage: "
"SYNC_IMAGE_LAYOUT_TRANSITION",
"",
false,
{
"message_type = BeginRenderingError",
"load_op = VK_ATTACHMENT_LOAD_OP_DONT_CARE",
"access = "
"VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT(VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_"
"BIT)",
"prior_access = SYNC_IMAGE_LAYOUT_TRANSITION",
}},
// From various tests. The validation layer does not calculate the exact vertexCounts that's
// being accessed. http://anglebug.com/42265220
{
"SYNC-HAZARD-READ-AFTER-WRITE",
"Hazard READ_AFTER_WRITE for vertex",
"usage: SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ",
},
{"SYNC-HAZARD-READ-AFTER-WRITE",
"Hazard READ_AFTER_WRITE for vertex",
"usage: SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ",
false,
{
"message_type = DrawVertexBufferError",
"access = "
"VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT(VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT)",
}},
{
"SYNC-HAZARD-READ-AFTER-WRITE",
"Hazard READ_AFTER_WRITE for index",
@@ -415,12 +455,15 @@ constexpr vk::SkippedSyncvalMessage kSkippedSyncvalMessages[] = {
"Access info (usage: SYNC_VERTEX_SHADER_SHADER_STORAGE_WRITE, prior_usage: "
"SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ",
},
{
"SYNC-HAZARD-WRITE-AFTER-READ",
"Hazard WRITE_AFTER_READ for dstBuffer VkBuffer",
"Access info (usage: SYNC_COPY_TRANSFER_WRITE, prior_usage: "
"SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ",
},
{"SYNC-HAZARD-WRITE-AFTER-READ",
"Hazard WRITE_AFTER_READ for dstBuffer VkBuffer",
"Access info (usage: SYNC_COPY_TRANSFER_WRITE, prior_usage: "
"SYNC_VERTEX_ATTRIBUTE_INPUT_VERTEX_ATTRIBUTE_READ",
false,
{"message_type = BufferRegionError", "resource_parameter = dstBuffer",
"access = VK_PIPELINE_STAGE_2_COPY_BIT(VK_ACCESS_2_TRANSFER_WRITE_BIT)",
"prior_access = "
"VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT(VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT)"}},
{
"SYNC-HAZARD-WRITE-AFTER-READ",
"Hazard WRITE_AFTER_READ for VkBuffer",
@@ -448,12 +491,31 @@ constexpr vk::SkippedSyncvalMessage kSkippedSyncvalMessages[] = {
"with loadOp VK_ATTACHMENT_LOAD_OP_LOAD. Access info (usage: "
"SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ, prior_usage: "
"SYNC_IMAGE_LAYOUT_TRANSITION, write_barriers: 0",
"", true},
"",
true,
{
"message_type = RenderPassLoadOpError",
"load_op = VK_ATTACHMENT_LOAD_OP_LOAD",
"access = "
"VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT(VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT)",
"prior_access = SYNC_IMAGE_LAYOUT_TRANSITION",
"write_barriers = 0",
}},
{"SYNC-HAZARD-WRITE-AFTER-WRITE",
"image layout transition (old_layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, new_layout: "
"image layout transition (old_layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, "
"new_layout: "
"VK_IMAGE_LAYOUT_GENERAL). Access info (usage: SYNC_IMAGE_LAYOUT_TRANSITION, prior_usage: "
"SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, write_barriers:",
"", true},
"",
true,
{
"message_type = RenderPassLayoutTransitionError",
"old_layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL",
"new_layout = VK_IMAGE_LAYOUT_GENERAL",
"access = SYNC_IMAGE_LAYOUT_TRANSITION", // probably not needed, message_type implies this
"prior_access = "
"VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT(VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT)",
}},
// From: TraceTest.special_forces_group_2 http://anglebug.com/42264123
{
"SYNC-HAZARD-WRITE-AFTER-READ",
@@ -571,12 +633,21 @@ constexpr vk::SkippedSyncvalMessage kSkippedSyncvalMessagesWithMSRTTEmulation[]
"SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ",
},
// Unknown whether ANGLE or syncval bug.
{
"SYNC-HAZARD-WRITE-AFTER-WRITE",
"image layout transition (old_layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, "
"new_layout: VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL). Access info (usage: "
"SYNC_IMAGE_LAYOUT_TRANSITION",
},
{"SYNC-HAZARD-WRITE-AFTER-WRITE",
"image layout transition (old_layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, "
"new_layout: VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL). Access info (usage: "
"SYNC_IMAGE_LAYOUT_TRANSITION",
"",
false,
// TODO: it seems if this filter is removed then the error will be
// intersepted by a different filter. Investigate the nature of the
// error if necessary how to improve its detection.
{
"message_type = RenderPassLayoutTransitionError",
"old_layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL",
"new_layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL",
"access = SYNC_IMAGE_LAYOUT_TRANSITION", // probably not needed, message_type implies this
}},
};

enum class DebugMessageReport
@@ -622,11 +693,38 @@ DebugMessageReport ShouldReportDebugMessage(Renderer *renderer,

for (const vk::SkippedSyncvalMessage &msg : renderer->getSkippedSyncvalMessages())
{
if (strstr(messageId, msg.messageId) == nullptr ||
strstr(message, msg.messageContents1) == nullptr ||
strstr(message, msg.messageContents2) == nullptr)
if (kSyncValCheckExtraProperties && msg.extraProperties[0])
{
continue;
if (strstr(messageId, msg.messageId) == nullptr)
{
continue;
}
bool mismatch = false;
for (uint32_t i = 0; i < kMaxSyncValExtraProperties; i++)
{
if (msg.extraProperties[i] == nullptr)
{
break;
}
if (strstr(message, msg.extraProperties[i]) == nullptr)
{
mismatch = true;
break;
}
}
if (mismatch)
{
continue;
}
}
else
{
if (strstr(messageId, msg.messageId) == nullptr ||
strstr(message, msg.messageContents1) == nullptr ||
strstr(message, msg.messageContents2) == nullptr)
{
continue;
}
}

// If the error is due to exposing coherent framebuffer fetch (without
@@ -2216,14 +2314,17 @@ angle::Result Renderer::initialize(vk::ErrorContext *context,
const VkBool32 setting_check_shaders = IsAndroid() ? VK_FALSE : VK_TRUE;
// http://b/316013423 Disable QueueSubmit Synchronization Validation. Lots of failures and some
// test timeout due to https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/7285
const VkBool32 setting_syncval_submit_time_validation = VK_FALSE;
const VkLayerSettingEXT layerSettings[] = {
const VkBool32 setting_syncval_submit_time_validation = VK_FALSE;
const VkBool32 setting_syncval_message_extra_properties = VK_TRUE;
const VkLayerSettingEXT layerSettings[] = {
{name, "validate_core", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &setting_validate_core},
{name, "validate_sync", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &setting_validate_sync},
{name, "thread_safety", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &setting_thread_safety},
{name, "check_shaders", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &setting_check_shaders},
{name, "syncval_submit_time_validation", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1,
&setting_syncval_submit_time_validation},
&setting_syncval_submit_time_validation},
{name, "syncval_message_extra_properties", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1,
&setting_syncval_message_extra_properties},
};
VkLayerSettingsCreateInfoEXT layerSettingsCreateInfo = {
VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr,
8 changes: 6 additions & 2 deletions src/libANGLE/renderer/vulkan/vk_renderer.h
Original file line number Diff line number Diff line change
@@ -52,13 +52,17 @@ class Format;
static constexpr size_t kMaxExtensionNames = 400;
using ExtensionNameList = angle::FixedVector<const char *, kMaxExtensionNames>;

static constexpr size_t kMaxSyncValExtraProperties = 5;
// Information used to accurately skip known synchronization issues in ANGLE.
// TODO: remove messageContents1 and messageContents2 fields after all
// supressions have transitioned to using extraProperties.
struct SkippedSyncvalMessage
{
const char *messageId;
const char *messageContents1;
const char *messageContents2 = "";
bool isDueToNonConformantCoherentColorFramebufferFetch = false;
const char *messageContents2 = "";
bool isDueToNonConformantCoherentColorFramebufferFetch = false;
const char *extraProperties[kMaxSyncValExtraProperties] = {};
};

class ImageMemorySuballocator : angle::NonCopyable

0 comments on commit d7ea4b2

Please sign in to comment.