Когда возвращается glBufferSubData?

Я хочу перенести содержимое очень большого куска памяти в достаточно большой буфер графического процессора, а затем немедленно изменить содержимое памяти на процессоре. Примерно так в псевдокоде:

glBindBuffer(/*very_large_buffer*/);
glBufferSubData(/*very_large_memory_chunk*/);
memset(/*zeros*/, /*very_large_memory_chunk*/);

В этом коде, что делает glBufferSubData на самом деле делать? Передает ли он only_large_memory_chunk куда-нибудь перед возвратом или просто планирует операцию передачи для возможного более позднего выполнения? Так что, если я немедленно начну изменять буфер ЦП, возможно ли, что частично измененная память будет перенесена, что приведет к мусору в GPU Very_large_buffer?

Обратите внимание, что я не спрашиваю о рендеринге звонков. Я знаю, что если буфер используется для рендеринга, операции передачи будут ждать до завершения рендеринга, и наоборот. Я хочу знать, ведет ли себя OpenGL одинаково в операциях передачи между CPU и GPU.

1 ответ

Решение

OpenGL не определяет, как glBufferSubData должен быть реализован: он может либо сразу скопировать данные в память GPU, либо отложить операцию копирования на более поздний момент.

Что гарантирует OpenGL (спецификация OpenGL 4.5, раздел 5.3), так это то, что можно принять вызов glBufferSubData должно быть завершено, когда метод возвращается. Это означает, что каждая реализация, которая откладывает операцию копирования CPU->GPU, должна убедиться, что память CPU скопирована перед возвратом.

В заключение: вы можете изменить содержимое указателя сразу после glBufferSubData возвращает без изменения / уничтожения содержимого буферов.

Другие вопросы по тегам