2012-08-04 12 views
1

我想實現一個深度剝離算法使用整數紋理着色器互斥。正如this question中建議的那樣,我懷疑可以使用imageAtomicCompSwap(...)。imageAtomicCompSwap文檔和使用

展望the documentation該功能,並選擇重載一個無符號整數:

uint imageAtomicCompSwap(gimage2D image, ivec2 P, uint data); 

但是,目前還不清楚這是如何使用的。文檔內容如下:

imageAtomicCompSwap自動將數據的值與座標P上的紋理元素的值進行比較。 。 。 。如果值相等,則數據存儲在紋理元素中,否則將被丟棄。它返回texel的新值。

這聽起來像我這個函數比較數據與texel中已經存在的值。如果這些值相等,實際上什麼都不會發生(「數據存儲在紋理元素中」,但它們相等,所以沒有變化)。如果這些值不相等,則沒有任何反應(「否則將被丟棄」)。這個函數然後返回texel的新值(這是因爲沒有任何事情發生,只是texel的原始值)。顯然我錯過了一些東西。

複雜的事情,我也沒有能夠得到這個功能,甚至出現。寫作:

//img2D_0 is declared "layout(r32ui) coherent restrict uniform uimage2D img2D_0" 
imageAtomicCompSwap(img2D_0,coord,1u); 

。 。 。得出:

0(14):錯誤C1115:無法找到兼容的重載函數 「imageAtomicCompSwap(結構uimage2D1x32,ivec2,UINT)」

值得一提的是,如果我通過兩個數字:

imageAtomicCompSwap(img2D_0,coord,1u,1u); 

它編譯罰款 - 據我所知這應該只針對多重採樣工作,雖然;我是不知何故宣佈了一個多重採樣的圖像?那麼,A:文檔是什麼意思,B:爲什麼我不需要工作?我很困惑。

回答

1

尋找文檔中該功能

人,這些頁面原因更多的問題比解決的......

總之,文檔被破壞。所述規範(即:每個重要文檔)規定的函數被定義爲:

uint imageAtomicCompSwap(IMAGE_PARAMS, uint compare, uint data) 

IMAGE_PARAMS是圖像均勻和紋理座標適合於該圖像均勻。對於一維圖像,需要image1Dint;對於2D圖像,需要image2Divec2;等等。

它的工作原理是將圖像中的值與compare進行比較。如果它們相等,則data存儲在此位置(交換);否則,不會進行交換。在條件交換完成之前,返回值將是在此位置處存儲的任何值。

+0

注意:我提交了一個關於此的錯誤報告,但考慮到ARB在迴應錯誤報告方面有多糟糕,我不會屏住呼吸。 – 2012-08-04 12:28:12

+0

謝謝。我不確定spinlocking是如何工作的。在我看來,設置比較爲0和數據爲1,正如你所建議的將始終返回1(如果紋理中的值爲0,則交換,返回新值,1;如果紋理中的值爲1,則您不交換,返回原始值,1)? – imallett 2012-08-04 12:37:45

+1

根據規範「原子內存操作從選定的紋素讀取一個值,使用下面描述的 操作之一計算新值,將新值寫入所選紋理元素,並返回讀取的原始值。 - 不是交換後的值。見 p155 – 2012-08-04 19:55:42