KhronosGroup / Vulkan-Samples

One stop solution for all Vulkan samples
Apache License 2.0
4.18k stars 624 forks source link

Missing synchronization in "subpasses" sample #455

Open koplas opened 2 years ago

koplas commented 2 years ago

The sample "subpasses" has missing synchronization, which leads to display artifacts.

To reproduce enable Synchronization Validation Layers and start the sample. Then switch the Render technique between "Subpasses" and "Renderpasses". Following validation errors are printed:

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 1 aspect depth during load with loadOp VK_ATTACHMENT_LOAD_OP_LOAD. Access info (usage: SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ, prior_usage: SYNC_IMAGE_LAYOUT_TRANSITION, write_barriers: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 32, reset_no: 1045).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 2 aspect color during load 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: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 33, reset_no: 1045).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 3 aspect color during load 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: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 34, reset_no: 1045).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

[info] Changing render technique
SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 1 aspect depth during load with loadOp VK_ATTACHMENT_LOAD_OP_LOAD. Access info (usage: SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ, prior_usage: SYNC_IMAGE_LAYOUT_TRANSITION, write_barriers: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 32, reset_no: 1050).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 2 aspect color during load 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: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 33, reset_no: 1050).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 3 aspect color during load 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: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 34, reset_no: 1050).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 1 aspect depth during load with loadOp VK_ATTACHMENT_LOAD_OP_LOAD. Access info (usage: SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ, prior_usage: SYNC_IMAGE_LAYOUT_TRANSITION, write_barriers: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 32, reset_no: 1044).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 2 aspect color during load 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: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 33, reset_no: 1044).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 3 aspect color during load 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: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 34, reset_no: 1044).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

SYNC-HAZARD-READ_AFTER_WRITE(ERROR / SPEC): msgNum: 1287084845 - Validation Error: [ SYNC-HAZARD-READ_AFTER_WRITE ] Object 0: handle = 0x5581ee092cb0, name = RP with 1 subpasses:
    [0]: 
, type = VK_OBJECT_TYPE_RENDER_PASS; | MessageID = 0x4cb75b2d | vkCmdBeginRenderPass: Hazard READ_AFTER_WRITE in subpass 0 for attachment 1 aspect depth during load with loadOp VK_ATTACHMENT_LOAD_OP_LOAD. Access info (usage: SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ, prior_usage: SYNC_IMAGE_LAYOUT_TRANSITION, write_barriers: SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, command: vkCmdPipelineBarrier, seq_no: 32, reset_no: 1042).
    Objects: 1
        [0] 0x5581ee092cb0, type: 18, name: RP with 1 subpasses:
    [0]: 

Note: The display artifacts are visible only when the "Subpasses" option is selected.

renderpasses subpasses

vulkaninfo.txt

koplas commented 2 years ago

A subpass dependency as described in https://developer.arm.com/documentation/101897/0200/fragment-shading/multipass-rendering should fix this issue.

Code snippet:

VkSubpassDependency subpassDependency = {}; 
subpassDependency.srcSubpass = 0; 
subpassDependency.dstSubpass = 1; 

subpassDependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | 
                                 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | 
                                 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; 

subpassDependency.dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | 
                                 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | 
                                 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | 
                                 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; 

subpassDependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | 
                                  VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT 

subpassDependency.dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | 
                                  VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | 
                                  VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | 
                                  VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | 
                                  VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; 

subpassDependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
SaschaWillems commented 2 years ago

Thanks for raising this issue. I get the same sync validation messages and noticed that this also happens for other samples (e.g. MSAA). We probably should do a full sync run for all samples to ensure that they all validate clean against sync val.

TomAtkinsonArm commented 2 years ago

May be too challenging to fix right now. Lets track it for future framework changes

SaschaWillems commented 3 months ago

We really need to fix this. This issue has been open for too long and is causing issues esp. for people using AMD hardware.

energyc0 commented 2 weeks ago

I had an artifact like this when I was implementing SSAO. I was thinking it was a synchronization problem. The artifact didn`t disappear when I fixed synchronization. In the end it was all about dividing by zero in my fragment shader.

SaschaWillems commented 2 weeks ago

This is definitely a sync issue (see earlier comments and linked issues/PRs). I can reproduce it on my side.