当 GPU 使用同一缓冲区作为传输操作的源时,让 CPU 从缓冲区读取数据是否安全vkCmdCopyBuffer
?
我之所以问这个问题,是因为我读到过,即使缓冲区用作传输源,其vkCmdCopyBuffer
本身也可能比简单的 GPU 读取更复杂,因此需要显式主机同步(即:复制必须先完成,CPU 才能从缓冲区读取)。但我找不到任何可以证实这一点的证据。
当 GPU 使用同一缓冲区作为传输操作的源时,让 CPU 从缓冲区读取数据是否安全vkCmdCopyBuffer
?
我之所以问这个问题,是因为我读到过,即使缓冲区用作传输源,其vkCmdCopyBuffer
本身也可能比简单的 GPU 读取更复杂,因此需要显式主机同步(即:复制必须先完成,CPU 才能从缓冲区读取)。但我找不到任何可以证实这一点的证据。
我在 Vulkan 中有一个带有colorBlendState
、blendEnable = false
、的管道logicOpEnable = true
,logicOp = XOR
以便片段着色器的输出与颜色附件的当前内容进行异或。我有这个工作,它的行为符合预期......大部分。
问题是,当在片段缓冲区中使用重叠三角形时,即使它们都位于同一渲染通道中,这些三角形似乎也会相互异或。经过一番研究后,这似乎可能是正确的行为,但这不是我的案例所期望的。有什么方法可以修改我的管道/渲染通道以仅在片段着色器输出和加载的颜色附件内容之间执行逻辑操作,而不是在片段着色器的各个三角形之间执行逻辑操作?
也就是说,我希望在没有混合或逻辑操作的情况下绘制顶点缓冲区中定义的所有三角形,直到最终结果写入颜色附件。有没有办法在不添加第二个渲染通道或子通道的情况下做到这一点?
Vulkan子组教程提到:
如果您指定的工作组大小小于子组大小,则保证子组内有非活动调用。
现在假设您的 maxComputeWorkGroupSize为1024,subGroupSize为 64。如果您想对图像应用过滤器,您可能会进行 2D 调用。因此,您最终的工作组大小将为 32,因为 32 * 32 * 1 = 1024。现在您的工作组大小小于子组大小。
所以我的问题是,是否最好使用 64 的 1D 工作组大小(并从现在“更大”的 GlobalInitationID.x 中提取相应的 x 和 y 坐标)?
我有两个队列,队列 A 和队列 B,来自不同的队列系列。队列A当前拥有独占共享模式的镜像所有权。我想提前将图像的所有权释放给队列B,因为我知道它将是下一个使用它的人。但是,我不知道布局队列 B 是否需要图像。
问题是释放屏障(在队列 A 上)和获取屏障(在队列 B 上)都需要指定源图像布局和目标图像布局。在事先不知道布局的情况下,如何将图像发布到队列B?
我认为最好的方法是在记录到队列 B 时使用两个图像内存屏障:第一个从队列 A 获取图像(不更改布局),第二个执行布局转换。问题是我不知道如何创建依赖项以确保获取图像后发生布局转换。有没有办法在两个连续图像内存屏障之间创建这种依赖关系?