запустить glDispatchCompute в цикле - PullRequest
       93

запустить glDispatchCompute в цикле

0 голосов
/ 20 сентября 2018

Могу ли я запустить этот код в цикле без чтения результатов из SSBO?И только читать результаты SSBO после 100 итераций.

for (int i=0; i <100; i++){
 glDispatchCompute(1, 200, 1);    
 glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);//i understand this needed to ensure 
                 //it is done running the glsl code in GPU from previous iteration
}

Также будет ли выполнен код glsl, например, во второй раз в цикле (i == 1), увидеть результаты первого выполнения glsl в SSBO (i == 0)?

Наконец, мне действительно нужен вызов glMemoryBarrier в цикле или он может быть вне цикла?Я обеспокоен тем, что код GPU не увидит изменений, внесенных первой итерацией в SSBO при выполнении во второй раз.

1 Ответ

0 голосов
/ 25 сентября 2018

1) Да, вы можете запустить свой шейдер несколько раз, не читая содержимое буфера, в который вы записываете, и читая их в конце (это очень распространенная практика в алгоритмах итеративной сортировки на GPU)

2) Если вы читаете / записываете данные в один и тот же буфер, да, они будут видны

3) Да, вам нужен барьер, в противном случае дипчек вычислительного шейдера будет запущен без ожидания завершения предыдущего,что приведет к неправильным результатам (как вы обеспокоены), если не сбои.Однако тип барьера будет зависеть от того, что вы делаете в своем шейдере.Вот полный список барьеров

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glMemoryBarrier.xhtml

Скорее всего, если вы сосредоточены на чтении / записи в SSBO, вы должны использовать барьер GL_SHADER_STORAGE_BARRIER_BIT, но если выне уверен, вы можете просто использовать GL_ALL_BARRIER_BITS.

...