2016-04-24 65 views
3

如果我们有几个OpenGL上下文,每个都在其自己的进程中,驱动程序以某种方式虚拟化设备,以便每个程序都认为它独占运行GPU。也就是说,如果一个程序调用glEnable,另一个程序永远不会注意到这一点。是否可以在OpenGL中一次保存所有状态?

这种情况可以通过大量的glGet调用来保存状态及其对应状态,以便在事后恢复状态。显然,司机更有效地做到了。但是,在用户空间中,我们需要跟踪对状态所做的更改并选择性地处理它们。也许这只是我错过了一些东西,但我认为这将是很好的,为了调整Framebuffer的视口,然后只是撤消这些变化,以他们以前的任何状态。

也许有一种方法可以在单个程序中实现上下文切换效果吗?

+3

那么,您只需在同一个程序中使用多个GL上下文,即可将状态彼此分开。由于此类上下文可以共享实际对象,因此您仍然可以使用相同的数据。 – derhass

回答

1

也许有一种方法可以在单个程序中实现上下文切换效果吗?

您可以在单个进程中创建尽可能多的OpenGL上下文并在它们之间切换。同样,对于现代GPU,OpenGL上下文的状态与GPU上实际发生的情况几乎没有相似之处。

1

状态机(和命令队列,下面讨论)对每个上下文都是唯一的。这比你想象的要高得多,状态通常在用户模式中很好地包装起来。

对于单个进程中的上下文切换,请注意GL中的每个渲染上下文都是未同步的。在上下文切换期间会生成隐式刷新,以帮助缓解此问题。只要上下文仅由单个线程使用,这通常就足够了,但可能会对性能产生负面影响。

相关问题