【发布时间】:2021-10-10 06:58:19
【问题描述】:
我试图了解整个 L1/L2 刷新的工作原理。假设我有一个像这样的计算着色器
layout(std430, set = 0, binding = 2) buffer Particles{
Particle particles[];
};
layout(std430, set = 0, binding = 4) buffer Constraints{
Constraint constraints[];
};
void main(){
const uint gID = gl_GlobalInvocationID.x;
for (int pass=0;pass<GAUSS_SEIDEL_PASSES;pass++){
// first query the constraint, which contains particle_id_1 and particle_id_1
const Constraint c = constraints[gID*GAUSS_SEIDEL_PASSES+pass];
// read newest positions
vec3 position1 = particles[c.particle_id_1].position;
vec3 position2 = particles[c.particle_id_2].position;
// modify position1 and position2
position1 += something;
position2 -= something;
// update positions
particles[c.particle_id_1].position = position1;
particles[c.particle_id_2].position = position2;
// in the next iteration, different constraints may use the updated positions
}
}
据我了解,最初所有数据都驻留在 L2 中。当我阅读particles[c.particle_id_1].position 时,我将一些数据从 L2 复制到 L1(或直接复制到寄存器)。
然后在position1 += something 中修改L1(或寄存器)。最后在particles[c.particle_id_2].position = position1 中,我将数据从 L1(或寄存器)刷新回 L2,对吗?所以如果我有第二个计算着色器,我想在这个之后运行,并且第二个着色器将读取粒子的位置,我不需要同步Particles。只设置一个执行屏障就足够了,没有内存屏障
void vkCmdPipelineBarrier(
VkCommandBuffer commandBuffer,
VkPipelineStageFlags srcStageMask, // here I put VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
VkPipelineStageFlags dstStageMask, // here I put VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
VkDependencyFlags dependencyFlags, // here nothing
uint32_t memoryBarrierCount, // here 0
const VkMemoryBarrier* pMemoryBarriers, // nullptr
uint32_t bufferMemoryBarrierCount, // 0
const VkBufferMemoryBarrier* pBufferMemoryBarriers, // nullptr
uint32_t imageMemoryBarrierCount, // 0
const VkImageMemoryBarrier* pImageMemoryBarriers); // nullptr
【问题讨论】:
标签: vulkan memory-barriers compute-shader barrier