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命令之前发出信号量,或者我错过了某个地方的同步/在某个地方做了错误的同步