2013-02-28 37 views
8

Tôi đang cố gắng tìm các tình huống trong đó đối tượng đồng bộ hóa có thể được sử dụng trong OpenGL. Sự hiểu biết của tôi là một đối tượng đồng bộ một lần đặt trong dòng lệnh GL (bằng cách sử dụng glFenceSync()) sẽ được báo hiệu sau khi tất cả các lệnh GL được thực hiện và nhận ra. Nếu các đối tượng đồng bộ hóa là nguyên gốc đồng bộ hóa thì tại sao chúng ta không thể báo hiệu chúng? Trường hợp chính xác chức năng này có thể giúp lập trình GL?Sử dụng đối tượng đồng bộ hàng rào trong OpenGL

Kịch bản sau có đúng không?

Thread 1 : 

Load model 
Draw() 
glFenceSync() 

Thread 2 : 

glWaitSync(); 
ReadPixels 
Use data for subsequent operation. 

Điều này có nghĩa là tôi không thể khởi chạy chuỗi 2 trừ khi glFenceSync() được gọi trong Chủ đề 1 không?

+2

"* Điều này có nghĩa là tôi không thể khởi chạy chuỗi 2 trừ khi glFenceSync() được gọi trong Thread 1? *" Vâng, cho đến khi bạn gọi 'glFenceSync', đối tượng đồng bộ chưa tồn tại. Bạn không thể chờ đợi điều gì đó không tồn tại. –

Trả lời

8

Hàng rào không phải là quá nhiều để đồng bộ hóa chủ đề, nhưng để biết, khi hoạt động asynchronus kết thúc. Ví dụ: nếu bạn thực hiện một đối tượng đệm pixel (PBO) glReadPixels, bạn có thể muốn biết rằng đọc đã được hoàn thành, trước khi bạn cố đọc hoặc ánh xạ PBO đến không gian địa chỉ của máy khách.

Nếu bạn thực hiện glReadPixels với PBO là mục tiêu, cuộc gọi sẽ trở lại ngay lập tức, nhưng việc chuyển dữ liệu thực sự có thể mất chút thời gian. Đó là nơi hàng rào có ích.

+0

Tôi có một tình huống mà tôi vẽ vào một FBO trong một chủ đề, và sau đó kết xuất từ ​​kết cấu đính kèm màu vào màn hình trong chuỗi khác (và tạo hàng rào để biết khi nào kết xuất xong). Khi một FBO mới có sẵn, tôi đưa FBO cũ và hàng rào lại cho người quản lý FBO để nó có thể truy vấn hàng rào và biết FBO có sẵn để viết lại. – Jherico

Các vấn đề liên quan