Class GLDrawableUtil
- java.lang.Object
-
- com.jogamp.opengl.util.GLDrawableUtil
-
public class GLDrawableUtil extends Object
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
GLDrawableUtil.ReshapeGLEventListener
GLRunnable
to issueGLEventListener.reshape(GLAutoDrawable, int, int, int, int)
, returningtrue
onGLRunnable.run(GLAutoDrawable)
.
-
Constructor Summary
Constructors Constructor Description GLDrawableUtil()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static boolean
isAnimatorAnimating(GLAnimatorControl animatorCtrl)
static boolean
isAnimatorAnimatingOnOtherThread(GLAnimatorControl animatorCtrl)
static boolean
isAnimatorStarted(GLAnimatorControl animatorCtrl)
static boolean
isAnimatorStartedOnOtherThread(GLAnimatorControl animatorCtrl)
static boolean
isSwapGLContextSafe(GLCapabilitiesImmutable requestedCaps, GLCapabilitiesImmutable chosenCapsA, GLCapabilitiesImmutable chosenCapsB)
Return a heuristic value whether switching theGLContext
is safe betweenGLAutoDrawable
s, i.e.static void
moveAllGLEventListener(GLAutoDrawable src, GLAutoDrawable dest, boolean preserveInitState)
static void
moveGLEventListener(GLAutoDrawable src, GLAutoDrawable dest, GLEventListener listener, boolean preserveInitState)
static boolean
swapBuffersBeforeRead(GLCapabilitiesImmutable chosenCaps)
Determines whether the chosenGLCapabilitiesImmutable
requires aswap-buffers
before reading pixels.static void
swapGLContext(GLAutoDrawable a, GLAutoDrawable b)
static void
swapGLContextAndAllGLEventListener(GLAutoDrawable a, GLAutoDrawable b)
Swaps theGLContext
and allGLEventListener
betweenGLAutoDrawable
a
andb
, while preserving it's initialized state, resets the GL-Viewport and issuingreshape(..)
.
-
-
-
Method Detail
-
isAnimatorStartedOnOtherThread
public static final boolean isAnimatorStartedOnOtherThread(GLAnimatorControl animatorCtrl)
-
isAnimatorStarted
public static final boolean isAnimatorStarted(GLAnimatorControl animatorCtrl)
-
isAnimatorAnimatingOnOtherThread
public static final boolean isAnimatorAnimatingOnOtherThread(GLAnimatorControl animatorCtrl)
-
isAnimatorAnimating
public static final boolean isAnimatorAnimating(GLAnimatorControl animatorCtrl)
-
moveGLEventListener
public static final void moveGLEventListener(GLAutoDrawable src, GLAutoDrawable dest, GLEventListener listener, boolean preserveInitState)
Moves the designatedGLEventListener
fromGLAutoDrawable
src
todest
. IfpreserveInitState
istrue
, it's initialized state is preserved andreshape(..)
issued w/ the nextGLAutoDrawable.display()
call.Note that it is only legal to pass
preserveInitState := true
, if theGLContext
of bothsrc
anddest
are shared, or has itself moved fromsrc
todest
.Also note that the caller is encouraged to pause an attached
GLAnimatorControl
.- Parameters:
src
-dest
-listener
-preserveInitState
-
-
moveAllGLEventListener
public static final void moveAllGLEventListener(GLAutoDrawable src, GLAutoDrawable dest, boolean preserveInitState)
Moves allGLEventListener
fromGLAutoDrawable
src
todest
. IfpreserveInitState
istrue
, it's initialized state is preserved andreshape(..)
issued w/ the nextGLAutoDrawable.display()
call.Note that it is only legal to pass
preserveInitState := true
, if theGLContext
of bothsrc
anddest
are shared, or has itself moved fromsrc
todest
.Also note that the caller is encouraged to pause an attached
GLAnimatorControl
.- Parameters:
src
-dest
-listener
-preserveInitState
-
-
isSwapGLContextSafe
public static boolean isSwapGLContextSafe(GLCapabilitiesImmutable requestedCaps, GLCapabilitiesImmutable chosenCapsA, GLCapabilitiesImmutable chosenCapsB)
Return a heuristic value whether switching theGLContext
is safe betweenGLAutoDrawable
s, i.e. viaswapGLContext(GLAutoDrawable, GLAutoDrawable)
orswapGLContextAndAllGLEventListener(GLAutoDrawable, GLAutoDrawable)
.Method currently returns
false
if:- Switching between on- and offscreen and one of the following is
true
:MSAA is used
[1] inchosenCapsA
orchosenCapsB
Stereo is used
inchosenCapsA
orchosenCapsB
Accumulator Buffer is requested
[2] inrequestedCaps
true
[1] See Bug 830: swapGLContextAndAllGLEventListener and onscreen MSAA w/ NV/GLX On NVidia GPUs w/ it's proprietary driver context swapping does not work if MSAA is involved and when swapping on- to offscreen.
[2] On AMD GPUs w/ it's proprietary driver, requesting an accumulator buffer leads to receive an accumulator buffer configuration, for which context swapping does not work when swapping on- to offscreen and vice-versa, i.e. cannot make context current. With AMD and Mesa drivers we only receive an accumulator buffer if requested, where on NVidia drivers all configurations contain the accumulator buffer. On both drivers, NVidia and Mesa, context swapping with accumulator buffer works.
- Parameters:
requestedCaps
- requestedGLCapabilitiesImmutable
which are intended for usage by bothGLAutoDrawable
s A and BchosenCapsA
- chosenGLCapabilitiesImmutable
ofGLAutoDrawable
A, whichGLContext
is intended to be swappedchosenCapsB
- chosenGLCapabilitiesImmutable
ofGLAutoDrawable
B, whichGLContext
is intended to be swapped- See Also:
swapGLContext(GLAutoDrawable, GLAutoDrawable)
,swapGLContextAndAllGLEventListener(GLAutoDrawable, GLAutoDrawable)
- Switching between on- and offscreen and one of the following is
-
swapGLContextAndAllGLEventListener
public static final void swapGLContextAndAllGLEventListener(GLAutoDrawable a, GLAutoDrawable b)
Swaps theGLContext
and allGLEventListener
betweenGLAutoDrawable
a
andb
, while preserving it's initialized state, resets the GL-Viewport and issuingreshape(..)
.The
GLAutoDrawable
toGLAnimatorControl
association is also swapped.If an
GLAnimatorControl
is being attached toGLAutoDrawable
a
orb
and the current thread is different thanthe animator's thread
, it is paused during the operation.During operation, both
auto-drawable's
upstream-locks
andsurfaces
are locked, hence atomicity of operation is guaranteed, see GLAutoDrawable Locking.Because of above mentioned locking, if this method is not performed on
a OpenGL capable thread
of bothGLAutoDrawable
s, it must be invoked on such an OpenGL capable thread, e.g. viaThreading.invokeOnOpenGLThread(boolean, Runnable)
.- Throws:
GLException
- if theAbstractGraphicsDevice
are incompatible w/ each other.- See Also:
isSwapGLContextSafe(GLCapabilitiesImmutable, GLCapabilitiesImmutable, GLCapabilitiesImmutable)
-
swapGLContext
public static final void swapGLContext(GLAutoDrawable a, GLAutoDrawable b)
Swaps theGLContext
of givenGLAutoDrawable
anddisposes
eachGLEventListener
w/o removing it.The GL-Viewport is reset and
reshape(..)
issued implicit.If an
GLAnimatorControl
is being attached to GLAutoDrawable src or dest and the current thread is different thanthe animator's thread
, it is paused during the operation.During operation, both
auto-drawable's
upstream-locks
andsurfaces
are locked, hence atomicity of operation is guaranteed, see GLAutoDrawable Locking.Because of above mentioned locking, if this method is not performed on
a OpenGL capable thread
of bothGLAutoDrawable
s, it must be invoked on such an OpenGL capable thread, e.g. viaThreading.invokeOnOpenGLThread(boolean, Runnable)
.- Parameters:
a
-b
-- See Also:
isSwapGLContextSafe(GLCapabilitiesImmutable, GLCapabilitiesImmutable, GLCapabilitiesImmutable)
-
swapBuffersBeforeRead
public static final boolean swapBuffersBeforeRead(GLCapabilitiesImmutable chosenCaps)
Determines whether the chosenGLCapabilitiesImmutable
requires aswap-buffers
before reading pixels.Usually one uses the
default-read-buffer
in which caseswap-buffers
shall happen after calling reading pixels, the default.However, multisampling offscreen
GLFBODrawable
s utilizeswap-buffers
to downsample the multisamples into the readable sampling sink. In this case, we requireswap-buffers
before reading pixels.- Returns:
- chosenCaps.isFBO() && chosenCaps.getSampleBuffers()
-
-