2016-04-24 56 views
3

如果我們有幾個OpenGL上下文,每個都在其自己的進程中,驅動程序以某種方式虛擬化設備,以便每個程序都認爲它獨佔運行GPU。也就是說,如果一個程序調用glEnable,另一個程序永遠不會注意到這一點。是否可以在OpenGL中一次保存所有狀態?

這種情況可以通過大量的glGet調用來保存狀態及其對應狀態,以便在事後恢復狀態。顯然,司機更有效地做到了。但是,在用戶空間中,我們需要跟蹤對狀態所做的更改並選擇性地處理它們。也許這只是我錯過了一些東西,但我認爲這將是很好的,爲了調整Framebuffer的視口,然後只是撤消這些變化,以他們以前的任何狀態。

也許有一種方法可以在單個程序中實現上下文切換效果嗎?

+3

那麼,您只需在同一個程序中使用多個GL上下文,即可將狀態彼此分開。由於此類上下文可以共享實際對象,因此您仍然可以使用相同的數據。 – derhass

回答

1

也許有一種方法可以在單個程序中實現上下文切換效果嗎?

您可以在單個進程中創建儘可能多的OpenGL上下文並在它們之間切換。同樣,對於現代GPU,OpenGL上下文的狀態與GPU上實際發生的情況幾乎沒有相似之處。

1

狀態機(和命令隊列,下面討論)對每個上下文都是唯一的。這比你想象的要高得多,狀態通常在用戶模式中很好地包裝起來。

對於單個進程中的上下文切換,請注意GL中的每個渲染上下文都是未同步的。在上下文切換期間會生成隱式刷新,以幫助緩解此問題。只要上下文僅由單個線程使用,這通常就足夠了,但可能會對性能產生負面影響。

相關問題