2017-06-21 80 views
1

我想將一個非常大的內存塊的內容傳輸到一個足夠大的GPU緩衝區,然後立即改變CPU上內存的內容。事情是這樣的僞代碼:glBufferSubData何時返回?

glBindBuffer(/*very_large_buffer*/); 
glBufferSubData(/*very_large_memory_chunk*/); 
memset(/*zeros*/, /*very_large_memory_chunk*/); 

在這段代碼,什麼glBufferSubData實際上做?它是否在返回之前將very_large_memory_chunk傳輸到某個位置,或者只是爲了稍後執行而安排傳輸操作?因此,如果我立即開始改變CPU緩衝區,是否有可能部分改變內存將被傳輸,在GPU的very_large_buffer中產生垃圾?

請注意,我沒有詢問渲染調用。我知道如果緩衝區用於渲染,傳輸操作將等待渲染完成,反之亦然。我想知道OpenGL在CPU到GPU傳輸操作中的行爲是否相似。

回答

2

OpenGL沒有定義如何實現glBufferSubData:它可以將數據立即複製到GPU內存,也可以將複製操作延遲到稍後的點。

OpenGL保證的是什麼(OpenGL 4.5規範,5.3節)是假設在方法返回時要調用glBufferSubData來完成。這意味着每個推遲CPU-> GPU複製操作的實現都必須確保CPU內存在返回之前被複制。

結論:您可以在glBufferSubData返回後立即更改指針的內容,而無需修改/銷燬緩衝區內容。