glUnmapBuffer, сохраняя память glMapBuffer доступной только для чтения - PullRequest
3 голосов
/ 19 февраля 2012

Возможно ли glUnmapBuffer GL_STREAM_DRAW пиксель-буферный объект и при этом сохранить данные, на которые указывает указатель, возвращенный ранее glMapBuffer , действительными для операций только для чтения с использованием SSE 4.1 потоковая загрузка?

Если нет, то есть ли техническая причина для этого? Или эта "особенность" была только что пропущена?

1 Ответ

6 голосов
/ 19 февраля 2012

Цель map и unmap - сказать: «Мне нужен указатель на это». и «Я закончил, используя указатель на это». Это то, что делают функции.

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

  1. Скопируйте записанные вами данные (если вы что-то написали) в объект буфера, если сопоставленный указатель не является прямым указателем на этот буфер.
  2. Перемещение объекта буфера в памяти графического процессора, если отображенный указатель является указателем на этот объект.

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

Кроме того, единственная причина, по которой вы предлагаете, заключается в том, что вы хотите прочитать данные в буфере. Ну, так как вы только что отобразили буфер (предположительно для записи, иначе вы бы не отобразили его), вы знаете, что в нем. Если вам нужен доступ к нему ЦП, вы должны были просто хранить данные локально; таким образом вы получите гораздо более надежный доступ к нему.

И если вы делаете другую передачу пикселей, считывание с этого указателя означает, что OpenGL должен будет выполнить синхронизацию, потому что весь смысл PBO - асинхронная передача. То есть, когда вы выполняете glReadPixels или что-то еще, OpenGL может ожидать фактического завершения этой операции, пока вы не отобразите буфер или не используете glGetBufferSubData.

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

То, о чем вы говорите, не имеет смысла.

...