8 minutes ago, turanszkij said:
Maybe you need to use buffer memory barriers instead - i was confused about this (confusion still visible in comments )
if (taskFlags & (1<<tREBUILD_RESTORE))
{
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayouts[tREBUILD_RESTORE], 0, 1, &descriptorSets[tREBUILD_RESTORE], 0, nullptr);
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipelines[taskToPipeline[tREBUILD_RESTORE]]);
#ifdef PROFILE_TASKS
profiler.Start (TS_BRESTORE, commandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT);
#endif
vkCmdDispatchIndirect(commandBuffer, buffers[bDISPATCH].deviceBuffer, sizeof(VkDispatchIndirectCommand) * OFFSET_DISPATCH_REBUILD_RESTORE);
#ifdef PROFILE_TASKS
profiler.Stop (TS_BRESTORE, commandBuffer, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT);
#endif
int barrierBuffers[] = {bS_POS, bS_V4, bS_I4, bS_SI, bS_CONE};
MemoryBarriers (commandBuffer, barrierBuffers, 5);
}
void MemoryBarriers (VkCommandBuffer commandBuffer, int *bufferList, const int numBarriers)
{
int const maxBarriers = 16;
assert (numBarriers <= maxBarriers);
VkBufferMemoryBarrier bufferMemoryBarriers[maxBarriers] = {};
//VkMemoryBarrier memoryBarriers[maxBarriers] = {};
for (int i=0; i<numBarriers; i++)
{
bufferMemoryBarriers[i].sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
//bufferMemoryBarriers[i].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
//bufferMemoryBarriers[i].dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT;
bufferMemoryBarriers[i].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT;
bufferMemoryBarriers[i].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
//bufferMemoryBarriers[i].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
//bufferMemoryBarriers[i].dstAccessMask = VK_ACCESS_MEMORY_WRITE_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
bufferMemoryBarriers[i].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
bufferMemoryBarriers[i].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
bufferMemoryBarriers[i].buffer = buffers[bufferList[i]].deviceBuffer;
bufferMemoryBarriers[i].offset = 0;
bufferMemoryBarriers[i].size = VK_WHOLE_SIZE;
//memoryBarriers[i].sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
//memoryBarriers[i].srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT;// | VK_ACCESS_SHADER_WRITE_BIT;
//memoryBarriers[i].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;// | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT;
}
vkCmdPipelineBarrier(
commandBuffer,
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,//VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,// srcStageMask,
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT,//VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,// dstStageMask,
0,//VkDependencyFlags dependencyFlags,
0, NULL,//numBarriers, memoryBarriers,//
numBarriers, bufferMemoryBarriers,
0, NULL);
}