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.
*
* It's {@link AbstractGraphicsConfiguration} is properly set according to the given {@link GLCapabilitiesImmutable}, see below.
*
*
* A FBO drawable is created if both {@link javax.media.opengl.GLCapabilities#isFBO() caps.isFBO()}
* and {@link GLContext#isFBOAvailable(AbstractGraphicsDevice, GLProfile) canCreateFBO(device, caps.getGLProfile())} is true.
*
*
* A Pbuffer drawable is created if both {@link javax.media.opengl.GLCapabilities#isPBuffer() caps.isPBuffer()}
* and {@link #canCreateGLPbuffer(javax.media.nativewindow.AbstractGraphicsDevice) canCreateGLPbuffer(device)} is true.
*
*
* If neither FBO nor Pbuffer is available, 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 a proxy {@link NativeSurface} w/ defined surface handle, i.e. a {@link WrappedSurface} or {@link GDISurface} instance.
*
* It's {@link AbstractGraphicsConfiguration} is properly set according to the given
* windowHandle
's native visualID if set or the given {@link GLCapabilitiesImmutable}.
*
*
* Lifecycle (destruction) of the given surface handle shall be handled by the caller.
*
*
* Such surface can be used to instantiate a GLDrawable. With the help of {@link GLAutoDrawableDelegate}
* you will be able to implement a new native windowing system binding almost on-the-fly, see {@link com.jogamp.opengl.swt.GLCanvas}.
*
*
* @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.
* Caller has to ensure it is compatible w/ the given windowHandle
* @param screenIdx matching screen index of given windowHandle
* @param windowHandle the native window handle
* @param caps the requested GLCapabilties
* @param chooser the custom chooser, may be null for default
* @param upstream optional {@link ProxySurface.UpstreamSurfaceHook} allowing control of the {@link ProxySurface}'s lifecycle and data it presents.
* @return the created {@link ProxySurface} instance w/ defined surface handle.
*/
public abstract ProxySurface createProxySurface(AbstractGraphicsDevice device,
int screenIdx,
long windowHandle,
GLCapabilitiesImmutable caps, GLCapabilitiesChooser chooser, UpstreamSurfaceHook upstream);
/**
* 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;
}