diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.cpp b/src/libANGLE/renderer/vulkan/vk_renderer.cpp index 441c420d376..ca7e84e8fb3 100644 --- a/src/libANGLE/renderer/vulkan/vk_renderer.cpp +++ b/src/libANGLE/renderer/vulkan/vk_renderer.cpp @@ -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, diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.h b/src/libANGLE/renderer/vulkan/vk_renderer.h index 845d351d08a..00202bf895b 100644 --- a/src/libANGLE/renderer/vulkan/vk_renderer.h +++ b/src/libANGLE/renderer/vulkan/vk_renderer.h @@ -52,13 +52,17 @@ class Format; static constexpr size_t kMaxExtensionNames = 400; using ExtensionNameList = angle::FixedVector; +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