2016-04-24 9 views
3

Wenn wir mehrere OpenGL-Kontexte haben, jeder in seinem eigenen Prozess, virtualisiert der Treiber irgendwie das Gerät, so dass jedes Programm denkt, dass es ausschließlich die GPU betreibt. Das heißt, wenn ein Programm glEnable aufruft, wird der andere dies nie bemerken.Ist es möglich, den gesamten Status in OpenGL auf einmal zu bewahren?

Dies könnte sonst mit einer Tonne von glGet Anrufe durchgeführt werden, um den Zustand und seine Gegenstücke zu speichern, um es danach wiederherzustellen. Offensichtlich macht der Fahrer es effizienter. Im Benutzerbereich müssen wir jedoch nachverfolgen, welche Änderungen wir am Zustand vorgenommen haben, und diese selektiv behandeln. Vielleicht fehlt mir nur etwas, aber ich dachte, es wäre schön, Viewport für einen Framebuffer anzupassen und diese Änderungen dann einfach wieder rückgängig zu machen.

Vielleicht gibt es eine Möglichkeit, die Wirkung eines Kontextwechsel noch innerhalb eines einzigen Programms zu erreichen?

+3

Nun, Sie können einfach mehrere GL-Kontexte im selben Programm verwenden, um den Status voneinander zu trennen. Da solche Kontexte die tatsächlichen Objekte gemeinsam nutzen können, können Sie immer noch an denselben Daten arbeiten. – derhass

Antwort

1

Vielleicht gibt es eine Möglichkeit, die Wirkung eines Kontextwechsel noch innerhalb eines einzigen Programms zu erreichen?

Sie können beliebig viele OpenGL-Kontexte in einem Prozess erstellen und zwischen ihnen wechseln. Auch bei modernen GPUs hat der Zustand des OpenGL-Kontext wenig Ähnlichkeit mit dem, was tatsächlich auf der GPU passiert.

1

Für Pre-Core OpenGL gibt es glPushAttrib()/glPopAttrib(), die Sie abspeichern können einige GL Zustand.

Sie sind wahrscheinlich besser dran, Ihre eigenen clientseitigen Statusschattierungen zu schreiben.

1

Die Statusmaschine (und die Befehlswarteschlange, siehe unten) sind für jeden Kontext eindeutig. Es ist viel, viel höher als du denkst; Der Zustand ist im Allgemeinen gut in usermode verpackt.

Beachten Sie bei Kontextwechsel in einem einzelnen Prozess, dass jeder Renderkontext im GL nicht synchronisiert ist. Ein impliziter Flush wird während eines Kontextwechsels erzeugt, um dieses Problem zu beheben. Solange ein Kontext nur von einem einzigen Thread verwendet wird, ist dies im Allgemeinen ausreichend, wird sich jedoch wahrscheinlich negativ auf die Leistung auswirken.