2017-02-01 9 views
0

Рассмотрим следующего случаяМинимального видоизменения данных под ссылкой после OpenGL вызова

glDeleteBuffers(1, &buffer); 
// buffer = 0; 
... 
if(buffer == 0) { 
    // Should not pass but does. 
} 

, конечно, когда glDeleteBuffers выполняется, буфер установлен в 0, но, учитывая задержку между выдачей удаления и фактически выполняются, я могу столкнуться отличное от нуля.

Условие выше продолжает проходить наугад, что нежелательно.

Мой вопрос: могу ли я назначить нуль в буфер без влияния на команду в очереди? Я понимаю, что при передаче ценности ничего плохого не может произойти, но я не нашел упоминания в документации, как обрабатываются ссылки. Записывает ли OpenGL данные из ссылок на некоторый неизменяемый временный буфер до того, как он «будет потреблен»?

Пробовал присваивать -1, надеясь, что это приведет к ошибке, но из-за случайного поведения проблемы я действительно не хочу полагаться на «не произошло, не произойдет».

+3

Почему вы думаете, что 'glDeleteBuffers' изменяет значение буфера? Второй параметр - это 'const GLuint * ', что означает, что он не может быть изменен функцией. – BDL

+0

Теперь это довольно странно, поскольку условие не всегда проходит. –

+0

Неопределенное поведение, потому что вы используете 'buffer' после того, как вы сказали GL, чтобы удалить его. – lfgtm

ответ

3

, конечно, когда glDeleteBuffers выполняется, буфер установлен в 0

Нет, это не так. Ни одна из функций glDelete* не изменит имя буфера, которое вы предоставляете.

но учитывая задержку между выдачей удаления и фактическим выполнением, я могу столкнуться с ненулевым значением.

Даже если glDelete* функции сделали перезапись массив, который вы прошли, они будут делать так сразу, как almost every other OpenGL function that writes to memory you provide.

Мой вопрос: могу ли я назначить нуль в буфер без влияния на команду в очереди?

buffer всего лишь целое число; вы можете настроить его так, как вам нравится. OpenGL будет продолжать делать то, что он делает.

Когда вы удаляете объект OpenGL, он фактически будет удален только after the object stops being attached to other objects and after the GPU gets done with whatever processes acted on it. Но независимо от того, отбрасываете ли вы свою ссылку на этот объект, это не связано с этим.

0

glDeleteBuffers никогда не меняет значение переданной переменной. Фактически, второй параметр равен const GLuint*, что означает, что он является постоянным и не может быть изменен.

О переходе -1: Помимо того, что ссылки буферных неподписанных целых, reference состояния:

glDeleteBuffers молча игнорирует 0 и имена, которые не соответствуют существующим буферам объектов

В целом и для (почти) всего вызова OpenGL: вы можете назначить все, что хотите, любой переменной, которую вы передали OpenGL. Когда возвращается вызов OpenGL, гарантируется, что он завершил обработку памяти на стороне клиента (за некоторыми исключениями, прочитайте this для получения дополнительной информации).

+0

О, мой плохой, прочитал: «GL_INVALID_VALUE генерируется, если n отрицательно». и автоматически предполагал, что он предназначен для индекса буфера, а не для подсчета буфера. –

 Смежные вопросы

  • Нет связанных вопросов^_^