Overv / VulkanTutorial

Tutorial for the Vulkan graphics and compute API
https://vulkan-tutorial.com
Creative Commons Attribution Share Alike 4.0 International
3.06k stars 511 forks source link

Synchronization Errors in Hello Triangle Tutorial #366

Open john01dav opened 7 months ago

john01dav commented 7 months ago

I originally encountered this problem due to actual symptoms of incorrect synchronization in a more realistic program than the hello triangle example, but when downloading the hello triangle app I am able to show synchronization errors due to the synchronization validation failing.

I added this code to the 15_hello_triangle.cpp file:

VkValidationFeatureEnableEXT enabled[] = {
    VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
    VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,
    VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT,
    VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT,
    VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT,
};
VkValidationFeaturesEXT validationFeatures;
VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{};
if (enableValidationLayers) {
    createInfo.enabledLayerCount = static_cast<uint32_t>(validationLayers.size());
    createInfo.ppEnabledLayerNames = validationLayers.data();

    populateDebugMessengerCreateInfo(debugCreateInfo);
    createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &debugCreateInfo;

    validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
    validationFeatures.pNext = nullptr;
    validationFeatures.pEnabledValidationFeatures = enabled;
    validationFeatures.enabledValidationFeatureCount = 5;
    validationFeatures.disabledValidationFeatureCount = 0;
    debugCreateInfo.pNext = &validationFeatures;
} else {
    createInfo.enabledLayerCount = 0;

    createInfo.pNext = nullptr;
}

Then, when running, there are validation errors:

validation layer: Validation Error: [ SYNC-HAZARD-WRITE-AFTER-WRITE ] Object 0: handle = 0xd000000000d, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x5c0ec5d6 | vkCmdBeginRenderPass: Hazard WRITE_AFTER_WRITE vs. layout transition in subpass 0 for attachment 0 aspect color during load with loadOp VK_ATTACHMENT_LOAD_OP_CLEAR.
validation layer: Validation Error: [ SYNC-HAZARD-WRITE-AFTER-WRITE ] Object 0: handle = 0xd000000000d, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x5c0ec5d6 | vkCmdEndRenderPass: Hazard WRITE_AFTER_WRITE vs. store/resolve operations in subpass 0 for attachment 0 final image layout transition (old_layout: VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, new_layout: VK_IMAGE_LAYOUT_PRESENT_SRC_KHR).

Actual issues occur on Nvidia + Wayland when you make the GPU very busy: flickering.webm

There seems to be something wrong with the synchronization in the tutorial that propagated into my program, but I don't understand synchronization well enough to say what. Also, it may be a good idea to enable synchronization and other extended validation in the tutorial, or at least show users how. I had no idea that this feature existed until recently.

john01dav commented 7 months ago

More context: https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/6995 https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/7006