2016-02-26 7 views
0

У меня есть реализация графических процессоров Marching Cubes, в которой используется последовательность из 6 GL-шейдеров с каждым чтением из буферов, написанных предыдущими шейдерами, после соответствующих барьеров памяти. Буферы, используемые на ранних этапах, содержат временные маркерные переменные и должны быть изменены до 0, когда они больше не нужны, но не удаляются, поскольку я хочу их снова для последующих запусков.Освободить буфер после чтения из GL-калькулятора шейдеров

На некоторых этапах мне нужно прочитать из буфера в шейдере, а затем освободить его сразу же после завершения шейдера перед распределением буферов для следующего этапа шейдера. Мой вопрос - как это сделать безопасно. В документе, посвященном памяти, говорится о том, что все записи завершены, прежде чем разрешить чтение другого шейдера, но ничего не говорят о чтении в первом шейдере.

Если я:

glUseProgram(firstShader); 
glDispatchCompute(size,1,1); 
glMemoryBarrier(GL_BUFFER_UPDATE_BARRIER_BIT); 
glNamedBufferData(firstBuffer,0,NULL,GL_DYNAMIC_DRAW); 
glNamedBufferData(secondBuffer,1000000,&data,GL_DYNAMIC_DRAW); 
glUseProgram(secondShader); 
glDispatchCompute(size,1,1); 

является firstBuffer гарантированно не не будет изменен до firstShader делается чтение из него? Если нет, как это сделать?

+0

Следует иметь в виду, что выделение/освобождение памяти в вашем основном цикле производительности не собирается покупать вам что-либо с точки зрения производительности. В самом деле, вы, вероятно, получите намного больше от своего алгоритма, если вы реструктурируете свой вычислительный шейдер для использования общих переменных, а не нескольких проходов и чтения/записи в память графического процессора. –

+0

Спасибо за комментарий Nicol. Я моделирую довольно крупные ячейки, поэтому проблема заключается в использовании памяти, а не производительности. Я использую первые пару проходов, чтобы собрать образцы и найти кубики, производящие геометрию, чтобы я мог запускать значительно меньшее количество запросов с этого момента. Есть несколько моментов, когда мне нужно хранить все пространство в памяти, которое может занимать сотни МБ, поэтому я бы хотел избавиться от него, как только закончите. Не знаете, как использовать общие переменные, поскольку они довольно малы и ограничены одной рабочей группой? – russ

ответ

0

и должен быть изменен до 0, когда он больше не нужен, но не будет удален, поскольку я захочу их снова для последующих запусков.

Изменение размера буфера эквивалентно его удалению и выделение нового буфера на одном и том же идентификаторе.

На некоторых этапах мне нужно прочитать из буфера в шейдере, а затем освободить его сразу же после завершения шейдера перед распределением буферов для следующего этапа шейдера. Мой вопрос - как это сделать безопасно.

Просто удалите его. Удаление буфера на первом этапе удаляет только идентификатор. Идентификатор - это еще одна ссылка на фактический объект буфера. При изменении размера или удалении буфера только связь между id и фактическим буфером прерывается. Изменение размера фактически создает новый буфер и повторно связывает его с ним. Фактически вызов glBufferData будет делать то же самое (в отличие от glBufferSubData). Это называется «сиротой».

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

+0

Спасибо, это все, что мне нужно знать :) – russ

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

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