OpenGL is specified as a thread-safe API, but in practice there are multithreading-related issues on most, if not all, of the platforms which support it. For example, some OpenGL implementations do not behave well when one context is made current first on one thread, released, and then made current on a second thread, although this is legal according to the OpenGL specification. On other platforms there are other problems.
Due to these limitations, and due to the inherent multithreading in the Java platform (in particular, in the Abstract Window Toolkit), it is often necessary to limit the multithreading occurring in the typical application using the OpenGL API.
In the current reference implementation, for instance, multithreading has been limited by forcing all OpenGL-related work for GLAutoDrawables on to a single thread. In other words, if an application uses only the GLAutoDrawable and GLEventListener callback mechanism, it is guaranteed to have the most correct single-threaded behavior on all platforms.
Applications using the GLContext makeCurrent/release API directly will inherently break this single-threaded model, as these methods require that the OpenGL context be made current on the current thread immediately. For applications wishing to integrate better with an implementation that uses the single-threaded model, this class provides public access to the mechanism used by the implementation.
Users can execute Runnables on the internal thread used for performing OpenGL work, and query whether the current thread is already this thread. Using these mechanisms the user can move work from the current thread on to the internal OpenGL thread if desired.
This class also provides mechanisms for querying whether this internal serialization of OpenGL work is in effect, and a programmatic way of disabling it. In the current reference implementation it is enabled by default, although it could be disabled in the future if OpenGL drivers become more robust on all platforms.
In addition to specifying programmatically whether the single
thread for OpenGL work is enabled, users may switch it on and off
using the system property jogl.1thread. Valid values
for this system property are:
-Djogl.1thread=false Disable single-threading of OpenGL work, hence use multithreading.
-Djogl.1thread=true Enable single-threading of OpenGL work (default -- on a newly-created worker thread)
-Djogl.1thread=auto Select default single-threading behavior (currently on)
-Djogl.1thread=awt Enable single-threading of OpenGL work on AWT event dispatch thread (current default on all
platforms, and also the default behavior older releases)
-Djogl.1thread=worker Enable single-threading of OpenGL work on newly-created worker thread (not suitable for Mac
OS X or X11 platforms, and risky on Windows in applet environments)
| Modifier and Type | Class and Description |
|---|---|
| public static enum |
| Access | Constructor and Description |
|---|---|
| private |
| Modifier and Type | Method and Description |
|---|---|
| public static final void | disableSingleThreading()
If an implementation of the com.jogamp.opengl APIs offers a multithreading option but the default behavior is single-threading, this API provides a mechanism for end users to disable single-threading in this implementation. |
| public static Threading. | |
| public static final void | invoke(final boolean
set to true for waiting until Runnable wait, final Runnable r is finished, otherwise false.the Runnable to be executed r, final Object optional lock object to be tested lock)If not |
| public static final void | invokeOnOpenGLThread(final boolean wait, final Runnable r)
Executes the passed Runnable on the single thread used for all OpenGL work in this com.jogamp.opengl API implementation. |
| public static final boolean | |
| public static final boolean | isSingleThreaded()
Indicates whether OpenGL work is being automatically forced to a single thread in this implementation. |
| public static final boolean | isToolkitThread()
Indicates whether the current thread is the designated toolkit thread, if such semantics exists. |
| Threading | back to summary |
|---|---|
| private Threading() No reason to ever instantiate this class | |
| disableSingleThreading | back to summary |
|---|---|
| public static final void disableSingleThreading() If an implementation of the com.jogamp.opengl APIs offers a multithreading option but the default behavior is single-threading, this API provides a mechanism for end users to disable single-threading in this implementation. Users are strongly discouraged from calling this method unless they are aware of all of the consequences and are prepared to enforce some amount of threading restrictions in their applications. Disabling single-threading, for example, may have unintended consequences on GLAutoDrawable implementations such as GLCanvas and GLJPanel. Currently there is no supported way to re-enable it once disabled, partly to discourage careless use of this method. This method should be called as early as possible in an application. | |
| getMode | back to summary |
|---|---|
| public static Threading. Returns the threading mode | |
| invoke | back to summary |
|---|---|
| public static final void invoke(final boolean wait, final Runnable r, final Object lock) throws GLException If not
Otherwise invoke Runnable | |
| invokeOnOpenGLThread | back to summary |
|---|---|
| public static final void invokeOnOpenGLThread(final boolean wait, final Runnable r) throws GLException Executes the passed Runnable on the single thread used for all
OpenGL work in this com.jogamp.opengl API implementation. It is
not specified exactly which thread is used for this
purpose. This method should only be called if the single-thread
model is in use and if the current thread is not the OpenGL
thread (i.e., if | |
| isOpenGLThread | back to summary |
|---|---|
| public static final boolean isOpenGLThread() throws GLException Indicates whether the current thread is capable of performing OpenGL-related work.
Method always returns | |
| isSingleThreaded | back to summary |
|---|---|
| public static final boolean isSingleThreaded() Indicates whether OpenGL work is being automatically forced to a single thread in this implementation. | |
| isToolkitThread | back to summary |
|---|---|
| public static final boolean isToolkitThread() throws GLException Indicates whether the current thread is the designated toolkit thread, if such semantics exists. | |
| Modifier and Type | Field and Description |
|---|---|
| public final int | |
| public static final Threading. | |
| public static final Threading. | ST_AWT
Single-Threaded OpenGL on AWT EDT |
| public static final Threading. | ST_WORKER
Single-Threaded OpenGL on dedicated worker thread. |
| Access | Constructor and Description |
|---|---|
| private |
| Modifier and Type | Method and Description |
|---|---|
| public static Threading. | |
| public static Threading. |
| id | back to summary |
|---|---|
| public final int id | |
| MT | back to summary |
|---|---|
| public static final Threading. Full multithreaded OpenGL,
i.e. any | |
| ST_AWT | back to summary |
|---|---|
| public static final Threading. Single-Threaded OpenGL on AWT EDT | |
| ST_WORKER | back to summary |
|---|---|
| public static final Threading. Single-Threaded OpenGL on dedicated worker thread. | |
| Mode | back to summary |
|---|---|
| private Mode(final int id) | |
| valueOf | back to summary |
|---|---|
| public static Threading. | |
| values | back to summary |
|---|---|
| public static Threading. | |