# This .cfg file is used to generate the GL interface and implementing class.
JavaOutputDir gensrc/classes
NativeOutputDir gensrc/native/jogl/gl4

# Inform the glue code generator of the association between #defines
# and functions and the extensions in which they are defined
# _for_ code generation. This shall match the parsed header files!
GLSemHeader GL/gl.h
GLSemHeader GL/glext-supplement.h
GLSemHeader GL/glext-20130207.h
GLSemHeader GL/glext.h
GLSemHeader GL/glcorearb.h
GLSemHeader GL/glcorearbext.h

ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL2ES1.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL2ES2.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL2ES3.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL3ES3.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL4ES3.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL2GL3.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL2.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL3.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL4.java
ExtendedInterfaceSymbolsIgnore ../build-temp/gensrc/classes/com/jogamp/opengl/GL3bc.java
ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/com/jogamp/opengl/GLBase.java
ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/com/jogamp/opengl/fixedfunc/GLMatrixFunc.java
ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/com/jogamp/opengl/fixedfunc/GLPointerFunc.java
ExtendedInterfaceSymbolsIgnore ../src/jogl/classes/com/jogamp/opengl/fixedfunc/GLLightingFunc.java

Package com.jogamp.opengl
Style InterfaceAndImpl
JavaClass GL4bc
#Extends GL4bc GLBase
#Extends GL4bc GL
#Extends GL4bc GL2ES1
#Extends GL4bc GL2ES2
#Extends GL4bc GL2ES3
#Extends GL4bc GL3ES3
#Extends GL4bc GL4ES3
#Extends GL4bc GL2GL3
#Extends GL4bc GL2
#Extends GL4bc GL3
Extends GL4bc GL3bc
Extends GL4bc GL4
ImplPackage jogamp.opengl.gl4
ImplJavaClass GL4bcImpl
#Implements GL4bcImpl GLBase
#Implements GL4bcImpl GL
#Implements GL4bcImpl GL2ES1
#Implements GL4bcImpl GL2ES2
#Implements GL4bcImpl GL2ES3
#Implements GL4bcImpl GL3ES3
#Implements GL4bcImpl GL4ES3
#Implements GL4bcImpl GL2GL3
#Implements GL4bcImpl GL2
#Implements GL4bcImpl GL3
#Implements GL4bcImpl GL3bc
Implements GL4bcImpl GL4
#Implements GL4bcImpl GL4bc implicit

Include gl-common.cfg
Include gl-common-extensions.cfg
Include gl-desktop.cfg
Include gl-embedded-ignores.cfg
Include gl3-desktop.cfg
Include gl3-common.cfg
Include gl2_es2-CustomJavaCode.cfg

#
# Manually implement following GL 4 functions to be redirected 
# to GLBufferObjectTracker.
#
# We cannot subsume/rename even parts of GL_EXT_direct_state_access,
# since it is explcit stated in the spec that no assumption
# shall be made in regards compatibility and interaction.
# Hence we add both, GL 4.5 DSA and GL_EXT_direct_state_access.
#
DelegateImplementation glNamedBufferData glNamedBufferDataDelegate
MethodJavadoc glNamedBufferData * <p>
MethodJavadoc glNamedBufferData * Throws a {@link GLException} if GL-function constraints are not met or the native GL-function fails.
MethodJavadoc glNamedBufferData * </p>
MethodJavadoc glNamedBufferData * <p>
MethodJavadoc glNamedBufferData * @throws GLException if size is less-than zero
MethodJavadoc glNamedBufferData * @throws GLException if a native GL-Error occurs
MethodJavadoc glNamedBufferData * </p>
DelegateImplementation glNamedBufferDataEXT glNamedBufferDataEXTDelegate
MethodJavadoc glNamedBufferDataEXT * <p>
MethodJavadoc glNamedBufferDataEXT * Throws a {@link GLException} if GL-function constraints are not met or the native GL-function fails.
MethodJavadoc glNamedBufferDataEXT * </p>
MethodJavadoc glNamedBufferDataEXT * <p>
MethodJavadoc glNamedBufferDataEXT * @throws GLException if size is less-than zero
MethodJavadoc glNamedBufferDataEXT * @throws GLException if a native GL-Error occurs
MethodJavadoc glNamedBufferDataEXT * </p>

DelegateImplementation glBufferStorage glBufferStorageDelegate
MethodJavadoc glBufferStorage * <p>
MethodJavadoc glBufferStorage * Throws a {@link GLException} if GL-function constraints are not met or the native GL-function fails.
MethodJavadoc glBufferStorage * </p>
MethodJavadoc glBufferStorage * <p>
MethodJavadoc glBufferStorage * @throws GLException if buffer is not bound to target
MethodJavadoc glBufferStorage * @throws GLException if size is less-or-equal zero
MethodJavadoc glBufferStorage * @throws GLException if a native GL-Error occurs
MethodJavadoc glBufferStorage * </p>

DelegateImplementation glNamedBufferStorage glNamedBufferStorageDelegate
MethodJavadoc glNamedBufferStorage * <p>
MethodJavadoc glNamedBufferStorage * Throws a {@link GLException} if GL-function constraints are not met or the native GL-function fails.
MethodJavadoc glNamedBufferStorage * </p>
MethodJavadoc glNamedBufferStorage * <p>
MethodJavadoc glNamedBufferStorage * @throws GLException if buffer is not bound to target
MethodJavadoc glNamedBufferStorage * @throws GLException if size is less-or-equal zero
MethodJavadoc glNamedBufferStorage * @throws GLException if a native GL-Error occurs
MethodJavadoc glNamedBufferStorage * </p>
DelegateImplementation glNamedBufferStorageEXT glNamedBufferStorageEXTDelegate
MethodJavadoc glNamedBufferStorageEXT * <p>
MethodJavadoc glNamedBufferStorageEXT * Throws a {@link GLException} if GL-function constraints are not met or the native GL-function fails.
MethodJavadoc glNamedBufferStorageEXT * </p>
MethodJavadoc glNamedBufferStorageEXT * <p>
MethodJavadoc glNamedBufferStorageEXT * @throws GLException if buffer is not bound to target
MethodJavadoc glNamedBufferStorageEXT * @throws GLException if size is less-or-equal zero
MethodJavadoc glNamedBufferStorageEXT * @throws GLException if a native GL-Error occurs
MethodJavadoc glNamedBufferStorageEXT * </p>

DelegateImplementation glMapNamedBuffer glMapNamedBufferDelegate
ReturnsOpaque long glMapNamedBufferDelegate
MethodJavadoc glMapNamedBuffer * <p>
MethodJavadoc glMapNamedBuffer * Throws a {@link GLException} if GL-function constraints are not met.
MethodJavadoc glMapNamedBuffer * </p>
MethodJavadoc glMapNamedBuffer * <p>
MethodJavadoc glMapNamedBuffer * Returns {@link GL2#mapNamedBuffer(int, int)}'s {@link GLBufferStorage#getMappedBuffer()}.
MethodJavadoc glMapNamedBuffer * </p>
MethodJavadoc glMapNamedBuffer * <p>
MethodJavadoc glMapNamedBuffer * @throws GLException if buffer is not tracked
MethodJavadoc glMapNamedBuffer * @throws GLException if buffer is already mapped
MethodJavadoc glMapNamedBuffer * @throws GLException if buffer has invalid store size, i.e. less-than zero
MethodJavadoc glMapNamedBuffer * </p>
DelegateImplementation glMapNamedBufferEXT glMapNamedBufferEXTDelegate
ReturnsOpaque long glMapNamedBufferEXTDelegate
MethodJavadoc glMapNamedBufferEXT * <p>
MethodJavadoc glMapNamedBufferEXT * Throws a {@link GLException} if GL-function constraints are not met.
MethodJavadoc glMapNamedBufferEXT * </p>
MethodJavadoc glMapNamedBufferEXT * <p>
MethodJavadoc glMapNamedBufferEXT * Returns {@link GL2#mapNamedBuffer(int, int)}'s {@link GLBufferStorage#getMappedBuffer()}.
MethodJavadoc glMapNamedBufferEXT * </p>
MethodJavadoc glMapNamedBufferEXT * <p>
MethodJavadoc glMapNamedBufferEXT * @throws GLException if buffer is not tracked
MethodJavadoc glMapNamedBufferEXT * @throws GLException if buffer is already mapped
MethodJavadoc glMapNamedBufferEXT * @throws GLException if buffer has invalid store size, i.e. less-than zero
MethodJavadoc glMapNamedBufferEXT * </p>

DelegateImplementation glMapNamedBufferRange glMapNamedBufferRangeDelegate
ReturnsOpaque long glMapNamedBufferRangeDelegate
MethodJavadoc glMapNamedBufferRange * <p>
MethodJavadoc glMapNamedBufferRange * Throws a {@link GLException} if GL-function constraints are not met.
MethodJavadoc glMapNamedBufferRange * </p>
MethodJavadoc glMapNamedBufferRange * <p>
MethodJavadoc glMapNamedBufferRange * Returns {@link GL2#mapNamedBufferRange(int, long, long, int)}'s {@link GLBufferStorage#getMappedBuffer()}.
MethodJavadoc glMapNamedBufferRange * </p>
MethodJavadoc glMapNamedBufferRange * <p>
MethodJavadoc glMapNamedBufferRange * @throws GLException if buffer is not tracked
MethodJavadoc glMapNamedBufferRange * @throws GLException if buffer is already mapped
MethodJavadoc glMapNamedBufferRange * @throws GLException if buffer has invalid store size, i.e. less-than zero
MethodJavadoc glMapNamedBufferRange * @throws GLException if buffer mapping range does not fit, incl. offset
MethodJavadoc glMapNamedBufferRange * </p>
DelegateImplementation glMapNamedBufferRangeEXT glMapNamedBufferRangeEXTDelegate
ReturnsOpaque long glMapNamedBufferRangeEXTDelegate
MethodJavadoc glMapNamedBufferRangeEXT * <p>
MethodJavadoc glMapNamedBufferRangeEXT * Throws a {@link GLException} if GL-function constraints are not met.
MethodJavadoc glMapNamedBufferRangeEXT * </p>
MethodJavadoc glMapNamedBufferRangeEXT * <p>
MethodJavadoc glMapNamedBufferRangeEXT * Returns {@link GL2#mapNamedBufferRange(int, long, long, int)}'s {@link GLBufferStorage#getMappedBuffer()}.
MethodJavadoc glMapNamedBufferRangeEXT * </p>
MethodJavadoc glMapNamedBufferRangeEXT * <p>
MethodJavadoc glMapNamedBufferRangeEXT * @throws GLException if buffer is not tracked
MethodJavadoc glMapNamedBufferRangeEXT * @throws GLException if buffer is already mapped
MethodJavadoc glMapNamedBufferRangeEXT * @throws GLException if buffer has invalid store size, i.e. less-than zero
MethodJavadoc glMapNamedBufferRangeEXT * @throws GLException if buffer mapping range does not fit, incl. offset
MethodJavadoc glMapNamedBufferRangeEXT * </p>

DelegateImplementation glUnmapNamedBuffer glUnmapNamedBufferDelegate
DelegateImplementation glUnmapNamedEXTBuffer glUnmapNamedEXTBufferDelegate

# Manual implement glDebugMessageCallback* using the proc address resolver
ForceProcAddressGen glDebugMessageCallback
ForceProcAddressGen glDebugMessageCallbackAMD

# Force all of the methods to be emitted using dynamic linking so we
# don't need to link against any emulation library on the desktop or
# depend on the presence of an import library for a particular device
ForceProcAddressGen __ALL__

# Also force the calling conventions of the locally generated function
# pointer typedefs for these routines to APIENTRY
LocalProcAddressCallingConvention __ALL__ APIENTRY

EmitProcAddressTable true
ProcAddressTableClassName GL4bcProcAddressTable
GetProcAddressTableExpr _pat
# GetProcAddressTableExpr ((GL4bcProcAddressTable)_context.getGLProcAddressTable())

# Pick up on-line OpenGL javadoc thanks to user cylab on javagaming.org forums
TagNativeBinding true

# Ignore extensions that are already picked up via the GL2ES1 interface
IgnoreExtension GL_EXT_point_parameters

IncludeAs CustomJavaCode GL4bc gl4bc-common-cpubufferJavaCode.java

# Add PixelStorei StateTracker
CustomJavaCode GL4bcImpl private static final int params_offset = 0; // just a helper for JavaPrologue ..

JavaPrologue glPixelStorei glStateTracker.setInt(pname, param);

JavaPrologue glGetIntegerv if ( glStateTracker.getInt(pname, params, params_offset) ) { return; }

JavaPrologue glFrustumf if ( !_context.hasFP32CompatAPI() ) {
JavaPrologue glFrustumf   glFrustum((double)l, (double)r, (double)b, (double)t, (double)n, (double)f);
JavaPrologue glFrustumf   return;
JavaPrologue glFrustumf }

JavaPrologue glOrthof if ( !_context.hasFP32CompatAPI() ) {
JavaPrologue glOrthof   glOrtho((double)l, (double)r, (double)b, (double)t, (double)n, (double)f);
JavaPrologue glOrthof   return;
JavaPrologue glOrthof }

JavaPrologue glDepthRangef if ( !_context.isGLES2Compatible() && !_context.hasFP32CompatAPI() ) {
JavaPrologue glDepthRangef   glDepthRange( (double)n, (double)f );  
JavaPrologue glDepthRangef   return;
JavaPrologue glDepthRangef }

JavaPrologue glClearDepthf if ( !_context.isGLES2Compatible() && !_context.hasFP32CompatAPI() ) {
JavaPrologue glClearDepthf   glClearDepth( (double)d );  
JavaPrologue glClearDepthf   return;
JavaPrologue glClearDepthf }

Include gl-headers.cfg

IncludeAs CustomJavaCode GL4bcImpl gl-impl-CustomJavaCode-common.java
IncludeAs CustomJavaCode GL4bcImpl gl-impl-CustomJavaCode-gl4bc.java
IncludeAs CustomJavaCode GL4bcImpl gl-impl-CustomJavaCode-gl2_es2.java

IncludeAs CustomCCode gl-impl-CustomCCode-gl4bc.c

Import com.jogamp.opengl.GLES1
Import com.jogamp.opengl.GLES2
Import com.jogamp.opengl.GL2ES1
Import com.jogamp.opengl.GL2ES2
Import com.jogamp.opengl.GL2ES3
Import com.jogamp.opengl.GL3ES3
Import com.jogamp.opengl.GL4ES3
Import com.jogamp.opengl.GL2GL3
Import com.jogamp.opengl.GL2
Import com.jogamp.opengl.GL3
Import com.jogamp.opengl.GL3bc
Import com.jogamp.opengl.GL4
Import com.jogamp.common.nio.Buffers
Import com.jogamp.opengl.util.GLBuffers
Import java.io.PrintStream
