我有一個片段着色器,使用圖像加載/存儲操作在imageBuffer上執行處理。 我專門關注以下情形:單階段(片段着色器),單通場景GLSL一致imageBuffer訪問
- 我有一個片段着色器(無多級(例如頂點然後片段着色器)的考慮,也沒有多路渲染。)
- ImageBuffer的變量聲明爲一致。獨家對連貫的圖像緩衝區感興趣。
爲了使事情非常清楚,我的情況是這樣的:
// Source code of my sole and unique fragment shader:
coherent layout(1x32) uniform uimageBuffer data;
void main()
{
...
various calls to imageLoad(data, ..., ...);
...
various calls to imageStore(data, ..., ...);
...
}
我基本上都看了規範
特別是這個非常段落:
「使用聲明的聲明作爲「一致」保證 商店的結果將立即可見,以着色器調用使用 類似聲明的變量;調用內存屏障需要 確保專賣店是可見的其他業務「
注:我的‘連貫統一ImageBuffer的數據;’聲明恰恰是一個‘類似聲明的’變量我的情況是單通。 ,單級(片段着色器)
現在,我已經看過各種網站和跌跌撞撞(大多數人一樣,我認爲)在此線程stackoverflow.com:
多SP ecifically,這一段:
「着色器甚至不能作一個假設,一個店之後發出負載 將得到剛存儲在這個 很着色器中的內存(是真的。你必須在把內存屏障拉 一個關)「
我的問題是這樣的:。
隨着規定的一致預選賽中,在我的單着色器,單通處理的情況下,我可以肯定或不確定imageStore()對我的片段着色器的所有調用(例如當前的調用以及其他併發調用)是否立即可見?
通過閱讀ARB_shader_image_load_store規範對我來說:
- 在這個問題的答案是肯定的,
- 我不需要任何類型的內存屏障()的,
- 在計算器上面引用線程引用的句子可能確實是誤導和錯誤的。
感謝您的見解。
你是在一些重大的頭痛,如果你不要在此着色器使用一個內存屏障,既*** ***負荷,稍後存儲。如果你的抽牌只能得到一個單獨的片段,你可能會安全地把它關閉。但對於任何更大的場景,您需要同步片段着色器調用之間的同步,否則其他片段可能會在另一個存儲器之前加載。片段着色器可以按照驅動程序認爲會產生理智結果的任何順序進行安排,imageLoad/Store在考慮因素時被有效忽略,因爲它假定您知道自己在做什麼。 –
@ AndonM.Coleman你沒有回答我的問題。這個問題是:**我可以肯定或不確定imageStore()對於我的片段着色器的所有調用(例如當前的調用以及其他併發調用)都將立即可見嗎?**換句話說,是在單一着色器階段加載/存儲連貫且類似聲明的變量**保證**將按順序執行?規範似乎說是的,一些論壇成員說不。您只是提及併發編程的一般問題。我知道我無法控制着色器調用的調度。 – fred54
這是你的問題,然後沒有。 –