Browse Source

--- Merging r18995 into '.':
U utils/instantfpc/instantfptools.pas
U utils/instantfpc/instantfpc.pas
--- Merging r19026 into '.':
A packages/opengles/src/gles20.pas
--- Merging r19027 into '.':
A packages/opengles/examples/es2example1.pas
--- Merging r19028 into '.':
U packages/opengles/Makefile.fpc
--- Merging r19029 into '.':
C packages/opengles/Makefile
--- Merging r19032 into '.':
U packages/fcl-base/src/avl_tree.pp
--- Merging r19049 into '.':
U utils/fpdoc/dglobals.pp
--- Merging r19050 into '.':
G utils/fpdoc/dglobals.pp
--- Merging r19072 into '.':
U packages/regexpr/src/regex.pp
Summary of conflicts:
Text conflicts: 1

# revisions: 18995,19026,19027,19028,19029,19032,19049,19050,19072
------------------------------------------------------------------------
r18995 | mattias | 2011-09-06 22:00:54 +0200 (Tue, 06 Sep 2011) | 1 line
Changed paths:
M /trunk/utils/instantfpc/instantfpc.pas
M /trunk/utils/instantfpc/instantfptools.pas

instantfpc: hint about environment variable INSTANTFPCCACHE
------------------------------------------------------------------------
------------------------------------------------------------------------
r19026 | sekelsenmat | 2011-09-08 15:00:09 +0200 (Thu, 08 Sep 2011) | 1 line
Changed paths:
A /trunk/packages/opengles/src/gles20.pas

Patch from bug #15632: OpenGL ES 2.0 headers
------------------------------------------------------------------------
------------------------------------------------------------------------
r19027 | sekelsenmat | 2011-09-08 15:00:30 +0200 (Thu, 08 Sep 2011) | 1 line
Changed paths:
A /trunk/packages/opengles/examples/es2example1.pas

Patch from bug #15632: OpenGL ES 2.0 headers
------------------------------------------------------------------------
------------------------------------------------------------------------
r19028 | sekelsenmat | 2011-09-08 15:03:42 +0200 (Thu, 08 Sep 2011) | 1 line
Changed paths:
M /trunk/packages/opengles/Makefile.fpc

opengles updates the Makefile.fpc
------------------------------------------------------------------------
------------------------------------------------------------------------
r19029 | sekelsenmat | 2011-09-08 15:17:07 +0200 (Thu, 08 Sep 2011) | 1 line
Changed paths:
M /trunk/packages/opengles/Makefile

Regenerates the makefiles for opengles
------------------------------------------------------------------------
------------------------------------------------------------------------
r19032 | mattias | 2011-09-08 19:53:31 +0200 (Thu, 08 Sep 2011) | 1 line
Changed paths:
M /trunk/packages/fcl-base/src/avl_tree.pp

avl_tree: added enumerator
------------------------------------------------------------------------
------------------------------------------------------------------------
r19049 | marco | 2011-09-11 17:05:45 +0200 (Sun, 11 Sep 2011) | 2 lines
Changed paths:
M /trunk/utils/fpdoc/dglobals.pp

* commented a few left over "alias" debug msg

------------------------------------------------------------------------
------------------------------------------------------------------------
r19050 | michael | 2011-09-11 19:39:17 +0200 (Sun, 11 Sep 2011) | 1 line
Changed paths:
M /trunk/utils/fpdoc/dglobals.pp

* Better warnings
------------------------------------------------------------------------
------------------------------------------------------------------------
r19072 | marco | 2011-09-15 22:19:25 +0200 (Thu, 15 Sep 2011) | 2 lines
Changed paths:
M /trunk/packages/regexpr/src/regex.pp

* Patch from Mantis #20046 fixing an issue in rcmatchstring.

------------------------------------------------------------------------

git-svn-id: branches/fixes_2_6@19141 -

marco 14 years ago
parent
commit
2be34d803f

+ 2 - 0
.gitattributes

@@ -5278,8 +5278,10 @@ packages/opengles/Makefile svneol=native#text/plain
 packages/opengles/Makefile.fpc svneol=native#text/plain
 packages/opengles/examples/Makefile svneol=native#text/plain
 packages/opengles/examples/Makefile.fpc svneol=native#text/plain
+packages/opengles/examples/es2example1.pas svneol=native#text/pascal
 packages/opengles/examples/glutdemoes.pp svneol=native#text/plain
 packages/opengles/src/gles11.pp svneol=native#text/plain
+packages/opengles/src/gles20.pas svneol=native#text/pascal
 packages/openssl/Makefile svneol=native#text/plain
 packages/openssl/Makefile.fpc svneol=native#text/plain
 packages/openssl/examples/Makefile svneol=native#text/plain

+ 36 - 0
packages/fcl-base/src/avl_tree.pp

@@ -48,6 +48,20 @@ type
     function NewNode: TAVLTreeNode; virtual; abstract;
   end;
 
+  TAVLTree = class;
+
+  { TAVLTreeNodeEnumerator }
+
+  TAVLTreeNodeEnumerator = class
+  private
+    FTree: TAVLTree;
+    FCurrent: TAVLTreeNode;
+  public
+    constructor Create(Tree: TAVLTree);
+    function MoveNext: Boolean;
+    property Current: TAVLTreeNode read FCurrent;
+  end;
+
   TAVLTree = class
   private
     FOnCompare: TListSortCompare;
@@ -98,6 +112,7 @@ type
     constructor Create(OnCompareMethod: TListSortCompare);
     constructor Create;
     destructor Destroy; override;
+    function GetEnumerator: TAVLTreeNodeEnumerator;
   end;
 
   TAVLTreeNodeMemManager = class(TBaseAVLTreeNodeManager)
@@ -136,6 +151,22 @@ begin
   else Result:=0;
 end;
 
+{ TAVLTreeNodeEnumerator }
+
+constructor TAVLTreeNodeEnumerator.Create(Tree: TAVLTree);
+begin
+  FTree:=Tree;
+end;
+
+function TAVLTreeNodeEnumerator.MoveNext: Boolean;
+begin
+  if FCurrent=nil then
+    FCurrent:=FTree.FindLowest
+  else
+    FCurrent:=FTree.FindSuccessor(FCurrent);
+  Result:=FCurrent<>nil;
+end;
+
 { TAVLTree }
 
 function TAVLTree.Add(Data: Pointer): TAVLTreeNode;
@@ -649,6 +680,11 @@ begin
   inherited Destroy;
 end;
 
+function TAVLTree.GetEnumerator: TAVLTreeNodeEnumerator;
+begin
+  Result:=TAVLTreeNodeEnumerator.Create(Self);
+end;
+
 function TAVLTree.Find(Data: Pointer): TAVLTreeNode;
 var Comp: integer;
 begin

+ 57 - 2
packages/opengles/Makefile

@@ -1,5 +1,5 @@
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/08/03]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2011/09/11]
 #
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-solaris x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded mipsel-linux
@@ -188,7 +188,11 @@ ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
 TARGETSUFFIX=$(OS_TARGET)
 SOURCESUFFIX=$(OS_SOURCE)
 else
+ifneq ($(findstring $(OS_TARGET),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+else
 TARGETSUFFIX=$(FULL_TARGET)
+endif
 SOURCESUFFIX=$(FULL_SOURCE)
 endif
 ifneq ($(FULL_TARGET),$(FULL_SOURCE))
@@ -290,11 +294,62 @@ endif
 endif
 override PACKAGE_NAME=opengles
 override PACKAGE_VERSION=2.5.1
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=gles20
+endif
 ifeq ($(FULL_TARGET),i386-iphonesim)
 override TARGET_UNITS+=gles11
 endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=gles20
+endif
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_UNITS+=gles11
+override TARGET_UNITS+=gles20 gles11
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_UNITS+=gles20
+endif
+ifeq ($(FULL_TARGET),mipsel-linux)
+override TARGET_UNITS+=gles20
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_EXAMPLEDIRS+=examples

+ 5 - 0
packages/opengles/Makefile.fpc

@@ -13,6 +13,11 @@ version=2.5.1
 [target]
 units_arm_darwin=gles11
 units_i386_iphonesim=gles11
+units_linux=gles20
+units_wince=gles20
+units_win32=gles20
+units_win64=gles20
+units_darwin=gles20
 exampledirs=examples
 
 [install]

+ 492 - 0
packages/opengles/examples/es2example1.pas

@@ -0,0 +1,492 @@
+program es2example1;
+// By Benjamin 'BeRo' Rosseaux - [email protected] - http://www.rosseaux.com
+// Tested on desktop linux and the Nokia N900 with Maemo 5
+{$ifdef fpc}
+ {$mode delphi}
+ {$ifdef CPUARM}
+  {$define ogles}
+ {$endif}
+ {$ifdef CPUI386}
+  {$define CPU386}
+ {$endif}
+ {$ifdef CPU386}
+  {$asmmode intel}
+ {$endif}
+{$endif}
+
+uses SysUtils,Classes,BaseUnix,Unix,UnixType,X,XLib,XUtil,XAtom{$ifdef ogles},gles20{$else},xf86vmode,GL,GLX,GLExt{$endif};
+
+const VertexArray:array[0..11] of single=(0,-1,0,1,
+                                          1,1,0,1,
+                                          -1,1,0,1);
+
+      ShaderPrecode={$ifdef ogles}''{$else}'#version 120'#10{$endif};
+
+      VertexShaderSource:string=ShaderPrecode+'attribute vec4 position;'#10+
+                                              'varying mediump vec2 pos;'#10+ 
+                                              'void main(){'#10+
+                                              ' gl_Position=position;'#10+
+                                              ' pos=position.xy;'#10+
+                                              '}';
+                                              
+      FragmentShaderSource:string=ShaderPrecode+'varying mediump vec2 pos;'#10+
+                                                'uniform mediump float phase;'#10+
+                                                'void main(){'#10+
+                                                ' gl_FragColor=vec4(1.0,1.0,1.0,1.0)*sin(((pos.x*pos.x)+(pos.y*pos.y))*40.0+phase);'#10+
+                                                '}';
+
+var ReturnCode,CanvasWidth,CanvasHeight:integer;
+    Running:boolean;
+    VertexShader,FragmentShader,ShaderProgram:TGLuint;
+    PhaseLocation:TGLint;
+    CurrentTime:int64;
+
+function GetTime:int64;
+var NowTime:TDateTime;
+    Year,Month,Day,hour,min,sec,msec:word;
+begin
+ NowTime:=Now;
+ DecodeDate(NowTime,Year,Month,Day);
+ DecodeTime(NowTime,hour,min,sec,msec);
+ result:=(((((((((((Year*365)+Month)*31)+Day)*24)+hour)*60)+min)*60)+sec)*1000)+msec;
+end;
+        
+procedure PrintShaderInfoLog(Shader:TGLUint;ShaderType:string);
+var len,Success:TGLint;
+    Buffer:pchar;
+begin
+ glGetShaderiv(Shader,GL_COMPILE_STATUS,@Success);
+ if Success<>GL_TRUE then begin
+  glGetShaderiv(Shader,GL_INFO_LOG_LENGTH,@len);
+  if len>0 then begin
+   getmem(Buffer,len+1);
+   glGetShaderInfoLog(Shader,len,nil,Buffer);
+   writeln(ShaderType,': ',Buffer);
+   freemem(Buffer);
+   Running:=false;
+   ReturnCode:=1;
+  end;
+ end;
+end;
+
+function CreateShader(ShaderType:TGLenum;Source:pchar):TGLuint;
+begin
+ result:=glCreateShader(ShaderType);
+ glShaderSource(result,1,@Source,nil);
+ glCompileShader(result);
+ if ShaderType=GL_VERTEX_SHADER then begin
+  PrintShaderInfoLog(result,'Vertex shader');
+ end else begin
+  PrintShaderInfoLog(result,'Fragment shader');
+ end;
+end;
+
+procedure Init;
+begin
+ ShaderProgram:=glCreateProgram();
+
+ VertexShader:=CreateShader(GL_VERTEX_SHADER,pchar(VertexShaderSource));
+ FragmentShader:=CreateShader(GL_FRAGMENT_SHADER,pchar(FragmentShaderSource));
+
+ glAttachShader(ShaderProgram,VertexShader);
+ glAttachShader(ShaderProgram,FragmentShader);
+ 
+ glLinkProgram(ShaderProgram);
+ 
+ glUseProgram(ShaderProgram);
+ 
+ PhaseLocation:=glGetUniformLocation(ShaderProgram,'phase');
+ if PhaseLocation<0 then begin
+  writeln('Error: Cannot get phase shader uniform location');
+  Running:=false;
+  ReturnCode:=1;
+ end;
+end;
+
+procedure Done;
+begin
+end;
+
+procedure Render;
+begin
+ glViewPort(0,0,CanvasWidth,CanvasHeight);
+ glClearColor(0,1,0,1);
+ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+ 
+ glUniform1f(PhaseLocation,(GetTime mod 2000)*0.001*pi);
+ 
+ glVertexAttribPointer(0,4,GL_FLOAT,0,0,@VertexArray);
+ glEnableVertexAttribArray(0);
+ glDrawArrays(GL_TRIANGLE_STRIP,0,3);
+ 
+end;
+
+const MOUSE_MASK=ButtonPressMask or ButtonReleaseMask or PointerMotionMask or ButtonMotionMask;
+      KEY_MASK=KeyPressMask or KeyReleaseMask or KeymapStateMask;
+      X_MASK=KEY_MASK or MOUSE_MASK or VisibilityChangeMask or StructureNotifymask or ExposureMask;
+
+{$ifdef ogles}
+     Attr:array[0..6] of EGLint=(EGL_BUFFER_SIZE,16,
+                                  EGL_DEPTH_SIZE,8,
+                                  EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT,
+                                  EGL_NONE);
+{    Attr:array[0..12] of EGLint=(EGL_BUFFER_SIZE,16,
+                                  EGL_RED_SIZE,6,
+                                  EGL_GREEN_SIZE,5,
+                                  EGL_BLUE_SIZE,6,
+                                  EGL_DEPTH_SIZE,8,
+                                  EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT,
+                                  EGL_NONE);}
+     CtxAttr:array[0..2] of EGLint=(EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE);
+{$else}
+     Attr:array[0..8] of TGLint=(GLX_RGBA,
+                                 GLX_RED_SIZE,1,
+                                 GLX_GREEN_SIZE,1,
+                                 GLX_BLUE_SIZE,1,
+                                 GLX_DOUBLEBUFFER,
+                                 none);
+{$endif}
+
+     Title:string='GL test';
+    
+var dpy:PXDisplay;
+    win,root:TWindow;
+    screennum,ScreenWidth,ScreenHeight:integer;
+    screen:PScreen;
+    visual:PVisual;
+    Event:TXEvent;
+{$ifdef ogles}
+    swa:TXSetWindowAttributes;
+    ecfg:EGLConfig;
+    num_config:EGLint;
+    esfc:EGLSurface;
+    ectxt:EGLContext;
+    edpy:EGLDisplay;
+    mouse_accel_numerator,mouse_accel_denominator,mouse_threshold:integer;
+{$else}
+    WinAttr:TXSetWindowAttributes;
+    GLXCont:GLXContext;
+    WindowTitleProperty:TXTextProperty;
+    visualinfo:PXVisualInfo;
+    ErrorBase,EventBase:integer;
+{$endif}
+    WM_DELETE_WINDOW:TAtom;
+    
+procedure DisableComposition;
+{$ifdef ogles}
+const one:integer=1;
+{$endif}
+var xclient:TXClientMessageEvent;
+    wm_state,fullscreen{$ifdef ogles},non_composited{$endif}:TAtom;
+begin
+ wm_state:=XInternAtom(dpy,'_NET_WM_STATE',false);
+ fullscreen:=XInternAtom(dpy,'_NET_WN_STATE_FULLSCREEN',false); 
+ XChangeProperty(dpy,win,wm_state,XA_ATOM,32,PropModeReplace,@fullscreen,1);
+ XFlush(dpy);
+ 
+{$ifdef ogles}
+ non_composited:=XInternAtom(dpy,'_HILDON_NON_COMPOSITED_WINDOW',false);
+ XChangeProperty(dpy,win,non_composited,XA_INTEGER,32,PropModeReplace,@one,1);
+ XFlush(dpy);
+{$endif}
+ 
+ xclient._type:=ClientMessage;
+ xclient.window:=win;
+ xclient.message_type:=XInternAtom(dpy,'_NET_WM_STATE',false);
+ xclient.format:=32;
+ xclient.data.l[0]:=1;
+ xclient.data.l[1]:=XInternAtom(dpy,'_NET_WM_STATE_FULLSCREEN',false);
+ xclient.data.l[2]:=0;
+ xclient.data.l[3]:=0;
+ xclient.data.l[4]:=0;
+ XSendEvent(dpy,root,false,SubstructureRedirectMask or SubstructureNotifyMask,PXEvent(pointer(@xclient)));
+ XFlush(dpy);
+end;
+
+procedure SetEmptyMouseCursor;
+const bm_no_data:array[0..7] of byte=(0,0,0,0,0,0,0,0);
+var bm_no:TPixmap;
+    cmap:TColormap;
+    no_ptr:TCursor;
+    black,dummy:TXColor;
+begin
+ cmap:=DefaultColormap(Dpy,screennum);
+ XAllocNamedColor(Dpy,cmap,'black',@black,@dummy);
+ bm_no:=XCreateBitmapFromData(Dpy,Win,POINTER(@bm_no_data),8,8);
+ no_ptr:=XCreatePixmapCursor(Dpy,bm_no,bm_no,@black,@black,0,0);
+ XDefineCursor(Dpy,Win,no_ptr);
+ XFreeCursor(Dpy,no_ptr);
+ if bm_no<>None then begin
+  XFreePixmap(Dpy,bm_no);
+ end;
+ XFreeColors(Dpy,cmap,@black.pixel,1,0);
+end;
+
+begin
+ CurrentTime:=0;
+ 
+ dpy:=XOpenDisplay(nil);
+ if not assigned(dpy) then begin
+  writeln('Error: Cannot connect to X server');
+  halt(1);
+ end;
+ 
+ root:=DefaultRootWindow(dpy);
+
+ screen:=XDefaultScreenOfDisplay(dpy);
+ if not assigned(screen) then begin
+  writeln('Error: Cannot get default screen');
+  halt(1);
+ end;
+ 
+ ScreenWidth:=screen^.Width;
+ ScreenHeight:=screen^.Height;
+
+ screennum:=XDefaultScreen(dpy);
+ 
+ visual:=XDefaultVisualOfScreen(screen);
+ 
+ CanvasWidth:=ScreenWidth;
+ CanvasHeight:=ScreenHeight;
+{$ifdef ogles}
+ 
+ swa.event_mask:=X_MASK;
+
+ win:=XCreateWindow(dpy,root,0,0,ScreenWidth,ScreenHeight,0,CopyFromParent,InputOutput,Visual,CWEventMask,@swa);
+ 
+ WM_DELETE_WINDOW:=XInternAtom(dpy,'WM_DELETE_WINDOW',FALSE);
+ XSetWMProtocols(dpy,win,@WM_DELETE_WINDOW,1);
+ XFlush(dpy);
+ 
+ DisableComposition;
+ 
+ XMapWindow(dpy,win);
+ XFlush(dpy);
+ 
+ DisableComposition;
+
+ XSelectInput(Dpy,Win,FocusChangeMask or KeyPressMask or KeyReleaseMask or PropertyChangeMask or StructureNotifyMask or KeymapStateMask or PointerMotionMask or EnterWindowMask or LeaveWindowMask or ButtonPressMask or ButtonReleaseMask or ExposureMask);
+ 
+ XStoreName(dpy,win,pchar(Title));
+ XFlush(dpy);
+
+ XMoveWindow(dpy,win,0,0);
+ XRaiseWindow(dpy,win);
+ //XWarpPointer(dpy,None,win,0,0,0,0,0,0);
+ XFlush(dpy);
+
+ SetEmptyMouseCursor;
+ 
+ XGrabPointer(dpy,win,true,MOUSE_MASK,GrabModeAsync,GrabModeAsync,win,None,CurrentTime);
+ XFlush(dpy);
+ 
+ XGetPointerControl(dpy,@mouse_accel_numerator,@mouse_accel_denominator,@mouse_threshold);
+ XFlush(dpy);
+ 
+ XChangePointerControl(dpy,1,1,1,1,0);
+ XFlush(dpy);
+ 
+ XGrabKeyboard(dpy,win,false,GrabModeAsync,GrabModeAsync,CurrentTime);
+ XFlush(dpy);
+ 
+ edpy:=eglGetDisplay(dpy);
+ if edpy=EGL_NO_DISPLAY then begin
+  writeln('Error: Got no EGL display');
+  halt(1);
+ end;
+
+ if eglInitialize(edpy,nil,nil)=0 then begin
+  writeln('Error: Unable to initialize EGL');
+  halt(1);
+ end;
+
+ num_config:=0;
+ if eglChooseConfig(edpy,@Attr,@ecfg,1,@num_config)=0 then begin
+  writeln('Error: Failed to choose config (',eglGetError,')');
+  halt(1);
+ end;
+ if num_config<>1 then begin
+  writeln('Error: Didn''t get exactly config but ',num_config);
+  halt(1);
+ end;
+ 
+ esfc:=eglCreateWindowSurface(edpy,ecfg,win,nil);
+ if esfc=EGL_NO_SURFACE then begin
+  writeln('Error: Unable to create EGL surface (',eglGetError,')');
+  halt(1);
+ end;
+ 
+ ectxt:=eglCreateContext(edpy,ecfg,EGL_NO_CONTEXT,@CtxAttr);
+ if ectxt=EGL_NO_CONTEXT then begin
+  writeln('Error: Unable to create EGL context (',eglGetError,')');
+  halt(1);
+ end;
+ 
+ eglMakeCurrent(edpy,esfc,esfc,ectxt);
+ 
+{$else}
+ InitGLX;
+ 
+ if not glXQueryExtension(dpy,ErrorBase,EventBase) then begin
+  writeln('Error: GLX extension not supported');
+  halt(1);
+ end;
+ 
+ visualinfo:=glXChooseVisual(dpy,screennum,Attr);
+ if not assigned(Visualinfo) THEN BEGIN
+  writeln('Error: Could not find visual info');
+  exit;
+ end;
+
+ WinAttr.colormap:=XCreateColormap(dpy,root,VisualInfo.Visual,AllocNone);
+ WinAttr.border_pixel:=0; 
+ WinAttr.background_pixel:=0;
+ WinAttr.event_mask:=X_MASK;
+ WinAttr.override_redirect:=1;
+ WinAttr.backing_store:=NotUseful;
+ WinAttr.save_under:=0;
+ 
+ Win:=XCreateWindow(dpy,root,0,0,ScreenWidth,ScreenHeight,0,VisualInfo.Depth,InputOutput,VisualInfo.Visual,CWOverrideRedirect or CWBackPixel or CWColormap or CWBackingStore or CWSaveUnder or CWEventMask,@WinAttr);
+
+ XSelectInput(Dpy,Win,FocusChangeMask or KeyPressMask or KeyReleaseMask or PropertyChangeMask or StructureNotifyMask or KeymapStateMask or PointerMotionMask or EnterWindowMask or LeaveWindowMask or ButtonPressMask or ButtonReleaseMask or ExposureMask);
+
+ XStringListToTextProperty(@Title,1,@WindowTitleProperty);
+ XSetWMName(Dpy,Win,@WindowTitleProperty);
+
+ glXCont:=glXCreateContext(Dpy,VisualInfo,none,true);
+ if not assigned(glXCont) then begin
+  writeln('Error: Could not create an OpenGL rendering context');
+  halt(1);
+ end;
+
+ DisableComposition;
+
+ XMapWindow(Dpy,Win);
+ XFlush(dpy);
+ 
+ DisableComposition;
+
+ glXMakeCurrent(Dpy,Win,glXCont);
+ 
+ SetEmptyMouseCursor;
+ 
+ XMoveWindow(dpy,win,0,0);
+ XRaiseWindow(dpy,win);
+ XWarpPointer(dpy,None,win,0,0,0,0,0,0);
+ XFlush(dpy);
+
+ XF86VidmodeSetViewPort(dpy,screennum,0,0);
+ XFlush(dpy);
+ 
+ XGrabPointer(dpy,win,true,MOUSE_MASK,GrabModeAsync,GrabModeAsync,win,None,CurrentTime);
+ XGrabKeyboard(dpy,win,false,GrabModeAsync,GrabModeAsync,CurrentTime);
+ XFlush(dpy);
+
+ XAutoRepeatOn(Dpy);
+ XFlush(dpy);
+ 
+ WM_DELETE_WINDOW:=XInternAtom(dpy,'WM_DELETE_WINDOW',FALSE);
+ XSetWMProtocols(dpy,win,@WM_DELETE_WINDOW,1);
+ XFlush(Dpy);
+ 
+ CanvasWidth:=ScreenWidth;
+ CanvasHeight:=ScreenHeight;
+ 
+ if assigned(visual) then begin
+  // Den Compiler befriedigen, so dass der kein Warning deswegen ausspuckt  :)
+ end;
+{$endif}
+ 
+ Running:=true;
+ ReturnCode:=0;
+{$ifndef ogles}
+ if not (Load_GL_version_1_2 and Load_GL_version_1_3 and Load_GL_version_1_4 and Load_GL_version_2_0) then begin
+  Running:=false;
+  writeln('Error: Cannot load OpenGL 2.0 API');
+  ReturnCode:=1;
+ end;
+{$endif}
+ if Running then begin
+  Init;
+  CurrentTime:=GetTime;
+ end;
+ while Running do begin
+ 
+  while XPending(Dpy)>0 do begin
+   XNextEvent(Dpy,@Event);
+   
+   case Event._type of
+
+    ClientMessage:BEGIN
+     if (Event.xclient.format=32) and (longword(Event.xclient.Data.l[0])=longword(WM_DELETE_WINDOW)) then begin
+      Running:=false;
+     end;
+    end;
+    
+    Expose:begin
+    end;
+    
+    ConfigureNotify:begin
+    end;
+    
+    MotionNotify:begin
+//   Running:=false;
+    end;
+    
+    ButtonPress:begin
+     Running:=false;
+    end;
+    
+    ButtonRelease:begin
+     Running:=false;
+    end;
+    
+    KeyMapNotify:begin
+    end;
+    
+    KeyPress:begin
+     Running:=false;
+    end;
+    
+    KeyRelease:begin
+     Running:=false;
+    end;
+    
+   end;
+   
+  end;
+  
+  CurrentTime:=GetTime;
+  Render;
+  
+{$ifdef ogles}
+  eglSwapBuffers(edpy,esfc);
+{$else}
+  glXSwapBuffers(dpy,win);
+{$endif}
+
+  XFlush(dpy);
+  
+ end;
+ if ReturnCode=0 then begin
+  Done;
+ end;
+ 
+{$ifdef ogles}
+ XChangePointerControl(dpy,1,1,mouse_accel_numerator,mouse_accel_denominator,mouse_threshold);
+ XUngrabPointer(dpy,CurrentTime);
+ XUngrabKeyboard(dpy,CurrentTime);
+ eglDestroyContext(edpy,ectxt);
+ eglDestroySurface(edpy,esfc);
+ eglTerminate(edpy);
+{$else}
+ XUngrabPointer(dpy,CurrentTime);
+ XUngrabKeyboard(dpy,CurrentTime);
+ glXDestroyContext(dpy,glxCont);
+{$endif}
+
+ XDestroyWindow(dpy,win);
+ XCloseDisplay(dpy);
+
+ halt(ReturnCode);
+end.

+ 1875 - 0
packages/opengles/src/gles20.pas

@@ -0,0 +1,1875 @@
+{** OpenGL ES 2.0 headers 
+ **
+ ** Ported/Translated for FreePascal by Benjamin 'BeRo' Rosseaux
+ ** [email protected] - http://www.rosseaux.com
+ ** 
+ ** EGL part:
+ **
+ ** Copyright (c) 2007-2009 The Khronos Group Inc.
+ **
+ ** Permission is hereby granted, free of charge, to any person obtaining a
+ ** copy of this software and/or associated documentation files (the
+ ** "Materials"), to deal in the Materials without restriction, including
+ ** without limitation the rights to use, copy, modify, merge, publish,
+ ** distribute, sublicense, and/or sell copies of the Materials, and to
+ ** permit persons to whom the Materials are furnished to do so, subject to
+ ** the following conditions:
+ **
+ ** The above copyright notice and this permission notice shall be included
+ ** in all copies or substantial portions of the Materials.
+ **
+ ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
+ ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ **
+ ** GLESv2 part:
+ **
+ ** This document is licensed under the SGI Free Software B License Version
+ ** 2.0. For details, see http://oss.sgi.com/projects/FreeB/ 
+ **}
+unit gles20;
+{$mode objfpc}
+{$ifdef linux}
+  {$define EGL}
+{$endif}
+{$ifdef windows}
+  {$define EGL}
+{$endif}
+
+interface
+
+uses SysUtils,dynlibs{$ifdef linux},x,xlib{$endif}{$ifdef windows},Windows{$endif};
+
+{$IFDEF FPC}
+{$PACKRECORDS C}
+{$ENDIF}
+
+Type
+  Pchar  = ^char;
+  
+{$ifdef EGL}
+type
+  PEGLConfig  = ^EGLConfig;
+  PEGLint  = ^EGLint;
+     EGLint = {$ifdef win64}int64{$else}longint{$endif}; // Why int64 only on win64 and not even on 64-bit linux???
+
+     EGLConfig = pointer;
+
+  { EGL Types  }
+  { EGLint is defined in eglplatform.h  }
+
+  type
+
+{$ifdef linux}
+     EGLNativeDisplayType = PDisplay;
+
+     EGLNativeWindowType = TWindow;
+
+     EGLNativePixmapType = TPixmap;
+{$else linux}
+{$ifdef windows}
+     EGLNativeDisplayType = HDC;
+
+     EGLNativeWindowType = HWND;
+
+     EGLNativePixmapType = HBITMAP;
+{$else windows}
+     EGLNativeDisplayType = ptrint;
+
+     EGLNativeWindowType = pointer;
+
+     EGLNativePixmapType = pointer;
+{$endif windows}
+{$endif linux}
+
+     EGLBoolean = dword;
+
+     EGLenum = dword;
+
+
+     EGLContext = pointer;
+
+     EGLDisplay = pointer;
+
+     EGLSurface = pointer;
+
+     EGLClientBuffer = pointer;
+  { EGL Versioning  }
+
+  const
+     EGL_VERSION_1_0 = 1;     
+     EGL_VERSION_1_1 = 1;     
+     EGL_VERSION_1_2 = 1;     
+     EGL_VERSION_1_3 = 1;     
+     EGL_VERSION_1_4 = 1;     
+  { EGL Enumerants. Bitmasks and other exceptional cases aside, most
+   * enums are assigned unique values starting at 0x3000.
+    }
+  { EGL aliases  }
+     EGL_FALSE = 0;     
+     EGL_TRUE = 1;     
+  { Out-of-band handle values  }
+  { was #define dname def_expr }
+  function EGL_DEFAULT_DISPLAY : EGLNativeDisplayType;    
+
+  { was #define dname def_expr }
+  function EGL_NO_CONTEXT : EGLContext;    
+
+  { was #define dname def_expr }
+  function EGL_NO_DISPLAY : EGLDisplay;    
+
+  { was #define dname def_expr }
+  function EGL_NO_SURFACE : EGLSurface;    
+
+  { Out-of-band attribute value  }
+  { was #define dname def_expr }
+  function EGL_DONT_CARE : EGLint;    
+
+  { Errors / GetError return values  }
+
+  const
+     EGL_SUCCESS = $3000;     
+     EGL_NOT_INITIALIZED = $3001;     
+     EGL_BAD_ACCESS = $3002;     
+     EGL_BAD_ALLOC = $3003;     
+     EGL_BAD_ATTRIBUTE = $3004;     
+     EGL_BAD_CONFIG = $3005;     
+     EGL_BAD_CONTEXT = $3006;     
+     EGL_BAD_CURRENT_SURFACE = $3007;     
+     EGL_BAD_DISPLAY = $3008;     
+     EGL_BAD_MATCH = $3009;     
+     EGL_BAD_NATIVE_PIXMAP = $300A;     
+     EGL_BAD_NATIVE_WINDOW = $300B;     
+     EGL_BAD_PARAMETER = $300C;     
+     EGL_BAD_SURFACE = $300D;     
+  { EGL 1.1 - IMG_power_management  }
+     EGL_CONTEXT_LOST = $300E;     
+  { Reserved 0x300F-0x301F for additional errors  }
+  { Config attributes  }
+     EGL_BUFFER_SIZE = $3020;     
+     EGL_ALPHA_SIZE = $3021;     
+     EGL_BLUE_SIZE = $3022;     
+     EGL_GREEN_SIZE = $3023;     
+     EGL_RED_SIZE = $3024;     
+     EGL_DEPTH_SIZE = $3025;     
+     EGL_STENCIL_SIZE = $3026;     
+     EGL_CONFIG_CAVEAT = $3027;     
+     EGL_CONFIG_ID = $3028;     
+     EGL_LEVEL = $3029;     
+     EGL_MAX_PBUFFER_HEIGHT = $302A;     
+     EGL_MAX_PBUFFER_PIXELS = $302B;     
+     EGL_MAX_PBUFFER_WIDTH = $302C;     
+     EGL_NATIVE_RENDERABLE = $302D;     
+     EGL_NATIVE_VISUAL_ID = $302E;     
+     EGL_NATIVE_VISUAL_TYPE = $302F;     
+     EGL_PRESERVED_RESOURCES = $3030;     
+     EGL_SAMPLES = $3031;     
+     EGL_SAMPLE_BUFFERS = $3032;     
+     EGL_SURFACE_TYPE = $3033;     
+     EGL_TRANSPARENT_TYPE = $3034;     
+     EGL_TRANSPARENT_BLUE_VALUE = $3035;     
+     EGL_TRANSPARENT_GREEN_VALUE = $3036;     
+     EGL_TRANSPARENT_RED_VALUE = $3037;     
+  { Attrib list terminator  }
+     EGL_NONE = $3038;     
+     EGL_BIND_TO_TEXTURE_RGB = $3039;     
+     EGL_BIND_TO_TEXTURE_RGBA = $303A;     
+     EGL_MIN_SWAP_INTERVAL = $303B;     
+     EGL_MAX_SWAP_INTERVAL = $303C;     
+     EGL_LUMINANCE_SIZE = $303D;     
+     EGL_ALPHA_MASK_SIZE = $303E;     
+     EGL_COLOR_BUFFER_TYPE = $303F;     
+     EGL_RENDERABLE_TYPE = $3040;     
+  { Pseudo-attribute (not queryable)  }
+     EGL_MATCH_NATIVE_PIXMAP = $3041;     
+     EGL_CONFORMANT = $3042;     
+  { Reserved 0x3041-0x304F for additional config attributes  }
+  { Config attribute values  }
+  { EGL_CONFIG_CAVEAT value  }
+     EGL_SLOW_CONFIG = $3050;     
+  { EGL_CONFIG_CAVEAT value  }
+     EGL_NON_CONFORMANT_CONFIG = $3051;     
+  { EGL_TRANSPARENT_TYPE value  }
+     EGL_TRANSPARENT_RGB = $3052;     
+  { EGL_COLOR_BUFFER_TYPE value  }
+     EGL_RGB_BUFFER = $308E;     
+  { EGL_COLOR_BUFFER_TYPE value  }
+     EGL_LUMINANCE_BUFFER = $308F;     
+  { More config attribute values, for EGL_TEXTURE_FORMAT  }
+     EGL_NO_TEXTURE = $305C;     
+     EGL_TEXTURE_RGB = $305D;     
+     EGL_TEXTURE_RGBA = $305E;     
+     EGL_TEXTURE_2D = $305F;     
+  { Config attribute mask bits  }
+  { EGL_SURFACE_TYPE mask bits  }
+     EGL_PBUFFER_BIT = $0001;     
+  { EGL_SURFACE_TYPE mask bits  }
+     EGL_PIXMAP_BIT = $0002;     
+  { EGL_SURFACE_TYPE mask bits  }
+     EGL_WINDOW_BIT = $0004;     
+  { EGL_SURFACE_TYPE mask bits  }
+     EGL_VG_COLORSPACE_LINEAR_BIT = $0020;     
+  { EGL_SURFACE_TYPE mask bits  }
+     EGL_VG_ALPHA_FORMAT_PRE_BIT = $0040;     
+  { EGL_SURFACE_TYPE mask bits  }
+     EGL_MULTISAMPLE_RESOLVE_BOX_BIT = $0200;     
+  { EGL_SURFACE_TYPE mask bits  }
+     EGL_SWAP_BEHAVIOR_PRESERVED_BIT = $0400;     
+  { EGL_RENDERABLE_TYPE mask bits  }
+     EGL_OPENGL_ES_BIT = $0001;     
+  { EGL_RENDERABLE_TYPE mask bits  }
+     EGL_OPENVG_BIT = $0002;     
+  { EGL_RENDERABLE_TYPE mask bits  }
+     EGL_OPENGL_ES2_BIT = $0004;     
+  { EGL_RENDERABLE_TYPE mask bits  }
+     EGL_OPENGL_BIT = $0008;     
+  { QueryString targets  }
+     EGL_VENDOR = $3053;     
+     EGL_VERSION = $3054;     
+     EGL_EXTENSIONS = $3055;     
+     EGL_CLIENT_APIS = $308D;     
+  { QuerySurface / SurfaceAttrib / CreatePbufferSurface targets  }
+     EGL_HEIGHT = $3056;     
+     EGL_WIDTH = $3057;     
+     EGL_LARGEST_PBUFFER = $3058;     
+     EGL_TEXTURE_FORMAT = $3080;     
+     EGL_TEXTURE_TARGET = $3081;     
+     EGL_MIPMAP_TEXTURE = $3082;     
+     EGL_MIPMAP_LEVEL = $3083;     
+     EGL_RENDER_BUFFER = $3086;     
+     EGL_VG_COLORSPACE = $3087;     
+     EGL_VG_ALPHA_FORMAT = $3088;     
+     EGL_HORIZONTAL_RESOLUTION = $3090;     
+     EGL_VERTICAL_RESOLUTION = $3091;     
+     EGL_PIXEL_ASPECT_RATIO = $3092;     
+     EGL_SWAP_BEHAVIOR = $3093;     
+     EGL_MULTISAMPLE_RESOLVE = $3099;     
+  { EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets  }
+     EGL_BACK_BUFFER = $3084;     
+     EGL_SINGLE_BUFFER = $3085;     
+  { OpenVG color spaces  }
+  { EGL_VG_COLORSPACE value  }
+     EGL_VG_COLORSPACE_sRGB = $3089;     
+  { EGL_VG_COLORSPACE value  }
+     EGL_VG_COLORSPACE_LINEAR = $308A;     
+  { OpenVG alpha formats  }
+  { EGL_ALPHA_FORMAT value  }
+     EGL_VG_ALPHA_FORMAT_NONPRE = $308B;     
+  { EGL_ALPHA_FORMAT value  }
+     EGL_VG_ALPHA_FORMAT_PRE = $308C;     
+  { Constant scale factor by which fractional display resolutions &
+   * aspect ratio are scaled when queried as integer values.
+    }
+     EGL_DISPLAY_SCALING = 10000;     
+  { Unknown display resolution/aspect ratio  }
+  { was #define dname def_expr }
+  function EGL_UNKNOWN : EGLint;    
+
+  { Back buffer swap behaviors  }
+  { EGL_SWAP_BEHAVIOR value  }
+
+  const
+     EGL_BUFFER_PRESERVED = $3094;     
+  { EGL_SWAP_BEHAVIOR value  }
+     EGL_BUFFER_DESTROYED = $3095;     
+  { CreatePbufferFromClientBuffer buffer types  }
+     EGL_OPENVG_IMAGE = $3096;     
+  { QueryContext targets  }
+     EGL_CONTEXT_CLIENT_TYPE = $3097;     
+  { CreateContext attributes  }
+     EGL_CONTEXT_CLIENT_VERSION = $3098;     
+  { Multisample resolution behaviors  }
+  { EGL_MULTISAMPLE_RESOLVE value  }
+     EGL_MULTISAMPLE_RESOLVE_DEFAULT = $309A;     
+  { EGL_MULTISAMPLE_RESOLVE value  }
+     EGL_MULTISAMPLE_RESOLVE_BOX = $309B;     
+  { BindAPI/QueryAPI targets  }
+     EGL_OPENGL_ES_API = $30A0;     
+     EGL_OPENVG_API = $30A1;     
+     EGL_OPENGL_API = $30A2;     
+  { GetCurrentSurface targets  }
+     EGL_DRAW = $3059;     
+     EGL_READ = $305A;     
+  { WaitNative engines  }
+     EGL_CORE_NATIVE_ENGINE = $305B;     
+  { EGL 1.2 tokens renamed for consistency in EGL 1.3  }
+     EGL_COLORSPACE = EGL_VG_COLORSPACE;     
+     EGL_ALPHA_FORMAT = EGL_VG_ALPHA_FORMAT;     
+     EGL_COLORSPACE_sRGB = EGL_VG_COLORSPACE_sRGB;     
+     EGL_COLORSPACE_LINEAR = EGL_VG_COLORSPACE_LINEAR;     
+     EGL_ALPHA_FORMAT_NONPRE = EGL_VG_ALPHA_FORMAT_NONPRE;     
+     EGL_ALPHA_FORMAT_PRE = EGL_VG_ALPHA_FORMAT_PRE;     
+  { EGL extensions must request enum blocks from the Khronos
+   * API Registrar, who maintains the enumerant registry. Submit
+   * a bug in Khronos Bugzilla against task "Registry".
+    }
+  { EGL Functions  }
+
+  var
+    eglGetError : function:EGLint;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglGetDisplay : function(display_id:EGLNativeDisplayType):EGLDisplay;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglInitialize : function(dpy:EGLDisplay; major:pEGLint; minor:pEGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglTerminate : function(dpy:EGLDisplay):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    eglQueryString : function(dpy:EGLDisplay; name:EGLint):pchar;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglGetConfigs : function(dpy:EGLDisplay; configs:pEGLConfig; config_size:EGLint; num_config:pEGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    eglChooseConfig : function(dpy:EGLDisplay; attrib_list:pEGLint; configs:pEGLConfig; config_size:EGLint; num_config:pEGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglGetConfigAttrib : function(dpy:EGLDisplay; config:EGLConfig; attribute:EGLint; value:pEGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    eglCreateWindowSurface : function(dpy:EGLDisplay; config:EGLConfig; win:EGLNativeWindowType; attrib_list:pEGLint):EGLSurface;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    eglCreatePbufferSurface : function(dpy:EGLDisplay; config:EGLConfig; attrib_list:pEGLint):EGLSurface;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    eglCreatePixmapSurface : function(dpy:EGLDisplay; config:EGLConfig; pixmap:EGLNativePixmapType; attrib_list:pEGLint):EGLSurface;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglDestroySurface : function(dpy:EGLDisplay; surface:EGLSurface):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglQuerySurface : function(dpy:EGLDisplay; surface:EGLSurface; attribute:EGLint; value:pEGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglBindAPI : function(api:EGLenum):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglQueryAPI : function:EGLenum;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglWaitClient : function:EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglReleaseThread : function:EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    eglCreatePbufferFromClientBuffer : function(dpy:EGLDisplay; buftype:EGLenum; buffer:EGLClientBuffer; config:EGLConfig; attrib_list:pEGLint):EGLSurface;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglSurfaceAttrib : function(dpy:EGLDisplay; surface:EGLSurface; attribute:EGLint; value:EGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglBindTexImage : function(dpy:EGLDisplay; surface:EGLSurface; buffer:EGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglReleaseTexImage : function(dpy:EGLDisplay; surface:EGLSurface; buffer:EGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglSwapInterval : function(dpy:EGLDisplay; interval:EGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    eglCreateContext : function(dpy:EGLDisplay; config:EGLConfig; share_context:EGLContext; attrib_list:pEGLint):EGLContext;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglDestroyContext : function(dpy:EGLDisplay; ctx:EGLContext):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglMakeCurrent : function(dpy:EGLDisplay; draw:EGLSurface; read:EGLSurface; ctx:EGLContext):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglGetCurrentContext : function:EGLContext;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglGetCurrentSurface : function(readdraw:EGLint):EGLSurface;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglGetCurrentDisplay : function:EGLDisplay;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglQueryContext : function(dpy:EGLDisplay; ctx:EGLContext; attribute:EGLint; value:pEGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglWaitGL : function:EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglWaitNative : function(engine:EGLint):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglSwapBuffers : function(dpy:EGLDisplay; surface:EGLSurface):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    eglCopyBuffers : function(dpy:EGLDisplay; surface:EGLSurface; target:EGLNativePixmapType):EGLBoolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+  { This is a generic function pointer type, whose name indicates it must
+   * be cast to the proper type *and calling convention* before use.
+    }
+
+  type
+
+     __eglMustCastToProperFunctionPointerType = procedure (_para1:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+  { Now, define eglGetProcAddress using the generic function ptr. type  }
+(* Const before type ignored *)
+
+  var
+    eglGetProcAddress : function(procname:pchar):__eglMustCastToProperFunctionPointerType;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+  { Header file version number  }
+  { Current version at http://www.khronos.org/registry/egl/  }
+
+  const
+     EGL_EGLEXT_VERSION = 3;     
+     EGL_KHR_config_attribs = 1;     
+  { EGLConfig attribute  }
+     EGL_CONFORMANT_KHR = $3042;     
+  { EGL_SURFACE_TYPE bitfield  }
+     EGL_VG_COLORSPACE_LINEAR_BIT_KHR = $0020;     
+  { EGL_SURFACE_TYPE bitfield  }
+     EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR = $0040;     
+     EGL_KHR_lock_surface = 1;     
+  { EGL_LOCK_USAGE_HINT_KHR bitfield  }
+     EGL_READ_SURFACE_BIT_KHR = $0001;     
+  { EGL_LOCK_USAGE_HINT_KHR bitfield  }
+     EGL_WRITE_SURFACE_BIT_KHR = $0002;     
+  { EGL_SURFACE_TYPE bitfield  }
+     EGL_LOCK_SURFACE_BIT_KHR = $0080;     
+  { EGL_SURFACE_TYPE bitfield  }
+     EGL_OPTIMAL_FORMAT_BIT_KHR = $0100;     
+  { EGLConfig attribute  }
+     EGL_MATCH_FORMAT_KHR = $3043;     
+  { EGL_MATCH_FORMAT_KHR value  }
+     EGL_FORMAT_RGB_565_EXACT_KHR = $30C0;     
+  { EGL_MATCH_FORMAT_KHR value  }
+     EGL_FORMAT_RGB_565_KHR = $30C1;     
+  { EGL_MATCH_FORMAT_KHR value  }
+     EGL_FORMAT_RGBA_8888_EXACT_KHR = $30C2;     
+  { EGL_MATCH_FORMAT_KHR value  }
+     EGL_FORMAT_RGBA_8888_KHR = $30C3;     
+  { eglLockSurfaceKHR attribute  }
+     EGL_MAP_PRESERVE_PIXELS_KHR = $30C4;     
+  { eglLockSurfaceKHR attribute  }
+     EGL_LOCK_USAGE_HINT_KHR = $30C5;     
+  { eglQuerySurface attribute  }
+     EGL_BITMAP_POINTER_KHR = $30C6;     
+  { eglQuerySurface attribute  }
+     EGL_BITMAP_PITCH_KHR = $30C7;     
+  { eglQuerySurface attribute  }
+     EGL_BITMAP_ORIGIN_KHR = $30C8;     
+  { eglQuerySurface attribute  }
+     EGL_BITMAP_PIXEL_RED_OFFSET_KHR = $30C9;     
+  { eglQuerySurface attribute  }
+     EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR = $30CA;     
+  { eglQuerySurface attribute  }
+     EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR = $30CB;     
+  { eglQuerySurface attribute  }
+     EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR = $30CC;     
+  { eglQuerySurface attribute  }
+     EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR = $30CD;     
+  { EGL_BITMAP_ORIGIN_KHR value  }
+     EGL_LOWER_LEFT_KHR = $30CE;     
+  { EGL_BITMAP_ORIGIN_KHR value  }
+     EGL_UPPER_LEFT_KHR = $30CF;     
+(* Const before type ignored *)
+
+  const
+     EGL_KHR_image = 1;     
+  { eglCreateImageKHR target  }
+     EGL_NATIVE_PIXMAP_KHR = $30B0;     
+
+type
+     EGLImageKHR = pointer;
+  { was #define dname def_expr }
+  function EGL_NO_IMAGE_KHR : EGLImageKHR;    
+
+(* Const before type ignored *)
+
+  const
+     EGL_KHR_vg_parent_image = 1;     
+  { eglCreateImageKHR target  }
+     EGL_VG_PARENT_IMAGE_KHR = $30BA;     
+     EGL_KHR_gl_texture_2D_image = 1;     
+  { eglCreateImageKHR target  }
+     EGL_GL_TEXTURE_2D_KHR = $30B1;     
+  { eglCreateImageKHR attribute  }
+     EGL_GL_TEXTURE_LEVEL_KHR = $30BC;     
+     EGL_KHR_gl_texture_cubemap_image = 1;     
+  { eglCreateImageKHR target  }
+     EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR = $30B3;     
+  { eglCreateImageKHR target  }
+     EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR = $30B4;     
+  { eglCreateImageKHR target  }
+     EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR = $30B5;     
+  { eglCreateImageKHR target  }
+     EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR = $30B6;     
+  { eglCreateImageKHR target  }
+     EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR = $30B7;     
+  { eglCreateImageKHR target  }
+     EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR = $30B8;     
+     EGL_KHR_gl_texture_3D_image = 1;     
+  { eglCreateImageKHR target  }
+     EGL_GL_TEXTURE_3D_KHR = $30B2;     
+  { eglCreateImageKHR attribute  }
+     EGL_GL_TEXTURE_ZOFFSET_KHR = $30BD;     
+     EGL_KHR_gl_renderbuffer_image = 1;     
+  { eglCreateImageKHR target  }
+     EGL_GL_RENDERBUFFER_KHR = $30B9;     
+     EGL_KHR_image_base = 1;     
+  { Most interfaces defined by EGL_KHR_image_pixmap above  }
+  { eglCreateImageKHR attribute  }
+     EGL_IMAGE_PRESERVED_KHR = $30D2;     
+     EGL_KHR_image_pixmap = 1;     
+  { Interfaces defined by EGL_KHR_image above  }
+
+{$endif EGL}
+
+  
+type
+  PGLubyte = ^GLubyte;
+  PGLboolean  = ^GLboolean;
+  PGLenum  = ^GLenum;
+  PGLfloat  = ^GLfloat;
+  PGLint  = ^GLint;
+  PGLsizei  = ^GLsizei;
+  PGLuint  = ^GLuint;
+
+  {-------------------------------------------------------------------------
+   * Data type definitions
+   *----------------------------------------------------------------------- }
+
+     GLvoid = pointer;
+     TGLvoid = GLvoid;
+
+     GLenum = dword;
+     TGLenum = GLenum;
+
+     GLboolean = byte;
+     TGLboolean = GLboolean;
+
+     GLbitfield = dword;
+     TGLbitfield = GLbitfield;
+
+     GLbyte = shortint;
+     TGLbyte = GLbyte;
+
+     GLshort = smallint;
+     TGLshort = GLshort;
+
+     GLint = longint;
+     TGLint = GLint;
+
+     GLsizei = longint;
+     TGLsizei = GLsizei;
+
+     GLubyte = byte;
+     TGLubyte = GLubyte;
+
+     GLushort = word;
+     TGLushort = GLushort;
+
+     GLuint = longword;
+     TGLuint = GLuint;
+
+     GLfloat = single;
+     TGLfloat = GLfloat;
+
+     GLclampf = single;
+     TGLclampf = GLclampf;
+
+     GLfixed = longint;
+     TGLfixed = GLfixed;
+  { GL types for handling large vertex buffer objects  }
+
+     GLintptr = ptrint;
+
+     GLsizeiptr = ptrint;
+  { OpenGL ES core versions  }
+
+  const
+     GL_ES_VERSION_2_0 = 1;     
+  { ClearBufferMask  }
+     GL_DEPTH_BUFFER_BIT = $00000100;     
+     GL_STENCIL_BUFFER_BIT = $00000400;     
+     GL_COLOR_BUFFER_BIT = $00004000;     
+  { Boolean  }
+     GL_FALSE = 0;     
+     GL_TRUE = 1;     
+  { BeginMode  }
+     GL_POINTS = $0000;     
+     GL_LINES = $0001;     
+     GL_LINE_LOOP = $0002;     
+     GL_LINE_STRIP = $0003;     
+     GL_TRIANGLES = $0004;     
+     GL_TRIANGLE_STRIP = $0005;     
+     GL_TRIANGLE_FAN = $0006;     
+  { AlphaFunction (not supported in ES20)  }
+  {      GL_NEVER  }
+  {      GL_LESS  }
+  {      GL_EQUAL  }
+  {      GL_LEQUAL  }
+  {      GL_GREATER  }
+  {      GL_NOTEQUAL  }
+  {      GL_GEQUAL  }
+  {      GL_ALWAYS  }
+  { BlendingFactorDest  }
+     GL_ZERO = 0;     
+     GL_ONE = 1;     
+     GL_SRC_COLOR = $0300;     
+     GL_ONE_MINUS_SRC_COLOR = $0301;     
+     GL_SRC_ALPHA = $0302;     
+     GL_ONE_MINUS_SRC_ALPHA = $0303;     
+     GL_DST_ALPHA = $0304;     
+     GL_ONE_MINUS_DST_ALPHA = $0305;     
+  { BlendingFactorSrc  }
+  {      GL_ZERO  }
+  {      GL_ONE  }
+     GL_DST_COLOR = $0306;     
+     GL_ONE_MINUS_DST_COLOR = $0307;     
+     GL_SRC_ALPHA_SATURATE = $0308;     
+  {      GL_SRC_ALPHA  }
+  {      GL_ONE_MINUS_SRC_ALPHA  }
+  {      GL_DST_ALPHA  }
+  {      GL_ONE_MINUS_DST_ALPHA  }
+  { BlendEquationSeparate  }
+     GL_FUNC_ADD = $8006;     
+     GL_BLEND_EQUATION = $8009;     
+  { same as BLEND_EQUATION  }
+     GL_BLEND_EQUATION_RGB = $8009;     
+     GL_BLEND_EQUATION_ALPHA = $883D;     
+  { BlendSubtract  }
+     GL_FUNC_SUBTRACT = $800A;     
+     GL_FUNC_REVERSE_SUBTRACT = $800B;     
+  { Separate Blend Functions  }
+     GL_BLEND_DST_RGB = $80C8;     
+     GL_BLEND_SRC_RGB = $80C9;     
+     GL_BLEND_DST_ALPHA = $80CA;     
+     GL_BLEND_SRC_ALPHA = $80CB;     
+     GL_CONSTANT_COLOR = $8001;     
+     GL_ONE_MINUS_CONSTANT_COLOR = $8002;     
+     GL_CONSTANT_ALPHA = $8003;     
+     GL_ONE_MINUS_CONSTANT_ALPHA = $8004;     
+     GL_BLEND_COLOR = $8005;     
+  { Buffer Objects  }
+     GL_ARRAY_BUFFER = $8892;     
+     GL_ELEMENT_ARRAY_BUFFER = $8893;     
+     GL_ARRAY_BUFFER_BINDING = $8894;     
+     GL_ELEMENT_ARRAY_BUFFER_BINDING = $8895;     
+     GL_STREAM_DRAW = $88E0;     
+     GL_STATIC_DRAW = $88E4;     
+     GL_DYNAMIC_DRAW = $88E8;     
+     GL_BUFFER_SIZE = $8764;     
+     GL_BUFFER_USAGE = $8765;     
+     GL_CURRENT_VERTEX_ATTRIB = $8626;     
+  { CullFaceMode  }
+     GL_FRONT = $0404;     
+     GL_BACK = $0405;     
+     GL_FRONT_AND_BACK = $0408;     
+  { DepthFunction  }
+  {      GL_NEVER  }
+  {      GL_LESS  }
+  {      GL_EQUAL  }
+  {      GL_LEQUAL  }
+  {      GL_GREATER  }
+  {      GL_NOTEQUAL  }
+  {      GL_GEQUAL  }
+  {      GL_ALWAYS  }
+  { EnableCap  }
+     GL_TEXTURE_2D = $0DE1;     
+     GL_CULL_FACE = $0B44;     
+     GL_BLEND = $0BE2;     
+     GL_DITHER = $0BD0;     
+     GL_STENCIL_TEST = $0B90;     
+     GL_DEPTH_TEST = $0B71;     
+     GL_SCISSOR_TEST = $0C11;     
+     GL_POLYGON_OFFSET_FILL = $8037;     
+     GL_SAMPLE_ALPHA_TO_COVERAGE = $809E;     
+     GL_SAMPLE_COVERAGE = $80A0;     
+  { ErrorCode  }
+     GL_NO_ERROR = 0;     
+     GL_INVALID_ENUM = $0500;     
+     GL_INVALID_VALUE = $0501;     
+     GL_INVALID_OPERATION = $0502;     
+     GL_OUT_OF_MEMORY = $0505;     
+  { FrontFaceDirection  }
+     GL_CW = $0900;     
+     GL_CCW = $0901;     
+  { GetPName  }
+     GL_LINE_WIDTH = $0B21;     
+     GL_ALIASED_POINT_SIZE_RANGE = $846D;     
+     GL_ALIASED_LINE_WIDTH_RANGE = $846E;     
+     GL_CULL_FACE_MODE = $0B45;     
+     GL_FRONT_FACE = $0B46;     
+     GL_DEPTH_RANGE = $0B70;     
+     GL_DEPTH_WRITEMASK = $0B72;     
+     GL_DEPTH_CLEAR_VALUE = $0B73;     
+     GL_DEPTH_FUNC = $0B74;     
+     GL_STENCIL_CLEAR_VALUE = $0B91;     
+     GL_STENCIL_FUNC = $0B92;     
+     GL_STENCIL_FAIL = $0B94;     
+     GL_STENCIL_PASS_DEPTH_FAIL = $0B95;     
+     GL_STENCIL_PASS_DEPTH_PASS = $0B96;     
+     GL_STENCIL_REF = $0B97;     
+     GL_STENCIL_VALUE_MASK = $0B93;     
+     GL_STENCIL_WRITEMASK = $0B98;     
+     GL_STENCIL_BACK_FUNC = $8800;     
+     GL_STENCIL_BACK_FAIL = $8801;     
+     GL_STENCIL_BACK_PASS_DEPTH_FAIL = $8802;     
+     GL_STENCIL_BACK_PASS_DEPTH_PASS = $8803;     
+     GL_STENCIL_BACK_REF = $8CA3;     
+     GL_STENCIL_BACK_VALUE_MASK = $8CA4;     
+     GL_STENCIL_BACK_WRITEMASK = $8CA5;     
+     GL_VIEWPORT = $0BA2;     
+     GL_SCISSOR_BOX = $0C10;     
+  {      GL_SCISSOR_TEST  }
+     GL_COLOR_CLEAR_VALUE = $0C22;     
+     GL_COLOR_WRITEMASK = $0C23;     
+     GL_UNPACK_ALIGNMENT = $0CF5;     
+     GL_PACK_ALIGNMENT = $0D05;     
+     GL_MAX_TEXTURE_SIZE = $0D33;     
+     GL_MAX_VIEWPORT_DIMS = $0D3A;     
+     GL_SUBPIXEL_BITS = $0D50;     
+     GL_RED_BITS = $0D52;     
+     GL_GREEN_BITS = $0D53;     
+     GL_BLUE_BITS = $0D54;     
+     GL_ALPHA_BITS = $0D55;     
+     GL_DEPTH_BITS = $0D56;     
+     GL_STENCIL_BITS = $0D57;     
+     GL_POLYGON_OFFSET_UNITS = $2A00;     
+  {      GL_POLYGON_OFFSET_FILL  }
+     GL_POLYGON_OFFSET_FACTOR = $8038;     
+     GL_TEXTURE_BINDING_2D = $8069;     
+     GL_SAMPLE_BUFFERS = $80A8;     
+     GL_SAMPLES = $80A9;     
+     GL_SAMPLE_COVERAGE_VALUE = $80AA;     
+     GL_SAMPLE_COVERAGE_INVERT = $80AB;     
+  { GetTextureParameter  }
+  {      GL_TEXTURE_MAG_FILTER  }
+  {      GL_TEXTURE_MIN_FILTER  }
+  {      GL_TEXTURE_WRAP_S  }
+  {      GL_TEXTURE_WRAP_T  }
+     GL_NUM_COMPRESSED_TEXTURE_FORMATS = $86A2;     
+     GL_COMPRESSED_TEXTURE_FORMATS = $86A3;     
+  { HintMode  }
+     GL_DONT_CARE = $1100;     
+     GL_FASTEST = $1101;     
+     GL_NICEST = $1102;     
+  { HintTarget  }
+     GL_GENERATE_MIPMAP_HINT = $8192;     
+  { DataType  }
+     GL_BYTE = $1400;     
+     GL_UNSIGNED_BYTE = $1401;     
+     GL_SHORT = $1402;     
+     GL_UNSIGNED_SHORT = $1403;     
+     GL_INT = $1404;     
+     GL_UNSIGNED_INT = $1405;     
+     GL_FLOAT = $1406;     
+     GL_FIXED = $140C;     
+  { PixelFormat  }
+     GL_DEPTH_COMPONENT = $1902;     
+     GL_ALPHA = $1906;     
+     GL_RGB = $1907;     
+     GL_RGBA = $1908;     
+     GL_LUMINANCE = $1909;     
+     GL_LUMINANCE_ALPHA = $190A;     
+  { PixelType  }
+  {      GL_UNSIGNED_BYTE  }
+     GL_UNSIGNED_SHORT_4_4_4_4 = $8033;     
+     GL_UNSIGNED_SHORT_5_5_5_1 = $8034;     
+     GL_UNSIGNED_SHORT_5_6_5 = $8363;     
+  { Shaders  }
+     GL_FRAGMENT_SHADER = $8B30;     
+     GL_VERTEX_SHADER = $8B31;     
+     GL_MAX_VERTEX_ATTRIBS = $8869;     
+     GL_MAX_VERTEX_UNIFORM_VECTORS = $8DFB;     
+     GL_MAX_VARYING_VECTORS = $8DFC;     
+     GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = $8B4D;     
+     GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = $8B4C;     
+     GL_MAX_TEXTURE_IMAGE_UNITS = $8872;     
+     GL_MAX_FRAGMENT_UNIFORM_VECTORS = $8DFD;     
+     GL_SHADER_TYPE = $8B4F;     
+     GL_DELETE_STATUS = $8B80;     
+     GL_LINK_STATUS = $8B82;     
+     GL_VALIDATE_STATUS = $8B83;     
+     GL_ATTACHED_SHADERS = $8B85;     
+     GL_ACTIVE_UNIFORMS = $8B86;     
+     GL_ACTIVE_UNIFORM_MAX_LENGTH = $8B87;     
+     GL_ACTIVE_ATTRIBUTES = $8B89;     
+     GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = $8B8A;     
+     GL_SHADING_LANGUAGE_VERSION = $8B8C;     
+     GL_CURRENT_PROGRAM = $8B8D;     
+  { StencilFunction  }
+     GL_NEVER = $0200;     
+     GL_LESS = $0201;     
+     GL_EQUAL = $0202;     
+     GL_LEQUAL = $0203;     
+     GL_GREATER = $0204;     
+     GL_NOTEQUAL = $0205;     
+     GL_GEQUAL = $0206;     
+     GL_ALWAYS = $0207;     
+  { StencilOp  }
+  {      GL_ZERO  }
+     GL_KEEP = $1E00;     
+     GL_REPLACE = $1E01;     
+     GL_INCR = $1E02;     
+     GL_DECR = $1E03;     
+     GL_INVERT = $150A;     
+     GL_INCR_WRAP = $8507;     
+     GL_DECR_WRAP = $8508;     
+  { StringName  }
+     GL_VENDOR = $1F00;     
+     GL_RENDERER = $1F01;     
+     GL_VERSION = $1F02;     
+     GL_EXTENSIONS = $1F03;     
+  { TextureMagFilter  }
+     GL_NEAREST = $2600;     
+     GL_LINEAR = $2601;     
+  { TextureMinFilter  }
+  {      GL_NEAREST  }
+  {      GL_LINEAR  }
+     GL_NEAREST_MIPMAP_NEAREST = $2700;     
+     GL_LINEAR_MIPMAP_NEAREST = $2701;     
+     GL_NEAREST_MIPMAP_LINEAR = $2702;     
+     GL_LINEAR_MIPMAP_LINEAR = $2703;     
+  { TextureParameterName  }
+     GL_TEXTURE_MAG_FILTER = $2800;     
+     GL_TEXTURE_MIN_FILTER = $2801;     
+     GL_TEXTURE_WRAP_S = $2802;     
+     GL_TEXTURE_WRAP_T = $2803;     
+  { TextureTarget  }
+  {      GL_TEXTURE_2D  }
+     GL_TEXTURE = $1702;     
+     GL_TEXTURE_CUBE_MAP = $8513;     
+     GL_TEXTURE_BINDING_CUBE_MAP = $8514;     
+     GL_TEXTURE_CUBE_MAP_POSITIVE_X = $8515;     
+     GL_TEXTURE_CUBE_MAP_NEGATIVE_X = $8516;     
+     GL_TEXTURE_CUBE_MAP_POSITIVE_Y = $8517;     
+     GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = $8518;     
+     GL_TEXTURE_CUBE_MAP_POSITIVE_Z = $8519;     
+     GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = $851A;     
+     GL_MAX_CUBE_MAP_TEXTURE_SIZE = $851C;     
+  { TextureUnit  }
+     GL_TEXTURE0 = $84C0;     
+     GL_TEXTURE1 = $84C1;     
+     GL_TEXTURE2 = $84C2;     
+     GL_TEXTURE3 = $84C3;     
+     GL_TEXTURE4 = $84C4;     
+     GL_TEXTURE5 = $84C5;     
+     GL_TEXTURE6 = $84C6;     
+     GL_TEXTURE7 = $84C7;     
+     GL_TEXTURE8 = $84C8;     
+     GL_TEXTURE9 = $84C9;     
+     GL_TEXTURE10 = $84CA;     
+     GL_TEXTURE11 = $84CB;     
+     GL_TEXTURE12 = $84CC;     
+     GL_TEXTURE13 = $84CD;     
+     GL_TEXTURE14 = $84CE;     
+     GL_TEXTURE15 = $84CF;     
+     GL_TEXTURE16 = $84D0;     
+     GL_TEXTURE17 = $84D1;     
+     GL_TEXTURE18 = $84D2;     
+     GL_TEXTURE19 = $84D3;     
+     GL_TEXTURE20 = $84D4;     
+     GL_TEXTURE21 = $84D5;     
+     GL_TEXTURE22 = $84D6;     
+     GL_TEXTURE23 = $84D7;     
+     GL_TEXTURE24 = $84D8;     
+     GL_TEXTURE25 = $84D9;     
+     GL_TEXTURE26 = $84DA;     
+     GL_TEXTURE27 = $84DB;     
+     GL_TEXTURE28 = $84DC;     
+     GL_TEXTURE29 = $84DD;     
+     GL_TEXTURE30 = $84DE;     
+     GL_TEXTURE31 = $84DF;     
+     GL_ACTIVE_TEXTURE = $84E0;     
+  { TextureWrapMode  }
+     GL_REPEAT = $2901;     
+     GL_CLAMP_TO_EDGE = $812F;     
+     GL_MIRRORED_REPEAT = $8370;     
+  { Uniform Types  }
+     GL_FLOAT_VEC2 = $8B50;     
+     GL_FLOAT_VEC3 = $8B51;     
+     GL_FLOAT_VEC4 = $8B52;     
+     GL_INT_VEC2 = $8B53;     
+     GL_INT_VEC3 = $8B54;     
+     GL_INT_VEC4 = $8B55;     
+     GL_BOOL = $8B56;     
+     GL_BOOL_VEC2 = $8B57;     
+     GL_BOOL_VEC3 = $8B58;     
+     GL_BOOL_VEC4 = $8B59;     
+     GL_FLOAT_MAT2 = $8B5A;     
+     GL_FLOAT_MAT3 = $8B5B;     
+     GL_FLOAT_MAT4 = $8B5C;     
+     GL_SAMPLER_2D = $8B5E;     
+     GL_SAMPLER_CUBE = $8B60;     
+  { Vertex Arrays  }
+     GL_VERTEX_ATTRIB_ARRAY_ENABLED = $8622;     
+     GL_VERTEX_ATTRIB_ARRAY_SIZE = $8623;     
+     GL_VERTEX_ATTRIB_ARRAY_STRIDE = $8624;     
+     GL_VERTEX_ATTRIB_ARRAY_TYPE = $8625;     
+     GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = $886A;     
+     GL_VERTEX_ATTRIB_ARRAY_POINTER = $8645;     
+     GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = $889F;     
+  { Read Format  }
+     GL_IMPLEMENTATION_COLOR_READ_TYPE = $8B9A;     
+     GL_IMPLEMENTATION_COLOR_READ_FORMAT = $8B9B;     
+  { Shader Source  }
+     GL_COMPILE_STATUS = $8B81;     
+     GL_INFO_LOG_LENGTH = $8B84;     
+     GL_SHADER_SOURCE_LENGTH = $8B88;     
+     GL_SHADER_COMPILER = $8DFA;     
+  { Shader Binary  }
+     GL_SHADER_BINARY_FORMATS = $8DF8;     
+     GL_NUM_SHADER_BINARY_FORMATS = $8DF9;     
+  { Shader Precision-Specified Types  }
+     GL_LOW_FLOAT = $8DF0;     
+     GL_MEDIUM_FLOAT = $8DF1;     
+     GL_HIGH_FLOAT = $8DF2;     
+     GL_LOW_INT = $8DF3;     
+     GL_MEDIUM_INT = $8DF4;     
+     GL_HIGH_INT = $8DF5;     
+  { Framebuffer Object.  }
+     GL_FRAMEBUFFER = $8D40;     
+     GL_RENDERBUFFER = $8D41;     
+     GL_RGBA4 = $8056;     
+     GL_RGB5_A1 = $8057;     
+     GL_RGB565 = $8D62;     
+     GL_DEPTH_COMPONENT16 = $81A5;     
+     GL_STENCIL_INDEX = $1901;     
+     GL_STENCIL_INDEX8 = $8D48;     
+     GL_RENDERBUFFER_WIDTH = $8D42;     
+     GL_RENDERBUFFER_HEIGHT = $8D43;     
+     GL_RENDERBUFFER_INTERNAL_FORMAT = $8D44;     
+     GL_RENDERBUFFER_RED_SIZE = $8D50;     
+     GL_RENDERBUFFER_GREEN_SIZE = $8D51;     
+     GL_RENDERBUFFER_BLUE_SIZE = $8D52;     
+     GL_RENDERBUFFER_ALPHA_SIZE = $8D53;     
+     GL_RENDERBUFFER_DEPTH_SIZE = $8D54;     
+     GL_RENDERBUFFER_STENCIL_SIZE = $8D55;     
+     GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = $8CD0;     
+     GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = $8CD1;     
+     GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = $8CD2;     
+     GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = $8CD3;     
+     GL_COLOR_ATTACHMENT0 = $8CE0;     
+     GL_DEPTH_ATTACHMENT = $8D00;     
+     GL_STENCIL_ATTACHMENT = $8D20;     
+     GL_NONE = 0;     
+     GL_FRAMEBUFFER_COMPLETE = $8CD5;     
+     GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = $8CD6;     
+     GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = $8CD7;     
+     GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS = $8CD9;     
+     GL_FRAMEBUFFER_UNSUPPORTED = $8CDD;     
+     GL_FRAMEBUFFER_BINDING = $8CA6;     
+     GL_RENDERBUFFER_BINDING = $8CA7;     
+     GL_MAX_RENDERBUFFER_SIZE = $84E8;     
+     GL_INVALID_FRAMEBUFFER_OPERATION = $0506;     
+  {-------------------------------------------------------------------------
+   * GL core functions.
+   *----------------------------------------------------------------------- }
+
+  var
+    glActiveTexture : procedure(texture:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glAttachShader : procedure(_program:GLuint; shader:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glBindAttribLocation : procedure(_program:GLuint; index:GLuint; name:pchar);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBindBuffer : procedure(target:GLenum; buffer:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBindFramebuffer : procedure(target:GLenum; framebuffer:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBindRenderbuffer : procedure(target:GLenum; renderbuffer:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBindTexture : procedure(target:GLenum; texture:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBlendColor : procedure(red:GLclampf; green:GLclampf; blue:GLclampf; alpha:GLclampf);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBlendEquation : procedure(mode:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBlendEquationSeparate : procedure(modeRGB:GLenum; modeAlpha:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBlendFunc : procedure(sfactor:GLenum; dfactor:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBlendFuncSeparate : procedure(srcRGB:GLenum; dstRGB:GLenum; srcAlpha:GLenum; dstAlpha:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glBufferData : procedure(target:GLenum; size:GLsizeiptr; data:pointer; usage:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glBufferSubData : procedure(target:GLenum; offset:GLintptr; size:GLsizeiptr; data:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glCheckFramebufferStatus : function(target:GLenum):GLenum;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glClear : procedure(mask:GLbitfield);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glClearColor : procedure(red:GLclampf; green:GLclampf; blue:GLclampf; alpha:GLclampf);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glClearDepthf : procedure(depth:GLclampf);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glClearStencil : procedure(s:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glColorMask : procedure(red:GLboolean; green:GLboolean; blue:GLboolean; alpha:GLboolean);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glCompileShader : procedure(shader:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glCompressedTexImage2D : procedure(target:GLenum; level:GLint; internalformat:GLenum; width:GLsizei; height:GLsizei; 
+      border:GLint; imageSize:GLsizei; data:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glCompressedTexSubImage2D : procedure(target:GLenum; level:GLint; xoffset:GLint; yoffset:GLint; width:GLsizei; 
+      height:GLsizei; format:GLenum; imageSize:GLsizei; data:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glCopyTexImage2D : procedure(target:GLenum; level:GLint; internalformat:GLenum; x:GLint; y:GLint; 
+      width:GLsizei; height:GLsizei; border:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glCopyTexSubImage2D : procedure(target:GLenum; level:GLint; xoffset:GLint; yoffset:GLint; x:GLint; 
+      y:GLint; width:GLsizei; height:GLsizei);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glCreateProgram : function:GLuint;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glCreateShader : function(_type:GLenum):GLuint;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glCullFace : procedure(mode:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glDeleteBuffers : procedure(n:GLsizei; buffers:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glDeleteFramebuffers : procedure(n:GLsizei; framebuffers:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDeleteProgram : procedure(_program:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glDeleteRenderbuffers : procedure(n:GLsizei; renderbuffers:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDeleteShader : procedure(shader:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glDeleteTextures : procedure(n:GLsizei; textures:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDepthFunc : procedure(func:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDepthMask : procedure(flag:GLboolean);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDepthRangef : procedure(zNear:GLclampf; zFar:GLclampf);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDetachShader : procedure(_program:GLuint; shader:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDisable : procedure(cap:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDisableVertexAttribArray : procedure(index:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDrawArrays : procedure(mode:GLenum; first:GLint; count:GLsizei);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glDrawElements : procedure(mode:GLenum; count:GLsizei; _type:GLenum; indices:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glEnable : procedure(cap:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glEnableVertexAttribArray : procedure(index:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glFinish : procedure;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glFlush : procedure;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glFramebufferRenderbuffer : procedure(target:GLenum; attachment:GLenum; renderbuffertarget:GLenum; renderbuffer:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glFramebufferTexture2D : procedure(target:GLenum; attachment:GLenum; textarget:GLenum; texture:GLuint; level:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glFrontFace : procedure(mode:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGenBuffers : procedure(n:GLsizei; buffers:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGenerateMipmap : procedure(target:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGenFramebuffers : procedure(n:GLsizei; framebuffers:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGenRenderbuffers : procedure(n:GLsizei; renderbuffers:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGenTextures : procedure(n:GLsizei; textures:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetActiveAttrib : procedure(_program:GLuint; index:GLuint; bufsize:GLsizei; length:pGLsizei; size:pGLint; 
+      _type:pGLenum; name:pchar);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetActiveUniform : procedure(_program:GLuint; index:GLuint; bufsize:GLsizei; length:pGLsizei; size:pGLint; 
+      _type:pGLenum; name:pchar);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetAttachedShaders : procedure(_program:GLuint; maxcount:GLsizei; count:pGLsizei; shaders:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glGetAttribLocation : function(_program:GLuint; name:pchar):longint;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetBooleanv : procedure(pname:GLenum; params:pGLboolean);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetBufferParameteriv : procedure(target:GLenum; pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetError : function:GLenum;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetFloatv : procedure(pname:GLenum; params:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetFramebufferAttachmentParameteriv : procedure(target:GLenum; attachment:GLenum; pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetIntegerv : procedure(pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetProgramiv : procedure(_program:GLuint; pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetProgramInfoLog : procedure(_program:GLuint; bufsize:GLsizei; length:pGLsizei; infolog:pchar);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetRenderbufferParameteriv : procedure(target:GLenum; pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetShaderiv : procedure(shader:GLuint; pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetShaderInfoLog : procedure(shader:GLuint; bufsize:GLsizei; length:pGLsizei; infolog:pchar);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetShaderPrecisionFormat : procedure(shadertype:GLenum; precisiontype:GLenum; range:pGLint; precision:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetShaderSource : procedure(shader:GLuint; bufsize:GLsizei; length:pGLsizei; source:pchar);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glGetString : function(name:GLenum):PGLubyte;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetTexParameterfv : procedure(target:GLenum; pname:GLenum; params:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetTexParameteriv : procedure(target:GLenum; pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetUniformfv : procedure(_program:GLuint; location:GLint; params:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetUniformiv : procedure(_program:GLuint; location:GLint; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glGetUniformLocation : function(_program:GLuint; name:pchar):longint;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetVertexAttribfv : procedure(index:GLuint; pname:GLenum; params:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetVertexAttribiv : procedure(index:GLuint; pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetVertexAttribPointerv : procedure(index:GLuint; pname:GLenum; pointer:Ppointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glHint : procedure(target:GLenum; mode:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glIsBuffer : function(buffer:GLuint):GLboolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glIsEnabled : function(cap:GLenum):GLboolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glIsFramebuffer : function(framebuffer:GLuint):GLboolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glIsProgram : function(_program:GLuint):GLboolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glIsRenderbuffer : function(renderbuffer:GLuint):GLboolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glIsShader : function(shader:GLuint):GLboolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glIsTexture : function(texture:GLuint):GLboolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glLineWidth : procedure(width:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glLinkProgram : procedure(_program:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glPixelStorei : procedure(pname:GLenum; param:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glPolygonOffset : procedure(factor:GLfloat; units:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glReadPixels : procedure(x:GLint; y:GLint; width:GLsizei; height:GLsizei; format:GLenum; 
+      _type:GLenum; pixels:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glReleaseShaderCompiler : procedure;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glRenderbufferStorage : procedure(target:GLenum; internalformat:GLenum; width:GLsizei; height:GLsizei);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glSampleCoverage : procedure(value:GLclampf; invert:GLboolean);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glScissor : procedure(x:GLint; y:GLint; width:GLsizei; height:GLsizei);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+(* Const before type ignored *)
+    glShaderBinary : procedure(n:GLsizei; shaders:pGLuint; binaryformat:GLenum; binary:pointer; length:GLsizei);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+(* Const before type ignored *)
+    glShaderSource : procedure(shader:GLuint; count:GLsizei; _string:Ppchar; length:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glStencilFunc : procedure(func:GLenum; ref:GLint; mask:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glStencilFuncSeparate : procedure(face:GLenum; func:GLenum; ref:GLint; mask:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glStencilMask : procedure(mask:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glStencilMaskSeparate : procedure(face:GLenum; mask:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glStencilOp : procedure(fail:GLenum; zfail:GLenum; zpass:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glStencilOpSeparate : procedure(face:GLenum; fail:GLenum; zfail:GLenum; zpass:GLenum);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glTexImage2D : procedure(target:GLenum; level:GLint; internalformat:GLenum; width:GLsizei; height:GLsizei; 
+      border:GLint; format:GLenum; _type:GLenum; pixels:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glTexParameterf : procedure(target:GLenum; pname:GLenum; param:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glTexParameterfv : procedure(target:GLenum; pname:GLenum; params:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glTexParameteri : procedure(target:GLenum; pname:GLenum; param:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glTexParameteriv : procedure(target:GLenum; pname:GLenum; params:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glTexSubImage2D : procedure(target:GLenum; level:GLint; xoffset:GLint; yoffset:GLint; width:GLsizei; 
+      height:GLsizei; format:GLenum; _type:GLenum; pixels:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUniform1f : procedure(location:GLint; x:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniform1fv : procedure(location:GLint; count:GLsizei; v:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUniform1i : procedure(location:GLint; x:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniform1iv : procedure(location:GLint; count:GLsizei; v:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUniform2f : procedure(location:GLint; x:GLfloat; y:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniform2fv : procedure(location:GLint; count:GLsizei; v:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUniform2i : procedure(location:GLint; x:GLint; y:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniform2iv : procedure(location:GLint; count:GLsizei; v:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUniform3f : procedure(location:GLint; x:GLfloat; y:GLfloat; z:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniform3fv : procedure(location:GLint; count:GLsizei; v:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUniform3i : procedure(location:GLint; x:GLint; y:GLint; z:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniform3iv : procedure(location:GLint; count:GLsizei; v:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUniform4f : procedure(location:GLint; x:GLfloat; y:GLfloat; z:GLfloat; w:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniform4fv : procedure(location:GLint; count:GLsizei; v:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUniform4i : procedure(location:GLint; x:GLint; y:GLint; z:GLint; w:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniform4iv : procedure(location:GLint; count:GLsizei; v:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniformMatrix2fv : procedure(location:GLint; count:GLsizei; transpose:GLboolean; value:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniformMatrix3fv : procedure(location:GLint; count:GLsizei; transpose:GLboolean; value:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glUniformMatrix4fv : procedure(location:GLint; count:GLsizei; transpose:GLboolean; value:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUseProgram : procedure(_program:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glValidateProgram : procedure(_program:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glVertexAttrib1f : procedure(indx:GLuint; x:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glVertexAttrib1fv : procedure(indx:GLuint; values:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glVertexAttrib2f : procedure(indx:GLuint; x:GLfloat; y:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glVertexAttrib2fv : procedure(indx:GLuint; values:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glVertexAttrib3f : procedure(indx:GLuint; x:GLfloat; y:GLfloat; z:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glVertexAttrib3fv : procedure(indx:GLuint; values:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glVertexAttrib4f : procedure(indx:GLuint; x:GLfloat; y:GLfloat; z:GLfloat; w:GLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glVertexAttrib4fv : procedure(indx:GLuint; values:pGLfloat);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glVertexAttribPointer : procedure(indx:GLuint; size:GLint; _type:GLenum; normalized:GLboolean; stride:GLsizei; 
+      ptr:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glViewport : procedure(x:GLint; y:GLint; width:GLsizei; height:GLsizei);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+  {------------------------------------------------------------------------*
+   * IMG extension tokens
+   *------------------------------------------------------------------------ }
+  { GL_IMG_binary_shader  }
+
+  const
+     GL_SGX_BINARY_IMG = $8C0A;     
+  { GL_IMG_texture_compression_pvrtc  }
+     GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = $8C00;     
+     GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = $8C01;     
+     GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = $8C02;     
+     GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = $8C03;     
+     GL_BGRA = $80E1;     
+  {------------------------------------------------------------------------*
+   * IMG extension functions
+   *------------------------------------------------------------------------ }
+  { GL_IMG_binary_shader  }
+     GL_IMG_binary_shader = 1;     
+  { GL_IMG_texture_compression_pvrtc  }
+     GL_IMG_texture_compression_pvrtc = 1;     
+  {
+   * This document is licensed under the SGI Free Software B License Version
+   * 2.0. For details, see http://oss.sgi.com/projects/FreeB/ .
+    }
+  {------------------------------------------------------------------------*
+   * OES extension tokens
+   *------------------------------------------------------------------------ }
+  { GL_OES_compressed_ETC1_RGB8_texture  }
+     GL_ETC1_RGB8_OES = $8D64;     
+  { GL_OES_compressed_paletted_texture  }
+     GL_PALETTE4_RGB8_OES = $8B90;     
+     GL_PALETTE4_RGBA8_OES = $8B91;     
+     GL_PALETTE4_R5_G6_B5_OES = $8B92;     
+     GL_PALETTE4_RGBA4_OES = $8B93;     
+     GL_PALETTE4_RGB5_A1_OES = $8B94;     
+     GL_PALETTE8_RGB8_OES = $8B95;     
+     GL_PALETTE8_RGBA8_OES = $8B96;     
+     GL_PALETTE8_R5_G6_B5_OES = $8B97;     
+     GL_PALETTE8_RGBA4_OES = $8B98;     
+     GL_PALETTE8_RGB5_A1_OES = $8B99;     
+  { GL_OES_depth24  }
+     GL_DEPTH_COMPONENT24_OES = $81A6;     
+  { GL_OES_depth32  }
+     GL_DEPTH_COMPONENT32_OES = $81A7;     
+  { GL_OES_depth_texture  }
+  { No new tokens introduced by this extension.  }
+  { GL_OES_EGL_image  }
+
+  type
+
+     GLeglImageOES = pointer;
+  { GL_OES_get_program_binary  }
+
+  const
+     GL_PROGRAM_BINARY_LENGTH_OES = $8741;     
+     GL_NUM_PROGRAM_BINARY_FORMATS_OES = $87FE;     
+     GL_PROGRAM_BINARY_FORMATS_OES = $87FF;     
+  { GL_OES_mapbuffer  }
+     GL_WRITE_ONLY_OES = $88B9;     
+     GL_BUFFER_ACCESS_OES = $88BB;     
+     GL_BUFFER_MAPPED_OES = $88BC;     
+     GL_BUFFER_MAP_POINTER_OES = $88BD;     
+  { GL_OES_packed_depth_stencil  }
+     GL_DEPTH_STENCIL_OES = $84F9;     
+     GL_UNSIGNED_INT_24_8_OES = $84FA;     
+     GL_DEPTH24_STENCIL8_OES = $88F0;     
+  { GL_OES_rgb8_rgba8  }
+     GL_RGB8_OES = $8051;     
+     GL_RGBA8_OES = $8058;     
+  { GL_OES_standard_derivatives  }
+     GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES = $8B8B;     
+  { GL_OES_stencil1  }
+     GL_STENCIL_INDEX1_OES = $8D46;     
+  { GL_OES_stencil4  }
+     GL_STENCIL_INDEX4_OES = $8D47;     
+  { GL_OES_texture3D  }
+     GL_TEXTURE_WRAP_R_OES = $8072;     
+     GL_TEXTURE_3D_OES = $806F;     
+     GL_TEXTURE_BINDING_3D_OES = $806A;     
+     GL_MAX_3D_TEXTURE_SIZE_OES = $8073;     
+     GL_SAMPLER_3D_OES = $8B5F;     
+     GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES = $8CD4;     
+  { GL_OES_texture_half_float  }
+     GL_HALF_FLOAT_OES = $8D61;     
+  { GL_OES_vertex_half_float  }
+  { GL_HALF_FLOAT_OES defined in GL_OES_texture_half_float already.  }
+  { GL_OES_vertex_type_10_10_10_2  }
+     GL_UNSIGNED_INT_10_10_10_2_OES = $8DF6;     
+     GL_INT_10_10_10_2_OES = $8DF7;     
+  {------------------------------------------------------------------------*
+   * AMD extension tokens
+   *------------------------------------------------------------------------ }
+  { GL_AMD_compressed_3DC_texture  }
+     GL_3DC_X_AMD = $87F9;     
+     GL_3DC_XY_AMD = $87FA;     
+  { GL_AMD_compressed_ATC_texture  }
+     GL_ATC_RGB_AMD = $8C92;     
+     GL_ATC_RGBA_EXPLICIT_ALPHA_AMD = $8C93;     
+     GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD = $87EE;     
+  { GL_AMD_program_binary_Z400  }
+     GL_Z400_BINARY_AMD = $8740;     
+  { GL_AMD_performance_monitor  }
+{$define GL_AMD_performance_monitor}  
+     GL_COUNTER_TYPE_AMD = $8BC0;     
+     GL_COUNTER_RANGE_AMD = $8BC1;     
+     GL_UNSIGNED_INT64_AMD = $8BC2;     
+     GL_PERCENTAGE_AMD = $8BC3;     
+     GL_PERFMON_RESULT_AVAILABLE_AMD = $8BC4;     
+     GL_PERFMON_RESULT_SIZE_AMD = $8BC5;     
+     GL_PERFMON_RESULT_AMD = $8BC6;     
+  {------------------------------------------------------------------------*
+   * EXT extension tokens
+   *------------------------------------------------------------------------ }
+  { GL_EXT_texture_filter_anisotropic  }
+     GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE;     
+     GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF;     
+  { GL_EXT_texture_type_2_10_10_10_REV  }
+     GL_UNSIGNED_INT_2_10_10_10_REV_EXT = $8368;     
+  {------------------------------------------------------------------------*
+   * OES extension functions
+   *------------------------------------------------------------------------ }
+  { GL_OES_compressed_ETC1_RGB8_texture  }
+     GL_OES_compressed_ETC1_RGB8_texture = 1;     
+  { GL_OES_compressed_paletted_texture  }
+     GL_OES_compressed_paletted_texture = 1;     
+  { GL_OES_EGL_image  }
+
+  var
+    glEGLImageTargetTexture2DOES : procedure(target:GLenum; image:GLeglImageOES);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glEGLImageTargetRenderbufferStorageOES : procedure(target:GLenum; image:GLeglImageOES);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+
+  { GL_OES_depth24  }
+
+  const
+     GL_OES_depth24 = 1;     
+  { GL_OES_depth32  }
+     GL_OES_depth32 = 1;     
+  { GL_OES_depth_texture  }
+     GL_OES_depth_texture = 1;     
+  { GL_OES_element_index_uint  }
+     GL_OES_element_index_uint = 1;     
+  { GL_OES_fbo_render_mipmap  }
+     GL_OES_fbo_render_mipmap = 1;     
+  { GL_OES_fragment_precision_high  }
+     GL_OES_fragment_precision_high = 1;     
+  { GL_OES_get_program_binary  }
+
+  var
+    glGetProgramBinaryOES : procedure(_program:GLuint; bufSize:GLsizei; length:pGLsizei; binaryFormat:pGLenum; binary:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glProgramBinaryOES : procedure(_program:GLuint; binaryFormat:GLenum; binary:pointer; length:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+
+(* Const before type ignored *)
+  { GL_OES_mapbuffer  }
+
+  const
+     GL_OES_mapbuffer = 1;     
+
+  var
+    glMapBufferOES : function(target:GLenum; access:GLenum):pointer;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glUnmapBufferOES : function(target:GLenum):GLboolean;{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetBufferPointervOES : procedure(target:GLenum; pname:GLenum; params:Ppointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+
+  type
+
+     PFNGLMAPBUFFEROESPROC = pointer;
+  { GL_OES_packed_depth_stencil  }
+
+  const
+     GL_OES_packed_depth_stencil = 1;     
+  { GL_OES_rgb8_rgba8  }
+     GL_OES_rgb8_rgba8 = 1;     
+  { GL_OES_standard_derivatives  }
+     GL_OES_standard_derivatives = 1;     
+  { GL_OES_stencil1  }
+     GL_OES_stencil1 = 1;     
+  { GL_OES_stencil4  }
+     GL_OES_stencil4 = 1;     
+  { GL_OES_texture_3D  }
+     GL_OES_texture_3D = 1;     
+(* Const before type ignored *)
+
+  var
+    glTexImage3DOES : procedure(target:GLenum; level:GLint; internalformat:GLenum; width:GLsizei; height:GLsizei; 
+      depth:GLsizei; border:GLint; format:GLenum; _type:GLenum; pixels:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glTexSubImage3DOES : procedure(target:GLenum; level:GLint; xoffset:GLint; yoffset:GLint; zoffset:GLint; 
+      width:GLsizei; height:GLsizei; depth:GLsizei; format:GLenum; _type:GLenum; 
+      pixels:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glCopyTexSubImage3DOES : procedure(target:GLenum; level:GLint; xoffset:GLint; yoffset:GLint; zoffset:GLint; 
+      x:GLint; y:GLint; width:GLsizei; height:GLsizei);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glCompressedTexImage3DOES : procedure(target:GLenum; level:GLint; internalformat:GLenum; width:GLsizei; height:GLsizei; 
+      depth:GLsizei; border:GLint; imageSize:GLsizei; data:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+    glCompressedTexSubImage3DOES : procedure(target:GLenum; level:GLint; xoffset:GLint; yoffset:GLint; zoffset:GLint; 
+      width:GLsizei; height:GLsizei; depth:GLsizei; format:GLenum; imageSize:GLsizei; 
+      data:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glFramebufferTexture3DOES : procedure(target:GLenum; attachment:GLenum; textarget:GLenum; texture:GLuint; level:GLint; 
+      zoffset:GLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+(* Const before type ignored *)
+
+(* Const before type ignored *)
+(* Const before type ignored *)
+(* Const before type ignored *)
+  { GL_OES_texture_float_linear  }
+
+  const
+     GL_OES_texture_float_linear = 1;     
+  { GL_OES_texture_half_float_linear  }
+     GL_OES_texture_half_float_linear = 1;     
+  { GL_OES_texture_float  }
+     GL_OES_texture_float = 1;     
+  { GL_OES_texture_half_float  }
+     GL_OES_texture_half_float = 1;     
+  { GL_OES_texture_npot  }
+     GL_OES_texture_npot = 1;     
+  { GL_OES_vertex_half_float  }
+     GL_OES_vertex_half_float = 1;     
+  { GL_OES_vertex_type_10_10_10_2  }
+     GL_OES_vertex_type_10_10_10_2 = 1;     
+  {------------------------------------------------------------------------*
+   * AMD extension functions
+   *------------------------------------------------------------------------ }
+  { GL_AMD_compressed_3DC_texture  }
+     GL_AMD_compressed_3DC_texture = 1;     
+  { GL_AMD_compressed_ATC_texture  }
+     GL_AMD_compressed_ATC_texture = 1;     
+  { GL_AMD_program_binary_Z400  }
+     GL_AMD_program_binary_Z400 = 1;     
+  { AMD_performance_monitor  }
+     GL_AMD_performance_monitor = 1;     
+
+  var
+    glGetPerfMonitorGroupsAMD : procedure(numGroups:pGLint; groupsSize:GLsizei; groups:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetPerfMonitorCountersAMD : procedure(group:GLuint; numCounters:pGLint; maxActiveCounters:pGLint; counterSize:GLsizei; counters:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetPerfMonitorGroupStringAMD : procedure(group:GLuint; bufSize:GLsizei; length:pGLsizei; groupString:pchar);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetPerfMonitorCounterStringAMD : procedure(group:GLuint; counter:GLuint; bufSize:GLsizei; length:pGLsizei; counterString:pchar);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetPerfMonitorCounterInfoAMD : procedure(group:GLuint; counter:GLuint; pname:GLenum; data:pointer);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGenPerfMonitorsAMD : procedure(n:GLsizei; monitors:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glDeletePerfMonitorsAMD : procedure(n:GLsizei; monitors:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glSelectPerfMonitorCountersAMD : procedure(monitor:GLuint; enable:GLboolean; group:GLuint; numCounters:GLint; countersList:pGLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glBeginPerfMonitorAMD : procedure(monitor:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glEndPerfMonitorAMD : procedure(monitor:GLuint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+    glGetPerfMonitorCounterDataAMD : procedure(monitor:GLuint; pname:GLenum; dataSize:GLsizei; data:pGLuint; bytesWritten:pGLint);{$ifdef windows}stdcall;{$else}cdecl;{$endif}
+
+  {------------------------------------------------------------------------*
+   * EXT extension functions
+   *------------------------------------------------------------------------ }
+  { GL_EXT_texture_filter_anisotropic  }
+
+  const
+     GL_EXT_texture_filter_anisotropic = 1;     
+  { GL_EXT_texture_type_2_10_10_10_REV  }
+     GL_EXT_texture_type_2_10_10_10_REV = 1;     
+
+function glGetProcAddress(ahlib:tlibhandle;ProcName:pchar):pointer;
+
+implementation
+
+  function glGetProcAddress(ahlib:tlibhandle;ProcName:pchar):pointer;
+    begin
+      result:=GetProcAddress(ahlib,ProcName);
+{$ifdef EGL}
+      if assigned(eglGetProcAddress) and not assigned(result) then
+        result:=eglGetProcAddress(ProcName);
+{$endif}
+    end;
+
+{$ifdef EGL}
+  { was #define dname def_expr }
+  function EGL_DEFAULT_DISPLAY : EGLNativeDisplayType;
+      begin
+         EGL_DEFAULT_DISPLAY:=EGLNativeDisplayType(0);
+      end;
+
+  { was #define dname def_expr }
+  function EGL_NO_CONTEXT : EGLContext;
+      begin
+         EGL_NO_CONTEXT:=EGLContext(0);
+      end;
+
+  { was #define dname def_expr }
+  function EGL_NO_DISPLAY : EGLDisplay;
+      begin
+         EGL_NO_DISPLAY:=EGLDisplay(0);
+      end;
+
+  { was #define dname def_expr }
+  function EGL_NO_SURFACE : EGLSurface;
+      begin
+         EGL_NO_SURFACE:=EGLSurface(0);
+      end;
+
+  { was #define dname def_expr }
+  function EGL_DONT_CARE : EGLint;
+      begin
+         EGL_DONT_CARE:=EGLint(-(1));
+      end;
+
+  { was #define dname def_expr }
+  function EGL_UNKNOWN : EGLint;
+      begin
+         EGL_UNKNOWN:=EGLint(-(1));
+      end;
+
+  { was #define dname def_expr }
+  function EGL_NO_IMAGE_KHR : EGLImageKHR;
+      begin
+         EGL_NO_IMAGE_KHR:=EGLImageKHR(0);
+      end;
+
+
+  var
+    EGLLib : tlibhandle;
+
+
+  procedure FreeEGL;
+    begin
+      if EGLLib<>0 then
+        FreeLibrary(EGLLib);
+
+      eglGetError:=nil;
+      eglGetDisplay:=nil;
+      eglInitialize:=nil;
+      eglTerminate:=nil;
+      eglQueryString:=nil;
+      eglGetConfigs:=nil;
+      eglChooseConfig:=nil;
+      eglGetConfigAttrib:=nil;
+      eglCreateWindowSurface:=nil;
+      eglCreatePbufferSurface:=nil;
+      eglCreatePixmapSurface:=nil;
+      eglDestroySurface:=nil;
+      eglQuerySurface:=nil;
+      eglBindAPI:=nil;
+      eglQueryAPI:=nil;
+      eglWaitClient:=nil;
+      eglReleaseThread:=nil;
+      eglCreatePbufferFromClientBuffer:=nil;
+      eglSurfaceAttrib:=nil;
+      eglBindTexImage:=nil;
+      eglReleaseTexImage:=nil;
+      eglSwapInterval:=nil;
+      eglCreateContext:=nil;
+      eglDestroyContext:=nil;
+      eglMakeCurrent:=nil;
+      eglGetCurrentContext:=nil;
+      eglGetCurrentSurface:=nil;
+      eglGetCurrentDisplay:=nil;
+      eglQueryContext:=nil;
+      eglWaitGL:=nil;
+      eglWaitNative:=nil;
+      eglSwapBuffers:=nil;
+      eglCopyBuffers:=nil;
+      eglGetProcAddress:=nil;
+    end;
+
+
+  procedure LoadEGL(lib : pchar);
+    begin
+      FreeEGL;
+      EGLLib:=LoadLibrary(lib);
+      if EGLLib=0 then
+        raise Exception.Create(format('Could not load library: %s',[lib]));
+
+      pointer(eglGetProcAddress):=GetProcAddress(EGLLib,'glGetProcAddress');
+      
+      pointer(eglGetError):=glGetProcAddress(EGLLib,'eglGetError');
+      pointer(eglGetDisplay):=glGetProcAddress(EGLLib,'eglGetDisplay');
+      pointer(eglInitialize):=glGetProcAddress(EGLLib,'eglInitialize');
+      pointer(eglTerminate):=glGetProcAddress(EGLLib,'eglTerminate');
+      pointer(eglQueryString):=glGetProcAddress(EGLLib,'eglQueryString');
+      pointer(eglGetConfigs):=glGetProcAddress(EGLLib,'eglGetConfigs');
+      pointer(eglChooseConfig):=glGetProcAddress(EGLLib,'eglChooseConfig');
+      pointer(eglGetConfigAttrib):=glGetProcAddress(EGLLib,'eglGetConfigAttrib');
+      pointer(eglCreateWindowSurface):=glGetProcAddress(EGLLib,'eglCreateWindowSurface');
+      pointer(eglCreatePbufferSurface):=glGetProcAddress(EGLLib,'eglCreatePbufferSurface');
+      pointer(eglCreatePixmapSurface):=glGetProcAddress(EGLLib,'eglCreatePixmapSurface');
+      pointer(eglDestroySurface):=glGetProcAddress(EGLLib,'eglDestroySurface');
+      pointer(eglQuerySurface):=glGetProcAddress(EGLLib,'eglQuerySurface');
+      pointer(eglBindAPI):=glGetProcAddress(EGLLib,'eglBindAPI');
+      pointer(eglQueryAPI):=glGetProcAddress(EGLLib,'eglQueryAPI');
+      pointer(eglWaitClient):=glGetProcAddress(EGLLib,'eglWaitClient');
+      pointer(eglReleaseThread):=glGetProcAddress(EGLLib,'eglReleaseThread');
+      pointer(eglCreatePbufferFromClientBuffer):=glGetProcAddress(EGLLib,'eglCreatePbufferFromClientBuffer');
+      pointer(eglSurfaceAttrib):=glGetProcAddress(EGLLib,'eglSurfaceAttrib');
+      pointer(eglBindTexImage):=glGetProcAddress(EGLLib,'eglBindTexImage');
+      pointer(eglReleaseTexImage):=glGetProcAddress(EGLLib,'eglReleaseTexImage');
+      pointer(eglSwapInterval):=glGetProcAddress(EGLLib,'eglSwapInterval');
+      pointer(eglCreateContext):=glGetProcAddress(EGLLib,'eglCreateContext');
+      pointer(eglDestroyContext):=glGetProcAddress(EGLLib,'eglDestroyContext');
+      pointer(eglMakeCurrent):=glGetProcAddress(EGLLib,'eglMakeCurrent');
+      pointer(eglGetCurrentContext):=glGetProcAddress(EGLLib,'eglGetCurrentContext');
+      pointer(eglGetCurrentSurface):=glGetProcAddress(EGLLib,'eglGetCurrentSurface');
+      pointer(eglGetCurrentDisplay):=glGetProcAddress(EGLLib,'eglGetCurrentDisplay');
+      pointer(eglQueryContext):=glGetProcAddress(EGLLib,'eglQueryContext');
+      pointer(eglWaitGL):=glGetProcAddress(EGLLib,'eglWaitGL');
+      pointer(eglWaitNative):=glGetProcAddress(EGLLib,'eglWaitNative');
+      pointer(eglSwapBuffers):=glGetProcAddress(EGLLib,'eglSwapBuffers');
+      pointer(eglCopyBuffers):=glGetProcAddress(EGLLib,'eglCopyBuffers');
+    end;
+{$endif EGL}
+
+  var
+    GLESv2Lib : tlibhandle;
+
+  procedure FreeGLESv2;
+    begin
+      if GLESv2Lib<>0 then
+        FreeLibrary(GLESv2Lib);
+
+      glActiveTexture:=nil;
+      glAttachShader:=nil;
+      glBindAttribLocation:=nil;
+      glBindBuffer:=nil;
+      glBindFramebuffer:=nil;
+      glBindRenderbuffer:=nil;
+      glBindTexture:=nil;
+      glBlendColor:=nil;
+      glBlendEquation:=nil;
+      glBlendEquationSeparate:=nil;
+      glBlendFunc:=nil;
+      glBlendFuncSeparate:=nil;
+      glBufferData:=nil;
+      glBufferSubData:=nil;
+      glCheckFramebufferStatus:=nil;
+      glClear:=nil;
+      glClearColor:=nil;
+      glClearDepthf:=nil;
+      glClearStencil:=nil;
+      glColorMask:=nil;
+      glCompileShader:=nil;
+      glCompressedTexImage2D:=nil;
+      glCompressedTexSubImage2D:=nil;
+      glCopyTexImage2D:=nil;
+      glCopyTexSubImage2D:=nil;
+      glCreateProgram:=nil;
+      glCreateShader:=nil;
+      glCullFace:=nil;
+      glDeleteBuffers:=nil;
+      glDeleteFramebuffers:=nil;
+      glDeleteProgram:=nil;
+      glDeleteRenderbuffers:=nil;
+      glDeleteShader:=nil;
+      glDeleteTextures:=nil;
+      glDepthFunc:=nil;
+      glDepthMask:=nil;
+      glDepthRangef:=nil;
+      glDetachShader:=nil;
+      glDisable:=nil;
+      glDisableVertexAttribArray:=nil;
+      glDrawArrays:=nil;
+      glDrawElements:=nil;
+      glEnable:=nil;
+      glEnableVertexAttribArray:=nil;
+      glFinish:=nil;
+      glFlush:=nil;
+      glFramebufferRenderbuffer:=nil;
+      glFramebufferTexture2D:=nil;
+      glFrontFace:=nil;
+      glGenBuffers:=nil;
+      glGenerateMipmap:=nil;
+      glGenFramebuffers:=nil;
+      glGenRenderbuffers:=nil;
+      glGenTextures:=nil;
+      glGetActiveAttrib:=nil;
+      glGetActiveUniform:=nil;
+      glGetAttachedShaders:=nil;
+      glGetAttribLocation:=nil;
+      glGetBooleanv:=nil;
+      glGetBufferParameteriv:=nil;
+      glGetError:=nil;
+      glGetFloatv:=nil;
+      glGetFramebufferAttachmentParameteriv:=nil;
+      glGetIntegerv:=nil;
+      glGetProgramiv:=nil;
+      glGetProgramInfoLog:=nil;
+      glGetRenderbufferParameteriv:=nil;
+      glGetShaderiv:=nil;
+      glGetShaderInfoLog:=nil;
+      glGetShaderPrecisionFormat:=nil;
+      glGetShaderSource:=nil;
+      glGetString:=nil;
+      glGetTexParameterfv:=nil;
+      glGetTexParameteriv:=nil;
+      glGetUniformfv:=nil;
+      glGetUniformiv:=nil;
+      glGetUniformLocation:=nil;
+      glGetVertexAttribfv:=nil;
+      glGetVertexAttribiv:=nil;
+      glGetVertexAttribPointerv:=nil;
+      glHint:=nil;
+      glIsBuffer:=nil;
+      glIsEnabled:=nil;
+      glIsFramebuffer:=nil;
+      glIsProgram:=nil;
+      glIsRenderbuffer:=nil;
+      glIsShader:=nil;
+      glIsTexture:=nil;
+      glLineWidth:=nil;
+      glLinkProgram:=nil;
+      glPixelStorei:=nil;
+      glPolygonOffset:=nil;
+      glReadPixels:=nil;
+      glReleaseShaderCompiler:=nil;
+      glRenderbufferStorage:=nil;
+      glSampleCoverage:=nil;
+      glScissor:=nil;
+      glShaderBinary:=nil;
+      glShaderSource:=nil;
+      glStencilFunc:=nil;
+      glStencilFuncSeparate:=nil;
+      glStencilMask:=nil;
+      glStencilMaskSeparate:=nil;
+      glStencilOp:=nil;
+      glStencilOpSeparate:=nil;
+      glTexImage2D:=nil;
+      glTexParameterf:=nil;
+      glTexParameterfv:=nil;
+      glTexParameteri:=nil;
+      glTexParameteriv:=nil;
+      glTexSubImage2D:=nil;
+      glUniform1f:=nil;
+      glUniform1fv:=nil;
+      glUniform1i:=nil;
+      glUniform1iv:=nil;
+      glUniform2f:=nil;
+      glUniform2fv:=nil;
+      glUniform2i:=nil;
+      glUniform2iv:=nil;
+      glUniform3f:=nil;
+      glUniform3fv:=nil;
+      glUniform3i:=nil;
+      glUniform3iv:=nil;
+      glUniform4f:=nil;
+      glUniform4fv:=nil;
+      glUniform4i:=nil;
+      glUniform4iv:=nil;
+      glUniformMatrix2fv:=nil;
+      glUniformMatrix3fv:=nil;
+      glUniformMatrix4fv:=nil;
+      glUseProgram:=nil;
+      glValidateProgram:=nil;
+      glVertexAttrib1f:=nil;
+      glVertexAttrib1fv:=nil;
+      glVertexAttrib2f:=nil;
+      glVertexAttrib2fv:=nil;
+      glVertexAttrib3f:=nil;
+      glVertexAttrib3fv:=nil;
+      glVertexAttrib4f:=nil;
+      glVertexAttrib4fv:=nil;
+      glVertexAttribPointer:=nil;
+      glViewport:=nil;
+      glEGLImageTargetTexture2DOES:=nil;
+      glEGLImageTargetRenderbufferStorageOES:=nil;
+      glGetProgramBinaryOES:=nil;
+      glProgramBinaryOES:=nil;
+      glMapBufferOES:=nil;
+      glUnmapBufferOES:=nil;
+      glGetBufferPointervOES:=nil;
+      glTexImage3DOES:=nil;
+      glTexSubImage3DOES:=nil;
+      glCopyTexSubImage3DOES:=nil;
+      glCompressedTexImage3DOES:=nil;
+      glCompressedTexSubImage3DOES:=nil;
+      glFramebufferTexture3DOES:=nil;
+      glGetPerfMonitorGroupsAMD:=nil;
+      glGetPerfMonitorCountersAMD:=nil;
+      glGetPerfMonitorGroupStringAMD:=nil;
+      glGetPerfMonitorCounterStringAMD:=nil;
+      glGetPerfMonitorCounterInfoAMD:=nil;
+      glGenPerfMonitorsAMD:=nil;
+      glDeletePerfMonitorsAMD:=nil;
+      glSelectPerfMonitorCountersAMD:=nil;
+      glBeginPerfMonitorAMD:=nil;
+      glEndPerfMonitorAMD:=nil;
+      glGetPerfMonitorCounterDataAMD:=nil;
+    end;
+
+
+  procedure LoadGLESv2(lib : pchar);
+    begin
+      FreeGLESv2;
+      GLESv2Lib:=LoadLibrary(lib);
+      if GLESv2Lib=0 then
+        raise Exception.Create(format('Could not load library: %s',[lib]));
+
+      pointer(glActiveTexture):=glGetProcAddress(GLESv2Lib,'glActiveTexture');
+      pointer(glAttachShader):=glGetProcAddress(GLESv2Lib,'glAttachShader');
+      pointer(glBindAttribLocation):=glGetProcAddress(GLESv2Lib,'glBindAttribLocation');
+      pointer(glBindBuffer):=glGetProcAddress(GLESv2Lib,'glBindBuffer');
+      pointer(glBindFramebuffer):=glGetProcAddress(GLESv2Lib,'glBindFramebuffer');
+      pointer(glBindRenderbuffer):=glGetProcAddress(GLESv2Lib,'glBindRenderbuffer');
+      pointer(glBindTexture):=glGetProcAddress(GLESv2Lib,'glBindTexture');
+      pointer(glBlendColor):=glGetProcAddress(GLESv2Lib,'glBlendColor');
+      pointer(glBlendEquation):=glGetProcAddress(GLESv2Lib,'glBlendEquation');
+      pointer(glBlendEquationSeparate):=glGetProcAddress(GLESv2Lib,'glBlendEquationSeparate');
+      pointer(glBlendFunc):=glGetProcAddress(GLESv2Lib,'glBlendFunc');
+      pointer(glBlendFuncSeparate):=glGetProcAddress(GLESv2Lib,'glBlendFuncSeparate');
+      pointer(glBufferData):=glGetProcAddress(GLESv2Lib,'glBufferData');
+      pointer(glBufferSubData):=glGetProcAddress(GLESv2Lib,'glBufferSubData');
+      pointer(glCheckFramebufferStatus):=glGetProcAddress(GLESv2Lib,'glCheckFramebufferStatus');
+      pointer(glClear):=glGetProcAddress(GLESv2Lib,'glClear');
+      pointer(glClearColor):=glGetProcAddress(GLESv2Lib,'glClearColor');
+      pointer(glClearDepthf):=glGetProcAddress(GLESv2Lib,'glClearDepthf');
+      pointer(glClearStencil):=glGetProcAddress(GLESv2Lib,'glClearStencil');
+      pointer(glColorMask):=glGetProcAddress(GLESv2Lib,'glColorMask');
+      pointer(glCompileShader):=glGetProcAddress(GLESv2Lib,'glCompileShader');
+      pointer(glCompressedTexImage2D):=glGetProcAddress(GLESv2Lib,'glCompressedTexImage2D');
+      pointer(glCompressedTexSubImage2D):=glGetProcAddress(GLESv2Lib,'glCompressedTexSubImage2D');
+      pointer(glCopyTexImage2D):=glGetProcAddress(GLESv2Lib,'glCopyTexImage2D');
+      pointer(glCopyTexSubImage2D):=glGetProcAddress(GLESv2Lib,'glCopyTexSubImage2D');
+      pointer(glCreateProgram):=glGetProcAddress(GLESv2Lib,'glCreateProgram');
+      pointer(glCreateShader):=glGetProcAddress(GLESv2Lib,'glCreateShader');
+      pointer(glCullFace):=glGetProcAddress(GLESv2Lib,'glCullFace');
+      pointer(glDeleteBuffers):=glGetProcAddress(GLESv2Lib,'glDeleteBuffers');
+      pointer(glDeleteFramebuffers):=glGetProcAddress(GLESv2Lib,'glDeleteFramebuffers');
+      pointer(glDeleteProgram):=glGetProcAddress(GLESv2Lib,'glDeleteProgram');
+      pointer(glDeleteRenderbuffers):=glGetProcAddress(GLESv2Lib,'glDeleteRenderbuffers');
+      pointer(glDeleteShader):=glGetProcAddress(GLESv2Lib,'glDeleteShader');
+      pointer(glDeleteTextures):=glGetProcAddress(GLESv2Lib,'glDeleteTextures');
+      pointer(glDepthFunc):=glGetProcAddress(GLESv2Lib,'glDepthFunc');
+      pointer(glDepthMask):=glGetProcAddress(GLESv2Lib,'glDepthMask');
+      pointer(glDepthRangef):=glGetProcAddress(GLESv2Lib,'glDepthRangef');
+      pointer(glDetachShader):=glGetProcAddress(GLESv2Lib,'glDetachShader');
+      pointer(glDisable):=glGetProcAddress(GLESv2Lib,'glDisable');
+      pointer(glDisableVertexAttribArray):=glGetProcAddress(GLESv2Lib,'glDisableVertexAttribArray');
+      pointer(glDrawArrays):=glGetProcAddress(GLESv2Lib,'glDrawArrays');
+      pointer(glDrawElements):=glGetProcAddress(GLESv2Lib,'glDrawElements');
+      pointer(glEnable):=glGetProcAddress(GLESv2Lib,'glEnable');
+      pointer(glEnableVertexAttribArray):=glGetProcAddress(GLESv2Lib,'glEnableVertexAttribArray');
+      pointer(glFinish):=glGetProcAddress(GLESv2Lib,'glFinish');
+      pointer(glFlush):=glGetProcAddress(GLESv2Lib,'glFlush');
+      pointer(glFramebufferRenderbuffer):=glGetProcAddress(GLESv2Lib,'glFramebufferRenderbuffer');
+      pointer(glFramebufferTexture2D):=glGetProcAddress(GLESv2Lib,'glFramebufferTexture2D');
+      pointer(glFrontFace):=glGetProcAddress(GLESv2Lib,'glFrontFace');
+      pointer(glGenBuffers):=glGetProcAddress(GLESv2Lib,'glGenBuffers');
+      pointer(glGenerateMipmap):=glGetProcAddress(GLESv2Lib,'glGenerateMipmap');
+      pointer(glGenFramebuffers):=glGetProcAddress(GLESv2Lib,'glGenFramebuffers');
+      pointer(glGenRenderbuffers):=glGetProcAddress(GLESv2Lib,'glGenRenderbuffers');
+      pointer(glGenTextures):=glGetProcAddress(GLESv2Lib,'glGenTextures');
+      pointer(glGetActiveAttrib):=glGetProcAddress(GLESv2Lib,'glGetActiveAttrib');
+      pointer(glGetActiveUniform):=glGetProcAddress(GLESv2Lib,'glGetActiveUniform');
+      pointer(glGetAttachedShaders):=glGetProcAddress(GLESv2Lib,'glGetAttachedShaders');
+      pointer(glGetAttribLocation):=glGetProcAddress(GLESv2Lib,'glGetAttribLocation');
+      pointer(glGetBooleanv):=glGetProcAddress(GLESv2Lib,'glGetBooleanv');
+      pointer(glGetBufferParameteriv):=glGetProcAddress(GLESv2Lib,'glGetBufferParameteriv');
+      pointer(glGetError):=glGetProcAddress(GLESv2Lib,'glGetError');
+      pointer(glGetFloatv):=glGetProcAddress(GLESv2Lib,'glGetFloatv');
+      pointer(glGetFramebufferAttachmentParameteriv):=glGetProcAddress(GLESv2Lib,'glGetFramebufferAttachmentParameteriv');
+      pointer(glGetIntegerv):=glGetProcAddress(GLESv2Lib,'glGetIntegerv');
+      pointer(glGetProgramiv):=glGetProcAddress(GLESv2Lib,'glGetProgramiv');
+      pointer(glGetProgramInfoLog):=glGetProcAddress(GLESv2Lib,'glGetProgramInfoLog');
+      pointer(glGetRenderbufferParameteriv):=glGetProcAddress(GLESv2Lib,'glGetRenderbufferParameteriv');
+      pointer(glGetShaderiv):=glGetProcAddress(GLESv2Lib,'glGetShaderiv');
+      pointer(glGetShaderInfoLog):=glGetProcAddress(GLESv2Lib,'glGetShaderInfoLog');
+      pointer(glGetShaderPrecisionFormat):=glGetProcAddress(GLESv2Lib,'glGetShaderPrecisionFormat');
+      pointer(glGetShaderSource):=glGetProcAddress(GLESv2Lib,'glGetShaderSource');
+      pointer(glGetString):=glGetProcAddress(GLESv2Lib,'glGetString');
+      pointer(glGetTexParameterfv):=glGetProcAddress(GLESv2Lib,'glGetTexParameterfv');
+      pointer(glGetTexParameteriv):=glGetProcAddress(GLESv2Lib,'glGetTexParameteriv');
+      pointer(glGetUniformfv):=glGetProcAddress(GLESv2Lib,'glGetUniformfv');
+      pointer(glGetUniformiv):=glGetProcAddress(GLESv2Lib,'glGetUniformiv');
+      pointer(glGetUniformLocation):=glGetProcAddress(GLESv2Lib,'glGetUniformLocation');
+      pointer(glGetVertexAttribfv):=glGetProcAddress(GLESv2Lib,'glGetVertexAttribfv');
+      pointer(glGetVertexAttribiv):=glGetProcAddress(GLESv2Lib,'glGetVertexAttribiv');
+      pointer(glGetVertexAttribPointerv):=glGetProcAddress(GLESv2Lib,'glGetVertexAttribPointerv');
+      pointer(glHint):=glGetProcAddress(GLESv2Lib,'glHint');
+      pointer(glIsBuffer):=glGetProcAddress(GLESv2Lib,'glIsBuffer');
+      pointer(glIsEnabled):=glGetProcAddress(GLESv2Lib,'glIsEnabled');
+      pointer(glIsFramebuffer):=glGetProcAddress(GLESv2Lib,'glIsFramebuffer');
+      pointer(glIsProgram):=glGetProcAddress(GLESv2Lib,'glIsProgram');
+      pointer(glIsRenderbuffer):=glGetProcAddress(GLESv2Lib,'glIsRenderbuffer');
+      pointer(glIsShader):=glGetProcAddress(GLESv2Lib,'glIsShader');
+      pointer(glIsTexture):=glGetProcAddress(GLESv2Lib,'glIsTexture');
+      pointer(glLineWidth):=glGetProcAddress(GLESv2Lib,'glLineWidth');
+      pointer(glLinkProgram):=glGetProcAddress(GLESv2Lib,'glLinkProgram');
+      pointer(glPixelStorei):=glGetProcAddress(GLESv2Lib,'glPixelStorei');
+      pointer(glPolygonOffset):=glGetProcAddress(GLESv2Lib,'glPolygonOffset');
+      pointer(glReadPixels):=glGetProcAddress(GLESv2Lib,'glReadPixels');
+      pointer(glReleaseShaderCompiler):=glGetProcAddress(GLESv2Lib,'glReleaseShaderCompiler');
+      pointer(glRenderbufferStorage):=glGetProcAddress(GLESv2Lib,'glRenderbufferStorage');
+      pointer(glSampleCoverage):=glGetProcAddress(GLESv2Lib,'glSampleCoverage');
+      pointer(glScissor):=glGetProcAddress(GLESv2Lib,'glScissor');
+      pointer(glShaderBinary):=glGetProcAddress(GLESv2Lib,'glShaderBinary');
+      pointer(glShaderSource):=glGetProcAddress(GLESv2Lib,'glShaderSource');
+      pointer(glStencilFunc):=glGetProcAddress(GLESv2Lib,'glStencilFunc');
+      pointer(glStencilFuncSeparate):=glGetProcAddress(GLESv2Lib,'glStencilFuncSeparate');
+      pointer(glStencilMask):=glGetProcAddress(GLESv2Lib,'glStencilMask');
+      pointer(glStencilMaskSeparate):=glGetProcAddress(GLESv2Lib,'glStencilMaskSeparate');
+      pointer(glStencilOp):=glGetProcAddress(GLESv2Lib,'glStencilOp');
+      pointer(glStencilOpSeparate):=glGetProcAddress(GLESv2Lib,'glStencilOpSeparate');
+      pointer(glTexImage2D):=glGetProcAddress(GLESv2Lib,'glTexImage2D');
+      pointer(glTexParameterf):=glGetProcAddress(GLESv2Lib,'glTexParameterf');
+      pointer(glTexParameterfv):=glGetProcAddress(GLESv2Lib,'glTexParameterfv');
+      pointer(glTexParameteri):=glGetProcAddress(GLESv2Lib,'glTexParameteri');
+      pointer(glTexParameteriv):=glGetProcAddress(GLESv2Lib,'glTexParameteriv');
+      pointer(glTexSubImage2D):=glGetProcAddress(GLESv2Lib,'glTexSubImage2D');
+      pointer(glUniform1f):=glGetProcAddress(GLESv2Lib,'glUniform1f');
+      pointer(glUniform1fv):=glGetProcAddress(GLESv2Lib,'glUniform1fv');
+      pointer(glUniform1i):=glGetProcAddress(GLESv2Lib,'glUniform1i');
+      pointer(glUniform1iv):=glGetProcAddress(GLESv2Lib,'glUniform1iv');
+      pointer(glUniform2f):=glGetProcAddress(GLESv2Lib,'glUniform2f');
+      pointer(glUniform2fv):=glGetProcAddress(GLESv2Lib,'glUniform2fv');
+      pointer(glUniform2i):=glGetProcAddress(GLESv2Lib,'glUniform2i');
+      pointer(glUniform2iv):=glGetProcAddress(GLESv2Lib,'glUniform2iv');
+      pointer(glUniform3f):=glGetProcAddress(GLESv2Lib,'glUniform3f');
+      pointer(glUniform3fv):=glGetProcAddress(GLESv2Lib,'glUniform3fv');
+      pointer(glUniform3i):=glGetProcAddress(GLESv2Lib,'glUniform3i');
+      pointer(glUniform3iv):=glGetProcAddress(GLESv2Lib,'glUniform3iv');
+      pointer(glUniform4f):=glGetProcAddress(GLESv2Lib,'glUniform4f');
+      pointer(glUniform4fv):=glGetProcAddress(GLESv2Lib,'glUniform4fv');
+      pointer(glUniform4i):=glGetProcAddress(GLESv2Lib,'glUniform4i');
+      pointer(glUniform4iv):=glGetProcAddress(GLESv2Lib,'glUniform4iv');
+      pointer(glUniformMatrix2fv):=glGetProcAddress(GLESv2Lib,'glUniformMatrix2fv');
+      pointer(glUniformMatrix3fv):=glGetProcAddress(GLESv2Lib,'glUniformMatrix3fv');
+      pointer(glUniformMatrix4fv):=glGetProcAddress(GLESv2Lib,'glUniformMatrix4fv');
+      pointer(glUseProgram):=glGetProcAddress(GLESv2Lib,'glUseProgram');
+      pointer(glValidateProgram):=glGetProcAddress(GLESv2Lib,'glValidateProgram');
+      pointer(glVertexAttrib1f):=glGetProcAddress(GLESv2Lib,'glVertexAttrib1f');
+      pointer(glVertexAttrib1fv):=glGetProcAddress(GLESv2Lib,'glVertexAttrib1fv');
+      pointer(glVertexAttrib2f):=glGetProcAddress(GLESv2Lib,'glVertexAttrib2f');
+      pointer(glVertexAttrib2fv):=glGetProcAddress(GLESv2Lib,'glVertexAttrib2fv');
+      pointer(glVertexAttrib3f):=glGetProcAddress(GLESv2Lib,'glVertexAttrib3f');
+      pointer(glVertexAttrib3fv):=glGetProcAddress(GLESv2Lib,'glVertexAttrib3fv');
+      pointer(glVertexAttrib4f):=glGetProcAddress(GLESv2Lib,'glVertexAttrib4f');
+      pointer(glVertexAttrib4fv):=glGetProcAddress(GLESv2Lib,'glVertexAttrib4fv');
+      pointer(glVertexAttribPointer):=glGetProcAddress(GLESv2Lib,'glVertexAttribPointer');
+      pointer(glViewport):=glGetProcAddress(GLESv2Lib,'glViewport');
+      pointer(glEGLImageTargetTexture2DOES):=glGetProcAddress(GLESv2Lib,'glEGLImageTargetTexture2DOES');
+      pointer(glEGLImageTargetRenderbufferStorageOES):=glGetProcAddress(GLESv2Lib,'glEGLImageTargetRenderbufferStorageOES');
+      pointer(glGetProgramBinaryOES):=glGetProcAddress(GLESv2Lib,'glGetProgramBinaryOES');
+      pointer(glProgramBinaryOES):=glGetProcAddress(GLESv2Lib,'glProgramBinaryOES');
+      pointer(glMapBufferOES):=glGetProcAddress(GLESv2Lib,'glMapBufferOES');
+      pointer(glUnmapBufferOES):=glGetProcAddress(GLESv2Lib,'glUnmapBufferOES');
+      pointer(glGetBufferPointervOES):=glGetProcAddress(GLESv2Lib,'glGetBufferPointervOES');
+      pointer(glTexImage3DOES):=glGetProcAddress(GLESv2Lib,'glTexImage3DOES');
+      pointer(glTexSubImage3DOES):=glGetProcAddress(GLESv2Lib,'glTexSubImage3DOES');
+      pointer(glCopyTexSubImage3DOES):=glGetProcAddress(GLESv2Lib,'glCopyTexSubImage3DOES');
+      pointer(glCompressedTexImage3DOES):=glGetProcAddress(GLESv2Lib,'glCompressedTexImage3DOES');
+      pointer(glCompressedTexSubImage3DOES):=glGetProcAddress(GLESv2Lib,'glCompressedTexSubImage3DOES');
+      pointer(glFramebufferTexture3DOES):=glGetProcAddress(GLESv2Lib,'glFramebufferTexture3DOES');
+      pointer(glGetPerfMonitorGroupsAMD):=glGetProcAddress(GLESv2Lib,'glGetPerfMonitorGroupsAMD');
+      pointer(glGetPerfMonitorCountersAMD):=glGetProcAddress(GLESv2Lib,'glGetPerfMonitorCountersAMD');
+      pointer(glGetPerfMonitorGroupStringAMD):=glGetProcAddress(GLESv2Lib,'glGetPerfMonitorGroupStringAMD');
+      pointer(glGetPerfMonitorCounterStringAMD):=glGetProcAddress(GLESv2Lib,'glGetPerfMonitorCounterStringAMD');
+      pointer(glGetPerfMonitorCounterInfoAMD):=glGetProcAddress(GLESv2Lib,'glGetPerfMonitorCounterInfoAMD');
+      pointer(glGenPerfMonitorsAMD):=glGetProcAddress(GLESv2Lib,'glGenPerfMonitorsAMD');
+      pointer(glDeletePerfMonitorsAMD):=glGetProcAddress(GLESv2Lib,'glDeletePerfMonitorsAMD');
+      pointer(glSelectPerfMonitorCountersAMD):=glGetProcAddress(GLESv2Lib,'glSelectPerfMonitorCountersAMD');
+      pointer(glBeginPerfMonitorAMD):=glGetProcAddress(GLESv2Lib,'glBeginPerfMonitorAMD');
+      pointer(glEndPerfMonitorAMD):=glGetProcAddress(GLESv2Lib,'glEndPerfMonitorAMD');
+      pointer(glGetPerfMonitorCounterDataAMD):=glGetProcAddress(GLESv2Lib,'glGetPerfMonitorCounterDataAMD');
+    end;
+
+
+initialization
+{$ifdef EGL}
+  EGLLib:=0;
+  LoadEGL({$ifdef windows}'libEGL.dll'{$else}'libEGL.so'{$endif});
+{$endif}
+  GLESv2Lib:=0;
+  LoadGLESv2({$ifdef darwin}'/System/Library/Frameworks/OpenGLES.framework/OpenGLES'{$else}{$ifdef windows}'libGLESv2.dll'{$else}'libGLESv2.so'{$endif}{$endif});
+finalization
+  FreeGLESv2;
+{$ifdef EGL}
+  FreeEGL;
+{$endif}
+end.

+ 4 - 2
packages/regexpr/src/regex.pp

@@ -542,10 +542,12 @@ var
   Ch     : AnsiChar;
   State  : integer;
   StrInx : integer;
+  LenStr : integer;
 begin
   {assume we fail to match}
   Result := false;
   Len := StartPosn;
+  LenStr := Length(s);
   {clear the deque}
   FHead := FCapacity div 2;
   FTail := FHead;
@@ -628,14 +630,14 @@ begin
           end;
       end;
     end;
-  until (FHead = FTail) or (ch = #0); // deque empty or end of string
+  until (FHead = FTail) or (StrInx > LenStr); // deque empty or end of string
   {if we reach this point we've either exhausted the deque or we've
    run out of string; if the former, the substring did not match
    since there are no more states. If the latter, we need to check
    the states left on the deque to see if one is the terminating
    state; if so the string matched the regular expression defined by
    the transition table}
-  while (FHead <> FTail) do begin
+  while (FHead <> FTail) and (StrInx<=LenStr) do begin
     State := DequePop;
     with FStateTable[State] do begin
       case sdMatchType of

+ 5 - 5
utils/fpdoc/dglobals.pp

@@ -793,7 +793,7 @@ var
        end
      else
        if cls<>result then
-         writeln(cls.name,'''s dependency '  ,clname,' could not be resolved');
+         writeln('Warning : ancestor class ',clname,' of class ',cls.name,' could not be resolved');
 end;
 
 function CreateAliasType (alname,clname : string;parentclass:TPasClassType; out cl2 :TPasClassType):TPasAliasType;
@@ -813,11 +813,11 @@ begin
         result:=ResolveAliasType(clname);
         if assigned(result) then
           begin
-            writeln('found alias ',clname,' (',s,') ',result.classname);  
+//            writeln('found alias ',clname,' (',s,') ',result.classname);  
           end
         else
           begin
-            writeln('new alias ',clname,' (',s,') ');
+//            writeln('new alias ',clname,' (',s,') ');
             cl2.addref;
             Result := TPasAliasType(CreateElement(TPasAliasType,s,module.interfacesection,vispublic,'',0));
             module.interfacesection.Declarations.Add(Result);
@@ -853,7 +853,7 @@ end;
                  begin
                    // writeln('Found alias pair ',clname,' = ',alname);   
                    if not assigned(CreateAliasType(alname,clname,cls,cls2)) then
-                      writeln('creating alias failed!');
+                      writeln('Warning: creating alias ',alname,' for ',clname,' failed!');
                  end 
                else
                  cls2:=ResolveAndLinkClass(clname,j=0,cls);
@@ -1192,7 +1192,7 @@ var
   end;
 
 begin
-//system.WriteLn('ResolveLink(', AModule.Name, ' - ', ALinkDest, ')... ');
+  system.WriteLn('ResolveLink(', AModule.Name, ' - ', ALinkDest, ')... ');
   if Length(ALinkDest) = 0 then
   begin
     SetLength(Result, 0);

+ 2 - 1
utils/instantfpc/instantfpc.pas

@@ -56,7 +56,8 @@ begin
   writeln('      Prints cache directory to stdout.');
   writeln;
   writeln('instantfpc --set-cache=<path to cache>');
-  writeln('      Set the cache to be used.');
+  writeln('      Set the cache to be used. Otherwise using environment variable');
+  writeln('      INSTANTFPCCACHE.');
   writeln;
   writeln('instantfpc --compiler=<path to compiler>');
   writeln('      Normally fpc is searched in PATH and used as compiler.');

+ 12 - 8
utils/instantfpc/instantfptools.pas

@@ -13,6 +13,10 @@ unit InstantFPTools;
   {$define HASEXEEXT}
 {$endif go32v2}
 
+{$IFNDEF VER2_4}
+{$DEFINE UseExeSearch}
+{$ENDIF}
+
 interface
 
 uses
@@ -138,14 +142,14 @@ begin
 end;
 
 function GetCompiler: string;
-
 var
+  CompFile: String;
+{$IFNDEF UseExeSearch}
   Path: String;
   p: Integer;
   StartPos: LongInt;
   Dir: String;
-  CompFile: String;
-
+{$ENDIF}
 begin
   Result:=CmdCompiler;
   if (Result<>'') then
@@ -164,9 +168,11 @@ begin
   {$ELSE}
   CompFile:='fpc';
   {$ENDIF}
+  {$IFDEF UseExeSearch}
+  Result:=ExeSearch(CompFile);
+  {$ELSE}
   Path:=GetEnvironmentVariable('PATH');
-  {$IFDEF VER2_4}
-  if PATH<>'' then begin
+  if Path<>'' then begin
     p:=1;
     while p<=length(Path) do begin
       StartPos:=p;
@@ -179,8 +185,6 @@ begin
       inc(p);
     end;
   end;
-  {$ELSE}
-  Result:=ExeSearch(CompFile);
   {$ENDIF}
 
   if (Result='') then
@@ -213,7 +217,7 @@ begin
   Proc.Execute;
   ss:=TStringStream.Create('');
   repeat
-    Count:=Proc.Output.Read(Buf,4096);
+    Count:=Proc.Output.Read(Buf{%H-},4096);
     if Count>0 then
       ss.write(buf,count);
   until Count=0;