Có một số cách để xử lý đồng bộ hóa trong Vulkan. Đây là cách tôi hiểu:Đồng bộ hóa giữa các bộ đệm lệnh trong Vulkan
- Hàng rào là GPU để đồng bộ hóa CPU.
- Semaphores là đồng bộ GPU với GPU, chúng được sử dụng để đồng bộ hóa hàng đợi nội dung gửi (trên cùng hàng hoặc hàng đợi khác nhau).
- Sự kiện tổng quát hơn, đặt lại và kiểm tra trên cả CPU và GPU.
- Các rào cản được sử dụng để đồng bộ hóa bên trong bộ đệm lệnh.
Trong trường hợp của tôi, tôi có hai bộ đệm lệnh. Và tôi muốn bộ đệm lệnh thứ hai thực hiện sau lần đầu tiên.
submitInfo.pCommandBuffers = &firstCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
// wait for first command buffer to finish
submitInfo.pCommandBuffers = &secondCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
Loại đồng bộ hóa nào là tốt nhất cho việc này? Nếu tôi sử dụng vkQueueWaitIdle(queue)),
là điều tương tự như sử dụng hàng rào hoặc tôi có nên sử dụng sự kiện hoặc ẩn dụ cho việc này không?
Nếu tôi gửi nhiều commandbuffer vào hàng đợi cùng một lúc:
std::vector<VkCommandBuffer> submitCmdBuffers = {
firstCommandBuffer,
secondCommandBuffer
};
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
vẫn Có cách nào để đồng bộ hóa giữa đầu tiên và thứ hai?
"* Và tôi muốn bộ đệm lệnh thứ hai thực thi sau lần đầu tiên. *" Bạn muốn "bao nhiêu" điều đó xảy ra? Đó là, bộ đệm lệnh thứ hai làm điều đó là bắt buộc đến mức cái đầu tiên đã thực hiện * đã hoàn thành * trước khi lệnh thứ hai bắt đầu? –
Bộ đệm lệnh đầu tiên là đối tượng rendering với kiểm tra độ sâu được bật. Bộ đệm lệnh thứ hai là hiển thị đường viền của các mắt lưới với kiểm tra độ sâu bị tắt. Bởi vì nó phải được trên đầu trang của các đối tượng khác. – hidayat
Nếu bạn thực hiện một lần gửi. sau đó sử dụng vkCmdSetEvent trong bộ đệm lệnh đầu tiên của bạn và vkCmdWaitEvents trong lần thứ hai của bạn và giữ cho các mặt nạ sân khấu src và dst càng hẹp càng tốt. –