getAvailableCapabilitiesImpl(AbstractGraphicsDevice device);
//----------------------------------------------------------------------
// Methods to create high-level objects
/**
* Returns a GLDrawable according to it's chosen Capabilities,
* which determines pixel format, on- and offscreen incl. PBuffer type.
*
* The native platform's chosen Capabilties are referenced within the target
* NativeSurface's AbstractGraphicsConfiguration.
*
* In case target's {@link javax.media.nativewindow.Capabilities#isOnscreen()} is true,
* an onscreen GLDrawable will be realized.
*
* In case target's {@link javax.media.nativewindow.Capabilities#isOnscreen()} is false,
* either a Pbuffer drawable is created if target's {@link javax.media.opengl.GLCapabilities#isPBuffer()} is true,
* or a simple pixmap/bitmap drawable is created. The latter is unlikely to be hardware accelerated.
*
*
* @throws IllegalArgumentException if the passed target is null
* @throws GLException if any window system-specific errors caused
* the creation of the GLDrawable to fail.
*
* @see javax.media.nativewindow.GraphicsConfigurationFactory#chooseGraphicsConfiguration(Capabilities, CapabilitiesChooser, AbstractGraphicsScreen)
*/
public abstract GLDrawable createGLDrawable(NativeSurface target)
throws IllegalArgumentException, GLException;
/**
* Creates a Offscreen GLDrawable incl it's offscreen {@link javax.media.nativewindow.NativeSurface} with the given capabilites and dimensions.
*
* A Pbuffer drawable/surface is created if both {@link javax.media.opengl.GLCapabilities#isPBuffer() caps.isPBuffer()}
* and {@link #canCreateGLPbuffer(javax.media.nativewindow.AbstractGraphicsDevice) canCreateGLPbuffer(device)} is true.
* Otherwise a simple pixmap/bitmap drawable/surface is created, which is unlikely to be hardware accelerated.
*
*
* @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared device to be used, may be null
for the platform's default device.
* @param caps the requested GLCapabilties
* @param chooser the custom chooser, may be null for default
* @param width the requested offscreen width
* @param height the requested offscreen height
*
* @return the created offscreen GLDrawable
*
* @throws GLException if any window system-specific errors caused
* the creation of the Offscreen to fail.
*/
public abstract GLDrawable createOffscreenDrawable(AbstractGraphicsDevice device,
GLCapabilitiesImmutable capabilities,
GLCapabilitiesChooser chooser,
int width, int height)
throws GLException;
/**
* Creates an offscreen NativeSurface.
* A Pbuffer surface is created if both {@link javax.media.opengl.GLCapabilities#isPBuffer() caps.isPBuffer()}
* and {@link #canCreateGLPbuffer(javax.media.nativewindow.AbstractGraphicsDevice) canCreateGLPbuffer(device)} is true.
* Otherwise a simple pixmap/bitmap surface is created. The latter is unlikely to be hardware accelerated.
*
* @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared the target device, may be null
for the platform's default device.
* @param caps the requested GLCapabilties
* @param chooser the custom chooser, may be null for default
* @param width the requested offscreen width
* @param height the requested offscreen height
* @return the created offscreen native surface
*
* @throws GLException if any window system-specific errors caused
* the creation of the GLDrawable to fail.
*/
public abstract NativeSurface createOffscreenSurface(AbstractGraphicsDevice device,
GLCapabilitiesImmutable caps,
GLCapabilitiesChooser chooser,
int width, int height);
/**
* Highly experimental API entry, allowing developer of new windowing system bindings
* to leverage the native window handle to produce a NativeSurface implementation (ProxySurface), having the required GLCapabilities.
* Such surface can be used to instantiate a GLDrawable and hence test your new binding w/o the
* costs of providing a full set of abstraction like the AWT GLCanvas or even the native NEWT bindings.
*
* @param device the platform's target device, shall not be null
* @param windowHandle the native window handle
* @param caps the requested GLCapabilties
* @param chooser the custom chooser, may be null for default
* @return The proxy surface wrapping the windowHandle on the device
*/
public abstract ProxySurface createProxySurface(AbstractGraphicsDevice device,
long windowHandle,
GLCapabilitiesImmutable caps,
GLCapabilitiesChooser chooser);
/**
* Returns true if it is possible to create a GLPbuffer. Some older
* graphics cards do not have this capability.
*
* @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared the target device, may be null
for the platform's default device.
*/
public abstract boolean canCreateGLPbuffer(AbstractGraphicsDevice device);
/**
* Creates a GLPbuffer with the given capabilites and dimensions.
*
* See the note in the overview documentation on
* context sharing.
*
* @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared the target device, may be null
for the platform's default device.
* @param capabilities the requested capabilities
* @param chooser the custom chooser, may be null for default
* @param initialWidth initial width of pbuffer
* @param initialHeight initial height of pbuffer
* @param shareWith a shared GLContext this GLPbuffer shall use
*
* @return the new {@link GLPbuffer} specific {@link GLAutoDrawable}
*
* @throws GLException if any window system-specific errors caused
* the creation of the GLPbuffer to fail.
*/
public abstract GLPbuffer createGLPbuffer(AbstractGraphicsDevice device,
GLCapabilitiesImmutable capabilities,
GLCapabilitiesChooser chooser,
int initialWidth,
int initialHeight,
GLContext shareWith)
throws GLException;
//----------------------------------------------------------------------
// Methods for interacting with third-party OpenGL libraries
/**
*
Creates a GLContext object representing an existing OpenGL
* context in an external (third-party) OpenGL-based library. This
* GLContext object may be used to draw into this preexisting
* context using its {@link GL} and {@link
* javax.media.opengl.glu.GLU} objects. New contexts created through
* {@link GLDrawable}s may share textures and display lists with
* this external context.
*
* The underlying OpenGL context must be current on the current
* thread at the time this method is called. The user is responsible
* for the maintenance of the underlying OpenGL context; calls to
* makeCurrent
and release
on the returned
* GLContext object have no effect. If the underlying OpenGL context
* is destroyed, the destroy
method should be called on
* the GLContext
. A new GLContext
object
* should be created for each newly-created underlying OpenGL
* context.
*
* @throws GLException if any window system-specific errors caused
* the creation of the external GLContext to fail.
*/
public abstract GLContext createExternalGLContext()
throws GLException;
/**
* Returns true if it is possible to create an external GLDrawable
* object via {@link #createExternalGLDrawable}.
*
* @param device which {@link javax.media.nativewindow.AbstractGraphicsDevice#getConnection() connection} denotes the shared the target device, may be null
for the platform's default device.
*/
public abstract boolean canCreateExternalGLDrawable(AbstractGraphicsDevice device);
/**
*
Creates a {@link GLDrawable} object representing an existing
* OpenGL drawable in an external (third-party) OpenGL-based
* library. This GLDrawable object may be used to create new,
* fully-functional {@link GLContext}s on the OpenGL drawable. This
* is useful when interoperating with a third-party OpenGL-based
* library and it is essential to not perturb the state of the
* library's existing context, even to the point of not sharing
* textures or display lists with that context.
*
* An underlying OpenGL context must be current on the desired
* drawable and the current thread at the time this method is
* called. The user is responsible for the maintenance of the
* underlying drawable. If one or more contexts are created on the
* drawable using {@link GLDrawable#createContext}, and the drawable
* is deleted by the third-party library, the user is responsible
* for calling {@link GLContext#destroy} on these contexts.
*
* Calls to setSize
, getWidth
and
* getHeight
are illegal on the returned GLDrawable. If
* these operations are required by the user, they must be performed
* by the third-party library.
*
* It is legal to create both an external GLContext and
* GLDrawable representing the same third-party OpenGL entities.
* This can be used, for example, to query current state information
* using the external GLContext and then create and set up new
* GLContexts using the external GLDrawable.
*
* This functionality may not be available on all platforms and
* {@link #canCreateExternalGLDrawable} should be called first to
* see if it is present. For example, on X11 platforms, this API
* requires the presence of GLX 1.3 or later.
*
* @throws GLException if any window system-specific errors caused
* the creation of the external GLDrawable to fail.
*/
public abstract GLDrawable createExternalGLDrawable()
throws GLException;
}