Tôi có một vài shader tính toán cần được thực hiện theo một thứ tự nhất định và đầu ra của nó phụ thuộc vào đầu vào trước đó. Lý tưởng nhất là tôi sẽ không bao giờ cần sao chép phía máy khách đệm và thực hiện tất cả công việc của mình trên GPU.
Hãy xem xét tôi có hai shader shute được biên dịch và liên kết là program_one
và program_two
. Giả sử tôi cũng có một GL_SHADER_STORAGE_BUFFER
dữ liệu chứa dữ liệu được ghi bởi program_one
và đọc bởi program_two
. Tôi có thể chỉ cần làm như sau:
glUseProgram(program_one);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);
glUseProgram(program_two);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer);
glDispatchCompute(16, 16, 1);
Có đảm bảo rằng tất cả các lệnh của trình đổ bóng tính toán đầu tiên sẽ kết thúc trước bất kỳ lệnh nào của lần thứ hai (để tránh các cuộc đua dữ liệu giữa đọc và viết buffer
) không? Nếu không, làm thế nào để tôi đồng bộ hóa chúng?