[問題] OpenGL Compute Shader同步不同group

作者: Ninja5566 (苦味)   2016-12-23 04:34:15
開發平台(Platform): (Ex: Win10, Linux, ...)
Win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VS2015
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
OpenGL 4.3
問題(Question):
我想利用compute shader做一個global index array
假設我每個在 compute shader 中的 work group 有一個 shared variable, 叫做local index array,
array長度固定, 但是裡面內含的有效index 數量並非固定, 例如說:
shared int array[1024]; // 每一個work group 自己具有的array
group 1: length = 3, array = 3, 4, 2, -1, -1, -1, -1.... (-1代表無效值)
group 2: length = 5, array = 1, 5, 3, 4, 6, -1, -1, -1,..
group 3: length = 1, array = 2, -1, -1, -1, -1....
因為我想要節省記憶體, 所以我想把這些group的local index array merge到
global index array, 也就是一個Shader Storage Buffer Object
, 並且讓他長成以下這個樣子:
global index array = 3, 4, 2, 1, 5, 3, 4, 6, 2, -1, -1, .....
此array 為group 依序將自己的 index array 接到前一個group的 array後方
我現在的問題是, 是否有辦法做到這件事情? 困難點在於, group 2必須要等到
group 1貼完array(或至少要更新一個offset讓group 2 知道他要從哪邊開始貼)
,group 3 也要等到group 2 更新玩global index array的offset才知道要從哪裡開始
但是 OpenGL 的barrier 只有同步同一個group的thread功能, 並無法同步不同
group, 所以我想請問有甚麼方法可以達到我的要求?
我原本的想法是用一塊Shader Storage Buffer Object 來記錄說最後一個更新
list offset group的編號是多少, 還沒有輪到你的group就在一個while loop
裡面等, 但是我在想這個方法是不是沒甚麼效率, 會不會有比較好的解法?
請各位前輩幫忙回答一下, 感謝!
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
其實我想實作Forward Plus Rendering, 但是一直不知道linked list
該怎麼做..
作者: Sidney0503 (Sidney0503)   2016-12-23 08:03:00
為何不使用vao vbo?
作者: Ninja5566 (苦味)   2016-12-23 08:16:00
compute shader完全不相容rendering pipeline
作者: johnjohnlin (嗯?)   2016-12-23 15:30:00
基本上要 2-pass,用 parallel prefix sum 作第一個 pass 只產生 element 數量,prefix sum 之後就是 offset 了,gpu 幾乎不會有 global sync thread如果不 care order 的話,用 atomic add 應該還行

Links booklink

Contact Us: admin [ a t ] ucptt.com