Interface GLSharedContextSetter
-
- All Superinterfaces:
GLAutoDrawable,GLDrawable,NativeSurfaceHolder
- All Known Subinterfaces:
GLOffscreenAutoDrawable,GLOffscreenAutoDrawable.FBO
- All Known Implementing Classes:
jogamp.opengl.GLAutoDrawableBase,GLAutoDrawableDelegate,GLCanvas,GLCanvas,GLJPanel,GLWindow
public interface GLSharedContextSetter extends GLAutoDrawable
Adds capabilities to set a sharedGLContextdirectly or via anGLAutoDrawable.Sharing of server-side OpenGL objects such as buffer objects, e.g. VBOs, and textures among OpenGL contexts is supported with this interface.
A master
GLContextis theGLContextwhich is created first. Subsequent sharedGLContextw/ the master are referred as slaveGLContext.Implementations of this interface control the slave's
GLContextandGLAutoDrawablerealization, i.e. the slaveGLAutoDrawablewill not be realized before their associated master.Using the nearest or same
visual IDorcapsacross the sharedGLDrawables will yield best compatibility.Lifecycle Considerations
After shared objects are created on the master, the OpenGL pipeline might need to be synchronized w/ the slaves, e.g. via
GL.glFinish(). At least this has been experienced w/ OSX 10.9.In general, destroying a master
GLContextbefore their shared slaves shall be permissible, i.e. the OpenGL driver needs to handle pending destruction of shared resources. This is confirmed to work properly on most platform/driver combinations, see unit testcom.jogamp.opengl.test.junit.jogl.acore.TestSharedContextVBOES2NEWT3and similar.However, to avoid scenarios with buggy drivers, users may not destroy the master
GLContextbefore its shared slaveGLContextinstances as long as they are using them.
Otherwise the OpenGL driver may crash w/ SIGSEGV, due to using already destroyed shared resources, if not handling the pending destruction of the latter!
Either proper lifecycle synchronization is implemented, e.g. by notifying the slaves about the loss of the shared resources, or the slaves validate whether the resources are still valid.To simplify above lifecycle issues, one may use a
dummyGLDrawableand it'sGLContextas the master of all shared slaveGLContext. Since this dummy instance does not depend on any native windowing system, it can be controlled easily w/o being in sight.
Below code creates aGLAutoDrawablebased on a dummy GLDrawable:// GLProfile and GLCapabilities should be equal across all shared GL drawable/context. final GLCapabilitiesImmutable caps = ... ; final GLProfile glp = caps.getGLProfile(); .. final boolean createNewDevice = true; // use 'own' display device! final GLAutoDrawable sharedDrawable = GLDrawableFactory.getFactory(glp).createDummyAutoDrawable(null, createNewDevice, caps, null); sharedDrawable.display(); // triggers GLContext object creation and native realization. ... // Later a shared 'slave' can be created e.g.: GLWindow glad = GLWindow.create(caps); // or any other GLAutoDrawable supporting GLSharedContextSetter glad.setSharedAutoDrawable(sharedDrawable); glad.addGLEventListener(..); glad.setVisible(true); // GLWindow creation ..GL Object Synchronization
Usually synchronization of shared GL objects should not be required, if the shared GL objects are created and immutable before concurrent usage.
However, using drivers exposing
GLRendererQuirks.NeedSharedObjectSyncalways require the user to synchronize access of shared GL objects.Synchronization can be avoided if accessing the shared GL objects exclusively via a queue or
Ringbuffer, see GLMediaPlayerImpl as an example.Known Driver Issues
Intel's Mesa >= 9.1.2 Backend for [Sandybridge/Ivybridge] on GNU/Linux Error: 'intel_do_flush_locked: No such file or directory' JogAmp: https://jogamp.org/bugzilla/show_bug.cgi?id=873 freedesktop.org: https://bugs.freedesktop.org/show_bug.cgi?id=41736#c8
Shared context seems not to be supported w/ lock-free bound X11 display connections per OpenGL drawable/context. The error message above is thrown in this case. Hence the driver bug renders shared context use w/ JOGL impossible.Hisilicon's Immersion.16 on Android We failed to create a shared ES2 context on another thread.
-
-
Field Summary
-
Fields inherited from interface com.jogamp.opengl.GLAutoDrawable
SCREEN_CHANGE_ACTION_ENABLED
-
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description voidsetSharedAutoDrawable(GLAutoDrawable sharedAutoDrawable)Specifies anGLAutoDrawable, whichOpenGL contextshall be shared by thisGLAutoDrawable'sGLContext.voidsetSharedContext(GLContext sharedContext)-
Methods inherited from interface com.jogamp.opengl.GLAutoDrawable
addGLEventListener, addGLEventListener, areAllGLEventListenerInitialized, createContext, destroy, display, disposeGLEventListener, flushGLRunnables, getAnimator, getAutoSwapBufferMode, getContext, getContextCreationFlags, getDelegatedDrawable, getExclusiveContextThread, getGL, getGLEventListener, getGLEventListenerCount, getGLEventListenerInitState, getUpstreamLock, getUpstreamWidget, invoke, invoke, isThreadGLCapable, removeGLEventListener, setAnimator, setAutoSwapBufferMode, setContext, setContextCreationFlags, setExclusiveContextThread, setGL, setGLEventListenerInitState
-
Methods inherited from interface com.jogamp.opengl.GLDrawable
getChosenGLCapabilities, getFactory, getGLProfile, getHandle, getNativeSurface, getRequestedGLCapabilities, getSurfaceHeight, getSurfaceWidth, isGLOriented, isRealized, setRealized, swapBuffers, toString
-
-
-
-
Method Detail
-
setSharedContext
void setSharedContext(GLContext sharedContext) throws IllegalStateException
Specifies anOpenGL context, which shall be shared by thisGLAutoDrawable'sGLContext.Since the
drawableandcontextis created atGLAutoDrawable initializationthis method shall be called beforehand to have any effect.A set sharedContext will block context creation, i.e.
GLAutoDrawable initialization, as long it is notcreated natively.The preferred method of assigning a shared context is to
set the shared GLAutoDrawable, since this method also takes theGLEventListenerinitialization into account.- Parameters:
sharedContext- The OpenGL context to be shared by thisGLAutoDrawable'sGLContext.- Throws:
IllegalStateException- if ashared GLContextorshared GLAutoDrawableis already set, the given sharedContext is null or equal to thisGLAutoDrawable's context.- See Also:
setSharedAutoDrawable(GLAutoDrawable)
-
setSharedAutoDrawable
void setSharedAutoDrawable(GLAutoDrawable sharedAutoDrawable) throws IllegalStateException
Specifies anGLAutoDrawable, whichOpenGL contextshall be shared by thisGLAutoDrawable'sGLContext.Since the
drawableandcontextis created atGLAutoDrawable initializationthis method shall be called beforehand to have any effect.A set sharedAutoDrawable will block context creation, i.e. initialization as long it's
GLContextisnull, orGLContexthas not beencreated natively, orGLEventListenerare notcompletely initialized
- Parameters:
sharedContext- The GLAutoDrawable, which OpenGL context shall be shared by thisGLAutoDrawable'sGLContext.- Throws:
IllegalStateException- if ashared GLContextorshared GLAutoDrawableis already set, the given sharedAutoDrawable is null or equal to this GLAutoDrawable.- See Also:
setSharedContext(GLContext)
-
-