Synchronization AMD上呈现时的图像伪影

Synchronization AMD上呈现时的图像伪影,synchronization,vulkan,Synchronization,Vulkan,在渲染过程和命令缓冲区结束之间,我有一个实际绘制到图像的计算着色器 在计算着色器之前和之后,我有布局转换图像屏障: vkCmdEndRenderPass(chain.cmdbuffers[i]); imgBars[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; imgBars[0].newLayout = VK_IMAGE_LAYOUT_GENERAL; imgBars[0].image = chain.images[i];

在渲染过程和命令缓冲区结束之间,我有一个实际绘制到图像的计算着色器

在计算着色器之前和之后,我有布局转换图像屏障:

vkCmdEndRenderPass(chain.cmdbuffers[i]);

    imgBars[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
    imgBars[0].newLayout = VK_IMAGE_LAYOUT_GENERAL;
    imgBars[0].image = chain.images[i];
    imgBars[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
    imgBars[0].subresourceRange.baseMipLevel = 0;
    imgBars[0].subresourceRange.baseArrayLayer = 0;
    imgBars[0].subresourceRange.levelCount = 1;
    imgBars[0].subresourceRange.layerCount = 1;
vkCmdPipelineBarrier(chain.cmdbuffers[i],
                     VK_PIPELINE_STAGE_VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,//render pass doesn't write anything in swapchain image
                     VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
                     0, 0, 0, 0, 0, 1, &imgBars[0]);

vkCmdBindPipeline(chain.cmdbuffers[i], VK_PIPELINE_BIND_POINT_COMPUTE, pipelines[2]);
vkCmdBindDescriptorSets(chain.cmdbuffers[i], VK_PIPELINE_BIND_POINT_COMPUTE, pipeLayouts[1],
                            0, 1, &chain.descSets[i], 0, 0);
vkCmdDispatch(chain.cmdbuffers[i], chain.dim.width/32, chain.dim.height/32, 1);

    imgBars[0].oldLayout = VK_IMAGE_LAYOUT_GENERAL;
    imgBars[0].newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
    imgBars[0].image = chain.images[i];
    imgBars[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
    imgBars[0].subresourceRange.baseMipLevel = 0;
    imgBars[0].subresourceRange.baseArrayLayer = 0;
    imgBars[0].subresourceRange.levelCount = 1;
    imgBars[0].subresourceRange.layerCount = 1;
    imgBars[0].srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
    imgBars[0].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
vkCmdPipelineBarrier(chain.cmdbuffers[i],
                     VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
                     VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
                     0, 0, 0, 0, 0, 1, &imgBars[0]);
vkEndCommandBuffer(chain.cmdbuffers[i]);
Renderdoc显示了绘图的正常工作-没有任何瑕疵,图像是在dispatch命令下绘制的。图像在某些部分绘制得相对精细,但在其他方面,它的大小与计算着色器工作组(它写入的坐标等于其全局调用ID)的大小相等。presentation命令接收一个信号量,该信号量由绘制到图像的命令缓冲区发出。演示文稿和命令都提交到同一个队列,尽管这可能无关紧要

它在nVidia gpu上运行良好

因此,我只能假设驱动程序在实际完成compute命令之前发出信号量,或者我错过了某个地方的同步/在某个地方做了错误的同步