瀏覽代碼

* opengl

git-svn-id: trunk@9973 -
marco 17 年之前
父節點
當前提交
9655cb60e7

+ 19 - 0
.gitattributes

@@ -4174,6 +4174,25 @@ packages/odbc/src/odbcsql.pas svneol=native#text/plain
 packages/odbc/src/odbcsqldyn.pas svneol=native#text/plain
 packages/odbc/src/odbcsqldyn.pas svneol=native#text/plain
 packages/odbc/tests/testodbc.mdb -text
 packages/odbc/tests/testodbc.mdb -text
 packages/odbc/tests/testodbc.pp svneol=native#text/plain
 packages/odbc/tests/testodbc.pp svneol=native#text/plain
+packages/opengl/Makefile svneol=native#text/plain
+packages/opengl/Makefile.fpc svneol=native#text/plain
+packages/opengl/examples/Makefile svneol=native#text/plain
+packages/opengl/examples/Makefile.fpc svneol=native#text/plain
+packages/opengl/examples/bounce.pp svneol=native#text/plain
+packages/opengl/examples/glutdemo.pp svneol=native#text/plain
+packages/opengl/examples/glxtest.pp svneol=native#text/plain
+packages/opengl/examples/morph3d.pp svneol=native#text/plain
+packages/opengl/examples/radblur.pp svneol=native#text/plain
+packages/opengl/fpmake.pp svneol=native#text/plain
+packages/opengl/glunits.txt svneol=native#text/plain
+packages/opengl/readme svneol=native#text/plain
+packages/opengl/src/gl.pp svneol=native#text/plain
+packages/opengl/src/glext.pp svneol=native#text/plain
+packages/opengl/src/glu.pp svneol=native#text/plain
+packages/opengl/src/glut.pp svneol=native#text/plain
+packages/opengl/src/glx.pp svneol=native#text/plain
+packages/opengl/src/tinygl.inc svneol=native#text/plain
+packages/opengl/src/tinyglh.inc svneol=native#text/plain
 packages/oracle/Makefile svneol=native#text/plain
 packages/oracle/Makefile svneol=native#text/plain
 packages/oracle/Makefile.fpc svneol=native#text/plain
 packages/oracle/Makefile.fpc svneol=native#text/plain
 packages/oracle/README svneol=native#text/plain
 packages/oracle/README svneol=native#text/plain

+ 98 - 24
packages/Makefile

@@ -241,28 +241,28 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl  libc  unixutil
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl  libc  unixutil
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  winunits-base winunits-jedi fcl-web ibase mysql zlib oracle odbc postgres sqlite imagemagick gdbint libpng  mad tcl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  winunits-base winunits-jedi fcl-web ibase mysql zlib oracle odbc postgres sqlite imagemagick gdbint libpng mad tcl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  zlib libpng x11 tcl
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  zlib libpng x11 tcl
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
@@ -271,13 +271,13 @@ ifeq ($(FULL_TARGET),i386-netware)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  zlib
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  zlib
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc  postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc  postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  zlib  libpng x11 tcl
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  zlib  libpng x11 tcl
@@ -298,13 +298,13 @@ ifeq ($(FULL_TARGET),i386-symbian)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
@@ -313,7 +313,7 @@ ifeq ($(FULL_TARGET),m68k-atari)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc  postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc  postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
@@ -322,10 +322,10 @@ ifeq ($(FULL_TARGET),m68k-embedded)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
@@ -334,7 +334,7 @@ ifeq ($(FULL_TARGET),powerpc-macos)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
@@ -343,34 +343,34 @@ ifeq ($(FULL_TARGET),powerpc-embedded)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  winunits-base winunits-jedi fcl-web ibase mysql zlib oracle odbc postgres sqlite imagemagick gdbint  tcl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  winunits-base winunits-jedi fcl-web ibase mysql zlib oracle odbc postgres sqlite imagemagick gdbint tcl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
@@ -391,10 +391,10 @@ ifeq ($(FULL_TARGET),arm-symbian)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl
+override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr  fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick gdbint libpng x11 gdbm tcl syslog libcurl opengl
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 override TARGET_DIRS+=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
@@ -1524,6 +1524,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 TARGET_DIRS_LIBC=1
 TARGET_DIRS_LIBC=1
 TARGET_DIRS_UNIXUTIL=1
 TARGET_DIRS_UNIXUTIL=1
 endif
 endif
@@ -1583,6 +1584,7 @@ TARGET_DIRS_GDBINT=1
 TARGET_DIRS_LIBPNG=1
 TARGET_DIRS_LIBPNG=1
 TARGET_DIRS_MAD=1
 TARGET_DIRS_MAD=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -1648,6 +1650,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -1709,6 +1712,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -1749,6 +1753,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -1832,6 +1837,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -1893,6 +1899,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2075,6 +2082,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2115,6 +2123,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2155,6 +2164,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2237,6 +2247,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2326,6 +2337,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2366,6 +2378,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2448,6 +2461,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2537,6 +2551,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2577,6 +2592,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2617,6 +2633,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2685,6 +2702,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2725,6 +2743,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2765,6 +2784,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2799,6 +2819,7 @@ TARGET_DIRS_SQLITE=1
 TARGET_DIRS_IMAGEMAGICK=1
 TARGET_DIRS_IMAGEMAGICK=1
 TARGET_DIRS_GDBINT=1
 TARGET_DIRS_GDBINT=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -2867,6 +2888,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -3044,6 +3066,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -3084,6 +3107,7 @@ TARGET_DIRS_GDBM=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_TCL=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_SYSLOG=1
 TARGET_DIRS_LIBCURL=1
 TARGET_DIRS_LIBCURL=1
+TARGET_DIRS_OPENGL=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 TARGET_DIRS_BASE=1
 TARGET_DIRS_BASE=1
@@ -5086,6 +5110,51 @@ libcurl:
 	$(MAKE) -C libcurl all
 	$(MAKE) -C libcurl all
 .PHONY: libcurl_all libcurl_debug libcurl_smart libcurl_release libcurl_units libcurl_examples libcurl_shared libcurl_install libcurl_sourceinstall libcurl_exampleinstall libcurl_distinstall libcurl_zipinstall libcurl_zipsourceinstall libcurl_zipexampleinstall libcurl_zipdistinstall libcurl_clean libcurl_distclean libcurl_cleanall libcurl_info libcurl_makefiles libcurl
 .PHONY: libcurl_all libcurl_debug libcurl_smart libcurl_release libcurl_units libcurl_examples libcurl_shared libcurl_install libcurl_sourceinstall libcurl_exampleinstall libcurl_distinstall libcurl_zipinstall libcurl_zipsourceinstall libcurl_zipexampleinstall libcurl_zipdistinstall libcurl_clean libcurl_distclean libcurl_cleanall libcurl_info libcurl_makefiles libcurl
 endif
 endif
+ifdef TARGET_DIRS_OPENGL
+opengl_all:
+	$(MAKE) -C opengl all
+opengl_debug:
+	$(MAKE) -C opengl debug
+opengl_smart:
+	$(MAKE) -C opengl smart
+opengl_release:
+	$(MAKE) -C opengl release
+opengl_units:
+	$(MAKE) -C opengl units
+opengl_examples:
+	$(MAKE) -C opengl examples
+opengl_shared:
+	$(MAKE) -C opengl shared
+opengl_install:
+	$(MAKE) -C opengl install
+opengl_sourceinstall:
+	$(MAKE) -C opengl sourceinstall
+opengl_exampleinstall:
+	$(MAKE) -C opengl exampleinstall
+opengl_distinstall:
+	$(MAKE) -C opengl distinstall
+opengl_zipinstall:
+	$(MAKE) -C opengl zipinstall
+opengl_zipsourceinstall:
+	$(MAKE) -C opengl zipsourceinstall
+opengl_zipexampleinstall:
+	$(MAKE) -C opengl zipexampleinstall
+opengl_zipdistinstall:
+	$(MAKE) -C opengl zipdistinstall
+opengl_clean:
+	$(MAKE) -C opengl clean
+opengl_distclean:
+	$(MAKE) -C opengl distclean
+opengl_cleanall:
+	$(MAKE) -C opengl cleanall
+opengl_info:
+	$(MAKE) -C opengl info
+opengl_makefiles:
+	$(MAKE) -C opengl makefiles
+opengl:
+	$(MAKE) -C opengl all
+.PHONY: opengl_all opengl_debug opengl_smart opengl_release opengl_units opengl_examples opengl_shared opengl_install opengl_sourceinstall opengl_exampleinstall opengl_distinstall opengl_zipinstall opengl_zipsourceinstall opengl_zipexampleinstall opengl_zipdistinstall opengl_clean opengl_distclean opengl_cleanall opengl_info opengl_makefiles opengl
+endif
 ifdef TARGET_DIRS_LIBC
 ifdef TARGET_DIRS_LIBC
 libc_all:
 libc_all:
 	$(MAKE) -C libc all
 	$(MAKE) -C libc all
@@ -5376,3 +5445,8 @@ libpng_debug: zlib_debug
 libpng_smart: zlib_smart
 libpng_smart: zlib_smart
 libpng_release: zlib_release
 libpng_release: zlib_release
 libpng_shared: zlib_shared
 libpng_shared: zlib_shared
+opengl_all: x11_all
+opengl_debug: x11_debug
+opengl_smart: x11_smart
+opengl_release: x11_release
+opengl_shared: x11_shared

+ 15 - 8
packages/Makefile.fpc

@@ -6,21 +6,21 @@
 dirs=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 dirs=base fv hash pasjpeg paszlib fpmkunit fcl-base fcl-db fcl-image fcl-net fcl-passrc fcl-registry fcl-xml fcl-fpcunit fcl-json extra fcl-process unzip regexpr
 dirs_linux_i386=libc  unixutil 
 dirs_linux_i386=libc  unixutil 
 dirs_freebsd=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
 dirs_freebsd=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
-               gdbint libpng x11 gdbm tcl syslog libcurl
+               gdbint libpng x11 gdbm tcl syslog libcurl opengl
 dirs_darwin=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
 dirs_darwin=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
-               gdbint libpng x11 gdbm tcl syslog libcurl
+               gdbint libpng x11 gdbm tcl syslog libcurl opengl
 dirs_solaris=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
 dirs_solaris=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
-               gdbint libpng x11 gdbm tcl syslog libcurl
+               gdbint libpng x11 gdbm tcl syslog libcurl opengl
 dirs_netbsd=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
 dirs_netbsd=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc postgres sqlite pthreads imagemagick \
-               gdbint libpng x11 gdbm tcl syslog libcurl
+               gdbint libpng x11 gdbm tcl syslog libcurl opengl
 dirs_openbsd=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc  postgres sqlite pthreads imagemagick \
 dirs_openbsd=fcl-web fcl-async ibase mysql ncurses zlib oracle odbc  postgres sqlite pthreads imagemagick \
-               gdbint libpng x11 gdbm tcl syslog libcurl
+               gdbint libpng x11 gdbm tcl syslog libcurl opengl
 dirs_linux=fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick \
 dirs_linux=fcl-web fcl-async ibase mysql ncurses unzip zlib oracle dbus odbc postgres sqlite pthreads imagemagick \
-               gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl
+               gdbint libpng x11 uuid ldap modplug dts mad  gdbm tcl syslog libcurl opengl
 dirs_win32=winunits-base winunits-jedi fcl-web ibase mysql zlib oracle odbc postgres sqlite imagemagick \
 dirs_win32=winunits-base winunits-jedi fcl-web ibase mysql zlib oracle odbc postgres sqlite imagemagick \
-               gdbint libpng  mad tcl
+               gdbint libpng mad tcl opengl
 dirs_win64=winunits-base winunits-jedi fcl-web ibase mysql zlib oracle odbc postgres sqlite imagemagick \
 dirs_win64=winunits-base winunits-jedi fcl-web ibase mysql zlib oracle odbc postgres sqlite imagemagick \
-               gdbint  tcl
+               gdbint tcl opengl
 dirs_wince=fcl-web ibase mysql tcl
 dirs_wince=fcl-web ibase mysql tcl
 dirs_os2=zlib libpng x11 tcl
 dirs_os2=zlib libpng x11 tcl
 dirs_emx=zlib  libpng x11 tcl
 dirs_emx=zlib  libpng x11 tcl
@@ -135,3 +135,10 @@ libpng_debug: zlib_debug
 libpng_smart: zlib_smart
 libpng_smart: zlib_smart
 libpng_release: zlib_release
 libpng_release: zlib_release
 libpng_shared: zlib_shared
 libpng_shared: zlib_shared
+
+opengl_all: x11_all
+opengl_debug: x11_debug
+opengl_smart: x11_smart
+opengl_release: x11_release
+opengl_shared: x11_shared
+

+ 24 - 93
packages/extra/Makefile

@@ -241,28 +241,28 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell lua sdl graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell lua sdl graph
 endif
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
 ifeq ($(FULL_TARGET),i386-go32v2)
 override TARGET_DIRS+=chm  graph
 override TARGET_DIRS+=chm  graph
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_DIRS+=chm  opengl gtk gtk2  cdrom fpgtk fftw openal oggvorbis a52  openssl pcap sdl lua graph
+override TARGET_DIRS+=chm  gtk gtk2  cdrom fpgtk fftw openal oggvorbis a52  openssl pcap sdl lua graph
 endif
 endif
 ifeq ($(FULL_TARGET),i386-os2)
 ifeq ($(FULL_TARGET),i386-os2)
 override TARGET_DIRS+=chm  os2units rexx gtk imlib fpgtk
 override TARGET_DIRS+=chm  os2units rexx gtk imlib fpgtk
 endif
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo sdl graph aspell
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo sdl graph aspell
 endif
 endif
 ifeq ($(FULL_TARGET),i386-beos)
 ifeq ($(FULL_TARGET),i386-beos)
 override TARGET_DIRS+=chm  graph
 override TARGET_DIRS+=chm  graph
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_DIRS+=chm  opengl gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
+override TARGET_DIRS+=chm  gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
 endif
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk  imlib gnome1 openssl pcap  cairo
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk  imlib gnome1 openssl pcap  cairo
 endif
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
 ifeq ($(FULL_TARGET),i386-qnx)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
@@ -271,13 +271,13 @@ ifeq ($(FULL_TARGET),i386-netware)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_DIRS+=chm  opengl gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
+override TARGET_DIRS+=chm  gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
 endif
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
 ifeq ($(FULL_TARGET),i386-wdosx)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms  libgd utmp bfd   fpgtk  imlib gnome1 openssl  cairo aspell univint sdl graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms  libgd utmp bfd   fpgtk  imlib gnome1 openssl  cairo aspell univint sdl graph
 endif
 endif
 ifeq ($(FULL_TARGET),i386-emx)
 ifeq ($(FULL_TARGET),i386-emx)
 override TARGET_DIRS+=chm  os2units rexx gtk imlib fpgtk
 override TARGET_DIRS+=chm  os2units rexx gtk imlib fpgtk
@@ -298,13 +298,13 @@ ifeq ($(FULL_TARGET),i386-symbian)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell graph
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo sdl graph aspell
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo sdl graph aspell
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_DIRS+=chm  opengl gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
+override TARGET_DIRS+=chm  gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
 ifeq ($(FULL_TARGET),m68k-amiga)
 override TARGET_DIRS+=chm  amunits
 override TARGET_DIRS+=chm  amunits
@@ -313,7 +313,7 @@ ifeq ($(FULL_TARGET),m68k-atari)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_DIRS+=chm  opengl gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
+override TARGET_DIRS+=chm  gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
 ifeq ($(FULL_TARGET),m68k-palmos)
 override TARGET_DIRS+=chm  palmunits
 override TARGET_DIRS+=chm  palmunits
@@ -322,10 +322,10 @@ ifeq ($(FULL_TARGET),m68k-embedded)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell sdl graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell sdl graph
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_DIRS+=chm  opengl gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
+override TARGET_DIRS+=chm  gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
 ifeq ($(FULL_TARGET),powerpc-amiga)
 override TARGET_DIRS+=chm  amunits
 override TARGET_DIRS+=chm  amunits
@@ -334,7 +334,7 @@ ifeq ($(FULL_TARGET),powerpc-macos)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms  libgd utmp bfd   fpgtk  imlib gnome1 openssl  cairo aspell univint sdl graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms  libgd utmp bfd   fpgtk  imlib gnome1 openssl  cairo aspell univint sdl graph
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
 ifeq ($(FULL_TARGET),powerpc-morphos)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
@@ -343,34 +343,34 @@ ifeq ($(FULL_TARGET),powerpc-embedded)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell graph
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_DIRS+=chm  opengl gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
+override TARGET_DIRS+=chm  gtk  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo aspell
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk  imlib gnome1 openssl pcap  cairo
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk  imlib gnome1 openssl pcap  cairo
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
 ifeq ($(FULL_TARGET),sparc-embedded)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell sdl graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell sdl graph
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo sdl graph aspell
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd   fpgtk imlib gnome1 openssl pcap  cairo sdl graph aspell
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms  libgd utmp bfd   fpgtk  imlib gnome1 openssl  cairo aspell
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms  libgd utmp bfd   fpgtk  imlib gnome1 openssl  cairo aspell
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_DIRS+=chm  opengl gtk gtk2  cdrom fpgtk fftw openssl sdl
+override TARGET_DIRS+=chm  gtk gtk2  cdrom fpgtk fftw openssl sdl
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
 ifeq ($(FULL_TARGET),x86_64-embedded)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell graph
 endif
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
 ifeq ($(FULL_TARGET),arm-palmos)
 override TARGET_DIRS+=chm  palmunits
 override TARGET_DIRS+=chm  palmunits
@@ -391,10 +391,10 @@ ifeq ($(FULL_TARGET),arm-symbian)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell graph
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms svgalib ggi  libgd utmp bfd    cdrom imlib gnome1 fpgtk newt  openal  oggvorbis a52 openssl pcap  cairo aspell graph
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_DIRS+=chm  fftw opengl gtk gtk2  forms  libgd utmp bfd   fpgtk  imlib gnome1 openssl  cairo aspell
+override TARGET_DIRS+=chm  fftw gtk gtk2  forms  libgd utmp bfd   fpgtk  imlib gnome1 openssl  cairo aspell
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 ifeq ($(FULL_TARGET),powerpc64-embedded)
 override TARGET_DIRS+=chm
 override TARGET_DIRS+=chm
@@ -1481,7 +1481,6 @@ fpc_makefiles: fpc_makefile fpc_makefile_dirs
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1512,7 +1511,6 @@ TARGET_DIRS_GRAPH=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-win32)
 ifeq ($(FULL_TARGET),i386-win32)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_CDROM=1
 TARGET_DIRS_CDROM=1
@@ -1538,7 +1536,6 @@ endif
 ifeq ($(FULL_TARGET),i386-freebsd)
 ifeq ($(FULL_TARGET),i386-freebsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1563,7 +1560,6 @@ TARGET_DIRS_GRAPH=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
 ifeq ($(FULL_TARGET),i386-netbsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_SVGALIB=1
 TARGET_DIRS_SVGALIB=1
@@ -1582,7 +1578,6 @@ endif
 ifeq ($(FULL_TARGET),i386-solaris)
 ifeq ($(FULL_TARGET),i386-solaris)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1606,7 +1601,6 @@ TARGET_DIRS_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
 ifeq ($(FULL_TARGET),i386-openbsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_SVGALIB=1
 TARGET_DIRS_SVGALIB=1
@@ -1628,7 +1622,6 @@ endif
 ifeq ($(FULL_TARGET),i386-darwin)
 ifeq ($(FULL_TARGET),i386-darwin)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1672,7 +1665,6 @@ endif
 ifeq ($(FULL_TARGET),m68k-linux)
 ifeq ($(FULL_TARGET),m68k-linux)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1698,7 +1690,6 @@ endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
 ifeq ($(FULL_TARGET),m68k-freebsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1719,7 +1710,6 @@ TARGET_DIRS_ASPELL=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
 ifeq ($(FULL_TARGET),m68k-netbsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_SVGALIB=1
 TARGET_DIRS_SVGALIB=1
@@ -1744,7 +1734,6 @@ TARGET_DIRS_CHM=1
 endif
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
 ifeq ($(FULL_TARGET),m68k-openbsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_SVGALIB=1
 TARGET_DIRS_SVGALIB=1
@@ -1770,7 +1759,6 @@ endif
 ifeq ($(FULL_TARGET),powerpc-linux)
 ifeq ($(FULL_TARGET),powerpc-linux)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1796,7 +1784,6 @@ TARGET_DIRS_GRAPH=1
 endif
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 ifeq ($(FULL_TARGET),powerpc-netbsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_SVGALIB=1
 TARGET_DIRS_SVGALIB=1
@@ -1822,7 +1809,6 @@ endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
 ifeq ($(FULL_TARGET),powerpc-darwin)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1848,7 +1834,6 @@ endif
 ifeq ($(FULL_TARGET),sparc-linux)
 ifeq ($(FULL_TARGET),sparc-linux)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1873,7 +1858,6 @@ TARGET_DIRS_GRAPH=1
 endif
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
 ifeq ($(FULL_TARGET),sparc-netbsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_SVGALIB=1
 TARGET_DIRS_SVGALIB=1
@@ -1892,7 +1876,6 @@ endif
 ifeq ($(FULL_TARGET),sparc-solaris)
 ifeq ($(FULL_TARGET),sparc-solaris)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1914,7 +1897,6 @@ endif
 ifeq ($(FULL_TARGET),x86_64-linux)
 ifeq ($(FULL_TARGET),x86_64-linux)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1941,7 +1923,6 @@ endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 ifeq ($(FULL_TARGET),x86_64-freebsd)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1963,7 +1944,6 @@ endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
 ifeq ($(FULL_TARGET),x86_64-darwin)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -1979,7 +1959,6 @@ TARGET_DIRS_ASPELL=1
 endif
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
 ifeq ($(FULL_TARGET),x86_64-win64)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_CDROM=1
 TARGET_DIRS_CDROM=1
@@ -1994,7 +1973,6 @@ endif
 ifeq ($(FULL_TARGET),arm-linux)
 ifeq ($(FULL_TARGET),arm-linux)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -2040,7 +2018,6 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
 ifeq ($(FULL_TARGET),powerpc64-linux)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -2066,7 +2043,6 @@ endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 ifeq ($(FULL_TARGET),powerpc64-darwin)
 TARGET_DIRS_CHM=1
 TARGET_DIRS_CHM=1
 TARGET_DIRS_FFTW=1
 TARGET_DIRS_FFTW=1
-TARGET_DIRS_OPENGL=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_GTK2=1
 TARGET_DIRS_FORMS=1
 TARGET_DIRS_FORMS=1
@@ -2173,51 +2149,6 @@ fftw:
 	$(MAKE) -C fftw all
 	$(MAKE) -C fftw all
 .PHONY: fftw_all fftw_debug fftw_smart fftw_release fftw_units fftw_examples fftw_shared fftw_install fftw_sourceinstall fftw_exampleinstall fftw_distinstall fftw_zipinstall fftw_zipsourceinstall fftw_zipexampleinstall fftw_zipdistinstall fftw_clean fftw_distclean fftw_cleanall fftw_info fftw_makefiles fftw
 .PHONY: fftw_all fftw_debug fftw_smart fftw_release fftw_units fftw_examples fftw_shared fftw_install fftw_sourceinstall fftw_exampleinstall fftw_distinstall fftw_zipinstall fftw_zipsourceinstall fftw_zipexampleinstall fftw_zipdistinstall fftw_clean fftw_distclean fftw_cleanall fftw_info fftw_makefiles fftw
 endif
 endif
-ifdef TARGET_DIRS_OPENGL
-opengl_all:
-	$(MAKE) -C opengl all
-opengl_debug:
-	$(MAKE) -C opengl debug
-opengl_smart:
-	$(MAKE) -C opengl smart
-opengl_release:
-	$(MAKE) -C opengl release
-opengl_units:
-	$(MAKE) -C opengl units
-opengl_examples:
-	$(MAKE) -C opengl examples
-opengl_shared:
-	$(MAKE) -C opengl shared
-opengl_install:
-	$(MAKE) -C opengl install
-opengl_sourceinstall:
-	$(MAKE) -C opengl sourceinstall
-opengl_exampleinstall:
-	$(MAKE) -C opengl exampleinstall
-opengl_distinstall:
-	$(MAKE) -C opengl distinstall
-opengl_zipinstall:
-	$(MAKE) -C opengl zipinstall
-opengl_zipsourceinstall:
-	$(MAKE) -C opengl zipsourceinstall
-opengl_zipexampleinstall:
-	$(MAKE) -C opengl zipexampleinstall
-opengl_zipdistinstall:
-	$(MAKE) -C opengl zipdistinstall
-opengl_clean:
-	$(MAKE) -C opengl clean
-opengl_distclean:
-	$(MAKE) -C opengl distclean
-opengl_cleanall:
-	$(MAKE) -C opengl cleanall
-opengl_info:
-	$(MAKE) -C opengl info
-opengl_makefiles:
-	$(MAKE) -C opengl makefiles
-opengl:
-	$(MAKE) -C opengl all
-.PHONY: opengl_all opengl_debug opengl_smart opengl_release opengl_units opengl_examples opengl_shared opengl_install opengl_sourceinstall opengl_exampleinstall opengl_distinstall opengl_zipinstall opengl_zipsourceinstall opengl_zipexampleinstall opengl_zipdistinstall opengl_clean opengl_distclean opengl_cleanall opengl_info opengl_makefiles opengl
-endif
 ifdef TARGET_DIRS_GTK
 ifdef TARGET_DIRS_GTK
 gtk_all:
 gtk_all:
 	$(MAKE) -C gtk all
 	$(MAKE) -C gtk all

+ 8 - 8
packages/extra/Makefile.fpc

@@ -4,7 +4,7 @@
 [target]
 [target]
 dirs=chm
 dirs=chm
 dirs_linux= fftw \
 dirs_linux= fftw \
-            opengl gtk gtk2  \
+             gtk gtk2  \
            forms svgalib ggi  libgd \
            forms svgalib ggi  libgd \
            utmp bfd    cdrom \
            utmp bfd    cdrom \
            imlib gnome1 fpgtk newt  \
            imlib gnome1 fpgtk newt  \
@@ -18,24 +18,24 @@ dirs_sparc_linux=graph
 dirs_arm_linux=graph
 dirs_arm_linux=graph
 dirs_m68k_linux=graph
 dirs_m68k_linux=graph
 dirs_netbsd= \
 dirs_netbsd= \
-             opengl gtk  \
+              gtk  \
             forms svgalib ggi  libgd \
             forms svgalib ggi  libgd \
             utmp bfd   fpgtk \
             utmp bfd   fpgtk \
              imlib gnome1 openssl pcap  cairo aspell
              imlib gnome1 openssl pcap  cairo aspell
 dirs_freebsd= fftw \
 dirs_freebsd= fftw \
-              opengl gtk gtk2  \
+               gtk gtk2  \
              forms svgalib ggi  libgd \
              forms svgalib ggi  libgd \
              utmp bfd   fpgtk \
              utmp bfd   fpgtk \
               imlib gnome1 openssl pcap  cairo sdl graph aspell
               imlib gnome1 openssl pcap  cairo sdl graph aspell
 dirs_openbsd= \
 dirs_openbsd= \
-              opengl gtk  \
+               gtk  \
              forms svgalib ggi  libgd \
              forms svgalib ggi  libgd \
              utmp bfd   fpgtk \
              utmp bfd   fpgtk \
               imlib gnome1 openssl pcap  cairo aspell
               imlib gnome1 openssl pcap  cairo aspell
 # libcurl should work on Win32 too, but I haven't tested this. Skip it for now. MVC.
 # libcurl should work on Win32 too, but I haven't tested this. Skip it for now. MVC.
-dirs_win32= opengl gtk gtk2  cdrom fpgtk fftw \
+dirs_win32=  gtk gtk2  cdrom fpgtk fftw \
               openal oggvorbis a52  openssl pcap sdl lua graph
               openal oggvorbis a52  openssl pcap sdl lua graph
-dirs_win64= opengl gtk gtk2  cdrom fpgtk fftw openssl sdl
+dirs_win64=  gtk gtk2  cdrom fpgtk fftw openssl sdl
 dirs_wince=  fftw
 dirs_wince=  fftw
 dirs_os2=os2units \
 dirs_os2=os2units \
          rexx \
          rexx \
@@ -49,14 +49,14 @@ dirs_go32v2= graph
 dirs_amiga=amunits
 dirs_amiga=amunits
 dirs_palmos=palmunits
 dirs_palmos=palmunits
 dirs_darwin=  fftw \
 dirs_darwin=  fftw \
-              opengl gtk gtk2  \
+               gtk gtk2  \
              forms  libgd \
              forms  libgd \
              utmp bfd   fpgtk  imlib gnome1 \
              utmp bfd   fpgtk  imlib gnome1 \
              openssl  cairo aspell
              openssl  cairo aspell
 dirs_powerpc_darwin=univint sdl graph
 dirs_powerpc_darwin=univint sdl graph
 dirs_i386_darwin=univint sdl graph
 dirs_i386_darwin=univint sdl graph
 dirs_solaris= fftw \
 dirs_solaris= fftw \
-              opengl gtk gtk2  \
+               gtk gtk2  \
              forms svgalib ggi  libgd \
              forms svgalib ggi  libgd \
              utmp bfd   fpgtk  imlib gnome1 \
              utmp bfd   fpgtk  imlib gnome1 \
              openssl pcap  cairo
              openssl pcap  cairo

+ 2713 - 0
packages/opengl/Makefile

@@ -0,0 +1,2713 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/01/26]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos 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 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 sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=opengl
+override PACKAGE_VERSION=2.0.0
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=gl glu glut  glext
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=gl glu glut  glx glext
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=gl glu glut
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_EXAMPLEDIRS+=examples
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_SOURCEDIR+=src tests examples
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifeq ($(OS_SOURCE),linux)
+ifndef GCCLIBDIR
+ifeq ($(CPU_TARGET),i386)
+ifneq ($(findstring x86_64,$(shell uname -a)),)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifeq ($(CPU_TARGET),powerpc64)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m64 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifndef GCCLIBDIR
+CROSSGCC=$(strip $(wildcard $(addsuffix /$(BINUTILSPREFIX)gcc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(CROSSGCC),)
+GCCLIBDIR:=$(shell dirname `$(CROSSGCC) -print-libgcc-file-name`)
+endif
+endif
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+ifdef inUnix
+ifeq ($(OS_SOURCE),netbsd)
+OTHERLIBDIR+=/usr/pkg/lib
+endif
+export GCCLIBDIR OTHERLIB
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_X11
+PACKAGEDIR_X11:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /x11/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_X11),)
+ifneq ($(wildcard $(PACKAGEDIR_X11)/units/$(TARGETSUFFIX)),)
+UNITDIR_X11=$(PACKAGEDIR_X11)/units/$(TARGETSUFFIX)
+else
+UNITDIR_X11=$(PACKAGEDIR_X11)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_X11)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_X11) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_X11)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_X11=
+UNITDIR_X11:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /x11/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_X11),)
+UNITDIR_X11:=$(firstword $(UNITDIR_X11))
+else
+UNITDIR_X11=
+endif
+endif
+ifdef UNITDIR_X11
+override COMPILER_UNITDIR+=$(UNITDIR_X11)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS)$(TARGET_IMPLICITUNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_examples
+ifneq ($(TARGET_EXAMPLES),)
+HASEXAMPLES=1
+override EXAMPLESOURCEFILES:=$(wildcard $(addsuffix .pp,$(TARGET_EXAMPLES)) $(addsuffix .pas,$(TARGET_EXAMPLES)) $(addsuffix .lpr,$(TARGET_EXAMPLES)) $(addsuffix .dpr,$(TARGET_EXAMPLES)))
+override EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(TARGET_EXAMPLES))
+override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(TARGET_EXAMPLES)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_EXAMPLES)))
+override CLEANEXEFILES+=$(EXAMPLEFILES) $(EXAMPLEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))
+endif
+ifeq ($(OS_TARGET),emx)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_EXAMPLES))
+endif
+endif
+ifneq ($(TARGET_EXAMPLEDIRS),)
+HASEXAMPLES=1
+endif
+fpc_examples: all $(EXAMPLEFILES) $(addsuffix _all,$(TARGET_EXAMPLEDIRS))
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+ifdef RUNBATCH
+	$(RUNBATCH) (ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+ifeq ($(FULL_TARGET),i386-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+TARGET_EXAMPLEDIRS_EXAMPLES=1
+endif
+ifdef TARGET_EXAMPLEDIRS_EXAMPLES
+examples_all:
+	$(MAKE) -C examples all
+examples_debug:
+	$(MAKE) -C examples debug
+examples_smart:
+	$(MAKE) -C examples smart
+examples_release:
+	$(MAKE) -C examples release
+examples_units:
+	$(MAKE) -C examples units
+examples_examples:
+	$(MAKE) -C examples examples
+examples_shared:
+	$(MAKE) -C examples shared
+examples_install:
+	$(MAKE) -C examples install
+examples_sourceinstall:
+	$(MAKE) -C examples sourceinstall
+examples_exampleinstall:
+	$(MAKE) -C examples exampleinstall
+examples_distinstall:
+	$(MAKE) -C examples distinstall
+examples_zipinstall:
+	$(MAKE) -C examples zipinstall
+examples_zipsourceinstall:
+	$(MAKE) -C examples zipsourceinstall
+examples_zipexampleinstall:
+	$(MAKE) -C examples zipexampleinstall
+examples_zipdistinstall:
+	$(MAKE) -C examples zipdistinstall
+examples_clean:
+	$(MAKE) -C examples clean
+examples_distclean:
+	$(MAKE) -C examples distclean
+examples_cleanall:
+	$(MAKE) -C examples cleanall
+examples_info:
+	$(MAKE) -C examples info
+examples_makefiles:
+	$(MAKE) -C examples makefiles
+examples:
+	$(MAKE) -C examples all
+.PHONY: examples_all examples_debug examples_smart examples_release examples_units examples_examples examples_shared examples_install examples_sourceinstall examples_exampleinstall examples_distinstall examples_zipinstall examples_zipsourceinstall examples_zipexampleinstall examples_zipdistinstall examples_clean examples_distclean examples_cleanall examples_info examples_makefiles examples
+endif
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples: fpc_examples
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean $(addsuffix _clean,$(TARGET_EXAMPLEDIRS))
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:

+ 37 - 0
packages/opengl/Makefile.fpc

@@ -0,0 +1,37 @@
+#
+#   Makefile.fpc for OpenGL for FPC
+#
+
+[package]
+name=opengl
+version=2.0.0
+
+[require]
+packages_linux=x11
+packages_freebsd=x11
+packages_netbsd=x11
+packages_openbsd=x11
+packages_darwin=x11
+
+[target]
+units=gl glu glut
+units_win32=glext
+units_linux=glx glext
+units_freebsd=glx glext
+units_netbsd=glx glext
+units_openbsd=glx glext
+units_darwin=glx glext
+exampledirs=examples
+
+[install]
+fpcpackage=y
+
+[compiler]
+includedir=src
+sourcedir=src tests examples
+
+[default]
+fpcdir=../..
+
+[rules]
+.NOTPARALLEL:

+ 2172 - 0
packages/opengl/examples/Makefile

@@ -0,0 +1,2172 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/01/26]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos 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 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 sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur  glxtest
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_OPTIONS+=-S2h
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifeq ($(OS_SOURCE),linux)
+ifndef GCCLIBDIR
+ifeq ($(CPU_TARGET),i386)
+ifneq ($(findstring x86_64,$(shell uname -a)),)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m32 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifeq ($(CPU_TARGET),powerpc64)
+ifeq ($(BINUTILSPREFIX),)
+GCCLIBDIR:=$(shell dirname `gcc -m64 -print-libgcc-file-name`)
+endif
+endif
+endif
+ifndef GCCLIBDIR
+CROSSGCC=$(strip $(wildcard $(addsuffix /$(BINUTILSPREFIX)gcc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(CROSSGCC),)
+GCCLIBDIR:=$(shell dirname `$(CROSSGCC) -print-libgcc-file-name`)
+endif
+endif
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+ifdef inUnix
+ifeq ($(OS_SOURCE),netbsd)
+OTHERLIBDIR+=/usr/pkg/lib
+endif
+export GCCLIBDIR OTHERLIB
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl opengl
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_X11
+PACKAGEDIR_X11:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /x11/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_X11),)
+ifneq ($(wildcard $(PACKAGEDIR_X11)/units/$(TARGETSUFFIX)),)
+UNITDIR_X11=$(PACKAGEDIR_X11)/units/$(TARGETSUFFIX)
+else
+UNITDIR_X11=$(PACKAGEDIR_X11)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_X11)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_X11) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_X11)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_X11=
+UNITDIR_X11:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /x11/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_X11),)
+UNITDIR_X11:=$(firstword $(UNITDIR_X11))
+else
+UNITDIR_X11=
+endif
+endif
+ifdef UNITDIR_X11
+override COMPILER_UNITDIR+=$(UNITDIR_X11)
+endif
+endif
+ifdef REQUIRE_PACKAGES_OPENGL
+PACKAGEDIR_OPENGL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /opengl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_OPENGL),)
+ifneq ($(wildcard $(PACKAGEDIR_OPENGL)/units/$(TARGETSUFFIX)),)
+UNITDIR_OPENGL=$(PACKAGEDIR_OPENGL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_OPENGL=$(PACKAGEDIR_OPENGL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_OPENGL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_OPENGL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_OPENGL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_OPENGL=
+UNITDIR_OPENGL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /opengl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_OPENGL),)
+UNITDIR_OPENGL:=$(firstword $(UNITDIR_OPENGL))
+else
+UNITDIR_OPENGL=
+endif
+endif
+ifdef UNITDIR_OPENGL
+override COMPILER_UNITDIR+=$(UNITDIR_OPENGL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX)
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_exes
+ifndef CROSSINSTALL
+ifneq ($(TARGET_PROGRAMS),)
+override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
+override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS))) $(addprefix $(IMPORTLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS)))
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+ifeq ($(OS_TARGET),emx)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+endif
+endif
+fpc_exes: $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(EXEFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:

+ 26 - 0
packages/opengl/examples/Makefile.fpc

@@ -0,0 +1,26 @@
+#
+#   Makefile.fpc for GL demos
+#
+
+[target]
+programs=glutdemo morph3d bounce radblur
+programs_linux=glxtest
+programs_freebsd=glxtest
+programs_netbsd=glxtest
+programs_openbsd=glxtest
+programs_darwin=glxtest
+
+[require]
+packages=opengl
+
+[install]
+fpcpackage=y
+
+[compiler]
+options=-S2h
+
+[default]
+fpcdir=../../..
+
+[rules]
+.NOTPARALLEL:

+ 246 - 0
packages/opengl/examples/bounce.pp

@@ -0,0 +1,246 @@
+{
+  Bouncing ball demo.  Color index mode only!
+
+  This program is in the public domain
+  Brian Paul
+
+  Converted to Pascal by Peter Vreman
+}
+program bounce;
+
+{$mode objfpc}
+
+uses
+  gl,glut;
+
+const
+  RED=1;
+  WHITE=2;
+  CYAN=3;
+
+var
+  IndexMode : Boolean;
+  Ball : GLuint;
+
+const
+  Zrot  : GLfloat = 0.0;
+  Zstep : GLfloat = 6.0;
+  Xpos  : GLfloat = 0.0;
+  Ypos  : GLfloat = 1.0;
+  Xvel  : GLfloat = 0.2;
+  Yvel  : GLfloat = 0.0;
+  Xmin  : GLfloat = -4.0;
+  Xmax  : GLfloat = 4.0;
+  Ymin  : GLfloat = -3.8;
+  Ymax  : GLfloat = 4.0;
+  G     : GLfloat = -0.1;
+
+
+function make_ball:GLuint;
+var
+  list   : GLuint;
+  a,b,
+  ar,br  : GLFloat;
+  da,db,
+  dar    : GLFloat;
+  radius : GLFloat;
+  color  : boolean;
+  x,y,z  : GLFloat;
+begin
+  da:=18.0;
+  db:=18.0;
+  radius:=1.0;
+
+  list := glGenLists(1);
+
+  glNewList(list, GL_COMPILE);
+
+  color := false;
+  a:=-90.0;
+  while (a+da<=90.0) do
+   begin
+     glBegin(GL_QUAD_STRIP);
+
+     b:=0.0;
+     while (b<=360.0) do
+      begin
+        if (color) then
+         begin
+           glIndexi(RED);
+           glColor3f(1, 0, 0);
+         end
+        else
+         begin
+           glIndexi(WHITE);
+           glColor3f(1, 1, 1);
+         end;
+
+        ar:=a * 3.14159/180.0;
+        br:=b * 3.14159/180.0;
+        x := COS(br) * COS(ar);
+        y := SIN(br) * COS(ar);
+        z := SIN(ar);
+        glVertex3f(x, y, z);
+
+        dar:=da * 3.14159/180.0;
+        x := radius * COS(br) * COS(ar + dar);
+        y := radius * SIN(br) * COS(ar + dar);
+        z := radius * SIN(ar + dar);
+        glVertex3f(x, y, z);
+
+        color := not color;
+        b:=b+db;
+      end;
+
+     glEnd();
+     a:=a+da;
+   end;
+
+  glEndList();
+
+  make_ball:=list;
+end;
+
+
+procedure reshape(width,height:longint); cdecl;
+var
+  aspect : glFloat;
+begin
+  aspect := glfloat(width) / glfloat(height);
+  glViewport(0, 0, width, height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glOrtho(-6.0 * aspect, 6.0 * aspect, -6.0, 6.0, -6.0, 6.0);
+  glMatrixMode(GL_MODELVIEW);
+end;
+
+
+procedure key(k:byte;x,y:longint); cdecl;
+begin
+  case k of
+    27 :
+      halt(0);
+  end;
+end;
+
+
+procedure draw; cdecl;
+var
+  i : GLint;
+begin
+  glClear(GL_COLOR_BUFFER_BIT);
+
+  glIndexi(CYAN);
+  glColor3f(0, 1, 1);
+  glBegin(GL_LINES);
+  for i:=-5 to 5 do
+   begin
+     glVertex2i(i, -5);
+     glVertex2i(i, 5);
+   end;
+  for i:=-5 to 5 do
+   begin
+     glVertex2i(-5, i);
+     glVertex2i(5, i);
+   end;
+  for i:=-5 to 5 do
+   begin
+     glVertex2i(i, -5);
+     glVertex2f(i * 1.15, -5.9);
+   end;
+  glVertex2f(-5.3, -5.35);
+  glVertex2f(5.3, -5.35);
+  glVertex2f(-5.75, -5.9);
+  glVertex2f(5.75, -5.9);
+  glEnd();
+
+  glPushMatrix();
+  glTranslatef(Xpos, Ypos, 0.0);
+  glScalef(2.0, 2.0, 2.0);
+  glRotatef(8.0, 0.0, 0.0, 1.0);
+  glRotatef(90.0, 1.0, 0.0, 0.0);
+  glRotatef(Zrot, 0.0, 0.0, 1.0);
+
+  glCallList(Ball);
+
+  glPopMatrix();
+
+  glFlush();
+  glutSwapBuffers();
+end;
+
+
+const
+  vel0 : glfloat = -100.0;
+procedure idle; cdecl;
+begin
+  Zrot:=Zrot+Zstep;
+  Xpos:=Xpos+Xvel;
+  if (Xpos >= Xmax) then
+   begin
+     Xpos := Xmax;
+     Xvel := -Xvel;
+     Zstep := -Zstep;
+   end;
+  if (Xpos <= Xmin) then
+   begin
+     Xpos := Xmin;
+     Xvel := -Xvel;
+     Zstep := -Zstep;
+   end;
+  Ypos:=Ypos+Yvel;
+  Yvel:=Yvel+G;
+  if (Ypos < Ymin) then
+   begin
+     Ypos := Ymin;
+     if (vel0 = -100.0) then
+       vel0 := abs(Yvel);
+     Yvel := vel0;
+   end;
+  glutPostRedisplay();
+end;
+
+
+procedure visible(vis:longint); cdecl;
+begin
+  if (vis=GLUT_VISIBLE) then
+    glutIdleFunc(@idle)
+  else
+    glutIdleFunc(nil);
+end;
+
+
+begin
+  glutInit(@argc, argv);
+  glutInitWindowPosition(0, 0);
+  glutInitWindowSize(600, 450);
+
+  if paramcount>1 then
+   IndexMode:=(paramstr(1)='-ci');
+
+  if (IndexMode) then
+     glutInitDisplayMode(GLUT_INDEX or GLUT_DOUBLE)
+  else
+     glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE);
+
+  glutCreateWindow('Bounce');
+  Ball := make_ball();
+  glCullFace(GL_BACK);
+  glEnable(GL_CULL_FACE);
+  glDisable(GL_DITHER);
+  glShadeModel(GL_FLAT);
+
+  glutDisplayFunc(@draw);
+  glutReshapeFunc(@reshape);
+  glutVisibilityFunc(@visible);
+  glutKeyboardFunc(@key);
+
+  if (IndexMode) then
+   begin
+     glutSetColor(RED, 1.0, 0.0, 0.0);
+     glutSetColor(WHITE, 1.0, 1.0, 1.0);
+     glutSetColor(CYAN, 0.0, 1.0, 1.0);
+   end;
+
+  glutMainLoop();
+end.

+ 134 - 0
packages/opengl/examples/glutdemo.pp

@@ -0,0 +1,134 @@
+{
+  GL units for Free Pascal - GLUT demo
+  1999 Sebastian Guenther, [email protected]
+
+  You may use this source as starting point for your own programs; consider it
+  as Public Domain.
+}
+
+{$mode objfpc}
+
+program GLUTDemo;
+uses
+  GL, GLU, GLUT;
+
+const
+
+  FPCImg: array[0..4, 0..10] of Byte =
+    ((1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1),
+     (1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0),
+     (1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0),
+     (1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0),
+     (1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1));
+
+var
+  counter: Integer;
+
+
+const
+  colors: array[0..7, 0..2] of Single =
+    ((0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1),
+     (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1));
+  corners: array[0..7, 0..2] of Single =
+    ((-1, -1, -1), (+1, -1, -1), (+1, +1, -1), (-1, +1, -1),
+     (-1, -1, +1), (+1, -1, +1), (+1, +1, +1), (-1, +1, +1));
+
+
+procedure DrawCube;
+  procedure DrawSide(i1, i2, i3, i4: Integer);
+  begin
+    glColor4f (colors [i1, 0], colors [i1, 1], colors [i1, 2], 0.5);
+    glVertex3f(corners[i1, 0], corners[i1, 1], corners[i1, 2]);
+    glColor4f (colors [i2, 0], colors [i2, 1], colors [i2, 2], 0.5);
+    glVertex3f(corners[i2, 0], corners[i2, 1], corners[i2, 2]);
+    glColor4f (colors [i3, 0], colors [i3, 1], colors [i3, 2], 0.5);
+    glVertex3f(corners[i3, 0], corners[i3, 1], corners[i3, 2]);
+
+    glVertex3f(corners[i4, 0], corners[i4, 1], corners[i4, 2]);
+  end;
+begin
+  glBegin(GL_QUADS);
+  DrawSide(4, 5, 6, 7);         // Front
+  DrawSide(3, 2, 1, 0);         // Back
+  DrawSide(2, 3, 7, 6);         // Top
+  DrawSide(0, 1, 5, 4);         // Bottom
+  DrawSide(4, 7, 3, 0);         // Left
+  DrawSide(1, 2, 6, 5);         // Right
+  glEnd;
+end;
+
+
+procedure DisplayWindow; cdecl;
+var
+  x, y: Integer;
+begin
+  Inc(counter);
+
+  glClearColor(0, 0, 0.2, 1);
+  glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);
+
+  glPushMatrix;
+  glTranslatef(0, 0, Sin(Single(counter) / 20.0) * 5.0 - 5.0);
+  glRotatef(Sin(Single(counter) / 200.0) * 720.0, 0, 1, 0);
+  glRotatef(counter, 0, 0, 1);
+
+  for y := 0 to 4 do
+    for x := 0 to 10 do
+      if FPCImg[y, x] > 0 then begin
+        glPushMatrix;
+        glRotatef(x * Sin(Single(counter) / 5.0), 0, 1, 0);
+        glRotatef(y * Sin(Single(counter) / 12.0) * 4.0, 0, 0, 1);
+        glTranslatef((x - 5) * 1, (2 - y) * 1, 0);
+        glScalef(0.4, 0.4, 0.4);
+        glRotatef(counter, 0.5, 1, 0);
+        DrawCube;
+        glPopMatrix;
+      end;
+
+  glPopMatrix;
+
+  Inc(counter);
+
+  glutSwapBuffers;
+end;
+
+procedure OnTimer(value: Integer); cdecl;
+begin
+  glutPostRedisplay;
+  glutTimerFunc(20, @OnTimer, 0);
+end;
+
+begin
+  glutInit(@argc, argv);
+
+  glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
+  glutCreateWindow('Free Pascal GLUT demo');
+  glutDisplayFunc(@DisplayWindow);
+  glutTimerFunc(20, @OnTimer, 0);
+
+  WriteLn;
+  WriteLn('GL info:');
+  WriteLn('  Vendor: ', PChar(glGetString(GL_VENDOR)));
+  WriteLn('  Renderer: ', PChar(glGetString(GL_RENDERER)));
+  WriteLn('  Version: ', PChar(glGetString(GL_VERSION)));
+  WriteLn('  Extensions: ', PChar(glGetString(GL_EXTENSIONS)));
+
+  // Enable backface culling
+  glEnable(GL_CULL_FACE);
+
+  // Set up depth buffer
+  glEnable(GL_DEPTH_TEST);
+  glDepthFunc(GL_LESS);
+
+  // Set up projection matrix
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity;
+  gluPerspective(90, 1.3, 0.1, 100);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity;
+  glTranslatef(0, 0, -5.5);
+
+  WriteLn('Starting...');
+  glutMainLoop;
+
+end.

+ 110 - 0
packages/opengl/examples/glxtest.pp

@@ -0,0 +1,110 @@
+{
+  GLX demo for FreePascal
+  2005 Bart Tierens, [email protected]
+
+  This program is in the public domain
+  
+  Warning: This demo works only with FreePascal 2.1 and better, due to changes to the glx header
+}
+program glxTest;
+
+{$MODE delphi}
+
+uses glx,unix,x,xlib,xutil,gl,glu;
+
+var
+  attr: Array[0..8] of integer = (GLX_RGBA,GLX_RED_SIZE,1,GLX_GREEN_SIZE,1,GLX_BLUE_SIZE,1,GLX_DOUBLEBUFFER,none);
+  visinfo: PXVisualInfo;
+  cm: TColormap;
+  winAttr: TXSetWindowAttributes;
+  glXCont: GLXContext;
+  dpy: PDisplay;
+  win: TWindow;
+
+procedure redraw();
+begin
+  glClear(GL_COLOR_BUFFER_BIT);
+
+  glTranslatef(-0.5,-0.5,-2);
+  glBegin(GL_QUADS);
+    glColor3f(1,0,0);
+    glVertex3f(0,0,0);
+    glColor3f(0,1,0);
+    glVertex3f(1,0,0);
+    glColor3f(0,0,1);
+    glVertex3f(1,1,0);
+    glColor3f(1,1,1);
+    glVertex3f(0,1,0);
+  glEnd();
+
+  glXSwapBuffers(dpy, win); //Swap the buffers
+end;
+
+procedure resize(width,height: integer);
+begin
+  glViewport(0,0,width,height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluPerspective(45,width/height,0.1,200);
+  glMatrixMode(GL_MODELVIEW);
+end;
+
+procedure loop();
+var
+  event: TXEvent;
+begin
+  while true do
+  begin
+    XNextEvent(dpy,@event);
+    case event._type of
+    Expose: redraw();
+    ConfigureNotify: resize(event.xconfigure.width,event.xconfigure.height);
+    KeyPress: halt(1);
+    end;
+  end;
+end;
+
+var
+  errorBase,eventBase: integer;
+  window_title_property: TXTextProperty;
+  title: String;
+begin
+  initGlx();
+  dpy := XOpenDisplay(nil);
+  if(dpy = nil) then
+  writeLn('Error: Could not connect to X server');
+
+  if not (glXQueryExtension(dpy,errorBase,eventBase)) then
+  writeLn('Error: GLX extension not supported');
+
+  visinfo := glXChooseVisual(dpy,DefaultScreen(dpy), Attr);
+  if(visinfo = nil) then
+  writeLn('Error: Could not find visual');
+
+  //Create a new colormap
+  cm := XCreateColormap(dpy,RootWindow(dpy,visinfo.screen),visinfo.visual,AllocNone);
+  winAttr.colormap := cm;
+  winAttr.border_pixel := 0;
+  winAttr.background_pixel := 0;
+  winAttr.event_mask := ExposureMask or ButtonPressMask or StructureNotifyMask or KeyPressMask;
+
+  //Create a window
+  win := XCreateWindow(dpy,RootWindow(dpy,visinfo.screen),0,0,640,480,0,visinfo.depth,InputOutput,visinfo.visual,CWBorderPixel or CWColormap or CWEventMask,@winAttr);
+
+  title := 'FreePascal GLX demo --------- Press any key to exit';
+  XStringListToTextProperty(@title,1,@window_title_property);
+  XSetWMName(dpy,win,@window_title_property);
+
+  //Create an OpenGL rendering context
+  glXCont := glXCreateContext(dpy,visinfo,none,true);
+  if(glXCont = nil) then
+  writeLn('Error: Could not create an OpenGL rendering context');
+
+  //Make it current
+  glXMakeCurrent(dpy,win,glXCont);
+
+  //Map the window on the display
+  XMapWindow(dpy,win);
+  
+  loop();
+end.

+ 915 - 0
packages/opengl/examples/morph3d.pp

@@ -0,0 +1,915 @@
+{
+ *-
+ * morph3d.c - Shows 3D morphing objects
+ *
+ * Converted to GLUT by brianp on 1/1/98
+ * Converted to FreePascal by Peter Vreman on 9/3/2000
+ *
+ * This program was inspired on a WindowsNT(R)'s screen saver. It was written
+ * from scratch and it was not based on any other source code.
+ *
+ * Porting it to xlock (the final objective of this code since the moment I
+ * decided to create it) was possible by comparing the original Mesa's gear
+ * demo with it's ported version, so thanks for Danny Sung for his indirect
+ * help (look at gear.c in xlock source tree). NOTE: At the moment this code
+ * was sent to Brian Paul for package inclusion, the XLock Version was not
+ * available. In fact, I'll wait it to appear on the next Mesa release (If you
+ * are reading this, it means THIS release) to send it for xlock package
+ * inclusion). It will probably there be a GLUT version too.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home. *
+ * Since I'm not a native english speaker, my apologies for any gramatical
+ * mistake.
+ *
+ * My e-mail addresses are
+ *
+ * [email protected]
+ *         and
+ * [email protected]
+ *
+ * Marcelo F. Vianna (Feb-13-1997)
+ */
+}
+program morph3d;
+
+{$mode objfpc}
+
+{
+This document is VERY incomplete, but tries to describe the mathematics used
+in the program. At this moment it just describes how the polyhedra are
+generated. On futhurer versions, this document will be probabbly improved.
+
+Since I'm not a native english speaker, my apologies for any gramatical
+mistake.
+
+Marcelo Fernandes Vianna
+- Undergraduate in Computer Engeneering at Catholic Pontifical University
+- of Rio de Janeiro (PUC-Rio) Brasil.
+- e-mail: [email protected] or [email protected]
+- Feb-13-1997
+
+POLYHEDRA GENERATION
+
+For the purpose of this program it's not sufficient to know the polyhedra
+vertexes coordinates. Since the morphing algorithm applies a nonlinear
+transformation over the surfaces (faces) of the polyhedron, each face has
+to be divided into smaller ones. The morphing algorithm needs to transform
+each vertex of these smaller faces individually. It's a very time consoming
+task.
+
+In order to reduce calculation overload, and since all the macro faces of
+the polyhedron are transformed by the same way, the generation is made by
+creating only one face of the polyhedron, morphing it and then rotating it
+around the polyhedron center.
+
+What we need to know is the face radius of the polyhedron (the radius of
+the inscribed sphere) and the angle between the center of two adjacent
+faces using the center of the sphere as the angle's vertex.
+
+The face radius of the regular polyhedra are known values which I decided
+to not waste my time calculating. Following is a table of face radius for
+the regular polyhedra with edge length = 1:
+
+    TETRAHEDRON  : 1/(2*sqrt(2))/sqrt(3)
+    CUBE         : 1/2
+    OCTAHEDRON   : 1/sqrt(6)
+    DODECAHEDRON : T^2 * sqrt((T+2)/5) / 2     -> where T=(sqrt(5)+1)/2
+    ICOSAHEDRON  : (3*sqrt(3)+sqrt(15))/12
+
+I've not found any reference about the mentioned angles, so I needed to
+calculate them, not a trivial task until I figured out how :)
+Curiously these angles are the same for the tetrahedron and octahedron.
+A way to obtain this value is inscribing the tetrahedron inside the cube
+by matching their vertexes. So you'll notice that the remaining unmatched
+vertexes are in the same straight line starting in the cube/tetrahedron
+center and crossing the center of each tetrahedron's face. At this point
+it's easy to obtain the bigger angle of the isosceles triangle formed by
+the center of the cube and two opposite vertexes on the same cube face.
+The edges of this triangle have the following lenghts: sqrt(2) for the base
+and sqrt(3)/2 for the other two other edges. So the angle we want is:
+     +-----------------------------------------------------------+
+     | 2*ARCSIN(sqrt(2)/sqrt(3)) = 109.47122063449069174 degrees |
+     +-----------------------------------------------------------+
+For the cube this angle is obvious, but just for formality it can be
+easily obtained because we also know it's isosceles edge lenghts:
+sqrt(2)/2 for the base and 1/2 for the other two edges. So the angle we
+want is:
+     +-----------------------------------------------------------+
+     | 2*ARCSIN((sqrt(2)/2)/1)   = 90.000000000000000000 degrees |
+     +-----------------------------------------------------------+
+For the octahedron we use the same idea used for the tetrahedron, but now
+we inscribe the cube inside the octahedron so that all cubes's vertexes
+matches excatly the center of each octahedron's face. It's now clear that
+this angle is the same of the thetrahedron one:
+     +-----------------------------------------------------------+
+     | 2*ARCSIN(sqrt(2)/sqrt(3)) = 109.47122063449069174 degrees |
+     +-----------------------------------------------------------+
+For the dodecahedron it's a little bit harder because it's only relationship
+with the cube is useless to us. So we need to solve the problem by another
+way. The concept of Face radius also exists on 2D polygons with the name
+Edge radius:
+  Edge Radius For Pentagon (ERp)
+  ERp = (1/2)/TAN(36 degrees) * VRp = 0.6881909602355867905
+  (VRp is the pentagon's vertex radio).
+  Face Radius For Dodecahedron
+  FRd = T^2 * sqrt((T+2)/5) / 2 = 1.1135163644116068404
+Why we need ERp? Well, ERp and FRd segments forms a 90 degrees angle,
+completing this triangle, the lesser angle is a half of the angle we are
+looking for, so this angle is:
+     +-----------------------------------------------------------+
+     | 2*ARCTAN(ERp/FRd)         = 63.434948822922009981 degrees |
+     +-----------------------------------------------------------+
+For the icosahedron we can use the same method used for dodecahedron (well
+the method used for dodecahedron may be used for all regular polyhedra)
+  Edge Radius For Triangle (this one is well known: 1/3 of the triangle height)
+  ERt = sin(60)/3 = sqrt(3)/6 = 0.2886751345948128655
+  Face Radius For Icosahedron
+  FRi= (3*sqrt(3)+sqrt(15))/12 = 0.7557613140761707538
+So the angle is:
+     +-----------------------------------------------------------+
+     | 2*ARCTAN(ERt/FRi)         = 41.810314895778596167 degrees |
+     +-----------------------------------------------------------+
+}
+
+uses
+  GL,GLUT;
+
+type
+  float = single;
+
+const
+  Scale = 0.3;
+
+// #define sqr(A)                     ((A)*(A))
+
+// Increasing this values produces better image quality, the price is speed.
+// Very low values produces erroneous/incorrect plotting
+  tetradivisions            = 23;
+  cubedivisions             = 20;
+  octadivisions             = 21;
+  dodecadivisions           = 10;
+  icodivisions              = 15;
+
+  tetraangle                = 109.47122063449069174;
+  cubeangle                 = 90.000000000000000000;
+  octaangle                 = 109.47122063449069174;
+  dodecaangle               = 63.434948822922009981;
+  icoangle                  = 41.810314895778596167;
+
+//#define Pi                         3.1415926535897932385
+  SQRT2                     = 1.4142135623730951455;
+  SQRT3                     = 1.7320508075688771932;
+  SQRT5                     = 2.2360679774997898051;
+  SQRT6                     = 2.4494897427831778813;
+  SQRT15                    = 3.8729833462074170214;
+  cossec36_2                = 0.8506508083520399322;
+  cos72                     = 0.3090169943749474241;
+  sin72                     = 0.9510565162951535721;
+  cos36                     = 0.8090169943749474241;
+  sin36                     = 0.5877852522924731292;
+
+{*************************************************************************}
+
+const
+  mono   : boolean=false;
+  smooth : boolean=true;
+var
+  WindH,WindW   : GLint;
+  step,seno     : GLFloat;
+  _object       : glint;
+  edgedivisions : glint;
+  draw_object   : procedure;
+  Magnitude     : glfloat;
+  MaterialColor : array[0..19] of pglfloat;
+
+const
+  front_shininess : array[0..0] of glfloat = (60.0);
+  front_specular  : array[0..3] of glfloat = ( 0.7, 0.7, 0.7, 1.0 );
+  ambient         : array[0..3] of glfloat = ( 0.0, 0.0, 0.0, 1.0 );
+  diffuse         : array[0..3] of glfloat = ( 1.0, 1.0, 1.0, 1.0 );
+  position0       : array[0..3] of glfloat = ( 1.0, 1.0, 1.0, 0.0 );
+  position1       : array[0..3] of glfloat = (-1.0,-1.0, 1.0, 0.0 );
+  lmodel_ambient  : array[0..3] of glfloat = ( 0.5, 0.5, 0.5, 1.0 );
+  lmodel_twoside  : array[0..0] of glfloat = (GL_TRUE);
+
+  MaterialRed     : array[0..3] of glfloat = ( 0.7, 0.0, 0.0, 1.0 );
+  MaterialGreen   : array[0..3] of glfloat = ( 0.1, 0.5, 0.2, 1.0 );
+  MaterialBlue    : array[0..3] of glfloat = ( 0.0, 0.0, 0.7, 1.0 );
+  MaterialCyan    : array[0..3] of glfloat = ( 0.2, 0.5, 0.7, 1.0 );
+  MaterialYellow  : array[0..3] of glfloat = ( 0.7, 0.7, 0.0, 1.0 );
+  MaterialMagenta : array[0..3] of glfloat = ( 0.6, 0.2, 0.5, 1.0 );
+  MaterialWhite   : array[0..3] of glfloat = ( 0.7, 0.7, 0.7, 1.0 );
+  MaterialGray    : array[0..3] of glfloat = ( 0.2, 0.2, 0.2, 1.0 );
+
+
+procedure TRIANGLE(Edge,Amp:GLFloat; Divisions: longint; Z:GLFloat);
+var
+  Xf,Yf,Xa,Yb,Xf2,Yf2 : Extended;
+  Factor,Factor1,Factor2 : GLfloat;
+  VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ : GLfloat;
+  Ax,Ay,Bx : GLfloat;
+  Ri,Ti : longint;
+  Vr : GLfloat;
+  AmpVr2 : GLfloat;
+  Zf : GLfloat;
+begin
+  Vr:=(Edge)*SQRT3/3;
+  AmpVr2:=(Amp)/sqr(Vr);
+  Zf:=(Edge)*(Z);
+
+  Ax:=(Edge)*(+0.5/(Divisions));
+  Ay:=(Edge)*(-SQRT3/(2*Divisions));
+  Bx:=(Edge)*(-0.5/(Divisions));
+
+  for Ri:=1 to Divisions do
+   begin
+    glBegin(GL_TRIANGLE_STRIP);
+    for Ti:=0 to Ri-1 do
+     begin
+      Xf:=(Ri-Ti)*Ax + Ti*Bx;
+      Yf:=Vr+(Ri-Ti)*Ay + Ti*Ay;
+      Xa:=Xf+0.001; Yb:=Yf+0.001;
+      Xf2:=sqr(Xf);
+      Yf2:=sqr(Yf);
+      Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      glVertex3f(VertX, VertY, VertZ);
+
+      Xf:=(Ri-Ti-1)*Ax + Ti*Bx;
+      Yf:=Vr+(Ri-Ti-1)*Ay + Ti*Ay;
+      Xa:=Xf+0.001; Yb:=Yf+0.001;
+      Xf2:=sqr(Xf);
+      Yf2:=sqr(Yf);
+      Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      glVertex3f(VertX, VertY, VertZ);
+     end;
+    Xf:=Ri*Bx;
+    Yf:=Vr+Ri*Ay;
+    Xa:=Xf+0.001; Yb:=Yf+0.001;
+    Xf2:=sqr(Xf);
+    Yf2:=sqr(Yf);
+    Factor:=1-((Xf2+Yf2)*AmpVr2);
+    Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+    Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+    VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+    NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+    NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+    glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+    glVertex3f(VertX, VertY, VertZ);
+    glEnd();
+  end;
+end;
+
+
+procedure SQUARE(Edge,Amp:GLFloat; Divisions: longint; Z:GLFloat);
+var
+  Xi,Yi : longint;
+  Xf,Yf,Y,Y2,Xf2,Yf2,Xa,Yb : GLfloat;
+  Factor,Factor1,Factor2 : GLfloat;
+  VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ : GLfloat;
+  AmpVr2 : GLfloat;
+  Zf : GLfloat;
+begin
+  AmpVr2:=(Amp)/sqr((Edge)*SQRT2/2);
+  Zf:=(Edge)*(Z);
+
+  for Yi:=0 to Divisions-1 do
+   begin
+    Yf:=-((Edge)/2.0) + (Yi)/(Divisions)*(Edge);
+    Yf2:=sqr(Yf);
+    Y:=Yf+1.0/(Divisions)*(Edge);
+    Y2:=sqr(Y);
+    glBegin(GL_QUAD_STRIP);
+    for Xi:=0 to Divisions do
+     begin
+      Xf:=-((Edge)/2.0) + (Xi)/(Divisions)*(Edge);
+      Xf2:=sqr(Xf);
+
+      Xa:=Xf+0.001; Yb:=Y+0.001;
+      Factor:=1-((Xf2+Y2)*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Y2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Y;         VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Y-VertY;  NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      glVertex3f(VertX, VertY, VertZ);
+
+      Xa:=Xf+0.001; Yb:=Yf+0.001;
+      Factor:=1-((Xf2+Yf2)*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      glVertex3f(VertX, VertY, VertZ);
+     end;
+    glEnd();
+  end;
+end;
+
+procedure PENTAGON(Edge,Amp:GLFloat; Divisions: longint; Z:GLFloat);
+var
+  Ri,Ti,Fi : longint;
+  Xf,Yf,Xf2,Yf2,Xa,Yb : GLfloat;
+  X,Y : array[0..5] of GLFloat;
+  Factor,Factor1,Factor2 : GLfloat;
+  VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ : GLfloat;
+  AmpVr2 : GLfloat;
+  Zf : GLfloat;
+begin
+  AmpVr2:=(Amp)/sqr((Edge)*cossec36_2);
+  Zf:=(Edge)*(Z);
+
+  for Fi:=0 to 5 do
+   begin
+    x[Fi]:=-cos( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge);
+    y[Fi]:=sin( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge);
+   end;
+
+  for Ri:=1 to Divisions do
+   begin
+    for Fi:=0 to 4 do
+     begin
+      glBegin(GL_TRIANGLE_STRIP);
+      for Ti:=0 to Ri-1 do
+       begin
+        Xf:=(Ri-Ti)*x[Fi] + Ti*x[Fi+1];
+        Yf:=(Ri-Ti)*y[Fi] + Ti*y[Fi+1];
+        Xa:=Xf+0.001; Yb:=Yf+0.001;
+        Xf2:=sqr(Xf);
+        Yf2:=sqr(Yf);
+        Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+        Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+        Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+        VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+        NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+        NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+        glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+        glVertex3f(VertX, VertY, VertZ);
+
+        Xf:=(Ri-Ti-1)*x[Fi] + Ti*x[Fi+1];
+        Yf:=(Ri-Ti-1)*y[Fi] + Ti*y[Fi+1];
+        Xa:=Xf+0.001; Yb:=Yf+0.001;
+        Xf2:=sqr(Xf);
+        Yf2:=sqr(Yf);
+        Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+        Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+        Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+        VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+        NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+        NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+        glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+        glVertex3f(VertX, VertY, VertZ);
+       end;
+      Xf:=Ri*x[Fi+1];
+      Yf:=Ri*y[Fi+1];
+      Xa:=Xf+0.001; Yb:=Yf+0.001;
+      Xf2:=sqr(Xf);
+      Yf2:=sqr(Yf);
+      Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      glVertex3f(VertX, VertY, VertZ);
+      glEnd();
+     end;
+   end;
+end;
+
+
+procedure draw_tetra;
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  TRIANGLE(2,seno,edgedivisions,0.5/SQRT6);
+  glEndList();
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-tetraangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+tetraangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+tetraangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure draw_cube;
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  SQUARE(2, seno, edgedivisions, 0.5);
+  glEndList();
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glRotatef(cubeangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glRotatef(cubeangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glRotatef(cubeangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+  glRotatef(cubeangle,0,1,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+  glCallList(list);
+  glRotatef(2*cubeangle,0,1,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure draw_octa;
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  TRIANGLE(2,seno,edgedivisions,1/SQRT6);
+  glEndList();
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-180+octaangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-octaangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-octaangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-180+octaangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-octaangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-octaangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure draw_dodeca;
+const
+  TAU = ((SQRT5+1)/2);
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  PENTAGON(1,seno,edgedivisions,sqr(TAU) * sqrt((TAU+2)/5) / 2);
+  glEndList();
+
+  glPushMatrix();
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glRotatef(180,0,0,1);
+  glPushMatrix();
+  glRotatef(-dodecaangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(-dodecaangle,cos72,sin72,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(-dodecaangle,cos72,-sin72,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(dodecaangle,cos36,-sin36,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(dodecaangle,cos36,sin36,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+  glCallList(list);
+  glRotatef(180,0,0,1);
+  glPushMatrix();
+  glRotatef(-dodecaangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(-dodecaangle,cos72,sin72,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[8]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(-dodecaangle,cos72,-sin72,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[9]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(dodecaangle,cos36,-sin36,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[10]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(dodecaangle,cos36,sin36,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[11]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure draw_ico;
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  TRIANGLE(1.5,seno,edgedivisions,(3*SQRT3+SQRT15)/12);
+  glEndList();
+
+  glPushMatrix();
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[8]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[9]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[10]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[11]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[12]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[13]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[14]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[15]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[16]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[17]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[18]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[19]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure do_draw; cdecl;
+begin
+  glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
+
+  glPushMatrix();
+
+    glTranslatef( 0.0, 0.0, -10.0 );
+    glScalef( Scale*WindH/WindW, Scale, Scale );
+    glTranslatef(2.5*WindW/WindH*sin(step*1.11),2.5*cos(step*1.25*1.11),0);
+    glRotatef(step*100,1,0,0);
+    glRotatef(step*95,0,1,0);
+    glRotatef(step*90,0,0,1);
+
+  seno:=(sin(step)+1.0/3.0)*(4.0/5.0)*Magnitude;
+
+  draw_object();
+
+  glPopMatrix();
+
+  glFlush();
+
+  glutSwapBuffers();
+
+  step:=step+0.05;
+end;
+
+
+procedure do_idle; cdecl;
+begin
+  glutPostRedisplay();
+end;
+
+
+procedure do_reshape(width,height:longint); cdecl;
+begin
+  WindW:=width;
+  WindH:=height;
+  glViewport(0, 0, width, height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
+  glMatrixMode(GL_MODELVIEW);
+end;
+
+
+procedure pinit;
+var
+  loop : longint;
+begin
+  case _object of
+    1 :
+    begin
+      draw_object:=@draw_tetra;
+      MaterialColor[0]:=@MaterialRed;
+      MaterialColor[1]:=@MaterialGreen;
+      MaterialColor[2]:=@MaterialBlue;
+      MaterialColor[3]:=@MaterialWhite;
+      edgedivisions:=tetradivisions;
+      Magnitude:=2.5;
+    end;
+    2:
+    begin
+      draw_object:=@draw_cube;
+      MaterialColor[0]:=@MaterialRed;
+      MaterialColor[1]:=@MaterialGreen;
+      MaterialColor[2]:=@MaterialCyan;
+      MaterialColor[3]:=@MaterialMagenta;
+      MaterialColor[4]:=@MaterialYellow;
+      MaterialColor[5]:=@MaterialBlue;
+      edgedivisions:=cubedivisions;
+      Magnitude:=2.0;
+    end;
+    3:
+    begin
+      draw_object:=@draw_octa;
+      MaterialColor[0]:=MaterialRed;
+      MaterialColor[1]:=MaterialGreen;
+      MaterialColor[2]:=MaterialBlue;
+      MaterialColor[3]:=MaterialWhite;
+      MaterialColor[4]:=MaterialCyan;
+      MaterialColor[5]:=MaterialMagenta;
+      MaterialColor[6]:=MaterialGray;
+      MaterialColor[7]:=MaterialYellow;
+      edgedivisions:=octadivisions;
+      Magnitude:=2.5;
+    end;
+    4:
+    begin
+      draw_object:=@draw_dodeca;
+      MaterialColor[ 0]:=MaterialRed;
+      MaterialColor[ 1]:=MaterialGreen;
+      MaterialColor[ 2]:=MaterialCyan;
+      MaterialColor[ 3]:=MaterialBlue;
+      MaterialColor[ 4]:=MaterialMagenta;
+      MaterialColor[ 5]:=MaterialYellow;
+      MaterialColor[ 6]:=MaterialGreen;
+      MaterialColor[ 7]:=MaterialCyan;
+      MaterialColor[ 8]:=MaterialRed;
+      MaterialColor[ 9]:=MaterialMagenta;
+      MaterialColor[10]:=MaterialBlue;
+      MaterialColor[11]:=MaterialYellow;
+      edgedivisions:=dodecadivisions;
+      Magnitude:=2.0;
+    end;
+    5:
+    begin
+      draw_object:=@draw_ico;
+      MaterialColor[ 0]:=MaterialRed;
+      MaterialColor[ 1]:=MaterialGreen;
+      MaterialColor[ 2]:=MaterialBlue;
+      MaterialColor[ 3]:=MaterialCyan;
+      MaterialColor[ 4]:=MaterialYellow;
+      MaterialColor[ 5]:=MaterialMagenta;
+      MaterialColor[ 6]:=MaterialRed;
+      MaterialColor[ 7]:=MaterialGreen;
+      MaterialColor[ 8]:=MaterialBlue;
+      MaterialColor[ 9]:=MaterialWhite;
+      MaterialColor[10]:=MaterialCyan;
+      MaterialColor[11]:=MaterialYellow;
+      MaterialColor[12]:=MaterialMagenta;
+      MaterialColor[13]:=MaterialRed;
+      MaterialColor[14]:=MaterialGreen;
+      MaterialColor[15]:=MaterialBlue;
+      MaterialColor[16]:=MaterialCyan;
+      MaterialColor[17]:=MaterialYellow;
+      MaterialColor[18]:=MaterialMagenta;
+      MaterialColor[19]:=MaterialGray;
+      edgedivisions:=icodivisions;
+      Magnitude:=2.5;
+    end;
+  end;
+  if (mono) then
+   begin
+     for loop:=0 to 19 do
+      MaterialColor[loop]:=MaterialGray;
+   end;
+  if (smooth) then
+    glShadeModel( GL_SMOOTH )
+  else
+    glShadeModel( GL_FLAT );
+end;
+
+
+procedure do_key(k:byte;x,y:integer); cdecl;
+begin
+  case Char(k) of
+    '1' : _object:=1;
+    '2' : _object:=2;
+    '3' : _object:=3;
+    '4' : _object:=4;
+    '5' : _object:=5;
+    ' ' : mono:=not mono;
+    #13 : smooth:=not smooth;
+    #27 : halt(0);
+  end;
+  pinit;
+end;
+
+
+begin
+  writeln('Morph 3D - Shows morphing platonic polyhedra');
+  writeln('Author: Marcelo Fernandes Vianna ([email protected])');
+  writeln('  [1]    - Tetrahedron');
+  writeln('  [2]    - Hexahedron (Cube)');
+  writeln('  [3]    - Octahedron');
+  writeln('  [4]    - Dodecahedron');
+  writeln('  [5]    - Icosahedron');
+  writeln('[SPACE]  - Toggle colored faces');
+  writeln('[RETURN] - Toggle smooth/flat shading');
+  writeln(' [ESC]   - Quit');
+  _object:=3;
+
+  glutInit(@argc, argv);
+  glutInitWindowPosition(0,0);
+  glutInitWindowSize(640,480);
+
+  glutInitDisplayMode( GLUT_DEPTH + GLUT_DOUBLE + GLUT_RGB );
+
+  if (glutCreateWindow('Morph 3D - Shows morphing platonic polyhedra') <= 0) then
+    halt(1);
+
+  glClearDepth(1.0);
+  glClearColor( 0.0, 0.0, 0.0, 1.0 );
+  glColor3f( 1.0, 1.0, 1.0 );
+
+  glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
+  glFlush();
+  glutSwapBuffers();
+
+  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+  glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+  glEnable(GL_LIGHTING);
+  glEnable(GL_LIGHT0);
+  glEnable(GL_LIGHT1);
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_NORMALIZE);
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+  glHint(GL_FOG_HINT, GL_FASTEST);
+  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+  glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
+
+  pinit();
+
+  glutReshapeFunc( @do_reshape );
+  glutKeyboardFunc( @do_key );
+  glutIdleFunc( @do_idle );
+  glutDisplayFunc( @do_draw );
+  glutMainLoop();
+end.

+ 375 - 0
packages/opengl/examples/radblur.pp

@@ -0,0 +1,375 @@
+//------------------------------------------------------------------------
+//
+// Author              : Dario Corno (rIo) / Jeff Molofee (NeHe)
+// Converted to Delphi : Jan Horn
+// Email               : [email protected]
+// Website             : http://www.sulaco.co.za
+// Authors Web Site    : http://www.spinningkids.org/rio
+// Date                : 14 October 2001
+// Version             : 1.0
+// Description         : Radial Blur
+//
+// Adapted to FPC      : Sebastian Guenther ([email protected]) 2001-11-21
+//
+//------------------------------------------------------------------------
+program RadialBlur;
+
+{$mode objfpc}
+
+uses GL, GLU, GLUT;
+
+const
+  WND_TITLE = 'Radial Blur';
+
+type TVector = Array[0..2] of glFloat;
+var
+  ElapsedTime : Integer;             // Elapsed time between frames
+
+  // Textures
+  BlurTexture : glUint;              // An Unsigned Int To Store The Texture Number
+
+  // User vaiables
+  Angle : glFloat;
+  Vertexes : Array[0..3] of TVector;
+  normal : TVector;
+
+const
+  FPSCount : Integer = 0;            // Counter for FPS
+  // Lights and Materials
+  globalAmbient  : Array[0..3] of glFloat = (0.2, 0.2,  0.2, 1.0);      // Set Ambient Lighting To Fairly Dark Light (No Color)
+  Light0Pos      : Array[0..3] of glFloat = (0.0, 5.0, 10.0, 1.0);      // Set The Light Position
+  Light0Ambient  : Array[0..3] of glFloat = (0.2, 0.2,  0.2, 1.0);      // More Ambient Light
+  Light0Diffuse  : Array[0..3] of glFloat = (0.3, 0.3,  0.3, 1.0);      // Set The Diffuse Light A Bit Brighter
+  Light0Specular : Array[0..3] of glFloat = (0.8, 0.8,  0.8, 1.0);      // Fairly Bright Specular Lighting
+
+  LmodelAmbient  : Array[0..3] of glFloat = (0.2, 0.2,  0.2, 1.0);      // And More Ambient Light
+
+
+function EmptyTexture : glUint;
+var txtnumber : glUint;
+    pData : Pointer;
+begin
+  // Create Storage Space For Texture Data (128x128x4)
+  GetMem(pData, 128*128*4);
+
+  glGenTextures(1, @txtnumber);                         // Create 1 Texture
+  glBindTexture(GL_TEXTURE_2D, txtnumber);              // Bind The Texture
+  glTexImage2D(GL_TEXTURE_2D, 0, 4, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, pData);
+  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+
+  result :=txtNumber;
+end;
+
+
+procedure ReduceToUnit(var vector : Array of glFloat);
+var length : glFLoat;
+begin
+  // Calculates The Length Of The Vector
+  length := sqrt((vector[0]*vector[0]) + (vector[1]*vector[1]) + (vector[2]*vector[2]));
+  if Length = 0 then
+    Length :=1;
+
+  vector[0] :=vector[0] / length;
+  vector[1] :=vector[1] / length;
+  vector[2] :=vector[2] / length;
+end;
+
+
+procedure calcNormal(const v : Array of TVector; var cross : Array of glFloat);
+var v1, v2 : Array[0..2] of glFloat;
+begin
+  // Finds The Vector Between 2 Points By Subtracting
+  // The x,y,z Coordinates From One Point To Another.
+
+  // Calculate The Vector From Point 1 To Point 0
+  v1[0] := v[0][0] - v[1][0];                   // Vector 1.x=Vertex[0].x-Vertex[1].x
+  v1[1] := v[0][1] - v[1][1];                   // Vector 1.y=Vertex[0].y-Vertex[1].y
+  v1[2] := v[0][2] - v[1][2];                   // Vector 1.z=Vertex[0].y-Vertex[1].z
+  // Calculate The Vector From Point 2 To Point 1
+  v2[0] := v[1][0] - v[2][0];                   // Vector 2.x=Vertex[0].x-Vertex[1].x
+  v2[1] := v[1][1] - v[2][1];                   // Vector 2.y=Vertex[0].y-Vertex[1].y
+  v2[2] := v[1][2] - v[2][2];                   // Vector 2.z=Vertex[0].z-Vertex[1].z
+  // Compute The Cross Product To Give Us A Surface Normal
+  cross[0] := v1[1]*v2[2] - v1[2]*v2[1];        // Cross Product For Y - Z
+  cross[1] := v1[2]*v2[0] - v1[0]*v2[2];        // Cross Product For X - Z
+  cross[2] := v1[0]*v2[1] - v1[1]*v2[0];        // Cross Product For X - Y
+
+  ReduceToUnit(cross);                          // Normalize The Vectors
+end;
+
+
+// Draws A Helix
+procedure ProcessHelix;
+const Twists = 5;
+      MaterialColor : Array[1..4] of glFloat = (0.4, 0.2, 0.8, 1.0);
+      Specular      : Array[1..4] of glFloat = (1, 1, 1, 1);
+var x, y, z : glFLoat;
+    phi, theta : Integer;
+    r, u, v : glFLoat;
+begin
+  glLoadIdentity();                             // Reset The Modelview Matrix
+  gluLookAt(0, 5, 50, 0, 0, 0, 0, 1, 0);        // Eye Position (0,5,50) Center Of Scene (0,0,0), Up On Y Axis
+
+  glPushMatrix();                               // Push The Modelview Matrix
+    glTranslatef(0,0,-50);                      // Translate 50 Units Into The Screen
+    glRotatef(angle/2.0, 1, 0, 0);              // Rotate By angle/2 On The X-Axis
+    glRotatef(angle/3.0, 0, 1, 0);              // Rotate By angle/3 On The Y-Axis
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, @MaterialColor);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, @specular);
+
+    r :=1.5;                                    // Radius
+
+    glBegin(GL_QUADS);                          // Begin Drawing Quads
+      phi :=0;
+      while phi < 360 do
+      begin
+        theta :=0;
+        while theta < 360*twists do
+        begin
+          v := phi / 180.0 * pi;                // Calculate Angle Of First Point       (  0 )
+          u := theta / 180.0 * pi;              // Calculate Angle Of First Point       (  0 )
+
+          x :=cos(u)*(2 + cos(v))*r;            // Calculate x Position (1st Point)
+          y :=sin(u)*(2 + cos(v))*r;            // Calculate y Position (1st Point)
+          z :=(u-(2*pi) + sin(v))*r;            // Calculate z Position (1st Point)
+
+          vertexes[0][0] :=x;                   // Set x Value Of First Vertex
+          vertexes[0][1] :=y;                   // Set y Value Of First Vertex
+          vertexes[0][2] :=z;                   // Set z Value Of First Vertex
+
+          v :=(phi/180.0 * pi);                 // Calculate Angle Of Second Point      (  0 )
+          u :=((theta+20)/180.0 * pi);          // Calculate Angle Of Second Point      ( 20 )
+
+          x :=cos(u)*(2 + cos(v))*r;            // Calculate x Position (2nd Point)
+          y :=sin(u)*(2 + cos(v))*r;            // Calculate y Position (2nd Point)
+          z :=(u-(2*pi) + sin(v))*r;            // Calculate z Position (2nd Point)
+
+          vertexes[1][0] :=x;                   // Set x Value Of Second Vertex
+          vertexes[1][1] :=y;                   // Set y Value Of Second Vertex
+          vertexes[1][2] :=z;                   // Set z Value Of Second Vertex
+
+          v :=(phi+20)/180.0*pi;                // Calculate Angle Of Third Point       ( 20 )
+          u :=(theta+20)/180.0*pi;              // Calculate Angle Of Third Point       ( 20 )
+
+          x :=cos(u)*(2 + cos(v))*r;            // Calculate x Position (3rd Point)
+          y :=sin(u)*(2 + cos(v))*r;            // Calculate y Position (3rd Point)
+          z :=(u-(2*pi) + sin(v))*r;            // Calculate z Position (3rd Point)
+
+          vertexes[2][0] :=x;                   // Set x Value Of Third Vertex
+          vertexes[2][1] :=y;                   // Set y Value Of Third Vertex
+          vertexes[2][2] :=z;                   // Set z Value Of Third Vertex
+
+          v :=(phi+20)/180.0*pi;                // Calculate Angle Of Fourth Point      ( 20 )
+          u :=theta / 180.0*pi;                 // Calculate Angle Of Fourth Point      (  0 )
+
+          x :=cos(u)*(2 + cos(v))*r;            // Calculate x Position (4th Point)
+          y :=sin(u)*(2 + cos(v))*r;            // Calculate y Position (4th Point)
+          z :=(u-(2*pi) + sin(v))*r;            // Calculate z Position (4th Point)
+
+          vertexes[3][0] :=x;                   // Set x Value Of Fourth Vertex
+          vertexes[3][1] :=y;                   // Set y Value Of Fourth Vertex
+          vertexes[3][2] :=z;                   // Set z Value Of Fourth Vertex
+
+          calcNormal(vertexes, normal);         // Calculate The Quad Normal
+
+          glNormal3f(normal[0],normal[1],normal[2]);    // Set The Normal
+
+          // Render The Quad
+          glVertex3f(vertexes[0][0],vertexes[0][1],vertexes[0][2]);
+          glVertex3f(vertexes[1][0],vertexes[1][1],vertexes[1][2]);
+          glVertex3f(vertexes[2][0],vertexes[2][1],vertexes[2][2]);
+          glVertex3f(vertexes[3][0],vertexes[3][1],vertexes[3][2]);
+          theta := theta + 20;
+        end;
+        phi :=phi + 20;
+      end;
+    glEnd();                                   // Done Rendering Quads
+  glPopMatrix();                               // Pop The Matrix
+end;
+
+
+// Set Up An Ortho View
+procedure ViewOrtho;
+begin
+  glMatrixMode(GL_PROJECTION);                  // Select Projection
+  glPushMatrix();                               // Push The Matrix
+  glLoadIdentity();                             // Reset The Matrix
+  glOrtho( 0, 640 , 480 , 0, -1, 1 );           // Select Ortho Mode (640x480)
+  glMatrixMode(GL_MODELVIEW);                   // Select Modelview Matrix
+  glPushMatrix();                               // Push The Matrix
+  glLoadIdentity();                             // Reset The Matrix
+end;
+
+
+// Set Up A Perspective View
+procedure ViewPerspective;
+begin
+  glMatrixMode( GL_PROJECTION );                // Select Projection
+  glPopMatrix();                                // Pop The Matrix
+  glMatrixMode( GL_MODELVIEW );                 // Select Modelview
+  glPopMatrix();                                // Pop The Matrix
+end;
+
+
+// Renders To A Texture
+procedure RenderToTexture;
+begin
+  glViewport(0, 0, 128, 128);                           // Set Our Viewport (Match Texture Size)
+  ProcessHelix();                                       // Render The Helix
+  glBindTexture(GL_TEXTURE_2D,BlurTexture);             // Bind To The Blur Texture
+
+  // Copy Our ViewPort To The Blur Texture (From 0,0 To 128,128... No Border)
+  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 128, 128, 0);
+  glClearColor(0.0, 0.0, 0.5, 0.5);                     // Set The Clear Color To Medium Blue
+  glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);  // Clear The Screen And Depth Buffer
+  glViewport(0, 0, 640 ,480);                           // Set Viewport (0,0 to 640x480)
+end;
+
+
+// Draw The Blurred Image
+procedure DrawBlur(const times : Integer; const inc : glFloat);
+var spost, alpha, alphainc : glFloat;
+    I : Integer;
+begin
+  alpha := 0.2;
+  spost := 0.0;
+  glEnable(GL_TEXTURE_2D);                      // Enable 2D Texture Mapping
+  glDisable(GL_DEPTH_TEST);                     // Disable Depth Testing
+  glBlendFunc(GL_SRC_ALPHA,GL_ONE);             // Set Blending Mode
+  glEnable(GL_BLEND);                           // Enable Blending
+  glBindTexture(GL_TEXTURE_2D,BlurTexture);     // Bind To The Blur Texture
+  ViewOrtho();                                  // Switch To An Ortho View
+
+  alphainc := alpha / times;                    // alphainc=0.2f / Times To Render Blur
+
+  glBegin(GL_QUADS);                            // Begin Drawing Quads
+    // Number Of Times To Render Blur
+    For I :=0 to times-1 do
+    begin
+      glColor4f(1.0, 1.0, 1.0, alpha);          // Set The Alpha Value (Starts At 0.2)
+      glTexCoord2f(0+spost,1-spost);            // Texture Coordinate   ( 0, 1 )
+      glVertex2f(0,0);                          // First Vertex         (   0,   0 )
+
+      glTexCoord2f(0+spost,0+spost);            // Texture Coordinate   ( 0, 0 )
+      glVertex2f(0,480);                        // Second Vertex        (   0, 480 )
+
+      glTexCoord2f(1-spost,0+spost);            // Texture Coordinate   ( 1, 0 )
+      glVertex2f(640,480);                      // Third Vertex         ( 640, 480 )
+
+      glTexCoord2f(1-spost,1-spost);            // Texture Coordinate   ( 1, 1 )
+      glVertex2f(640,0);                        // Fourth Vertex        ( 640,   0 )
+
+      spost := spost + inc;                     // Gradually Increase spost (Zooming Closer To Texture Center)
+      alpha := alpha - alphainc;                // Gradually Decrease alpha (Gradually Fading Image Out)
+    end;
+  glEnd();                                      // Done Drawing Quads
+
+  ViewPerspective();                            // Switch To A Perspective View
+
+  glEnable(GL_DEPTH_TEST);                      // Enable Depth Testing
+  glDisable(GL_TEXTURE_2D);                     // Disable 2D Texture Mapping
+  glDisable(GL_BLEND);                          // Disable Blending
+  glBindTexture(GL_TEXTURE_2D,0);               // Unbind The Blur Texture
+end;
+
+{------------------------------------------------------------------}
+{  Function to draw the actual scene                               }
+{------------------------------------------------------------------}
+procedure glDraw;
+begin
+  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);    // Clear The Screen And The Depth Buffer
+  glLoadIdentity();                     // Reset The View
+  RenderToTexture;                      // Render To A Texture
+  ProcessHelix;                         // Draw Our Helix
+  DrawBlur(25, 0.02);                   // Draw The Blur Effect
+
+  angle :=ElapsedTime / 5.0;            // Update angle Based On The Clock
+end;
+
+
+{------------------------------------------------------------------}
+{  Initialise OpenGL                                               }
+{------------------------------------------------------------------}
+procedure glInit;
+begin
+  glClearColor(0.0, 0.0, 0.0, 0.5);        // Black Background
+  glShadeModel(GL_SMOOTH);                 // Enables Smooth Color Shading
+  glClearDepth(1.0);                       // Depth Buffer Setup
+  glDepthFunc(GL_LESS);                    // The Type Of Depth Test To Do
+
+  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   //Realy Nice perspective calculations
+
+  glEnable(GL_DEPTH_TEST);                 // Enable Depth Buffer
+  glEnable(GL_TEXTURE_2D);                 // Enable Texture Mapping
+
+  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @LmodelAmbient);       // Set The Ambient Light Model
+
+  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @GlobalAmbient);       // Set The Global Ambient Light Model
+  glLightfv(GL_LIGHT0, GL_POSITION, @light0Pos);                // Set The Lights Position
+  glLightfv(GL_LIGHT0, GL_AMBIENT, @light0Ambient);             // Set The Ambient Light
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, @light0Diffuse);             // Set The Diffuse Light
+  glLightfv(GL_LIGHT0, GL_SPECULAR, @light0Specular);           // Set Up Specular Lighting
+  glEnable(GL_LIGHTING);                                                                                // Enable Lighting
+  glEnable(GL_LIGHT0);                                                                          // Enable Light0
+
+  BlurTexture := EmptyTexture();                                                                // Create Our Empty Texture
+  glShadeModel(GL_SMOOTH);                                                                      // Select Smooth Shading
+  glMateriali(GL_FRONT, GL_SHININESS, 128);
+end;
+
+
+{------------------------------------------------------------------}
+{  Handle window resize                                            }
+{------------------------------------------------------------------}
+procedure glResizeWnd(Width, Height : Integer);
+begin
+  if (Height = 0) then                // prevent divide by zero exception
+    Height := 1;
+  glViewport(0, 0, Width, Height);    // Set the viewport for the OpenGL window
+  glMatrixMode(GL_PROJECTION);        // Change Matrix Mode to Projection
+  glLoadIdentity();                   // Reset View
+  gluPerspective(45.0, Width/glFloat(Height), 2.0, 200.0);  // Do the perspective calculations. Last value = max clipping depth
+
+  glMatrixMode(GL_MODELVIEW);         // Return to the modelview matrix
+  glLoadIdentity();                   // Reset View
+end;
+
+
+var
+  DemoStart, LastTime : LongWord;
+
+
+procedure DisplayWindow; cdecl;
+begin
+  Inc(FPSCount);                      // Increment FPS Counter
+
+  LastTime :=ElapsedTime;
+  ElapsedTime := glutGet(GLUT_ELAPSED_TIME) - DemoStart;     // Calculate Elapsed Time
+  ElapsedTime :=(LastTime + ElapsedTime) DIV 2; // Average it out for smoother movement
+  glDraw;
+  glutSwapBuffers;
+  Inc(ElapsedTime, 10);
+  glutPostRedisplay;
+end;
+
+procedure OnReshape(width, height: Integer); cdecl;
+begin
+  glResizeWnd(width, height);
+end;
+
+
+begin
+  glutInit(@argc, argv);
+  glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
+  glutCreateWindow(WND_TITLE);
+  glutDisplayFunc(@DisplayWindow);
+  glutReshapeFunc(@OnReshape);
+  glutInitWindowSize(640, 480);
+
+  glInit;
+
+  DemoStart := glutGet(GLUT_ELAPSED_TIME);
+  glutMainLoop;
+end.

+ 37 - 0
packages/opengl/fpmake.pp

@@ -0,0 +1,37 @@
+{$ifndef ALLPACKAGES}
+{$mode objfpc}{$H+}
+program fpmake;
+
+uses fpmkunit;
+
+Var
+  P : TPackage;
+  T : TTarget;
+begin
+  With Installer do
+    begin
+{$endif ALLPACKAGES}
+
+    P:=AddPackage('opengl');
+{$ifdef ALLPACKAGES}
+    P.Directory:='opengl';
+{$endif ALLPACKAGES}
+    P.Version:='2.0.0';
+    P.SourcePath.Add('src');
+
+    T:=P.Targets.AddUnit('glext.pp');
+    T:=P.Targets.AddUnit('gl.pp');
+    T:=P.Targets.AddUnit('glu.pp');
+    T:=P.Targets.AddUnit('glut.pp');
+    T:=P.Targets.AddUnit('glx.pp');
+      with T.Dependencies do
+        begin
+          AddUnit('xlib');
+        end;
+
+
+{$ifndef ALLPACKAGES}
+    Run;
+    end;
+end.
+{$endif ALLPACKAGES}

+ 46 - 0
packages/opengl/glunits.txt

@@ -0,0 +1,46 @@
+  glunits.zip
+***************
+
+These are the Delphi conversions of gl.h, glu.h, glut.h and
+glext.h. Copy them to your Delphi\Lib directory or somewhere else
+in your compiler's search path and you're all set!
+
+To use these units with OpenGL drivers other than Microsoft's,
+you need to manually initialize three DLL libraries. For example:
+
+  LoadOpenGL('opengl.dll');
+  LoadGLu('glu.dll');
+  LoadGlut('glut.dll');  // Optional
+
+If you do this, make sure to free the previously loaded library
+first:
+
+  FreeOpenGL;
+  FreeGLu;
+  FreeGlut;
+
+If the DLLs the application is trying to load cannot be found, an
+exception will be raised. By default, the units will try to load
+OpenGL32.dll, GLu32.dll and Glut32.dll. No exception will be
+thrown if they are not found, so if you want to support multiple
+OpenGL implementations in your app, it's probably best to
+explicitly load the DLLs explicitly as shown above. This way, you
+can properly trap errors.
+
+A final note: if you have a 3D card with an OpenGL ICD, you do NOT
+need to load the driver yourself. Microsoft's OpenGL32.dll will
+automatically detect and use your 3D card's drivers, so the
+default settings in these units will work perfectly.
+
+The fourth file in this archive, glext.pas, contains declarations
+of constants and function prototypes of most OpenGL extensions.
+To use an extension, you just need to check if it's supported, and
+load it's functions with wglGetProcAddress() if it is. You can
+check the presence of an extension with the included function
+glext_ExtensionSupported(). By using glext.pas, you no longer have
+to copy/paste/translate declarations from the extension specs. If
+you should come across an extension that isn't yet included in
+glext.pas, I'd appreciate it if you could drop me a line so I can
+add it ASAP.
+
+  Tom Nuydens ([email protected])

+ 22 - 0
packages/opengl/readme

@@ -0,0 +1,22 @@
+New Free Pascal OpenGL (GL, GLU, GLUT, GLX) Units
+GLX unit (c) 1999-2002 Sebastian Guenther, [email protected]
+other units adapted to Free Pascal from the delphi3d.net units
+by Tom Nuydens ([email protected]), see http://www.delphi3d.net/
+
+You might have a look at the original readme, glunits.txt, as well 
+
+
+Some remarks:
+* The new OpenGL units are not 100% compatible to the old ones; the new units
+  use exactly the same function declarations as their C counterpart.
+* Platform compatiblity: You can work on all targets exactly as on Win32;
+  for example, you can use wglGetProcAddress for loading OpenGL extensions even
+  on Unix based systems. A future release of the glext unit might have helper
+  functions for loading specific extensions. (There is a small problem with
+  Free Pascal: In FPC mode, you cannot assign a pointer, as returned by
+  wglGetProcAddress, to a variable which holds a function pointer. Currently
+  you have to compile your programs in Delphi mode, if they are using OpenGL
+  extensions)
+* GLUT on Win32: Get the glut32.dll from here:
+  http://www.xmission.com/~nate/glut.html
+* GTKGLArea: The GL Area widget for GTK is available in the GTK package

+ 2346 - 0
packages/opengl/src/gl.pp

@@ -0,0 +1,2346 @@
+{
+
+  Adaption of the delphi3d.net OpenGL units to FreePascal
+  Sebastian Guenther ([email protected]) in 2002
+  These units are free to use
+}
+
+(*++ BUILD Version: 0004    // Increment this if a change has global effects
+
+Copyright (c) 1985-96, Microsoft Corporation
+
+Module Name:
+
+    gl.h
+
+Abstract:
+
+    Procedure declarations, constant definitions and macros for the OpenGL
+    component.
+
+--*)
+
+{*
+** Copyright 1996 Silicon Graphics, Inc.
+** All Rights Reserved.
+**
+** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
+** the contents of this file may not be disclosed to third parties, copied or
+** duplicated in any form, in whole or in part, without the prior written
+** permission of Silicon Graphics, Inc.
+**
+** RESTRICTED RIGHTS LEGEND:
+** Use, duplication or disclosure by the Government is subject to restrictions
+** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
+** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
+** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
+** rights reserved under the Copyright Laws of the United States.
+*}
+
+{******************************************************************************}
+{ Converted to Delphi by Tom Nuydens ([email protected])                        }
+{ For the latest updates, visit Delphi3D: http://www.delphi3d.net              }
+{******************************************************************************}
+
+{$MODE Delphi}
+{$MACRO ON}
+{$IFDEF Windows}
+  {$DEFINE extdecl := stdcall}
+{$ELSE}
+  {$DEFINE extdecl := cdecl}
+  {$IFDEF MorphOS}
+    {$INLINE ON}
+    {$DEFINE GL_UNIT}
+  {$ELSE}
+    {$LINKLIB c}
+  {$ENDIF}
+{$ENDIF}
+
+unit GL;
+
+interface
+
+uses
+  SysUtils,
+  {$IFDEF Windows}
+  Windows, dynlibs
+  {$ELSE Windows}
+  {$IFDEF MorphOS}
+  TinyGL
+  {$ELSE MorphOS}
+  dynlibs
+  {$ENDIF MorphOS}
+  {$ENDIF Windows};
+
+{$IFNDEF MORPHOS}
+var
+  LibGL: TLibHandle;
+{$ENDIF MORPHOS}
+
+type
+  GLenum     = Cardinal;      PGLenum     = ^GLenum;
+  GLboolean  = Byte;          PGLboolean  = ^GLboolean;
+  GLbitfield = Cardinal;      PGLbitfield = ^GLbitfield;
+  GLbyte     = ShortInt;      PGLbyte     = ^GLbyte;
+  GLshort    = SmallInt;      PGLshort    = ^GLshort;
+  GLint      = Integer;       PGLint      = ^GLint;
+  GLsizei    = Integer;       PGLsizei    = ^GLsizei;
+  GLubyte    = Byte;          PGLubyte    = ^GLubyte;
+  GLushort   = Word;          PGLushort   = ^GLushort;
+  GLuint     = Cardinal;      PGLuint     = ^GLuint;
+  GLfloat    = Single;        PGLfloat    = ^GLfloat;
+  GLclampf   = Single;        PGLclampf   = ^GLclampf;
+  GLdouble   = Double;        PGLdouble   = ^GLdouble;
+  GLclampd   = Double;        PGLclampd   = ^GLclampd;
+{ GLvoid     = void; }        PGLvoid     = Pointer;
+                              PPGLvoid    = ^PGLvoid;
+
+  TGLenum     = GLenum;
+  TGLboolean  = GLboolean;
+  TGLbitfield = GLbitfield;
+  TGLbyte     = GLbyte;
+  TGLshort    = GLshort;
+  TGLint      = GLint;
+  TGLsizei    = GLsizei;
+  TGLubyte    = GLubyte;
+  TGLushort   = GLushort;
+  TGLuint     = GLuint;
+  TGLfloat    = GLfloat;
+  TGLclampf   = GLclampf;
+  TGLdouble   = GLdouble;
+  TGLclampd   = GLclampd;
+
+{******************************************************************************}
+
+const
+  // Version
+  GL_VERSION_1_1                    = 1;
+
+  // AccumOp
+  GL_ACCUM                          = $0100;
+  GL_LOAD                           = $0101;
+  GL_RETURN                         = $0102;
+  GL_MULT                           = $0103;
+  GL_ADD                            = $0104;
+
+  // AlphaFunction
+  GL_NEVER                          = $0200;
+  GL_LESS                           = $0201;
+  GL_EQUAL                          = $0202;
+  GL_LEQUAL                         = $0203;
+  GL_GREATER                        = $0204;
+  GL_NOTEQUAL                       = $0205;
+  GL_GEQUAL                         = $0206;
+  GL_ALWAYS                         = $0207;
+
+  // AttribMask
+  GL_CURRENT_BIT                    = $00000001;
+  GL_POINT_BIT                      = $00000002;
+  GL_LINE_BIT                       = $00000004;
+  GL_POLYGON_BIT                    = $00000008;
+  GL_POLYGON_STIPPLE_BIT            = $00000010;
+  GL_PIXEL_MODE_BIT                 = $00000020;
+  GL_LIGHTING_BIT                   = $00000040;
+  GL_FOG_BIT                        = $00000080;
+  GL_DEPTH_BUFFER_BIT               = $00000100;
+  GL_ACCUM_BUFFER_BIT               = $00000200;
+  GL_STENCIL_BUFFER_BIT             = $00000400;
+  GL_VIEWPORT_BIT                   = $00000800;
+  GL_TRANSFORM_BIT                  = $00001000;
+  GL_ENABLE_BIT                     = $00002000;
+  GL_COLOR_BUFFER_BIT               = $00004000;
+  GL_HINT_BIT                       = $00008000;
+  GL_EVAL_BIT                       = $00010000;
+  GL_LIST_BIT                       = $00020000;
+  GL_TEXTURE_BIT                    = $00040000;
+  GL_SCISSOR_BIT                    = $00080000;
+  GL_ALL_ATTRIB_BITS                = $000FFFFF;
+
+  // 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;
+  GL_QUADS                          = $0007;
+  GL_QUAD_STRIP                     = $0008;
+  GL_POLYGON                        = $0009;
+
+  // 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
+
+  // Boolean
+  GL_TRUE                           = 1;
+  GL_FALSE                          = 0;
+
+  // ClearBufferMask
+  //      GL_COLOR_BUFFER_BIT
+  //      GL_ACCUM_BUFFER_BIT
+  //      GL_STENCIL_BUFFER_BIT
+  //      GL_DEPTH_BUFFER_BIT
+
+  // ClientArrayType
+  //      GL_VERTEX_ARRAY
+  //      GL_NORMAL_ARRAY
+  //      GL_COLOR_ARRAY
+  //      GL_INDEX_ARRAY
+  //      GL_TEXTURE_COORD_ARRAY
+  //      GL_EDGE_FLAG_ARRAY
+
+  // ClipPlaneName
+  GL_CLIP_PLANE0                    = $3000;
+  GL_CLIP_PLANE1                    = $3001;
+  GL_CLIP_PLANE2                    = $3002;
+  GL_CLIP_PLANE3                    = $3003;
+  GL_CLIP_PLANE4                    = $3004;
+  GL_CLIP_PLANE5                    = $3005;
+
+  // ColorMaterialFace
+  //      GL_FRONT
+  //      GL_BACK
+  //      GL_FRONT_AND_BACK
+
+  // ColorMaterialParameter
+  //      GL_AMBIENT
+  //      GL_DIFFUSE
+  //      GL_SPECULAR
+  //      GL_EMISSION
+  //      GL_AMBIENT_AND_DIFFUSE
+
+  // ColorPointerType
+  //      GL_BYTE
+  //      GL_UNSIGNED_BYTE
+  //      GL_SHORT
+  //      GL_UNSIGNED_SHORT
+  //      GL_INT
+  //      GL_UNSIGNED_INT
+  //      GL_FLOAT
+  //      GL_DOUBLE
+
+  // CullFaceMode
+  //      GL_FRONT
+  //      GL_BACK
+  //      GL_FRONT_AND_BACK
+
+  // 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_2_BYTES                        = $1407;
+  GL_3_BYTES                        = $1408;
+  GL_4_BYTES                        = $1409;
+  GL_DOUBLE                         = $140A;
+
+  // DepthFunction
+  //      GL_NEVER
+  //      GL_LESS
+  //      GL_EQUAL
+  //      GL_LEQUAL
+  //      GL_GREATER
+  //      GL_NOTEQUAL
+  //      GL_GEQUAL
+  //      GL_ALWAYS
+
+  // DrawBufferMode
+  GL_NONE                           = 0;
+  GL_FRONT_LEFT                     = $0400;
+  GL_FRONT_RIGHT                    = $0401;
+  GL_BACK_LEFT                      = $0402;
+  GL_BACK_RIGHT                     = $0403;
+  GL_FRONT                          = $0404;
+  GL_BACK                           = $0405;
+  GL_LEFT                           = $0406;
+  GL_RIGHT                          = $0407;
+  GL_FRONT_AND_BACK                 = $0408;
+  GL_AUX0                           = $0409;
+  GL_AUX1                           = $040A;
+  GL_AUX2                           = $040B;
+  GL_AUX3                           = $040C;
+
+  // Enable
+  //      GL_FOG
+  //      GL_LIGHTING
+  //      GL_TEXTURE_1D
+  //      GL_TEXTURE_2D
+  //      GL_LINE_STIPPLE
+  //      GL_POLYGON_STIPPLE
+  //      GL_CULL_FACE
+  //      GL_ALPHA_TEST
+  //      GL_BLEND
+  //      GL_INDEX_LOGIC_OP
+  //      GL_COLOR_LOGIC_OP
+  //      GL_DITHER
+  //      GL_STENCIL_TEST
+  //      GL_DEPTH_TEST
+  //      GL_CLIP_PLANE0
+  //      GL_CLIP_PLANE1
+  //      GL_CLIP_PLANE2
+  //      GL_CLIP_PLANE3
+  //      GL_CLIP_PLANE4
+  //      GL_CLIP_PLANE5
+  //      GL_LIGHT0
+  //      GL_LIGHT1
+  //      GL_LIGHT2
+  //      GL_LIGHT3
+  //      GL_LIGHT4
+  //      GL_LIGHT5
+  //      GL_LIGHT6
+  //      GL_LIGHT7
+  //      GL_TEXTURE_GEN_S
+  //      GL_TEXTURE_GEN_T
+  //      GL_TEXTURE_GEN_R
+  //      GL_TEXTURE_GEN_Q
+  //      GL_MAP1_VERTEX_3
+  //      GL_MAP1_VERTEX_4
+  //      GL_MAP1_COLOR_4
+  //      GL_MAP1_INDEX
+  //      GL_MAP1_NORMAL
+  //      GL_MAP1_TEXTURE_COORD_1
+  //      GL_MAP1_TEXTURE_COORD_2
+  //      GL_MAP1_TEXTURE_COORD_3
+  //      GL_MAP1_TEXTURE_COORD_4
+  //      GL_MAP2_VERTEX_3
+  //      GL_MAP2_VERTEX_4
+  //      GL_MAP2_COLOR_4
+  //      GL_MAP2_INDEX
+  //      GL_MAP2_NORMAL
+  //      GL_MAP2_TEXTURE_COORD_1
+  //      GL_MAP2_TEXTURE_COORD_2
+  //      GL_MAP2_TEXTURE_COORD_3
+  //      GL_MAP2_TEXTURE_COORD_4
+  //      GL_POINT_SMOOTH
+  //      GL_LINE_SMOOTH
+  //      GL_POLYGON_SMOOTH
+  //      GL_SCISSOR_TEST
+  //      GL_COLOR_MATERIAL
+  //      GL_NORMALIZE
+  //      GL_AUTO_NORMAL
+  //      GL_VERTEX_ARRAY
+  //      GL_NORMAL_ARRAY
+  //      GL_COLOR_ARRAY
+  //      GL_INDEX_ARRAY
+  //      GL_TEXTURE_COORD_ARRAY
+  //      GL_EDGE_FLAG_ARRAY
+  //      GL_POLYGON_OFFSET_POINT
+  //      GL_POLYGON_OFFSET_LINE
+  //      GL_POLYGON_OFFSET_FILL
+
+  // ErrorCode
+  GL_NO_ERROR                       = 0;
+  GL_INVALID_ENUM                   = $0500;
+  GL_INVALID_VALUE                  = $0501;
+  GL_INVALID_OPERATION              = $0502;
+  GL_STACK_OVERFLOW                 = $0503;
+  GL_STACK_UNDERFLOW                = $0504;
+  GL_OUT_OF_MEMORY                  = $0505;
+
+  // FeedBackMode
+  GL_2D                             = $0600;
+  GL_3D                             = $0601;
+  GL_3D_COLOR                       = $0602;
+  GL_3D_COLOR_TEXTURE               = $0603;
+  GL_4D_COLOR_TEXTURE               = $0604;
+
+  // FeedBackToken
+  GL_PASS_THROUGH_TOKEN             = $0700;
+  GL_POINT_TOKEN                    = $0701;
+  GL_LINE_TOKEN                     = $0702;
+  GL_POLYGON_TOKEN                  = $0703;
+  GL_BITMAP_TOKEN                   = $0704;
+  GL_DRAW_PIXEL_TOKEN               = $0705;
+  GL_COPY_PIXEL_TOKEN               = $0706;
+  GL_LINE_RESET_TOKEN               = $0707;
+
+  // FogMode
+  //      GL_LINEAR
+  GL_EXP                            = $0800;
+  GL_EXP2                           = $0801;
+
+  // FogParameter
+  //      GL_FOG_COLOR
+  //      GL_FOG_DENSITY
+  //      GL_FOG_END
+  //      GL_FOG_INDEX
+  //      GL_FOG_MODE
+  //      GL_FOG_START
+
+  // FrontFaceDirection
+  GL_CW                             = $0900;
+  GL_CCW                            = $0901;
+
+  // GetMapTarget
+  GL_COEFF                          = $0A00;
+  GL_ORDER                          = $0A01;
+  GL_DOMAIN                         = $0A02;
+
+  // GetPixelMap
+  //      GL_PIXEL_MAP_I_TO_I
+  //      GL_PIXEL_MAP_S_TO_S
+  //      GL_PIXEL_MAP_I_TO_R
+  //      GL_PIXEL_MAP_I_TO_G
+  //      GL_PIXEL_MAP_I_TO_B
+  //      GL_PIXEL_MAP_I_TO_A
+  //      GL_PIXEL_MAP_R_TO_R
+  //      GL_PIXEL_MAP_G_TO_G
+  //      GL_PIXEL_MAP_B_TO_B
+  //      GL_PIXEL_MAP_A_TO_A
+
+  // GetPointerTarget
+  //      GL_VERTEX_ARRAY_POINTER
+  //      GL_NORMAL_ARRAY_POINTER
+  //      GL_COLOR_ARRAY_POINTER
+  //      GL_INDEX_ARRAY_POINTER
+  //      GL_TEXTURE_COORD_ARRAY_POINTER
+  //      GL_EDGE_FLAG_ARRAY_POINTER
+
+  // GetTarget
+  GL_CURRENT_COLOR                  = $0B00;
+  GL_CURRENT_INDEX                  = $0B01;
+  GL_CURRENT_NORMAL                 = $0B02;
+  GL_CURRENT_TEXTURE_COORDS         = $0B03;
+  GL_CURRENT_RASTER_COLOR           = $0B04;
+  GL_CURRENT_RASTER_INDEX           = $0B05;
+  GL_CURRENT_RASTER_TEXTURE_COORDS  = $0B06;
+  GL_CURRENT_RASTER_POSITION        = $0B07;
+  GL_CURRENT_RASTER_POSITION_VALID  = $0B08;
+  GL_CURRENT_RASTER_DISTANCE        = $0B09;
+  GL_POINT_SMOOTH                   = $0B10;
+  GL_POINT_SIZE                     = $0B11;
+  GL_POINT_SIZE_RANGE               = $0B12;
+  GL_POINT_SIZE_GRANULARITY         = $0B13;
+  GL_LINE_SMOOTH                    = $0B20;
+  GL_LINE_WIDTH                     = $0B21;
+  GL_LINE_WIDTH_RANGE               = $0B22;
+  GL_LINE_WIDTH_GRANULARITY         = $0B23;
+  GL_LINE_STIPPLE                   = $0B24;
+  GL_LINE_STIPPLE_PATTERN           = $0B25;
+  GL_LINE_STIPPLE_REPEAT            = $0B26;
+  GL_LIST_MODE                      = $0B30;
+  GL_MAX_LIST_NESTING               = $0B31;
+  GL_LIST_BASE                      = $0B32;
+  GL_LIST_INDEX                     = $0B33;
+  GL_POLYGON_MODE                   = $0B40;
+  GL_POLYGON_SMOOTH                 = $0B41;
+  GL_POLYGON_STIPPLE                = $0B42;
+  GL_EDGE_FLAG                      = $0B43;
+  GL_CULL_FACE                      = $0B44;
+  GL_CULL_FACE_MODE                 = $0B45;
+  GL_FRONT_FACE                     = $0B46;
+  GL_LIGHTING                       = $0B50;
+  GL_LIGHT_MODEL_LOCAL_VIEWER       = $0B51;
+  GL_LIGHT_MODEL_TWO_SIDE           = $0B52;
+  GL_LIGHT_MODEL_AMBIENT            = $0B53;
+  GL_SHADE_MODEL                    = $0B54;
+  GL_COLOR_MATERIAL_FACE            = $0B55;
+  GL_COLOR_MATERIAL_PARAMETER       = $0B56;
+  GL_COLOR_MATERIAL                 = $0B57;
+  GL_FOG                            = $0B60;
+  GL_FOG_INDEX                      = $0B61;
+  GL_FOG_DENSITY                    = $0B62;
+  GL_FOG_START                      = $0B63;
+  GL_FOG_END                        = $0B64;
+  GL_FOG_MODE                       = $0B65;
+  GL_FOG_COLOR                      = $0B66;
+  GL_DEPTH_RANGE                    = $0B70;
+  GL_DEPTH_TEST                     = $0B71;
+  GL_DEPTH_WRITEMASK                = $0B72;
+  GL_DEPTH_CLEAR_VALUE              = $0B73;
+  GL_DEPTH_FUNC                     = $0B74;
+  GL_ACCUM_CLEAR_VALUE              = $0B80;
+  GL_STENCIL_TEST                   = $0B90;
+  GL_STENCIL_CLEAR_VALUE            = $0B91;
+  GL_STENCIL_FUNC                   = $0B92;
+  GL_STENCIL_VALUE_MASK             = $0B93;
+  GL_STENCIL_FAIL                   = $0B94;
+  GL_STENCIL_PASS_DEPTH_FAIL        = $0B95;
+  GL_STENCIL_PASS_DEPTH_PASS        = $0B96;
+  GL_STENCIL_REF                    = $0B97;
+  GL_STENCIL_WRITEMASK              = $0B98;
+  GL_MATRIX_MODE                    = $0BA0;
+  GL_NORMALIZE                      = $0BA1;
+  GL_VIEWPORT                       = $0BA2;
+  GL_MODELVIEW_STACK_DEPTH          = $0BA3;
+  GL_PROJECTION_STACK_DEPTH         = $0BA4;
+  GL_TEXTURE_STACK_DEPTH            = $0BA5;
+  GL_MODELVIEW_MATRIX               = $0BA6;
+  GL_PROJECTION_MATRIX              = $0BA7;
+  GL_TEXTURE_MATRIX                 = $0BA8;
+  GL_ATTRIB_STACK_DEPTH             = $0BB0;
+  GL_CLIENT_ATTRIB_STACK_DEPTH      = $0BB1;
+  GL_ALPHA_TEST                     = $0BC0;
+  GL_ALPHA_TEST_FUNC                = $0BC1;
+  GL_ALPHA_TEST_REF                 = $0BC2;
+  GL_DITHER                         = $0BD0;
+  GL_BLEND_DST                      = $0BE0;
+  GL_BLEND_SRC                      = $0BE1;
+  GL_BLEND                          = $0BE2;
+  GL_LOGIC_OP_MODE                  = $0BF0;
+  GL_INDEX_LOGIC_OP                 = $0BF1;
+  GL_COLOR_LOGIC_OP                 = $0BF2;
+  GL_AUX_BUFFERS                    = $0C00;
+  GL_DRAW_BUFFER                    = $0C01;
+  GL_READ_BUFFER                    = $0C02;
+  GL_SCISSOR_BOX                    = $0C10;
+  GL_SCISSOR_TEST                   = $0C11;
+  GL_INDEX_CLEAR_VALUE              = $0C20;
+  GL_INDEX_WRITEMASK                = $0C21;
+  GL_COLOR_CLEAR_VALUE              = $0C22;
+  GL_COLOR_WRITEMASK                = $0C23;
+  GL_INDEX_MODE                     = $0C30;
+  GL_RGBA_MODE                      = $0C31;
+  GL_DOUBLEBUFFER                   = $0C32;
+  GL_STEREO                         = $0C33;
+  GL_RENDER_MODE                    = $0C40;
+  GL_PERSPECTIVE_CORRECTION_HINT    = $0C50;
+  GL_POINT_SMOOTH_HINT              = $0C51;
+  GL_LINE_SMOOTH_HINT               = $0C52;
+  GL_POLYGON_SMOOTH_HINT            = $0C53;
+  GL_FOG_HINT                       = $0C54;
+  GL_TEXTURE_GEN_S                  = $0C60;
+  GL_TEXTURE_GEN_T                  = $0C61;
+  GL_TEXTURE_GEN_R                  = $0C62;
+  GL_TEXTURE_GEN_Q                  = $0C63;
+  GL_PIXEL_MAP_I_TO_I               = $0C70;
+  GL_PIXEL_MAP_S_TO_S               = $0C71;
+  GL_PIXEL_MAP_I_TO_R               = $0C72;
+  GL_PIXEL_MAP_I_TO_G               = $0C73;
+  GL_PIXEL_MAP_I_TO_B               = $0C74;
+  GL_PIXEL_MAP_I_TO_A               = $0C75;
+  GL_PIXEL_MAP_R_TO_R               = $0C76;
+  GL_PIXEL_MAP_G_TO_G               = $0C77;
+  GL_PIXEL_MAP_B_TO_B               = $0C78;
+  GL_PIXEL_MAP_A_TO_A               = $0C79;
+  GL_PIXEL_MAP_I_TO_I_SIZE          = $0CB0;
+  GL_PIXEL_MAP_S_TO_S_SIZE          = $0CB1;
+  GL_PIXEL_MAP_I_TO_R_SIZE          = $0CB2;
+  GL_PIXEL_MAP_I_TO_G_SIZE          = $0CB3;
+  GL_PIXEL_MAP_I_TO_B_SIZE          = $0CB4;
+  GL_PIXEL_MAP_I_TO_A_SIZE          = $0CB5;
+  GL_PIXEL_MAP_R_TO_R_SIZE          = $0CB6;
+  GL_PIXEL_MAP_G_TO_G_SIZE          = $0CB7;
+  GL_PIXEL_MAP_B_TO_B_SIZE          = $0CB8;
+  GL_PIXEL_MAP_A_TO_A_SIZE          = $0CB9;
+  GL_UNPACK_SWAP_BYTES              = $0CF0;
+  GL_UNPACK_LSB_FIRST               = $0CF1;
+  GL_UNPACK_ROW_LENGTH              = $0CF2;
+  GL_UNPACK_SKIP_ROWS               = $0CF3;
+  GL_UNPACK_SKIP_PIXELS             = $0CF4;
+  GL_UNPACK_ALIGNMENT               = $0CF5;
+  GL_PACK_SWAP_BYTES                = $0D00;
+  GL_PACK_LSB_FIRST                 = $0D01;
+  GL_PACK_ROW_LENGTH                = $0D02;
+  GL_PACK_SKIP_ROWS                 = $0D03;
+  GL_PACK_SKIP_PIXELS               = $0D04;
+  GL_PACK_ALIGNMENT                 = $0D05;
+  GL_MAP_COLOR                      = $0D10;
+  GL_MAP_STENCIL                    = $0D11;
+  GL_INDEX_SHIFT                    = $0D12;
+  GL_INDEX_OFFSET                   = $0D13;
+  GL_RED_SCALE                      = $0D14;
+  GL_RED_BIAS                       = $0D15;
+  GL_ZOOM_X                         = $0D16;
+  GL_ZOOM_Y                         = $0D17;
+  GL_GREEN_SCALE                    = $0D18;
+  GL_GREEN_BIAS                     = $0D19;
+  GL_BLUE_SCALE                     = $0D1A;
+  GL_BLUE_BIAS                      = $0D1B;
+  GL_ALPHA_SCALE                    = $0D1C;
+  GL_ALPHA_BIAS                     = $0D1D;
+  GL_DEPTH_SCALE                    = $0D1E;
+  GL_DEPTH_BIAS                     = $0D1F;
+  GL_MAX_EVAL_ORDER                 = $0D30;
+  GL_MAX_LIGHTS                     = $0D31;
+  GL_MAX_CLIP_PLANES                = $0D32;
+  GL_MAX_TEXTURE_SIZE               = $0D33;
+  GL_MAX_PIXEL_MAP_TABLE            = $0D34;
+  GL_MAX_ATTRIB_STACK_DEPTH         = $0D35;
+  GL_MAX_MODELVIEW_STACK_DEPTH      = $0D36;
+  GL_MAX_NAME_STACK_DEPTH           = $0D37;
+  GL_MAX_PROJECTION_STACK_DEPTH     = $0D38;
+  GL_MAX_TEXTURE_STACK_DEPTH        = $0D39;
+  GL_MAX_VIEWPORT_DIMS              = $0D3A;
+  GL_MAX_CLIENT_ATTRIB_STACK_DEPTH  = $0D3B;
+  GL_SUBPIXEL_BITS                  = $0D50;
+  GL_INDEX_BITS                     = $0D51;
+  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_ACCUM_RED_BITS                 = $0D58;
+  GL_ACCUM_GREEN_BITS               = $0D59;
+  GL_ACCUM_BLUE_BITS                = $0D5A;
+  GL_ACCUM_ALPHA_BITS               = $0D5B;
+  GL_NAME_STACK_DEPTH               = $0D70;
+  GL_AUTO_NORMAL                    = $0D80;
+  GL_MAP1_COLOR_4                   = $0D90;
+  GL_MAP1_INDEX                     = $0D91;
+  GL_MAP1_NORMAL                    = $0D92;
+  GL_MAP1_TEXTURE_COORD_1           = $0D93;
+  GL_MAP1_TEXTURE_COORD_2           = $0D94;
+  GL_MAP1_TEXTURE_COORD_3           = $0D95;
+  GL_MAP1_TEXTURE_COORD_4           = $0D96;
+  GL_MAP1_VERTEX_3                  = $0D97;
+  GL_MAP1_VERTEX_4                  = $0D98;
+  GL_MAP2_COLOR_4                   = $0DB0;
+  GL_MAP2_INDEX                     = $0DB1;
+  GL_MAP2_NORMAL                    = $0DB2;
+  GL_MAP2_TEXTURE_COORD_1           = $0DB3;
+  GL_MAP2_TEXTURE_COORD_2           = $0DB4;
+  GL_MAP2_TEXTURE_COORD_3           = $0DB5;
+  GL_MAP2_TEXTURE_COORD_4           = $0DB6;
+  GL_MAP2_VERTEX_3                  = $0DB7;
+  GL_MAP2_VERTEX_4                  = $0DB8;
+  GL_MAP1_GRID_DOMAIN               = $0DD0;
+  GL_MAP1_GRID_SEGMENTS             = $0DD1;
+  GL_MAP2_GRID_DOMAIN               = $0DD2;
+  GL_MAP2_GRID_SEGMENTS             = $0DD3;
+  GL_TEXTURE_1D                     = $0DE0;
+  GL_TEXTURE_2D                     = $0DE1;
+  GL_FEEDBACK_BUFFER_POINTER        = $0DF0;
+  GL_FEEDBACK_BUFFER_SIZE           = $0DF1;
+  GL_FEEDBACK_BUFFER_TYPE           = $0DF2;
+  GL_SELECTION_BUFFER_POINTER       = $0DF3;
+  GL_SELECTION_BUFFER_SIZE          = $0DF4;
+  //      GL_TEXTURE_BINDING_1D
+  //      GL_TEXTURE_BINDING_2D
+  //      GL_VERTEX_ARRAY
+  //      GL_NORMAL_ARRAY
+  //      GL_COLOR_ARRAY
+  //      GL_INDEX_ARRAY
+  //      GL_TEXTURE_COORD_ARRAY
+  //      GL_EDGE_FLAG_ARRAY
+  //      GL_VERTEX_ARRAY_SIZE
+  //      GL_VERTEX_ARRAY_TYPE
+  //      GL_VERTEX_ARRAY_STRIDE
+  //      GL_NORMAL_ARRAY_TYPE
+  //      GL_NORMAL_ARRAY_STRIDE
+  //      GL_COLOR_ARRAY_SIZE
+  //      GL_COLOR_ARRAY_TYPE
+  //      GL_COLOR_ARRAY_STRIDE
+  //      GL_INDEX_ARRAY_TYPE
+  //      GL_INDEX_ARRAY_STRIDE
+  //      GL_TEXTURE_COORD_ARRAY_SIZE
+  //      GL_TEXTURE_COORD_ARRAY_TYPE
+  //      GL_TEXTURE_COORD_ARRAY_STRIDE
+  //      GL_EDGE_FLAG_ARRAY_STRIDE
+  //      GL_POLYGON_OFFSET_FACTOR
+  //      GL_POLYGON_OFFSET_UNITS
+
+  // GetTextureParameter
+  //      GL_TEXTURE_MAG_FILTER
+  //      GL_TEXTURE_MIN_FILTER
+  //      GL_TEXTURE_WRAP_S
+  //      GL_TEXTURE_WRAP_T
+  GL_TEXTURE_WIDTH                  = $1000;
+  GL_TEXTURE_HEIGHT                 = $1001;
+  GL_TEXTURE_INTERNAL_FORMAT        = $1003;
+  GL_TEXTURE_BORDER_COLOR           = $1004;
+  GL_TEXTURE_BORDER                 = $1005;
+  //      GL_TEXTURE_RED_SIZE
+  //      GL_TEXTURE_GREEN_SIZE
+  //      GL_TEXTURE_BLUE_SIZE
+  //      GL_TEXTURE_ALPHA_SIZE
+  //      GL_TEXTURE_LUMINANCE_SIZE
+  //      GL_TEXTURE_INTENSITY_SIZE
+  //      GL_TEXTURE_PRIORITY
+  //      GL_TEXTURE_RESIDENT
+
+  // HintMode
+  GL_DONT_CARE                      = $1100;
+  GL_FASTEST                        = $1101;
+  GL_NICEST                         = $1102;
+
+  // HintTarget
+  //      GL_PERSPECTIVE_CORRECTION_HINT
+  //      GL_POINT_SMOOTH_HINT
+  //      GL_LINE_SMOOTH_HINT
+  //      GL_POLYGON_SMOOTH_HINT
+  //      GL_FOG_HINT
+
+  // IndexPointerType
+  //      GL_SHORT
+  //      GL_INT
+  //      GL_FLOAT
+  //      GL_DOUBLE
+
+  // LightModelParameter
+  //      GL_LIGHT_MODEL_AMBIENT
+  //      GL_LIGHT_MODEL_LOCAL_VIEWER
+  //      GL_LIGHT_MODEL_TWO_SIDE
+
+  // LightName
+  GL_LIGHT0                         = $4000;
+  GL_LIGHT1                         = $4001;
+  GL_LIGHT2                         = $4002;
+  GL_LIGHT3                         = $4003;
+  GL_LIGHT4                         = $4004;
+  GL_LIGHT5                         = $4005;
+  GL_LIGHT6                         = $4006;
+  GL_LIGHT7                         = $4007;
+
+  // LightParameter
+  GL_AMBIENT                        = $1200;
+  GL_DIFFUSE                        = $1201;
+  GL_SPECULAR                       = $1202;
+  GL_POSITION                       = $1203;
+  GL_SPOT_DIRECTION                 = $1204;
+  GL_SPOT_EXPONENT                  = $1205;
+  GL_SPOT_CUTOFF                    = $1206;
+  GL_CONSTANT_ATTENUATION           = $1207;
+  GL_LINEAR_ATTENUATION             = $1208;
+  GL_QUADRATIC_ATTENUATION          = $1209;
+
+  // InterleavedArrays
+  //      GL_V2F
+  //      GL_V3F
+  //      GL_C4UB_V2F
+  //      GL_C4UB_V3F
+  //      GL_C3F_V3F
+  //      GL_N3F_V3F
+  //      GL_C4F_N3F_V3F
+  //      GL_T2F_V3F
+  //      GL_T4F_V4F
+  //      GL_T2F_C4UB_V3F
+  //      GL_T2F_C3F_V3F
+  //      GL_T2F_N3F_V3F
+  //      GL_T2F_C4F_N3F_V3F
+  //      GL_T4F_C4F_N3F_V4F
+
+  // ListMode
+  GL_COMPILE                        = $1300;
+  GL_COMPILE_AND_EXECUTE            = $1301;
+
+  // ListNameType
+  //      GL_BYTE
+  //      GL_UNSIGNED_BYTE
+  //      GL_SHORT
+  //      GL_UNSIGNED_SHORT
+  //      GL_INT
+  //      GL_UNSIGNED_INT
+  //      GL_FLOAT
+  //      GL_2_BYTES
+  //      GL_3_BYTES
+  //      GL_4_BYTES
+
+  // LogicOp
+  GL_CLEAR                          = $1500;
+  GL_AND                            = $1501;
+  GL_AND_REVERSE                    = $1502;
+  GL_COPY                           = $1503;
+  GL_AND_INVERTED                   = $1504;
+  GL_NOOP                           = $1505;
+  GL_XOR                            = $1506;
+  GL_OR                             = $1507;
+  GL_NOR                            = $1508;
+  GL_EQUIV                          = $1509;
+  GL_INVERT                         = $150A;
+  GL_OR_REVERSE                     = $150B;
+  GL_COPY_INVERTED                  = $150C;
+  GL_OR_INVERTED                    = $150D;
+  GL_NAND                           = $150E;
+  GL_SET                            = $150F;
+
+  // MapTarget
+  //      GL_MAP1_COLOR_4
+  //      GL_MAP1_INDEX
+  //      GL_MAP1_NORMAL
+  //      GL_MAP1_TEXTURE_COORD_1
+  //      GL_MAP1_TEXTURE_COORD_2
+  //      GL_MAP1_TEXTURE_COORD_3
+  //      GL_MAP1_TEXTURE_COORD_4
+  //      GL_MAP1_VERTEX_3
+  //      GL_MAP1_VERTEX_4
+  //      GL_MAP2_COLOR_4
+  //      GL_MAP2_INDEX
+  //      GL_MAP2_NORMAL
+  //      GL_MAP2_TEXTURE_COORD_1
+  //      GL_MAP2_TEXTURE_COORD_2
+  //      GL_MAP2_TEXTURE_COORD_3
+  //      GL_MAP2_TEXTURE_COORD_4
+  //      GL_MAP2_VERTEX_3
+  //      GL_MAP2_VERTEX_4
+
+  // MaterialFace
+  //      GL_FRONT
+  //      GL_BACK
+  //      GL_FRONT_AND_BACK
+
+  // MaterialParameter
+  GL_EMISSION                       = $1600;
+  GL_SHININESS                      = $1601;
+  GL_AMBIENT_AND_DIFFUSE            = $1602;
+  GL_COLOR_INDEXES                  = $1603;
+  //      GL_AMBIENT
+  //      GL_DIFFUSE
+  //      GL_SPECULAR
+
+  // MatrixMode
+  GL_MODELVIEW                      = $1700;
+  GL_PROJECTION                     = $1701;
+  GL_TEXTURE                        = $1702;
+
+  // MeshMode1
+  //      GL_POINT
+  //      GL_LINE
+
+  // MeshMode2
+  //      GL_POINT
+  //      GL_LINE
+  //      GL_FILL
+
+  // NormalPointerType
+  //      GL_BYTE
+  //      GL_SHORT
+  //      GL_INT
+  //      GL_FLOAT
+  //      GL_DOUBLE
+
+  // PixelCopyType
+  GL_COLOR                          = $1800;
+  GL_DEPTH                          = $1801;
+  GL_STENCIL                        = $1802;
+
+  // PixelFormat
+  GL_COLOR_INDEX                    = $1900;
+  GL_STENCIL_INDEX                  = $1901;
+  GL_DEPTH_COMPONENT                = $1902;
+  GL_RED                            = $1903;
+  GL_GREEN                          = $1904;
+  GL_BLUE                           = $1905;
+  GL_ALPHA                          = $1906;
+  GL_RGB                            = $1907;
+  GL_RGBA                           = $1908;
+  GL_LUMINANCE                      = $1909;
+  GL_LUMINANCE_ALPHA                = $190A;
+
+  // PixelMap
+  //      GL_PIXEL_MAP_I_TO_I
+  //      GL_PIXEL_MAP_S_TO_S
+  //      GL_PIXEL_MAP_I_TO_R
+  //      GL_PIXEL_MAP_I_TO_G
+  //      GL_PIXEL_MAP_I_TO_B
+  //      GL_PIXEL_MAP_I_TO_A
+  //      GL_PIXEL_MAP_R_TO_R
+  //      GL_PIXEL_MAP_G_TO_G
+  //      GL_PIXEL_MAP_B_TO_B
+  //      GL_PIXEL_MAP_A_TO_A
+
+  // PixelStore
+  //      GL_UNPACK_SWAP_BYTES
+  //      GL_UNPACK_LSB_FIRST
+  //      GL_UNPACK_ROW_LENGTH
+  //      GL_UNPACK_SKIP_ROWS
+  //      GL_UNPACK_SKIP_PIXELS
+  //      GL_UNPACK_ALIGNMENT
+  //      GL_PACK_SWAP_BYTES
+  //      GL_PACK_LSB_FIRST
+  //      GL_PACK_ROW_LENGTH
+  //      GL_PACK_SKIP_ROWS
+  //      GL_PACK_SKIP_PIXELS
+  //      GL_PACK_ALIGNMENT
+
+  // PixelTransfer
+  //      GL_MAP_COLOR
+  //      GL_MAP_STENCIL
+  //      GL_INDEX_SHIFT
+  //      GL_INDEX_OFFSET
+  //      GL_RED_SCALE
+  //      GL_RED_BIAS
+  //      GL_GREEN_SCALE
+  //      GL_GREEN_BIAS
+  //      GL_BLUE_SCALE
+  //      GL_BLUE_BIAS
+  //      GL_ALPHA_SCALE
+  //      GL_ALPHA_BIAS
+  //      GL_DEPTH_SCALE
+  //      GL_DEPTH_BIAS
+
+  // PixelType
+  GL_BITMAP                         = $1A00;
+  //      GL_BYTE
+  //      GL_UNSIGNED_BYTE
+  //      GL_SHORT
+  //      GL_UNSIGNED_SHORT
+  //      GL_INT
+  //      GL_UNSIGNED_INT
+  //      GL_FLOAT
+
+  // PolygonMode
+  GL_POINT                          = $1B00;
+  GL_LINE                           = $1B01;
+  GL_FILL                           = $1B02;
+
+  // ReadBufferMode
+  //      GL_FRONT_LEFT
+  //      GL_FRONT_RIGHT
+  //      GL_BACK_LEFT
+  //      GL_BACK_RIGHT
+  //      GL_FRONT
+  //      GL_BACK
+  //      GL_LEFT
+  //      GL_RIGHT
+  //      GL_AUX0
+  //      GL_AUX1
+  //      GL_AUX2
+  //      GL_AUX3
+
+  // RenderingMode
+  GL_RENDER                         = $1C00;
+  GL_FEEDBACK                       = $1C01;
+  GL_SELECT                         = $1C02;
+
+  // ShadingModel
+  GL_FLAT                           = $1D00;
+  GL_SMOOTH                         = $1D01;
+
+  // StencilFunction
+  //      GL_NEVER
+  //      GL_LESS
+  //      GL_EQUAL
+  //      GL_LEQUAL
+  //      GL_GREATER
+  //      GL_NOTEQUAL
+  //      GL_GEQUAL
+  //      GL_ALWAYS
+
+  // StencilOp
+  //      GL_ZERO
+  GL_KEEP                           = $1E00;
+  GL_REPLACE                        = $1E01;
+  GL_INCR                           = $1E02;
+  GL_DECR                           = $1E03;
+  //      GL_INVERT
+
+  // StringName
+  GL_VENDOR                         = $1F00;
+  GL_RENDERER                       = $1F01;
+  GL_VERSION                        = $1F02;
+  GL_EXTENSIONS                     = $1F03;
+
+  // TextureCoordName
+  GL_S                              = $2000;
+  GL_T                              = $2001;
+  GL_R                              = $2002;
+  GL_Q                              = $2003;
+
+  // TexCoordPointerType
+  //      GL_SHORT
+  //      GL_INT
+  //      GL_FLOAT
+  //      GL_DOUBLE
+
+  // TextureEnvMode
+  GL_MODULATE                       = $2100;
+  GL_DECAL                          = $2101;
+  //      GL_BLEND
+  //      GL_REPLACE
+
+  // TextureEnvParameter
+  GL_TEXTURE_ENV_MODE               = $2200;
+  GL_TEXTURE_ENV_COLOR              = $2201;
+
+  // TextureEnvTarget
+  GL_TEXTURE_ENV                    = $2300;
+
+  // TextureGenMode
+  GL_EYE_LINEAR                     = $2400;
+  GL_OBJECT_LINEAR                  = $2401;
+  GL_SPHERE_MAP                     = $2402;
+
+  // TextureGenParameter
+  GL_TEXTURE_GEN_MODE               = $2500;
+  GL_OBJECT_PLANE                   = $2501;
+  GL_EYE_PLANE                      = $2502;
+
+  // 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;
+  //      GL_TEXTURE_BORDER_COLOR
+  //      GL_TEXTURE_PRIORITY
+
+  // TextureTarget
+  //      GL_TEXTURE_1D
+  //      GL_TEXTURE_2D
+  //      GL_PROXY_TEXTURE_1D
+  //      GL_PROXY_TEXTURE_2D
+
+  // TextureWrapMode
+  GL_CLAMP                          = $2900;
+  GL_REPEAT                         = $2901;
+
+  // VertexPointerType
+  //      GL_SHORT
+  //      GL_INT
+  //      GL_FLOAT
+  //      GL_DOUBLE
+
+  // ClientAttribMask
+  GL_CLIENT_PIXEL_STORE_BIT         = $00000001;
+  GL_CLIENT_VERTEX_ARRAY_BIT        = $00000002;
+  GL_CLIENT_ALL_ATTRIB_BITS         = $FFFFFFFF;
+
+  // polygon_offset
+  GL_POLYGON_OFFSET_FACTOR          = $8038;
+  GL_POLYGON_OFFSET_UNITS           = $2A00;
+  GL_POLYGON_OFFSET_POINT           = $2A01;
+  GL_POLYGON_OFFSET_LINE            = $2A02;
+  GL_POLYGON_OFFSET_FILL            = $8037;
+
+  // texture
+  GL_ALPHA4                         = $803B;
+  GL_ALPHA8                         = $803C;
+  GL_ALPHA12                        = $803D;
+  GL_ALPHA16                        = $803E;
+  GL_LUMINANCE4                     = $803F;
+  GL_LUMINANCE8                     = $8040;
+  GL_LUMINANCE12                    = $8041;
+  GL_LUMINANCE16                    = $8042;
+  GL_LUMINANCE4_ALPHA4              = $8043;
+  GL_LUMINANCE6_ALPHA2              = $8044;
+  GL_LUMINANCE8_ALPHA8              = $8045;
+  GL_LUMINANCE12_ALPHA4             = $8046;
+  GL_LUMINANCE12_ALPHA12            = $8047;
+  GL_LUMINANCE16_ALPHA16            = $8048;
+  GL_INTENSITY                      = $8049;
+  GL_INTENSITY4                     = $804A;
+  GL_INTENSITY8                     = $804B;
+  GL_INTENSITY12                    = $804C;
+  GL_INTENSITY16                    = $804D;
+  GL_R3_G3_B2                       = $2A10;
+  GL_RGB4                           = $804F;
+  GL_RGB5                           = $8050;
+  GL_RGB8                           = $8051;
+  GL_RGB10                          = $8052;
+  GL_RGB12                          = $8053;
+  GL_RGB16                          = $8054;
+  GL_RGBA2                          = $8055;
+  GL_RGBA4                          = $8056;
+  GL_RGB5_A1                        = $8057;
+  GL_RGBA8                          = $8058;
+  GL_RGB10_A2                       = $8059;
+  GL_RGBA12                         = $805A;
+  GL_RGBA16                         = $805B;
+  GL_TEXTURE_RED_SIZE               = $805C;
+  GL_TEXTURE_GREEN_SIZE             = $805D;
+  GL_TEXTURE_BLUE_SIZE              = $805E;
+  GL_TEXTURE_ALPHA_SIZE             = $805F;
+  GL_TEXTURE_LUMINANCE_SIZE         = $8060;
+  GL_TEXTURE_INTENSITY_SIZE         = $8061;
+  GL_PROXY_TEXTURE_1D               = $8063;
+  GL_PROXY_TEXTURE_2D               = $8064;
+
+  // texture_object
+  GL_TEXTURE_PRIORITY               = $8066;
+  GL_TEXTURE_RESIDENT               = $8067;
+  GL_TEXTURE_BINDING_1D             = $8068;
+  GL_TEXTURE_BINDING_2D             = $8069;
+
+  // vertex_array
+  GL_VERTEX_ARRAY                   = $8074;
+  GL_NORMAL_ARRAY                   = $8075;
+  GL_COLOR_ARRAY                    = $8076;
+  GL_INDEX_ARRAY                    = $8077;
+  GL_TEXTURE_COORD_ARRAY            = $8078;
+  GL_EDGE_FLAG_ARRAY                = $8079;
+  GL_VERTEX_ARRAY_SIZE              = $807A;
+  GL_VERTEX_ARRAY_TYPE              = $807B;
+  GL_VERTEX_ARRAY_STRIDE            = $807C;
+  GL_NORMAL_ARRAY_TYPE              = $807E;
+  GL_NORMAL_ARRAY_STRIDE            = $807F;
+  GL_COLOR_ARRAY_SIZE               = $8081;
+  GL_COLOR_ARRAY_TYPE               = $8082;
+  GL_COLOR_ARRAY_STRIDE             = $8083;
+  GL_INDEX_ARRAY_TYPE               = $8085;
+  GL_INDEX_ARRAY_STRIDE             = $8086;
+  GL_TEXTURE_COORD_ARRAY_SIZE       = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE       = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE     = $808A;
+  GL_EDGE_FLAG_ARRAY_STRIDE         = $808C;
+  GL_VERTEX_ARRAY_POINTER           = $808E;
+  GL_NORMAL_ARRAY_POINTER           = $808F;
+  GL_COLOR_ARRAY_POINTER            = $8090;
+  GL_INDEX_ARRAY_POINTER            = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER    = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER        = $8093;
+  GL_V2F                            = $2A20;
+  GL_V3F                            = $2A21;
+  GL_C4UB_V2F                       = $2A22;
+  GL_C4UB_V3F                       = $2A23;
+  GL_C3F_V3F                        = $2A24;
+  GL_N3F_V3F                        = $2A25;
+  GL_C4F_N3F_V3F                    = $2A26;
+  GL_T2F_V3F                        = $2A27;
+  GL_T4F_V4F                        = $2A28;
+  GL_T2F_C4UB_V3F                   = $2A29;
+  GL_T2F_C3F_V3F                    = $2A2A;
+  GL_T2F_N3F_V3F                    = $2A2B;
+  GL_T2F_C4F_N3F_V3F                = $2A2C;
+  GL_T4F_C4F_N3F_V4F                = $2A2D;
+
+  // Extensions
+  GL_EXT_vertex_array               = 1;
+  GL_WIN_swap_hint                  = 1;
+  GL_EXT_bgra                       = 1;
+  GL_EXT_paletted_texture           = 1;
+
+  // EXT_vertex_array
+  GL_VERTEX_ARRAY_EXT               = $8074;
+  GL_NORMAL_ARRAY_EXT               = $8075;
+  GL_COLOR_ARRAY_EXT                = $8076;
+  GL_INDEX_ARRAY_EXT                = $8077;
+  GL_TEXTURE_COORD_ARRAY_EXT        = $8078;
+  GL_EDGE_FLAG_ARRAY_EXT            = $8079;
+  GL_VERTEX_ARRAY_SIZE_EXT          = $807A;
+  GL_VERTEX_ARRAY_TYPE_EXT          = $807B;
+  GL_VERTEX_ARRAY_STRIDE_EXT        = $807C;
+  GL_VERTEX_ARRAY_COUNT_EXT         = $807D;
+  GL_NORMAL_ARRAY_TYPE_EXT          = $807E;
+  GL_NORMAL_ARRAY_STRIDE_EXT        = $807F;
+  GL_NORMAL_ARRAY_COUNT_EXT         = $8080;
+  GL_COLOR_ARRAY_SIZE_EXT           = $8081;
+  GL_COLOR_ARRAY_TYPE_EXT           = $8082;
+  GL_COLOR_ARRAY_STRIDE_EXT         = $8083;
+  GL_COLOR_ARRAY_COUNT_EXT          = $8084;
+  GL_INDEX_ARRAY_TYPE_EXT           = $8085;
+  GL_INDEX_ARRAY_STRIDE_EXT         = $8086;
+  GL_INDEX_ARRAY_COUNT_EXT          = $8087;
+  GL_TEXTURE_COORD_ARRAY_SIZE_EXT   = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE_EXT   = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE_EXT = $808A;
+  GL_TEXTURE_COORD_ARRAY_COUNT_EXT  = $808B;
+  GL_EDGE_FLAG_ARRAY_STRIDE_EXT     = $808C;
+  GL_EDGE_FLAG_ARRAY_COUNT_EXT      = $808D;
+  GL_VERTEX_ARRAY_POINTER_EXT       = $808E;
+  GL_NORMAL_ARRAY_POINTER_EXT       = $808F;
+  GL_COLOR_ARRAY_POINTER_EXT        = $8090;
+  GL_INDEX_ARRAY_POINTER_EXT        = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER_EXT = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER_EXT    = $8093;
+  GL_DOUBLE_EXT                     = GL_DOUBLE;
+
+  // EXT_bgra
+  GL_BGR_EXT                        = $80E0;
+  GL_BGRA_EXT                       = $80E1;
+
+  // EXT_paletted_texture
+
+  // These must match the GL_COLOR_TABLE_*_SGI enumerants
+  GL_COLOR_TABLE_FORMAT_EXT         = $80D8;
+  GL_COLOR_TABLE_WIDTH_EXT          = $80D9;
+  GL_COLOR_TABLE_RED_SIZE_EXT       = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE_EXT     = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE_EXT      = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE_EXT     = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE_EXT = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE_EXT = $80DF;
+
+  GL_COLOR_INDEX1_EXT               = $80E2;
+  GL_COLOR_INDEX2_EXT               = $80E3;
+  GL_COLOR_INDEX4_EXT               = $80E4;
+  GL_COLOR_INDEX8_EXT               = $80E5;
+  GL_COLOR_INDEX12_EXT              = $80E6;
+  GL_COLOR_INDEX16_EXT              = $80E7;
+
+  // For compatibility with OpenGL v1.0
+  GL_LOGIC_OP                       = GL_INDEX_LOGIC_OP;
+  GL_TEXTURE_COMPONENTS             = GL_TEXTURE_INTERNAL_FORMAT;
+
+{******************************************************************************}
+
+{$IFDEF MORPHOS}
+
+{ MorphOS GL works differently due to different dynamic-library handling on Amiga-like }
+{ systems, so its headers are included here. }
+{$INCLUDE tinyglh.inc}
+
+{$ELSE MORPHOS}
+var
+  glAccum: procedure(op: GLenum; value: GLfloat); extdecl;
+  glAlphaFunc: procedure(func: GLenum; ref: GLclampf); extdecl;
+  glAreTexturesResident: function (n: GLsizei; const textures: PGLuint; residences: PGLboolean): GLboolean; extdecl;
+  glArrayElement: procedure(i: GLint); extdecl;
+  glBegin: procedure(mode: GLenum); extdecl;
+  glBindTexture: procedure(target: GLenum; texture: GLuint); extdecl;
+  glBitmap: procedure (width, height: GLsizei; xorig, yorig: GLfloat; xmove, ymove: GLfloat; const bitmap: PGLubyte); extdecl;
+  glBlendFunc: procedure(sfactor, dfactor: GLenum); extdecl;
+  glCallList: procedure(list: GLuint); extdecl;
+  glCallLists: procedure(n: GLsizei; atype: GLenum; const lists: Pointer); extdecl;
+  glClear: procedure(mask: GLbitfield); extdecl;
+  glClearAccum: procedure(red, green, blue, alpha: GLfloat); extdecl;
+  glClearColor: procedure(red, green, blue, alpha: GLclampf); extdecl;
+  glClearDepth: procedure(depth: GLclampd); extdecl;
+  glClearIndex: procedure(c: GLfloat); extdecl;
+  glClearStencil: procedure(s: GLint); extdecl;
+  glClipPlane: procedure(plane: GLenum; const equation: PGLdouble); extdecl;
+  glColor3b: procedure(red, green, blue: GLbyte); extdecl;
+  glColor3bv: procedure(const v: PGLbyte); extdecl;
+  glColor3d: procedure(red, green, blue: GLdouble); extdecl;
+  glColor3dv: procedure(const v: PGLdouble); extdecl;
+  glColor3f: procedure(red, green, blue: GLfloat); extdecl;
+  glColor3fv: procedure(const v: PGLfloat); extdecl;
+  glColor3i: procedure(red, green, blue: GLint); extdecl;
+  glColor3iv: procedure(const v: PGLint); extdecl;
+  glColor3s: procedure(red, green, blue: GLshort); extdecl;
+  glColor3sv: procedure(const v: PGLshort); extdecl;
+  glColor3ub: procedure(red, green, blue: GLubyte); extdecl;
+  glColor3ubv: procedure(const v: PGLubyte); extdecl;
+  glColor3ui: procedure(red, green, blue: GLuint); extdecl;
+  glColor3uiv: procedure(const v: PGLuint); extdecl;
+  glColor3us: procedure(red, green, blue: GLushort); extdecl;
+  glColor3usv: procedure(const v: PGLushort); extdecl;
+  glColor4b: procedure(red, green, blue, alpha: GLbyte); extdecl;
+  glColor4bv: procedure(const v: PGLbyte); extdecl;
+  glColor4d: procedure(red, green, blue, alpha: GLdouble); extdecl;
+  glColor4dv: procedure(const v: PGLdouble); extdecl;
+  glColor4f: procedure(red, green, blue, alpha: GLfloat); extdecl;
+  glColor4fv: procedure(const v: PGLfloat); extdecl;
+  glColor4i: procedure(red, green, blue, alpha: GLint); extdecl;
+  glColor4iv: procedure(const v: PGLint); extdecl;
+  glColor4s: procedure(red, green, blue, alpha: GLshort); extdecl;
+  glColor4sv: procedure(const v: PGLshort); extdecl;
+  glColor4ub: procedure(red, green, blue, alpha: GLubyte); extdecl;
+  glColor4ubv: procedure(const v: PGLubyte); extdecl;
+  glColor4ui: procedure(red, green, blue, alpha: GLuint); extdecl;
+  glColor4uiv: procedure(const v: PGLuint); extdecl;
+  glColor4us: procedure(red, green, blue, alpha: GLushort); extdecl;
+  glColor4usv: procedure(const v: PGLushort); extdecl;
+  glColorMask: procedure(red, green, blue, alpha: GLboolean); extdecl;
+  glColorMaterial: procedure(face, mode: GLenum); extdecl;
+  glColorPointer: procedure(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); extdecl;
+  glCopyPixels: procedure(x, y: GLint; width, height: GLsizei; atype: GLenum); extdecl;
+  glCopyTexImage1D: procedure (target: GLenum; level: GLint; internalFormat: GLenum; x, y: GLint; width: GLsizei; border: GLint); extdecl;
+  glCopyTexImage2D: procedure(target: GLenum; level: GLint; internalFormat: GLenum; x, y: GLint; width, height: GLsizei; border: GLint); extdecl;
+  glCopyTexSubImage1D: procedure(target: GLenum; level, xoffset, x, y: GLint; width: GLsizei); extdecl;
+  glCopyTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset, x, y: GLint; width, height: GLsizei); extdecl;
+  glCullFace: procedure(mode: GLenum); extdecl;
+  glDeleteLists: procedure(list: GLuint; range: GLsizei); extdecl;
+  glDeleteTextures: procedure(n: GLsizei; const textures: PGLuint); extdecl;
+  glDepthFunc: procedure(func: GLenum); extdecl;
+  glDepthMask: procedure(flag: GLboolean); extdecl;
+  glDepthRange: procedure(zNear, zFar: GLclampd); extdecl;
+  glDisable: procedure(cap: GLenum); extdecl;
+  glDisableClientState: procedure(aarray: GLenum); extdecl;
+  glDrawArrays: procedure(mode: GLenum; first: GLint; count: GLsizei); extdecl;
+  glDrawBuffer: procedure(mode: GLenum); extdecl;
+  glDrawElements: procedure(mode: GLenum; count: GLsizei; atype: GLenum; const indices: Pointer); extdecl;
+  glDrawPixels: procedure(width, height: GLsizei; format, atype: GLenum; const pixels: Pointer); extdecl;
+  glEdgeFlag: procedure(flag: GLboolean); extdecl;
+  glEdgeFlagPointer: procedure(stride: GLsizei; const pointer: Pointer); extdecl;
+  glEdgeFlagv: procedure(const flag: PGLboolean); extdecl;
+  glEnable: procedure(cap: GLenum); extdecl;
+  glEnableClientState: procedure(aarray: GLenum); extdecl;
+  glEnd: procedure; extdecl;
+  glEndList: procedure; extdecl;
+  glEvalCoord1d: procedure(u: GLdouble); extdecl;
+  glEvalCoord1dv: procedure(const u: PGLdouble); extdecl;
+  glEvalCoord1f: procedure(u: GLfloat); extdecl;
+  glEvalCoord1fv: procedure(const u: PGLfloat); extdecl;
+  glEvalCoord2d: procedure(u, v: GLdouble); extdecl;
+  glEvalCoord2dv: procedure(const u: PGLdouble); extdecl;
+  glEvalCoord2f: procedure(u, v: GLfloat); extdecl;
+  glEvalCoord2fv: procedure(const u: PGLfloat); extdecl;
+  glEvalMesh1: procedure(mode: GLenum; i1, i2: GLint); extdecl;
+  glEvalMesh2: procedure(mode: GLenum; i1, i2, j1, j2: GLint); extdecl;
+  glEvalPoint1: procedure(i: GLint); extdecl;
+  glEvalPoint2: procedure(i, j: GLint); extdecl;
+  glFeedbackBuffer: procedure(size: GLsizei; atype: GLenum; buffer: PGLfloat); extdecl;
+  glFinish: procedure; extdecl;
+  glFlush: procedure; extdecl;
+  glFogf: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glFogfv: procedure(pname: GLenum; const params: PGLfloat); extdecl;
+  glFogi: procedure(pname: GLenum; param: GLint); extdecl;
+  glFogiv: procedure(pname: GLenum; const params: PGLint); extdecl;
+  glFrontFace: procedure(mode: GLenum); extdecl;
+  glFrustum: procedure(left, right, bottom, top, zNear, zFar: GLdouble); extdecl;
+  glGenLists: function(range: GLsizei): GLuint; extdecl;
+  glGenTextures: procedure(n: GLsizei; textures: PGLuint); extdecl;
+  glGetBooleanv: procedure(pname: GLenum; params: PGLboolean); extdecl;
+  glGetClipPlane: procedure(plane: GLenum; equation: PGLdouble); extdecl;
+  glGetDoublev: procedure(pname: GLenum; params: PGLdouble); extdecl;
+  glGetError: function: GLenum; extdecl;
+  glGetFloatv: procedure(pname: GLenum; params: PGLfloat); extdecl;
+  glGetIntegerv: procedure(pname: GLenum; params: PGLint); extdecl;
+  glGetLightfv: procedure(light, pname: GLenum; params: PGLfloat); extdecl;
+  glGetLightiv: procedure(light, pname: GLenum; params: PGLint); extdecl;
+  glGetMapdv: procedure(target, query: GLenum; v: PGLdouble); extdecl;
+  glGetMapfv: procedure(target, query: GLenum; v: PGLfloat); extdecl;
+  glGetMapiv: procedure(target, query: GLenum; v: PGLint); extdecl;
+  glGetMaterialfv: procedure(face, pname: GLenum; params: PGLfloat); extdecl;
+  glGetMaterialiv: procedure(face, pname: GLenum; params: PGLint); extdecl;
+  glGetPixelMapfv: procedure(map: GLenum; values: PGLfloat); extdecl;
+  glGetPixelMapuiv: procedure(map: GLenum; values: PGLuint); extdecl;
+  glGetPixelMapusv: procedure(map: GLenum; values: PGLushort); extdecl;
+  glGetPointerv: procedure(pname: GLenum; params: Pointer); extdecl;
+  glGetPolygonStipple: procedure(mask: PGLubyte); extdecl;
+  glGetString: function(name: GLenum): PChar; extdecl;
+  glGetTexEnvfv: procedure(target, pname: GLenum; params: PGLfloat); extdecl;
+  glGetTexEnviv: procedure(target, pname: GLenum; params: PGLint); extdecl;
+  glGetTexGendv: procedure(coord, pname: GLenum; params: PGLdouble); extdecl;
+  glGetTexGenfv: procedure(coord, pname: GLenum; params: PGLfloat); extdecl;
+  glGetTexGeniv: procedure(coord, pname: GLenum; params: PGLint); extdecl;
+  glGetTexImage: procedure(target: GLenum; level: GLint; format: GLenum; atype: GLenum; pixels: Pointer); extdecl;
+  glGetTexLevelParameterfv: procedure(target: GLenum; level: GLint; pname: GLenum; params: Pointer); extdecl;
+  glGetTexLevelParameteriv: procedure(target: GLenum; level: GLint; pname: GLenum; params: PGLint); extdecl;
+  glGetTexParameterfv: procedure(target, pname: GLenum; params: PGLfloat); extdecl;
+  glGetTexParameteriv: procedure(target, pname: GLenum; params: PGLint); extdecl;
+  glHint: procedure(target, mode: GLenum); extdecl;
+  glIndexMask: procedure(mask: GLuint); extdecl;
+  glIndexPointer: procedure(atype: GLenum; stride: GLsizei; const pointer: Pointer); extdecl;
+  glIndexd: procedure(c: GLdouble); extdecl;
+  glIndexdv: procedure(const c: PGLdouble); extdecl;
+  glIndexf: procedure(c: GLfloat); extdecl;
+  glIndexfv: procedure(const c: PGLfloat); extdecl;
+  glIndexi: procedure(c: GLint); extdecl;
+  glIndexiv: procedure(const c: PGLint); extdecl;
+  glIndexs: procedure(c: GLshort); extdecl;
+  glIndexsv: procedure(const c: PGLshort); extdecl;
+  glIndexub: procedure(c: GLubyte); extdecl;
+  glIndexubv: procedure(const c: PGLubyte); extdecl;
+  glInitNames: procedure; extdecl;
+  glInterleavedArrays: procedure(format: GLenum; stride: GLsizei; const pointer: Pointer); extdecl;
+  glIsEnabled: function(cap: GLenum): GLboolean; extdecl;
+  glIsList: function(list: GLuint): GLboolean; extdecl;
+  glIsTexture: function(texture: GLuint): GLboolean; extdecl;
+  glLightModelf: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glLightModelfv: procedure(pname: GLenum; const params: PGLfloat); extdecl;
+  glLightModeli: procedure(pname: GLenum; param: GLint); extdecl;
+  glLightModeliv: procedure(pname: GLenum; const params: PGLint); extdecl;
+  glLightf: procedure(light, pname: GLenum; param: GLfloat); extdecl;
+  glLightfv: procedure(light, pname: GLenum; const params: PGLfloat); extdecl;
+  glLighti: procedure(light, pname: GLenum; param: GLint); extdecl;
+  glLightiv: procedure(light, pname: GLenum; const params: PGLint); extdecl;
+  glLineStipple: procedure(factor: GLint; pattern: GLushort); extdecl;
+  glLineWidth: procedure(width: GLfloat); extdecl;
+  glListBase: procedure(base: GLuint); extdecl;
+  glLoadIdentity: procedure; extdecl;
+  glLoadMatrixd: procedure(const m: PGLdouble); extdecl;
+  glLoadMatrixf: procedure(const m: PGLfloat); extdecl;
+  glLoadName: procedure(name: GLuint); extdecl;
+  glLogicOp: procedure(opcode: GLenum); extdecl;
+  glMap1d: procedure(target: GLenum; u1, u2: GLdouble; stride, order: GLint; const points: PGLdouble); extdecl;
+  glMap1f: procedure(target: GLenum; u1, u2: GLfloat; stride, order: GLint; const points: PGLfloat); extdecl;
+  glMap2d: procedure(target: GLenum; u1, u2: GLdouble; ustride, uorder: GLint; v1, v2: GLdouble; vstride, vorder: GLint; const points: PGLdouble); extdecl;
+  glMap2f: procedure(target: GLenum; u1, u2: GLfloat; ustride, uorder: GLint; v1, v2: GLfloat; vstride, vorder: GLint; const points: PGLfloat); extdecl;
+  glMapGrid1d: procedure(un: GLint; u1, u2: GLdouble); extdecl;
+  glMapGrid1f: procedure(un: GLint; u1, u2: GLfloat); extdecl;
+  glMapGrid2d: procedure(un: GLint; u1, u2: GLdouble; vn: GLint; v1, v2: GLdouble); extdecl;
+  glMapGrid2f: procedure(un: GLint; u1, u2: GLfloat; vn: GLint; v1, v2: GLfloat); extdecl;
+  glMaterialf: procedure(face, pname: GLenum; param: GLfloat); extdecl;
+  glMaterialfv: procedure(face, pname: GLenum; const params: PGLfloat); extdecl;
+  glMateriali: procedure(face, pname: GLenum; param: GLint); extdecl;
+  glMaterialiv: procedure(face, pname: GLenum; const params: PGLint); extdecl;
+  glMatrixMode: procedure(mode: GLenum); extdecl;
+  glMultMatrixd: procedure(const m: PGLdouble); extdecl;
+  glMultMatrixf: procedure(const m: PGLfloat); extdecl;
+  glNewList: procedure(list: GLuint; mode: GLenum); extdecl;
+  glNormal3b: procedure(nx, ny, nz: GLbyte); extdecl;
+  glNormal3bv: procedure(const v: PGLbyte); extdecl;
+  glNormal3d: procedure(nx, ny, nz: GLdouble); extdecl;
+  glNormal3dv: procedure(const v: PGLdouble); extdecl;
+  glNormal3f: procedure(nx, ny, nz: GLfloat); extdecl;
+  glNormal3fv: procedure(const v: PGLfloat); extdecl;
+  glNormal3i: procedure(nx, ny, nz: GLint); extdecl;
+  glNormal3iv: procedure(const v: PGLint); extdecl;
+  glNormal3s: procedure(nx, ny, nz: GLshort); extdecl;
+  glNormal3sv: procedure(const v: PGLshort); extdecl;
+  glNormalPointer: procedure(atype: GLenum; stride: GLsizei; const pointer: Pointer); extdecl;
+  glOrtho: procedure(left, right, bottom, top, zNear, zFar: GLdouble); extdecl;
+  glPassThrough: procedure(token: GLfloat); extdecl;
+  glPixelMapfv: procedure(map: GLenum; mapsize: GLsizei; const values: PGLfloat); extdecl;
+  glPixelMapuiv: procedure(map: GLenum; mapsize: GLsizei; const values: PGLuint); extdecl;
+  glPixelMapusv: procedure(map: GLenum; mapsize: GLsizei; const values: PGLushort); extdecl;
+  glPixelStoref: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glPixelStorei: procedure(pname: GLenum; param: GLint); extdecl;
+  glPixelTransferf: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glPixelTransferi: procedure(pname: GLenum; param: GLint); extdecl;
+  glPixelZoom: procedure(xfactor, yfactor: GLfloat); extdecl;
+  glPointSize: procedure(size: GLfloat); extdecl;
+  glPolygonMode: procedure(face, mode: GLenum); extdecl;
+  glPolygonOffset: procedure(factor, units: GLfloat); extdecl;
+  glPolygonStipple: procedure(const mask: PGLubyte); extdecl;
+  glPopAttrib: procedure; extdecl;
+  glPopClientAttrib: procedure; extdecl;
+  glPopMatrix: procedure; extdecl;
+  glPopName: procedure; extdecl;
+  glPrioritizeTextures: procedure(n: GLsizei; const textures: PGLuint; const priorities: PGLclampf); extdecl;
+  glPushAttrib: procedure(mask: GLbitfield); extdecl;
+  glPushClientAttrib: procedure(mask: GLbitfield); extdecl;
+  glPushMatrix: procedure; extdecl;
+  glPushName: procedure(name: GLuint); extdecl;
+  glRasterPos2d: procedure(x, y: GLdouble); extdecl;
+  glRasterPos2dv: procedure(const v: PGLdouble); extdecl;
+  glRasterPos2f: procedure(x, y: GLfloat); extdecl;
+  glRasterPos2fv: procedure(const v: PGLfloat); extdecl;
+  glRasterPos2i: procedure(x, y: GLint); extdecl;
+  glRasterPos2iv: procedure(const v: PGLint); extdecl;
+  glRasterPos2s: procedure(x, y: GLshort); extdecl;
+  glRasterPos2sv: procedure(const v: PGLshort); extdecl;
+  glRasterPos3d: procedure(x, y, z: GLdouble); extdecl;
+  glRasterPos3dv: procedure(const v: PGLdouble); extdecl;
+  glRasterPos3f: procedure(x, y, z: GLfloat); extdecl;
+  glRasterPos3fv: procedure(const v: PGLfloat); extdecl;
+  glRasterPos3i: procedure(x, y, z: GLint); extdecl;
+  glRasterPos3iv: procedure(const v: PGLint); extdecl;
+  glRasterPos3s: procedure(x, y, z: GLshort); extdecl;
+  glRasterPos3sv: procedure(const v: PGLshort); extdecl;
+  glRasterPos4d: procedure(x, y, z, w: GLdouble); extdecl;
+  glRasterPos4dv: procedure(const v: PGLdouble); extdecl;
+  glRasterPos4f: procedure(x, y, z, w: GLfloat); extdecl;
+  glRasterPos4fv: procedure(const v: PGLfloat); extdecl;
+  glRasterPos4i: procedure(x, y, z, w: GLint); extdecl;
+  glRasterPos4iv: procedure(const v: PGLint); extdecl;
+  glRasterPos4s: procedure(x, y, z, w: GLshort); extdecl;
+  glRasterPos4sv: procedure(const v: PGLshort); extdecl;
+  glReadBuffer: procedure(mode: GLenum); extdecl;
+  glReadPixels: procedure(x, y: GLint; width, height: GLsizei; format, atype: GLenum; pixels: Pointer); extdecl;
+  glRectd: procedure(x1, y1, x2, y2: GLdouble); extdecl;
+  glRectdv: procedure(const v1: PGLdouble; const v2: PGLdouble); extdecl;
+  glRectf: procedure(x1, y1, x2, y2: GLfloat); extdecl;
+  glRectfv: procedure(const v1: PGLfloat; const v2: PGLfloat); extdecl;
+  glRecti: procedure(x1, y1, x2, y2: GLint); extdecl;
+  glRectiv: procedure(const v1: PGLint; const v2: PGLint); extdecl;
+  glRects: procedure(x1, y1, x2, y2: GLshort); extdecl;
+  glRectsv: procedure(const v1: PGLshort; const v2: PGLshort); extdecl;
+  glRenderMode: function(mode: GLint): GLint; extdecl;
+  glRotated: procedure(angle, x, y, z: GLdouble); extdecl;
+  glRotatef: procedure(angle, x, y, z: GLfloat); extdecl;
+  glScaled: procedure(x, y, z: GLdouble); extdecl;
+  glScalef: procedure(x, y, z: GLfloat); extdecl;
+  glScissor: procedure(x, y: GLint; width, height: GLsizei); extdecl;
+  glSelectBuffer: procedure(size: GLsizei; buffer: PGLuint); extdecl;
+  glShadeModel: procedure(mode: GLenum); extdecl;
+  glStencilFunc: procedure(func: GLenum; ref: GLint; mask: GLuint); extdecl;
+  glStencilMask: procedure(mask: GLuint); extdecl;
+  glStencilOp: procedure(fail, zfail, zpass: GLenum); extdecl;
+  glTexCoord1d: procedure(s: GLdouble); extdecl;
+  glTexCoord1dv: procedure(const v: PGLdouble); extdecl;
+  glTexCoord1f: procedure(s: GLfloat); extdecl;
+  glTexCoord1fv: procedure(const v: PGLfloat); extdecl;
+  glTexCoord1i: procedure(s: GLint); extdecl;
+  glTexCoord1iv: procedure(const v: PGLint); extdecl;
+  glTexCoord1s: procedure(s: GLshort); extdecl;
+  glTexCoord1sv: procedure(const v: PGLshort); extdecl;
+  glTexCoord2d: procedure(s, t: GLdouble); extdecl;
+  glTexCoord2dv: procedure(const v: PGLdouble); extdecl;
+  glTexCoord2f: procedure(s, t: GLfloat); extdecl;
+  glTexCoord2fv: procedure(const v: PGLfloat); extdecl;
+  glTexCoord2i: procedure(s, t: GLint); extdecl;
+  glTexCoord2iv: procedure(const v: PGLint); extdecl;
+  glTexCoord2s: procedure(s, t: GLshort); extdecl;
+  glTexCoord2sv: procedure(const v: PGLshort); extdecl;
+  glTexCoord3d: procedure(s, t, r: GLdouble); extdecl;
+  glTexCoord3dv: procedure(const v: PGLdouble); extdecl;
+  glTexCoord3f: procedure(s, t, r: GLfloat); extdecl;
+  glTexCoord3fv: procedure(const v: PGLfloat); extdecl;
+  glTexCoord3i: procedure(s, t, r: GLint); extdecl;
+  glTexCoord3iv: procedure(const v: PGLint); extdecl;
+  glTexCoord3s: procedure(s, t, r: GLshort); extdecl;
+  glTexCoord3sv: procedure(const v: PGLshort); extdecl;
+  glTexCoord4d: procedure(s, t, r, q: GLdouble); extdecl;
+  glTexCoord4dv: procedure(const v: PGLdouble); extdecl;
+  glTexCoord4f: procedure(s, t, r, q: GLfloat); extdecl;
+  glTexCoord4fv: procedure(const v: PGLfloat); extdecl;
+  glTexCoord4i: procedure(s, t, r, q: GLint); extdecl;
+  glTexCoord4iv: procedure(const v: PGLint); extdecl;
+  glTexCoord4s: procedure(s, t, r, q: GLshort); extdecl;
+  glTexCoord4sv: procedure(const v: PGLshort); extdecl;
+  glTexCoordPointer: procedure(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); extdecl;
+  glTexEnvf: procedure(target: GLenum; pname: GLenum; param: GLfloat); extdecl;
+  glTexEnvfv: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glTexEnvi: procedure(target: GLenum; pname: GLenum; param: GLint); extdecl;
+  glTexEnviv: procedure(target: GLenum; pname: GLenum; const params: PGLint); extdecl;
+  glTexGend: procedure(coord: GLenum; pname: GLenum; param: GLdouble); extdecl;
+  glTexGendv: procedure(coord: GLenum; pname: GLenum; const params: PGLdouble); extdecl;
+  glTexGenf: procedure(coord: GLenum; pname: GLenum; param: GLfloat); extdecl;
+  glTexGenfv: procedure(coord: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glTexGeni: procedure(coord: GLenum; pname: GLenum; param: GLint); extdecl;
+  glTexGeniv: procedure(coord: GLenum; pname: GLenum; const params: PGLint); extdecl;
+  glTexImage1D: procedure(target: GLenum; level, internalformat: GLint; width: GLsizei; border: GLint; format, atype: GLenum; const pixels: Pointer); extdecl;
+  glTexImage2D: procedure(target: GLenum; level, internalformat: GLint; width, height: GLsizei; border: GLint; format, atype: GLenum; const pixels: Pointer); extdecl;
+  glTexParameterf: procedure(target: GLenum; pname: GLenum; param: GLfloat); extdecl;
+  glTexParameterfv: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glTexParameteri: procedure(target: GLenum; pname: GLenum; param: GLint); extdecl;
+  glTexParameteriv: procedure(target: GLenum; pname: GLenum; const params: PGLint); extdecl;
+  glTexSubImage1D: procedure(target: GLenum; level, xoffset: GLint; width: GLsizei; format, atype: GLenum; const pixels: Pointer); extdecl;
+  glTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset: GLint; width, height: GLsizei; format, atype: GLenum; const pixels: Pointer); extdecl;
+  glTranslated: procedure(x, y, z: GLdouble); extdecl;
+  glTranslatef: procedure(x, y, z: GLfloat); extdecl;
+  glVertex2d: procedure(x, y: GLdouble); extdecl;
+  glVertex2dv: procedure(const v: PGLdouble); extdecl;
+  glVertex2f: procedure(x, y: GLfloat); extdecl;
+  glVertex2fv: procedure(const v: PGLfloat); extdecl;
+  glVertex2i: procedure(x, y: GLint); extdecl;
+  glVertex2iv: procedure(const v: PGLint); extdecl;
+  glVertex2s: procedure(x, y: GLshort); extdecl;
+  glVertex2sv: procedure(const v: PGLshort); extdecl;
+  glVertex3d: procedure(x, y, z: GLdouble); extdecl;
+  glVertex3dv: procedure(const v: PGLdouble); extdecl;
+  glVertex3f: procedure(x, y, z: GLfloat); extdecl;
+  glVertex3fv: procedure(const v: PGLfloat); extdecl;
+  glVertex3i: procedure(x, y, z: GLint); extdecl;
+  glVertex3iv: procedure(const v: PGLint); extdecl;
+  glVertex3s: procedure(x, y, z: GLshort); extdecl;
+  glVertex3sv: procedure(const v: PGLshort); extdecl;
+  glVertex4d: procedure(x, y, z, w: GLdouble); extdecl;
+  glVertex4dv: procedure(const v: PGLdouble); extdecl;
+  glVertex4f: procedure(x, y, z, w: GLfloat); extdecl;
+  glVertex4fv: procedure(const v: PGLfloat); extdecl;
+  glVertex4i: procedure(x, y, z, w: GLint); extdecl;
+  glVertex4iv: procedure(const v: PGLint); extdecl;
+  glVertex4s: procedure(x, y, z, w: GLshort); extdecl;
+  glVertex4sv: procedure(const v: PGLshort); extdecl;
+  glVertexPointer: procedure(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); extdecl;
+  glViewport: procedure(x, y: GLint; width, height: GLsizei); extdecl;
+  {$IFDEF Windows}
+  ChoosePixelFormat: function(DC: HDC; p2: PPixelFormatDescriptor): Integer; extdecl;
+  {$ENDIF}
+{$ENDIF MORPHOS}
+
+type
+  // EXT_vertex_array
+  PFNGLARRAYELEMENTEXTPROC = procedure(i: GLint); extdecl;
+  PFNGLDRAWARRAYSEXTPROC = procedure(mode: GLenum; first: GLint; count: GLsizei); extdecl;
+  PFNGLVERTEXPOINTEREXTPROC = procedure(size: GLint; atype: GLenum;
+                                        stride, count: GLsizei; const pointer: Pointer); extdecl;
+  PFNGLNORMALPOINTEREXTPROC = procedure(atype: GLenum; stride, count: GLsizei;
+                                        const pointer: Pointer); extdecl;
+  PFNGLCOLORPOINTEREXTPROC = procedure(size: GLint; atype: GLenum; stride, count: GLsizei;
+                                       const pointer: Pointer); extdecl;
+  PFNGLINDEXPOINTEREXTPROC = procedure(atype: GLenum; stride, count: GLsizei;
+                                       const pointer: Pointer); extdecl;
+  PFNGLTEXCOORDPOINTEREXTPROC = procedure(size: GLint; atype: GLenum;
+                                          stride, count: GLsizei; const pointer: Pointer); extdecl;
+  PFNGLEDGEFLAGPOINTEREXTPROC = procedure(stride, count: GLsizei;
+                                          const pointer: PGLboolean); extdecl;
+  PFNGLGETPOINTERVEXTPROC = procedure(pname: GLenum; params: Pointer); extdecl;
+  PFNGLARRAYELEMENTARRAYEXTPROC = procedure(mode: GLenum; count: GLsizei;
+                                            const pi: Pointer); extdecl;
+
+  // WIN_swap_hint
+  PFNGLADDSWAPHINTRECTWINPROC = procedure(x, y: GLint; width, height: GLsizei); extdecl;
+
+  // EXT_paletted_texture
+  PFNGLCOLORTABLEEXTPROC = procedure(target, internalFormat: GLenum; width: GLsizei;
+                                     format, atype: GLenum; const data: Pointer); extdecl;
+  PFNGLCOLORSUBTABLEEXTPROC = procedure(target: GLenum; start, count: GLsizei;
+                                        format, atype: GLenum; const data: Pointer); extdecl;
+  PFNGLGETCOLORTABLEEXTPROC = procedure(target, format, atype: GLenum; data: Pointer); extdecl;
+  PFNGLGETCOLORTABLEPARAMETERIVEXTPROC = procedure(target, pname: GLenum; params: PGLint); extdecl;
+  PFNGLGETCOLORTABLEPARAMETERFVEXTPROC = procedure(target, pname: GLenum; params: PGLfloat); extdecl;
+
+procedure LoadOpenGL(const dll: String);
+procedure FreeOpenGL;
+
+implementation
+
+{$if defined(cpui386) or defined(cpux86_64)}
+uses
+  math;
+{$endif}
+
+{$ifdef windows}
+function WinChoosePixelFormat(DC: HDC; p2: PPixelFormatDescriptor): Integer; extdecl; external 'gdi32' name 'ChoosePixelFormat';
+{$endif}
+
+{$IFDEF MORPHOS}
+
+{ MorphOS GL works differently due to different dynamic-library handling on Amiga-like }
+{ systems, so its functions are included here. }
+{$INCLUDE tinygl.inc}
+
+{$ENDIF MORPHOS}
+
+procedure FreeOpenGL;
+begin
+{$IFDEF MORPHOS}
+
+  // MorphOS's GL will closed down by TinyGL unit, nothing is needed here.
+
+{$ELSE MORPHOS}
+  @glAccum := nil;
+  @glAlphaFunc := nil;
+  @glAreTexturesResident := nil;
+  @glArrayElement := nil;
+  @glBegin := nil;
+  @glBindTexture := nil;
+  @glBitmap := nil;
+  @glBlendFunc := nil;
+  @glCallList := nil;
+  @glCallLists := nil;
+  @glClear := nil;
+  @glClearAccum := nil;
+  @glClearColor := nil;
+  @glClearDepth := nil;
+  @glClearIndex := nil;
+  @glClearStencil := nil;
+  @glClipPlane := nil;
+  @glColor3b := nil;
+  @glColor3bv := nil;
+  @glColor3d := nil;
+  @glColor3dv := nil;
+  @glColor3f := nil;
+  @glColor3fv := nil;
+  @glColor3i := nil;
+  @glColor3iv := nil;
+  @glColor3s := nil;
+  @glColor3sv := nil;
+  @glColor3ub := nil;
+  @glColor3ubv := nil;
+  @glColor3ui := nil;
+  @glColor3uiv := nil;
+  @glColor3us := nil;
+  @glColor3usv := nil;
+  @glColor4b := nil;
+  @glColor4bv := nil;
+  @glColor4d := nil;
+  @glColor4dv := nil;
+  @glColor4f := nil;
+  @glColor4fv := nil;
+  @glColor4i := nil;
+  @glColor4iv := nil;
+  @glColor4s := nil;
+  @glColor4sv := nil;
+  @glColor4ub := nil;
+  @glColor4ubv := nil;
+  @glColor4ui := nil;
+  @glColor4uiv := nil;
+  @glColor4us := nil;
+  @glColor4usv := nil;
+  @glColorMask := nil;
+  @glColorMaterial := nil;
+  @glColorPointer := nil;
+  @glCopyPixels := nil;
+  @glCopyTexImage1D := nil;
+  @glCopyTexImage2D := nil;
+  @glCopyTexSubImage1D := nil;
+  @glCopyTexSubImage2D := nil;
+  @glCullFace := nil;
+  @glDeleteLists := nil;
+  @glDeleteTextures := nil;
+  @glDepthFunc := nil;
+  @glDepthMask := nil;
+  @glDepthRange := nil;
+  @glDisable := nil;
+  @glDisableClientState := nil;
+  @glDrawArrays := nil;
+  @glDrawBuffer := nil;
+  @glDrawElements := nil;
+  @glDrawPixels := nil;
+  @glEdgeFlag := nil;
+  @glEdgeFlagPointer := nil;
+  @glEdgeFlagv := nil;
+  @glEnable := nil;
+  @glEnableClientState := nil;
+  @glEnd := nil;
+  @glEndList := nil;
+  @glEvalCoord1d := nil;
+  @glEvalCoord1dv := nil;
+  @glEvalCoord1f := nil;
+  @glEvalCoord1fv := nil;
+  @glEvalCoord2d := nil;
+  @glEvalCoord2dv := nil;
+  @glEvalCoord2f := nil;
+  @glEvalCoord2fv := nil;
+  @glEvalMesh1 := nil;
+  @glEvalMesh2 := nil;
+  @glEvalPoint1 := nil;
+  @glEvalPoint2 := nil;
+  @glFeedbackBuffer := nil;
+  @glFinish := nil;
+  @glFlush := nil;
+  @glFogf := nil;
+  @glFogfv := nil;
+  @glFogi := nil;
+  @glFogiv := nil;
+  @glFrontFace := nil;
+  @glFrustum := nil;
+  @glGenLists := nil;
+  @glGenTextures := nil;
+  @glGetBooleanv := nil;
+  @glGetClipPlane := nil;
+  @glGetDoublev := nil;
+  @glGetError := nil;
+  @glGetFloatv := nil;
+  @glGetIntegerv := nil;
+  @glGetLightfv := nil;
+  @glGetLightiv := nil;
+  @glGetMapdv := nil;
+  @glGetMapfv := nil;
+  @glGetMapiv := nil;
+  @glGetMaterialfv := nil;
+  @glGetMaterialiv := nil;
+  @glGetPixelMapfv := nil;
+  @glGetPixelMapuiv := nil;
+  @glGetPixelMapusv := nil;
+  @glGetPointerv := nil;
+  @glGetPolygonStipple := nil;
+  @glGetString := nil;
+  @glGetTexEnvfv := nil;
+  @glGetTexEnviv := nil;
+  @glGetTexGendv := nil;
+  @glGetTexGenfv := nil;
+  @glGetTexGeniv := nil;
+  @glGetTexImage := nil;
+  @glGetTexLevelParameterfv := nil;
+  @glGetTexLevelParameteriv := nil;
+  @glGetTexParameterfv := nil;
+  @glGetTexParameteriv := nil;
+  @glHint := nil;
+  @glIndexMask := nil;
+  @glIndexPointer := nil;
+  @glIndexd := nil;
+  @glIndexdv := nil;
+  @glIndexf := nil;
+  @glIndexfv := nil;
+  @glIndexi := nil;
+  @glIndexiv := nil;
+  @glIndexs := nil;
+  @glIndexsv := nil;
+  @glIndexub := nil;
+  @glIndexubv := nil;
+  @glInitNames := nil;
+  @glInterleavedArrays := nil;
+  @glIsEnabled := nil;
+  @glIsList := nil;
+  @glIsTexture := nil;
+  @glLightModelf := nil;
+  @glLightModelfv := nil;
+  @glLightModeli := nil;
+  @glLightModeliv := nil;
+  @glLightf := nil;
+  @glLightfv := nil;
+  @glLighti := nil;
+  @glLightiv := nil;
+  @glLineStipple := nil;
+  @glLineWidth := nil;
+  @glListBase := nil;
+  @glLoadIdentity := nil;
+  @glLoadMatrixd := nil;
+  @glLoadMatrixf := nil;
+  @glLoadName := nil;
+  @glLogicOp := nil;
+  @glMap1d := nil;
+  @glMap1f := nil;
+  @glMap2d := nil;
+  @glMap2f := nil;
+  @glMapGrid1d := nil;
+  @glMapGrid1f := nil;
+  @glMapGrid2d := nil;
+  @glMapGrid2f := nil;
+  @glMaterialf := nil;
+  @glMaterialfv := nil;
+  @glMateriali := nil;
+  @glMaterialiv := nil;
+  @glMatrixMode := nil;
+  @glMultMatrixd := nil;
+  @glMultMatrixf := nil;
+  @glNewList := nil;
+  @glNormal3b := nil;
+  @glNormal3bv := nil;
+  @glNormal3d := nil;
+  @glNormal3dv := nil;
+  @glNormal3f := nil;
+  @glNormal3fv := nil;
+  @glNormal3i := nil;
+  @glNormal3iv := nil;
+  @glNormal3s := nil;
+  @glNormal3sv := nil;
+  @glNormalPointer := nil;
+  @glOrtho := nil;
+  @glPassThrough := nil;
+  @glPixelMapfv := nil;
+  @glPixelMapuiv := nil;
+  @glPixelMapusv := nil;
+  @glPixelStoref := nil;
+  @glPixelStorei := nil;
+  @glPixelTransferf := nil;
+  @glPixelTransferi := nil;
+  @glPixelZoom := nil;
+  @glPointSize := nil;
+  @glPolygonMode := nil;
+  @glPolygonOffset := nil;
+  @glPolygonStipple := nil;
+  @glPopAttrib := nil;
+  @glPopClientAttrib := nil;
+  @glPopMatrix := nil;
+  @glPopName := nil;
+  @glPrioritizeTextures := nil;
+  @glPushAttrib := nil;
+  @glPushClientAttrib := nil;
+  @glPushMatrix := nil;
+  @glPushName := nil;
+  @glRasterPos2d := nil;
+  @glRasterPos2dv := nil;
+  @glRasterPos2f := nil;
+  @glRasterPos2fv := nil;
+  @glRasterPos2i := nil;
+  @glRasterPos2iv := nil;
+  @glRasterPos2s := nil;
+  @glRasterPos2sv := nil;
+  @glRasterPos3d := nil;
+  @glRasterPos3dv := nil;
+  @glRasterPos3f := nil;
+  @glRasterPos3fv := nil;
+  @glRasterPos3i := nil;
+  @glRasterPos3iv := nil;
+  @glRasterPos3s := nil;
+  @glRasterPos3sv := nil;
+  @glRasterPos4d := nil;
+  @glRasterPos4dv := nil;
+  @glRasterPos4f := nil;
+  @glRasterPos4fv := nil;
+  @glRasterPos4i := nil;
+  @glRasterPos4iv := nil;
+  @glRasterPos4s := nil;
+  @glRasterPos4sv := nil;
+  @glReadBuffer := nil;
+  @glReadPixels := nil;
+  @glRectd := nil;
+  @glRectdv := nil;
+  @glRectf := nil;
+  @glRectfv := nil;
+  @glRecti := nil;
+  @glRectiv := nil;
+  @glRects := nil;
+  @glRectsv := nil;
+  @glRenderMode := nil;
+  @glRotated := nil;
+  @glRotatef := nil;
+  @glScaled := nil;
+  @glScalef := nil;
+  @glScissor := nil;
+  @glSelectBuffer := nil;
+  @glShadeModel := nil;
+  @glStencilFunc := nil;
+  @glStencilMask := nil;
+  @glStencilOp := nil;
+  @glTexCoord1d := nil;
+  @glTexCoord1dv := nil;
+  @glTexCoord1f := nil;
+  @glTexCoord1fv := nil;
+  @glTexCoord1i := nil;
+  @glTexCoord1iv := nil;
+  @glTexCoord1s := nil;
+  @glTexCoord1sv := nil;
+  @glTexCoord2d := nil;
+  @glTexCoord2dv := nil;
+  @glTexCoord2f := nil;
+  @glTexCoord2fv := nil;
+  @glTexCoord2i := nil;
+  @glTexCoord2iv := nil;
+  @glTexCoord2s := nil;
+  @glTexCoord2sv := nil;
+  @glTexCoord3d := nil;
+  @glTexCoord3dv := nil;
+  @glTexCoord3f := nil;
+  @glTexCoord3fv := nil;
+  @glTexCoord3i := nil;
+  @glTexCoord3iv := nil;
+  @glTexCoord3s := nil;
+  @glTexCoord3sv := nil;
+  @glTexCoord4d := nil;
+  @glTexCoord4dv := nil;
+  @glTexCoord4f := nil;
+  @glTexCoord4fv := nil;
+  @glTexCoord4i := nil;
+  @glTexCoord4iv := nil;
+  @glTexCoord4s := nil;
+  @glTexCoord4sv := nil;
+  @glTexCoordPointer := nil;
+  @glTexEnvf := nil;
+  @glTexEnvfv := nil;
+  @glTexEnvi := nil;
+  @glTexEnviv := nil;
+  @glTexGend := nil;
+  @glTexGendv := nil;
+  @glTexGenf := nil;
+  @glTexGenfv := nil;
+  @glTexGeni := nil;
+  @glTexGeniv := nil;
+  @glTexImage1D := nil;
+  @glTexImage2D := nil;
+  @glTexParameterf := nil;
+  @glTexParameterfv := nil;
+  @glTexParameteri := nil;
+  @glTexParameteriv := nil;
+  @glTexSubImage1D := nil;
+  @glTexSubImage2D := nil;
+  @glTranslated := nil;
+  @glTranslatef := nil;
+  @glVertex2d := nil;
+  @glVertex2dv := nil;
+  @glVertex2f := nil;
+  @glVertex2fv := nil;
+  @glVertex2i := nil;
+  @glVertex2iv := nil;
+  @glVertex2s := nil;
+  @glVertex2sv := nil;
+  @glVertex3d := nil;
+  @glVertex3dv := nil;
+  @glVertex3f := nil;
+  @glVertex3fv := nil;
+  @glVertex3i := nil;
+  @glVertex3iv := nil;
+  @glVertex3s := nil;
+  @glVertex3sv := nil;
+  @glVertex4d := nil;
+  @glVertex4dv := nil;
+  @glVertex4f := nil;
+  @glVertex4fv := nil;
+  @glVertex4i := nil;
+  @glVertex4iv := nil;
+  @glVertex4s := nil;
+  @glVertex4sv := nil;
+  @glVertexPointer := nil;
+  @glViewport := nil;
+  {$IFDEF Windows}
+  @ChoosePixelFormat := nil;
+  {$ENDIF}
+
+  if (LibGL <> 0) then
+    FreeLibrary(LibGL);
+{$ENDIF MORPHOS}
+end;
+
+procedure LoadOpenGL(const dll: String);
+{$IFDEF MORPHOS}
+begin
+  // MorphOS's GL has own initialization in TinyGL unit, nothing is needed here.
+end;
+{$ELSE MORPHOS}
+var
+  MethodName: string = '';
+
+  function GetGLProcAddress(Lib: PtrInt; ProcName: PChar): Pointer;
+  begin
+    MethodName:=ProcName;
+    Result:=GetProcAddress(Lib, ProcName);
+  end;
+
+begin
+
+  FreeOpenGL;
+
+  LibGL := LoadLibrary(PChar(dll));
+  if LibGL = 0 then raise Exception.Create('Could not load OpenGL from ' + dll);
+  try
+    @glAccum := GetGLProcAddress(LibGL, 'glAccum');
+    @glAlphaFunc := GetGLProcAddress(LibGL, 'glAlphaFunc');
+    @glAreTexturesResident := GetGLProcAddress(LibGL, 'glAreTexturesResident');
+    @glArrayElement := GetGLProcAddress(LibGL, 'glArrayElement');
+    @glBegin := GetGLProcAddress(LibGL, 'glBegin');
+    @glBindTexture := GetGLProcAddress(LibGL, 'glBindTexture');
+    @glBitmap := GetGLProcAddress(LibGL, 'glBitmap');
+    @glBlendFunc := GetGLProcAddress(LibGL, 'glBlendFunc');
+    @glCallList := GetGLProcAddress(LibGL, 'glCallList');
+    @glCallLists := GetGLProcAddress(LibGL, 'glCallLists');
+    @glClear := GetGLProcAddress(LibGL, 'glClear');
+    @glClearAccum := GetGLProcAddress(LibGL, 'glClearAccum');
+    @glClearColor := GetGLProcAddress(LibGL, 'glClearColor');
+    @glClearDepth := GetGLProcAddress(LibGL, 'glClearDepth');
+    @glClearIndex := GetGLProcAddress(LibGL, 'glClearIndex');
+    @glClearStencil := GetGLProcAddress(LibGL, 'glClearStencil');
+    @glClipPlane := GetGLProcAddress(LibGL, 'glClipPlane');
+    @glColor3b := GetGLProcAddress(LibGL, 'glColor3b');
+    @glColor3bv := GetGLProcAddress(LibGL, 'glColor3bv');
+    @glColor3d := GetGLProcAddress(LibGL, 'glColor3d');
+    @glColor3dv := GetGLProcAddress(LibGL, 'glColor3dv');
+    @glColor3f := GetGLProcAddress(LibGL, 'glColor3f');
+    @glColor3fv := GetGLProcAddress(LibGL, 'glColor3fv');
+    @glColor3i := GetGLProcAddress(LibGL, 'glColor3i');
+    @glColor3iv := GetGLProcAddress(LibGL, 'glColor3iv');
+    @glColor3s := GetGLProcAddress(LibGL, 'glColor3s');
+    @glColor3sv := GetGLProcAddress(LibGL, 'glColor3sv');
+    @glColor3ub := GetGLProcAddress(LibGL, 'glColor3ub');
+    @glColor3ubv := GetGLProcAddress(LibGL, 'glColor3ubv');
+    @glColor3ui := GetGLProcAddress(LibGL, 'glColor3ui');
+    @glColor3uiv := GetGLProcAddress(LibGL, 'glColor3uiv');
+    @glColor3us := GetGLProcAddress(LibGL, 'glColor3us');
+    @glColor3usv := GetGLProcAddress(LibGL, 'glColor3usv');
+    @glColor4b := GetGLProcAddress(LibGL, 'glColor4b');
+    @glColor4bv := GetGLProcAddress(LibGL, 'glColor4bv');
+    @glColor4d := GetGLProcAddress(LibGL, 'glColor4d');
+    @glColor4dv := GetGLProcAddress(LibGL, 'glColor4dv');
+    @glColor4f := GetGLProcAddress(LibGL, 'glColor4f');
+    @glColor4fv := GetGLProcAddress(LibGL, 'glColor4fv');
+    @glColor4i := GetGLProcAddress(LibGL, 'glColor4i');
+    @glColor4iv := GetGLProcAddress(LibGL, 'glColor4iv');
+    @glColor4s := GetGLProcAddress(LibGL, 'glColor4s');
+    @glColor4sv := GetGLProcAddress(LibGL, 'glColor4sv');
+    @glColor4ub := GetGLProcAddress(LibGL, 'glColor4ub');
+    @glColor4ubv := GetGLProcAddress(LibGL, 'glColor4ubv');
+    @glColor4ui := GetGLProcAddress(LibGL, 'glColor4ui');
+    @glColor4uiv := GetGLProcAddress(LibGL, 'glColor4uiv');
+    @glColor4us := GetGLProcAddress(LibGL, 'glColor4us');
+    @glColor4usv := GetGLProcAddress(LibGL, 'glColor4usv');
+    @glColorMask := GetGLProcAddress(LibGL, 'glColorMask');
+    @glColorMaterial := GetGLProcAddress(LibGL, 'glColorMaterial');
+    @glColorPointer := GetGLProcAddress(LibGL, 'glColorPointer');
+    @glCopyPixels := GetGLProcAddress(LibGL, 'glCopyPixels');
+    @glCopyTexImage1D := GetGLProcAddress(LibGL, 'glCopyTexImage1D');
+    @glCopyTexImage2D := GetGLProcAddress(LibGL, 'glCopyTexImage2D');
+    @glCopyTexSubImage1D := GetGLProcAddress(LibGL, 'glCopyTexSubImage1D');
+    @glCopyTexSubImage2D := GetGLProcAddress(LibGL, 'glCopyTexSubImage2D');
+    @glCullFace := GetGLProcAddress(LibGL, 'glCullFace');
+    @glDeleteLists := GetGLProcAddress(LibGL, 'glDeleteLists');
+    @glDeleteTextures := GetGLProcAddress(LibGL, 'glDeleteTextures');
+    @glDepthFunc := GetGLProcAddress(LibGL, 'glDepthFunc');
+    @glDepthMask := GetGLProcAddress(LibGL, 'glDepthMask');
+    @glDepthRange := GetGLProcAddress(LibGL, 'glDepthRange');
+    @glDisable := GetGLProcAddress(LibGL, 'glDisable');
+    @glDisableClientState := GetGLProcAddress(LibGL, 'glDisableClientState');
+    @glDrawArrays := GetGLProcAddress(LibGL, 'glDrawArrays');
+    @glDrawBuffer := GetGLProcAddress(LibGL, 'glDrawBuffer');
+    @glDrawElements := GetGLProcAddress(LibGL, 'glDrawElements');
+    @glDrawPixels := GetGLProcAddress(LibGL, 'glDrawPixels');
+    @glEdgeFlag := GetGLProcAddress(LibGL, 'glEdgeFlag');
+    @glEdgeFlagPointer := GetGLProcAddress(LibGL, 'glEdgeFlagPointer');
+    @glEdgeFlagv := GetGLProcAddress(LibGL, 'glEdgeFlagv');
+    @glEnable := GetGLProcAddress(LibGL, 'glEnable');
+    @glEnableClientState := GetGLProcAddress(LibGL, 'glEnableClientState');
+    @glEnd := GetGLProcAddress(LibGL, 'glEnd');
+    @glEndList := GetGLProcAddress(LibGL, 'glEndList');
+    @glEvalCoord1d := GetGLProcAddress(LibGL, 'glEvalCoord1d');
+    @glEvalCoord1dv := GetGLProcAddress(LibGL, 'glEvalCoord1dv');
+    @glEvalCoord1f := GetGLProcAddress(LibGL, 'glEvalCoord1f');
+    @glEvalCoord1fv := GetGLProcAddress(LibGL, 'glEvalCoord1fv');
+    @glEvalCoord2d := GetGLProcAddress(LibGL, 'glEvalCoord2d');
+    @glEvalCoord2dv := GetGLProcAddress(LibGL, 'glEvalCoord2dv');
+    @glEvalCoord2f := GetGLProcAddress(LibGL, 'glEvalCoord2f');
+    @glEvalCoord2fv := GetGLProcAddress(LibGL, 'glEvalCoord2fv');
+    @glEvalMesh1 := GetGLProcAddress(LibGL, 'glEvalMesh1');
+    @glEvalMesh2 := GetGLProcAddress(LibGL, 'glEvalMesh2');
+    @glEvalPoint1 := GetGLProcAddress(LibGL, 'glEvalPoint1');
+    @glEvalPoint2 := GetGLProcAddress(LibGL, 'glEvalPoint2');
+    @glFeedbackBuffer := GetGLProcAddress(LibGL, 'glFeedbackBuffer');
+    @glFinish := GetGLProcAddress(LibGL, 'glFinish');
+    @glFlush := GetGLProcAddress(LibGL, 'glFlush');
+    @glFogf := GetGLProcAddress(LibGL, 'glFogf');
+    @glFogfv := GetGLProcAddress(LibGL, 'glFogfv');
+    @glFogi := GetGLProcAddress(LibGL, 'glFogi');
+    @glFogiv := GetGLProcAddress(LibGL, 'glFogiv');
+    @glFrontFace := GetGLProcAddress(LibGL, 'glFrontFace');
+    @glFrustum := GetGLProcAddress(LibGL, 'glFrustum');
+    @glGenLists := GetGLProcAddress(LibGL, 'glGenLists');
+    @glGenTextures := GetGLProcAddress(LibGL, 'glGenTextures');
+    @glGetBooleanv := GetGLProcAddress(LibGL, 'glGetBooleanv');
+    @glGetClipPlane := GetGLProcAddress(LibGL, 'glGetClipPlane');
+    @glGetDoublev := GetGLProcAddress(LibGL, 'glGetDoublev');
+    @glGetError := GetGLProcAddress(LibGL, 'glGetError');
+    @glGetFloatv := GetGLProcAddress(LibGL, 'glGetFloatv');
+    @glGetIntegerv := GetGLProcAddress(LibGL, 'glGetIntegerv');
+    @glGetLightfv := GetGLProcAddress(LibGL, 'glGetLightfv');
+    @glGetLightiv := GetGLProcAddress(LibGL, 'glGetLightiv');
+    @glGetMapdv := GetGLProcAddress(LibGL, 'glGetMapdv');
+    @glGetMapfv := GetGLProcAddress(LibGL, 'glGetMapfv');
+    @glGetMapiv := GetGLProcAddress(LibGL, 'glGetMapiv');
+    @glGetMaterialfv := GetGLProcAddress(LibGL, 'glGetMaterialfv');
+    @glGetMaterialiv := GetGLProcAddress(LibGL, 'glGetMaterialiv');
+    @glGetPixelMapfv := GetGLProcAddress(LibGL, 'glGetPixelMapfv');
+    @glGetPixelMapuiv := GetGLProcAddress(LibGL, 'glGetPixelMapuiv');
+    @glGetPixelMapusv := GetGLProcAddress(LibGL, 'glGetPixelMapusv');
+    @glGetPointerv := GetGLProcAddress(LibGL, 'glGetPointerv');
+    @glGetPolygonStipple := GetGLProcAddress(LibGL, 'glGetPolygonStipple');
+    @glGetString := GetGLProcAddress(LibGL, 'glGetString');
+    @glGetTexEnvfv := GetGLProcAddress(LibGL, 'glGetTexEnvfv');
+    @glGetTexEnviv := GetGLProcAddress(LibGL, 'glGetTexEnviv');
+    @glGetTexGendv := GetGLProcAddress(LibGL, 'glGetTexGendv');
+    @glGetTexGenfv := GetGLProcAddress(LibGL, 'glGetTexGenfv');
+    @glGetTexGeniv := GetGLProcAddress(LibGL, 'glGetTexGeniv');
+    @glGetTexImage := GetGLProcAddress(LibGL, 'glGetTexImage');
+    @glGetTexLevelParameterfv := GetGLProcAddress(LibGL, 'glGetTexLevelParameterfv');
+    @glGetTexLevelParameteriv := GetGLProcAddress(LibGL, 'glGetTexLevelParameteriv');
+    @glGetTexParameterfv := GetGLProcAddress(LibGL, 'glGetTexParameterfv');
+    @glGetTexParameteriv := GetGLProcAddress(LibGL, 'glGetTexParameteriv');
+    @glHint := GetGLProcAddress(LibGL, 'glHint');
+    @glIndexMask := GetGLProcAddress(LibGL, 'glIndexMask');
+    @glIndexPointer := GetGLProcAddress(LibGL, 'glIndexPointer');
+    @glIndexd := GetGLProcAddress(LibGL, 'glIndexd');
+    @glIndexdv := GetGLProcAddress(LibGL, 'glIndexdv');
+    @glIndexf := GetGLProcAddress(LibGL, 'glIndexf');
+    @glIndexfv := GetGLProcAddress(LibGL, 'glIndexfv');
+    @glIndexi := GetGLProcAddress(LibGL, 'glIndexi');
+    @glIndexiv := GetGLProcAddress(LibGL, 'glIndexiv');
+    @glIndexs := GetGLProcAddress(LibGL, 'glIndexs');
+    @glIndexsv := GetGLProcAddress(LibGL, 'glIndexsv');
+    @glIndexub := GetGLProcAddress(LibGL, 'glIndexub');
+    @glIndexubv := GetGLProcAddress(LibGL, 'glIndexubv');
+    @glInitNames := GetGLProcAddress(LibGL, 'glInitNames');
+    @glInterleavedArrays := GetGLProcAddress(LibGL, 'glInterleavedArrays');
+    @glIsEnabled := GetGLProcAddress(LibGL, 'glIsEnabled');
+    @glIsList := GetGLProcAddress(LibGL, 'glIsList');
+    @glIsTexture := GetGLProcAddress(LibGL, 'glIsTexture');
+    @glLightModelf := GetGLProcAddress(LibGL, 'glLightModelf');
+    @glLightModelfv := GetGLProcAddress(LibGL, 'glLightModelfv');
+    @glLightModeli := GetGLProcAddress(LibGL, 'glLightModeli');
+    @glLightModeliv := GetGLProcAddress(LibGL, 'glLightModeliv');
+    @glLightf := GetGLProcAddress(LibGL, 'glLightf');
+    @glLightfv := GetGLProcAddress(LibGL, 'glLightfv');
+    @glLighti := GetGLProcAddress(LibGL, 'glLighti');
+    @glLightiv := GetGLProcAddress(LibGL, 'glLightiv');
+    @glLineStipple := GetGLProcAddress(LibGL, 'glLineStipple');
+    @glLineWidth := GetGLProcAddress(LibGL, 'glLineWidth');
+    @glListBase := GetGLProcAddress(LibGL, 'glListBase');
+    @glLoadIdentity := GetGLProcAddress(LibGL, 'glLoadIdentity');
+    @glLoadMatrixd := GetGLProcAddress(LibGL, 'glLoadMatrixd');
+    @glLoadMatrixf := GetGLProcAddress(LibGL, 'glLoadMatrixf');
+    @glLoadName := GetGLProcAddress(LibGL, 'glLoadName');
+    @glLogicOp := GetGLProcAddress(LibGL, 'glLogicOp');
+    @glMap1d := GetGLProcAddress(LibGL, 'glMap1d');
+    @glMap1f := GetGLProcAddress(LibGL, 'glMap1f');
+    @glMap2d := GetGLProcAddress(LibGL, 'glMap2d');
+    @glMap2f := GetGLProcAddress(LibGL, 'glMap2f');
+    @glMapGrid1d := GetGLProcAddress(LibGL, 'glMapGrid1d');
+    @glMapGrid1f := GetGLProcAddress(LibGL, 'glMapGrid1f');
+    @glMapGrid2d := GetGLProcAddress(LibGL, 'glMapGrid2d');
+    @glMapGrid2f := GetGLProcAddress(LibGL, 'glMapGrid2f');
+    @glMaterialf := GetGLProcAddress(LibGL, 'glMaterialf');
+    @glMaterialfv := GetGLProcAddress(LibGL, 'glMaterialfv');
+    @glMateriali := GetGLProcAddress(LibGL, 'glMateriali');
+    @glMaterialiv := GetGLProcAddress(LibGL, 'glMaterialiv');
+    @glMatrixMode := GetGLProcAddress(LibGL, 'glMatrixMode');
+    @glMultMatrixd := GetGLProcAddress(LibGL, 'glMultMatrixd');
+    @glMultMatrixf := GetGLProcAddress(LibGL, 'glMultMatrixf');
+    @glNewList := GetGLProcAddress(LibGL, 'glNewList');
+    @glNormal3b := GetGLProcAddress(LibGL, 'glNormal3b');
+    @glNormal3bv := GetGLProcAddress(LibGL, 'glNormal3bv');
+    @glNormal3d := GetGLProcAddress(LibGL, 'glNormal3d');
+    @glNormal3dv := GetGLProcAddress(LibGL, 'glNormal3dv');
+    @glNormal3f := GetGLProcAddress(LibGL, 'glNormal3f');
+    @glNormal3fv := GetGLProcAddress(LibGL, 'glNormal3fv');
+    @glNormal3i := GetGLProcAddress(LibGL, 'glNormal3i');
+    @glNormal3iv := GetGLProcAddress(LibGL, 'glNormal3iv');
+    @glNormal3s := GetGLProcAddress(LibGL, 'glNormal3s');
+    @glNormal3sv := GetGLProcAddress(LibGL, 'glNormal3sv');
+    @glNormalPointer := GetGLProcAddress(LibGL, 'glNormalPointer');
+    @glOrtho := GetGLProcAddress(LibGL, 'glOrtho');
+    @glPassThrough := GetGLProcAddress(LibGL, 'glPassThrough');
+    @glPixelMapfv := GetGLProcAddress(LibGL, 'glPixelMapfv');
+    @glPixelMapuiv := GetGLProcAddress(LibGL, 'glPixelMapuiv');
+    @glPixelMapusv := GetGLProcAddress(LibGL, 'glPixelMapusv');
+    @glPixelStoref := GetGLProcAddress(LibGL, 'glPixelStoref');
+    @glPixelStorei := GetGLProcAddress(LibGL, 'glPixelStorei');
+    @glPixelTransferf := GetGLProcAddress(LibGL, 'glPixelTransferf');
+    @glPixelTransferi := GetGLProcAddress(LibGL, 'glPixelTransferi');
+    @glPixelZoom := GetGLProcAddress(LibGL, 'glPixelZoom');
+    @glPointSize := GetGLProcAddress(LibGL, 'glPointSize');
+    @glPolygonMode := GetGLProcAddress(LibGL, 'glPolygonMode');
+    @glPolygonOffset := GetGLProcAddress(LibGL, 'glPolygonOffset');
+    @glPolygonStipple := GetGLProcAddress(LibGL, 'glPolygonStipple');
+    @glPopAttrib := GetGLProcAddress(LibGL, 'glPopAttrib');
+    @glPopClientAttrib := GetGLProcAddress(LibGL, 'glPopClientAttrib');
+    @glPopMatrix := GetGLProcAddress(LibGL, 'glPopMatrix');
+    @glPopName := GetGLProcAddress(LibGL, 'glPopName');
+    @glPrioritizeTextures := GetGLProcAddress(LibGL, 'glPrioritizeTextures');
+    @glPushAttrib := GetGLProcAddress(LibGL, 'glPushAttrib');
+    @glPushClientAttrib := GetGLProcAddress(LibGL, 'glPushClientAttrib');
+    @glPushMatrix := GetGLProcAddress(LibGL, 'glPushMatrix');
+    @glPushName := GetGLProcAddress(LibGL, 'glPushName');
+    @glRasterPos2d := GetGLProcAddress(LibGL, 'glRasterPos2d');
+    @glRasterPos2dv := GetGLProcAddress(LibGL, 'glRasterPos2dv');
+    @glRasterPos2f := GetGLProcAddress(LibGL, 'glRasterPos2f');
+    @glRasterPos2fv := GetGLProcAddress(LibGL, 'glRasterPos2fv');
+    @glRasterPos2i := GetGLProcAddress(LibGL, 'glRasterPos2i');
+    @glRasterPos2iv := GetGLProcAddress(LibGL, 'glRasterPos2iv');
+    @glRasterPos2s := GetGLProcAddress(LibGL, 'glRasterPos2s');
+    @glRasterPos2sv := GetGLProcAddress(LibGL, 'glRasterPos2sv');
+    @glRasterPos3d := GetGLProcAddress(LibGL, 'glRasterPos3d');
+    @glRasterPos3dv := GetGLProcAddress(LibGL, 'glRasterPos3dv');
+    @glRasterPos3f := GetGLProcAddress(LibGL, 'glRasterPos3f');
+    @glRasterPos3fv := GetGLProcAddress(LibGL, 'glRasterPos3fv');
+    @glRasterPos3i := GetGLProcAddress(LibGL, 'glRasterPos3i');
+    @glRasterPos3iv := GetGLProcAddress(LibGL, 'glRasterPos3iv');
+    @glRasterPos3s := GetGLProcAddress(LibGL, 'glRasterPos3s');
+    @glRasterPos3sv := GetGLProcAddress(LibGL, 'glRasterPos3sv');
+    @glRasterPos4d := GetGLProcAddress(LibGL, 'glRasterPos4d');
+    @glRasterPos4dv := GetGLProcAddress(LibGL, 'glRasterPos4dv');
+    @glRasterPos4f := GetGLProcAddress(LibGL, 'glRasterPos4f');
+    @glRasterPos4fv := GetGLProcAddress(LibGL, 'glRasterPos4fv');
+    @glRasterPos4i := GetGLProcAddress(LibGL, 'glRasterPos4i');
+    @glRasterPos4iv := GetGLProcAddress(LibGL, 'glRasterPos4iv');
+    @glRasterPos4s := GetGLProcAddress(LibGL, 'glRasterPos4s');
+    @glRasterPos4sv := GetGLProcAddress(LibGL, 'glRasterPos4sv');
+    @glReadBuffer := GetGLProcAddress(LibGL, 'glReadBuffer');
+    @glReadPixels := GetGLProcAddress(LibGL, 'glReadPixels');
+    @glRectd := GetGLProcAddress(LibGL, 'glRectd');
+    @glRectdv := GetGLProcAddress(LibGL, 'glRectdv');
+    @glRectf := GetGLProcAddress(LibGL, 'glRectf');
+    @glRectfv := GetGLProcAddress(LibGL, 'glRectfv');
+    @glRecti := GetGLProcAddress(LibGL, 'glRecti');
+    @glRectiv := GetGLProcAddress(LibGL, 'glRectiv');
+    @glRects := GetGLProcAddress(LibGL, 'glRects');
+    @glRectsv := GetGLProcAddress(LibGL, 'glRectsv');
+    @glRenderMode := GetGLProcAddress(LibGL, 'glRenderMode');
+    @glRotated := GetGLProcAddress(LibGL, 'glRotated');
+    @glRotatef := GetGLProcAddress(LibGL, 'glRotatef');
+    @glScaled := GetGLProcAddress(LibGL, 'glScaled');
+    @glScalef := GetGLProcAddress(LibGL, 'glScalef');
+    @glScissor := GetGLProcAddress(LibGL, 'glScissor');
+    @glSelectBuffer := GetGLProcAddress(LibGL, 'glSelectBuffer');
+    @glShadeModel := GetGLProcAddress(LibGL, 'glShadeModel');
+    @glStencilFunc := GetGLProcAddress(LibGL, 'glStencilFunc');
+    @glStencilMask := GetGLProcAddress(LibGL, 'glStencilMask');
+    @glStencilOp := GetGLProcAddress(LibGL, 'glStencilOp');
+    @glTexCoord1d := GetGLProcAddress(LibGL, 'glTexCoord1d');
+    @glTexCoord1dv := GetGLProcAddress(LibGL, 'glTexCoord1dv');
+    @glTexCoord1f := GetGLProcAddress(LibGL, 'glTexCoord1f');
+    @glTexCoord1fv := GetGLProcAddress(LibGL, 'glTexCoord1fv');
+    @glTexCoord1i := GetGLProcAddress(LibGL, 'glTexCoord1i');
+    @glTexCoord1iv := GetGLProcAddress(LibGL, 'glTexCoord1iv');
+    @glTexCoord1s := GetGLProcAddress(LibGL, 'glTexCoord1s');
+    @glTexCoord1sv := GetGLProcAddress(LibGL, 'glTexCoord1sv');
+    @glTexCoord2d := GetGLProcAddress(LibGL, 'glTexCoord2d');
+    @glTexCoord2dv := GetGLProcAddress(LibGL, 'glTexCoord2dv');
+    @glTexCoord2f := GetGLProcAddress(LibGL, 'glTexCoord2f');
+    @glTexCoord2fv := GetGLProcAddress(LibGL, 'glTexCoord2fv');
+    @glTexCoord2i := GetGLProcAddress(LibGL, 'glTexCoord2i');
+    @glTexCoord2iv := GetGLProcAddress(LibGL, 'glTexCoord2iv');
+    @glTexCoord2s := GetGLProcAddress(LibGL, 'glTexCoord2s');
+    @glTexCoord2sv := GetGLProcAddress(LibGL, 'glTexCoord2sv');
+    @glTexCoord3d := GetGLProcAddress(LibGL, 'glTexCoord3d');
+    @glTexCoord3dv := GetGLProcAddress(LibGL, 'glTexCoord3dv');
+    @glTexCoord3f := GetGLProcAddress(LibGL, 'glTexCoord3f');
+    @glTexCoord3fv := GetGLProcAddress(LibGL, 'glTexCoord3fv');
+    @glTexCoord3i := GetGLProcAddress(LibGL, 'glTexCoord3i');
+    @glTexCoord3iv := GetGLProcAddress(LibGL, 'glTexCoord3iv');
+    @glTexCoord3s := GetGLProcAddress(LibGL, 'glTexCoord3s');
+    @glTexCoord3sv := GetGLProcAddress(LibGL, 'glTexCoord3sv');
+    @glTexCoord4d := GetGLProcAddress(LibGL, 'glTexCoord4d');
+    @glTexCoord4dv := GetGLProcAddress(LibGL, 'glTexCoord4dv');
+    @glTexCoord4f := GetGLProcAddress(LibGL, 'glTexCoord4f');
+    @glTexCoord4fv := GetGLProcAddress(LibGL, 'glTexCoord4fv');
+    @glTexCoord4i := GetGLProcAddress(LibGL, 'glTexCoord4i');
+    @glTexCoord4iv := GetGLProcAddress(LibGL, 'glTexCoord4iv');
+    @glTexCoord4s := GetGLProcAddress(LibGL, 'glTexCoord4s');
+    @glTexCoord4sv := GetGLProcAddress(LibGL, 'glTexCoord4sv');
+    @glTexCoordPointer := GetGLProcAddress(LibGL, 'glTexCoordPointer');
+    @glTexEnvf := GetGLProcAddress(LibGL, 'glTexEnvf');
+    @glTexEnvfv := GetGLProcAddress(LibGL, 'glTexEnvfv');
+    @glTexEnvi := GetGLProcAddress(LibGL, 'glTexEnvi');
+    @glTexEnviv := GetGLProcAddress(LibGL, 'glTexEnviv');
+    @glTexGend := GetGLProcAddress(LibGL, 'glTexGend');
+    @glTexGendv := GetGLProcAddress(LibGL, 'glTexGendv');
+    @glTexGenf := GetGLProcAddress(LibGL, 'glTexGenf');
+    @glTexGenfv := GetGLProcAddress(LibGL, 'glTexGenfv');
+    @glTexGeni := GetGLProcAddress(LibGL, 'glTexGeni');
+    @glTexGeniv := GetGLProcAddress(LibGL, 'glTexGeniv');
+    @glTexImage1D := GetGLProcAddress(LibGL, 'glTexImage1D');
+    @glTexImage2D := GetGLProcAddress(LibGL, 'glTexImage2D');
+    @glTexParameterf := GetGLProcAddress(LibGL, 'glTexParameterf');
+    @glTexParameterfv := GetGLProcAddress(LibGL, 'glTexParameterfv');
+    @glTexParameteri := GetGLProcAddress(LibGL, 'glTexParameteri');
+    @glTexParameteriv := GetGLProcAddress(LibGL, 'glTexParameteriv');
+    @glTexSubImage1D := GetGLProcAddress(LibGL, 'glTexSubImage1D');
+    @glTexSubImage2D := GetGLProcAddress(LibGL, 'glTexSubImage2D');
+    @glTranslated := GetGLProcAddress(LibGL, 'glTranslated');
+    @glTranslatef := GetGLProcAddress(LibGL, 'glTranslatef');
+    @glVertex2d := GetGLProcAddress(LibGL, 'glVertex2d');
+    @glVertex2dv := GetGLProcAddress(LibGL, 'glVertex2dv');
+    @glVertex2f := GetGLProcAddress(LibGL, 'glVertex2f');
+    @glVertex2fv := GetGLProcAddress(LibGL, 'glVertex2fv');
+    @glVertex2i := GetGLProcAddress(LibGL, 'glVertex2i');
+    @glVertex2iv := GetGLProcAddress(LibGL, 'glVertex2iv');
+    @glVertex2s := GetGLProcAddress(LibGL, 'glVertex2s');
+    @glVertex2sv := GetGLProcAddress(LibGL, 'glVertex2sv');
+    @glVertex3d := GetGLProcAddress(LibGL, 'glVertex3d');
+    @glVertex3dv := GetGLProcAddress(LibGL, 'glVertex3dv');
+    @glVertex3f := GetGLProcAddress(LibGL, 'glVertex3f');
+    @glVertex3fv := GetGLProcAddress(LibGL, 'glVertex3fv');
+    @glVertex3i := GetGLProcAddress(LibGL, 'glVertex3i');
+    @glVertex3iv := GetGLProcAddress(LibGL, 'glVertex3iv');
+    @glVertex3s := GetGLProcAddress(LibGL, 'glVertex3s');
+    @glVertex3sv := GetGLProcAddress(LibGL, 'glVertex3sv');
+    @glVertex4d := GetGLProcAddress(LibGL, 'glVertex4d');
+    @glVertex4dv := GetGLProcAddress(LibGL, 'glVertex4dv');
+    @glVertex4f := GetGLProcAddress(LibGL, 'glVertex4f');
+    @glVertex4fv := GetGLProcAddress(LibGL, 'glVertex4fv');
+    @glVertex4i := GetGLProcAddress(LibGL, 'glVertex4i');
+    @glVertex4iv := GetGLProcAddress(LibGL, 'glVertex4iv');
+    @glVertex4s := GetGLProcAddress(LibGL, 'glVertex4s');
+    @glVertex4sv := GetGLProcAddress(LibGL, 'glVertex4sv');
+    @glVertexPointer := GetGLProcAddress(LibGL, 'glVertexPointer');
+    @glViewport := GetGLProcAddress(LibGL, 'glViewport');
+  except
+    raise Exception.Create('Failed loading ' + MethodName +' from ' + dll);
+  end;
+
+  {$IFDEF Windows}
+  try
+    @ChoosePixelFormat := GetGLProcAddress(LibGL, 'ChoosePixelFormat');
+    if not Assigned(ChoosePixelFormat) then
+      @ChoosePixelFormat := @WinChoosePixelFormat;
+  except
+    raise Exception.Create('Unable to select pixel format');
+  end;
+  {$ENDIF}
+end;
+{$ENDIF MORPHOS}
+
+initialization
+
+  { according to bug 7570, this is necessary on all x86 platforms,
+    maybe we've to fix the sse control word as well }
+  { Yes, at least for darwin/x86_64 (JM) }
+  {$if defined(cpui386) or defined(cpux86_64)}
+  SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide,exOverflow, exUnderflow, exPrecision]);
+  {$endif}
+
+  {$IFDEF Windows}
+  LoadOpenGL('opengl32.dll');
+  {$ELSE}
+  {$ifdef darwin}
+  LoadOpenGL('/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib');
+  {$ELSE}
+  {$IFDEF MorphOS}
+  InitTinyGLLibrary;
+  {$ELSE}
+  LoadOpenGL('libGL.so.1');
+  {$ENDIF}
+  {$endif}
+  {$ENDIF}
+
+finalization
+
+  FreeOpenGL;
+
+end.

+ 9547 - 0
packages/opengl/src/glext.pp

@@ -0,0 +1,9547 @@
+{
+
+  Adaption of the delphi3d.net OpenGL units to FreePascal
+  Sebastian Guenther ([email protected]) in 2002
+  These units are free to use
+}
+
+{$MACRO ON}
+{$MODE Delphi}
+{$IFDEF Windows}
+  {$DEFINE extdecl:=stdcall }
+{$ELSE}
+  {$DEFINE extdecl:=cdecl }
+{$ENDIF}
+
+unit GLext;
+
+(**************************************************
+ *        OpenGL extension loading library        *
+ * Generated by MetaGLext, written by Tom Nuydens *
+ *  ([email protected] -- http://www.delphi3d.net  *
+ **************************************************)
+
+//*** Generated on 10/11/2002
+
+interface
+
+uses
+  SysUtils,
+  {$IFDEF Windows}
+  Windows,
+  {$ELSE}
+  dynlibs,
+  {$ENDIF}
+  GL;
+
+{$IFDEF Windows}
+{ Declared in Windows unit as well in FPC; but declared here as well, to be
+  fully compatible to upstream version  - sg }
+function wglGetProcAddress(proc: PChar): Pointer; extdecl; external 'OpenGL32.dll';
+{$ELSE}
+function wglGetProcAddress(proc: PChar): Pointer;
+{$ENDIF}
+
+// Test if the given extension name is present in the given extension string.
+function glext_ExtensionSupported(const extension: String; const searchIn: String): Boolean;
+
+// Load the extension with the given name.
+function glext_LoadExtension(ext: String): Boolean;
+
+type
+  GLcharARB = Char;
+  TGLcharARB = GLcharARB;
+  PGLcharARB = ^GLcharARB;
+
+  GLhandleARB = Cardinal;
+  TGLhandleARB = GLhandleARB;
+  PGLhandleARB = ^GLhandleARB;
+
+  GLintptr = PtrInt;
+  TGLintptr = GLintptr;
+  PGLintptr = ^GLintptr;
+
+  GLsizeiptr = PtrInt;
+  TGLsizeiptr = GLsizeiptr;
+  PGLsizeiptr = ^GLsizeiptr;
+
+  GLchar = Char;
+  TGLchar = GLchar;
+  PGLchar = Pchar;
+
+//***** GL_version_1_2 *****//
+const
+  GL_UNSIGNED_BYTE_3_3_2 = $8032;
+  GL_UNSIGNED_SHORT_4_4_4_4 = $8033;
+  GL_UNSIGNED_SHORT_5_5_5_1 = $8034;
+  GL_UNSIGNED_INT_8_8_8_8 = $8035;
+  GL_UNSIGNED_INT_10_10_10_2 = $8036;
+  GL_RESCALE_NORMAL = $803A;
+  GL_UNSIGNED_BYTE_2_3_3_REV = $8362;
+  GL_UNSIGNED_SHORT_5_6_5 = $8363;
+  GL_UNSIGNED_SHORT_5_6_5_REV = $8364;
+  GL_UNSIGNED_SHORT_4_4_4_4_REV = $8365;
+  GL_UNSIGNED_SHORT_1_5_5_5_REV = $8366;
+  GL_UNSIGNED_INT_8_8_8_8_REV = $8367;
+  GL_UNSIGNED_INT_2_10_10_10_REV = $8368;
+  GL_BGR = $80E0;
+  GL_BGRA = $80E1;
+  GL_MAX_ELEMENTS_VERTICES = $80E8;
+  GL_MAX_ELEMENTS_INDICES = $80E9;
+  GL_CLAMP_TO_EDGE = $812F;
+  GL_TEXTURE_MIN_LOD = $813A;
+  GL_TEXTURE_MAX_LOD = $813B;
+  GL_TEXTURE_BASE_LEVEL = $813C;
+  GL_TEXTURE_MAX_LEVEL = $813D;
+  GL_LIGHT_MODEL_COLOR_CONTROL = $81F8;
+  GL_SINGLE_COLOR = $81F9;
+  GL_SEPARATE_SPECULAR_COLOR = $81FA;
+  GL_SMOOTH_POINT_SIZE_RANGE = $0B12;
+  GL_SMOOTH_POINT_SIZE_GRANULARITY = $0B13;
+  GL_SMOOTH_LINE_WIDTH_RANGE = $0B22;
+  GL_SMOOTH_LINE_WIDTH_GRANULARITY = $0B23;
+  GL_ALIASED_POINT_SIZE_RANGE = $846D;
+  GL_ALIASED_LINE_WIDTH_RANGE = $846E;
+  GL_PACK_SKIP_IMAGES = $806B;
+  GL_PACK_IMAGE_HEIGHT = $806C;
+  GL_UNPACK_SKIP_IMAGES = $806D;
+  GL_UNPACK_IMAGE_HEIGHT = $806E;
+  GL_TEXTURE_3D = $806F;
+  GL_PROXY_TEXTURE_3D = $8070;
+  GL_TEXTURE_DEPTH = $8071;
+  GL_TEXTURE_WRAP_R = $8072;
+  GL_MAX_3D_TEXTURE_SIZE = $8073;
+var
+  glBlendColor: procedure(red: GLclampf; green: GLclampf; blue: GLclampf; alpha: GLclampf); extdecl;
+  glBlendEquation: procedure(mode: GLenum); extdecl;
+  glDrawRangeElements: procedure(mode: GLenum; start: GLuint; _end: GLuint; count: GLsizei; _type: GLenum; const indices: PGLvoid); extdecl;
+  glColorTable: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const table: PGLvoid); extdecl;
+  glColorTableParameterfv: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glColorTableParameteriv: procedure(target: GLenum; pname: GLenum; const params: PGLint); extdecl;
+  glCopyColorTable: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei); extdecl;
+  glGetColorTable: procedure(target: GLenum; format: GLenum; _type: GLenum; table: PGLvoid); extdecl;
+  glGetColorTableParameterfv: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetColorTableParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glColorSubTable: procedure(target: GLenum; start: GLsizei; count: GLsizei; format: GLenum; _type: GLenum; const data: PGLvoid); extdecl;
+  glCopyColorSubTable: procedure(target: GLenum; start: GLsizei; x: GLint; y: GLint; width: GLsizei); extdecl;
+  glConvolutionFilter1D: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const image: PGLvoid); extdecl;
+  glConvolutionFilter2D: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const image: PGLvoid); extdecl;
+  glConvolutionParameterf: procedure(target: GLenum; pname: GLenum; params: GLfloat); extdecl;
+  glConvolutionParameterfv: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glConvolutionParameteri: procedure(target: GLenum; pname: GLenum; params: GLint); extdecl;
+  glConvolutionParameteriv: procedure(target: GLenum; pname: GLenum; const params: PGLint); extdecl;
+  glCopyConvolutionFilter1D: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei); extdecl;
+  glCopyConvolutionFilter2D: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei; height: GLsizei); extdecl;
+  glGetConvolutionFilter: procedure(target: GLenum; format: GLenum; _type: GLenum; image: PGLvoid); extdecl;
+  glGetConvolutionParameterfv: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetConvolutionParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetSeparableFilter: procedure(target: GLenum; format: GLenum; _type: GLenum; row: PGLvoid; column: PGLvoid; span: PGLvoid); extdecl;
+  glSeparableFilter2D: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const row: PGLvoid; const column: PGLvoid); extdecl;
+  glGetHistogram: procedure(target: GLenum; reset: GLboolean; format: GLenum; _type: GLenum; values: PGLvoid); extdecl;
+  glGetHistogramParameterfv: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetHistogramParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetMinmax: procedure(target: GLenum; reset: GLboolean; format: GLenum; _type: GLenum; values: PGLvoid); extdecl;
+  glGetMinmaxParameterfv: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetMinmaxParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glHistogram: procedure(target: GLenum; width: GLsizei; internalformat: GLenum; sink: GLboolean); extdecl;
+  glMinmax: procedure(target: GLenum; internalformat: GLenum; sink: GLboolean); extdecl;
+  glResetHistogram: procedure(target: GLenum); extdecl;
+  glResetMinmax: procedure(target: GLenum); extdecl;
+  glTexImage3D: procedure(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); extdecl;
+  glTexSubImage3D: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; format: GLenum; _type: GLenum; const pixels: PGLvoid); extdecl;
+  glCopyTexSubImage3D: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; x: GLint; y: GLint; width: GLsizei; height: GLsizei); extdecl;
+
+function Load_GL_version_1_2: Boolean;
+
+//***** GL_ARB_imaging *****//
+const
+  GL_CONSTANT_COLOR = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR = $8002;
+  GL_CONSTANT_ALPHA = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA = $8004;
+  GL_BLEND_COLOR = $8005;
+  GL_FUNC_ADD = $8006;
+  GL_MIN = $8007;
+  GL_MAX = $8008;
+  GL_BLEND_EQUATION = $8009;
+  GL_FUNC_SUBTRACT = $800A;
+  GL_FUNC_REVERSE_SUBTRACT = $800B;
+  GL_CONVOLUTION_1D = $8010;
+  GL_CONVOLUTION_2D = $8011;
+  GL_SEPARABLE_2D = $8012;
+  GL_CONVOLUTION_BORDER_MODE = $8013;
+  GL_CONVOLUTION_FILTER_SCALE = $8014;
+  GL_CONVOLUTION_FILTER_BIAS = $8015;
+  GL_REDUCE = $8016;
+  GL_CONVOLUTION_FORMAT = $8017;
+  GL_CONVOLUTION_WIDTH = $8018;
+  GL_CONVOLUTION_HEIGHT = $8019;
+  GL_MAX_CONVOLUTION_WIDTH = $801A;
+  GL_MAX_CONVOLUTION_HEIGHT = $801B;
+  GL_POST_CONVOLUTION_RED_SCALE = $801C;
+  GL_POST_CONVOLUTION_GREEN_SCALE = $801D;
+  GL_POST_CONVOLUTION_BLUE_SCALE = $801E;
+  GL_POST_CONVOLUTION_ALPHA_SCALE = $801F;
+  GL_POST_CONVOLUTION_RED_BIAS = $8020;
+  GL_POST_CONVOLUTION_GREEN_BIAS = $8021;
+  GL_POST_CONVOLUTION_BLUE_BIAS = $8022;
+  GL_POST_CONVOLUTION_ALPHA_BIAS = $8023;
+  GL_HISTOGRAM = $8024;
+  GL_PROXY_HISTOGRAM = $8025;
+  GL_HISTOGRAM_WIDTH = $8026;
+  GL_HISTOGRAM_FORMAT = $8027;
+  GL_HISTOGRAM_RED_SIZE = $8028;
+  GL_HISTOGRAM_GREEN_SIZE = $8029;
+  GL_HISTOGRAM_BLUE_SIZE = $802A;
+  GL_HISTOGRAM_ALPHA_SIZE = $802B;
+  GL_HISTOGRAM_LUMINANCE_SIZE = $802C;
+  GL_HISTOGRAM_SINK = $802D;
+  GL_MINMAX = $802E;
+  GL_MINMAX_FORMAT = $802F;
+  GL_MINMAX_SINK = $8030;
+  GL_TABLE_TOO_LARGE = $8031;
+  GL_COLOR_MATRIX = $80B1;
+  GL_COLOR_MATRIX_STACK_DEPTH = $80B2;
+  GL_MAX_COLOR_MATRIX_STACK_DEPTH = $80B3;
+  GL_POST_COLOR_MATRIX_RED_SCALE = $80B4;
+  GL_POST_COLOR_MATRIX_GREEN_SCALE = $80B5;
+  GL_POST_COLOR_MATRIX_BLUE_SCALE = $80B6;
+  GL_POST_COLOR_MATRIX_ALPHA_SCALE = $80B7;
+  GL_POST_COLOR_MATRIX_RED_BIAS = $80B8;
+  GL_POST_COLOR_MATRIX_GREEN_BIAS = $80B9;
+  GL_POST_COLOR_MATRIX_BLUE_BIAS = $80BA;
+  GL_POST_COLOR_MATIX_ALPHA_BIAS = $80BB;
+  GL_COLOR_TABLE = $80D0;
+  GL_POST_CONVOLUTION_COLOR_TABLE = $80D1;
+  GL_POST_COLOR_MATRIX_COLOR_TABLE = $80D2;
+  GL_PROXY_COLOR_TABLE = $80D3;
+  GL_PROXY_POST_CONVOLUTION_COLOR_TABLE = $80D4;
+  GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE = $80D5;
+  GL_COLOR_TABLE_SCALE = $80D6;
+  GL_COLOR_TABLE_BIAS = $80D7;
+  GL_COLOR_TABLE_FORMAT = $80D8;
+  GL_COLOR_TABLE_WIDTH = $80D9;
+  GL_COLOR_TABLE_RED_SIZE = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE = $80DF;
+  GL_IGNORE_BORDER = $8150;
+  GL_CONSTANT_BORDER = $8151;
+  GL_WRAP_BORDER = $8152;
+  GL_REPLICATE_BORDER = $8153;
+  GL_CONVOLUTION_BORDER_COLOR = $8154;
+
+function Load_GL_ARB_imaging: Boolean;
+
+//***** GL_version_1_3 *****//
+const
+  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;
+  GL_CLIENT_ACTIVE_TEXTURE = $84E1;
+  GL_MAX_TEXTURE_UNITS = $84E2;
+  GL_TRANSPOSE_MODELVIEW_MATRIX = $84E3;
+  GL_TRANSPOSE_PROJECTION_MATRIX = $84E4;
+  GL_TRANSPOSE_TEXTURE_MATRIX = $84E5;
+  GL_TRANSPOSE_COLOR_MATRIX = $84E6;
+  GL_MULTISAMPLE = $809D;
+  GL_SAMPLE_ALPHA_TO_COVERAGE = $809E;
+  GL_SAMPLE_ALPHA_TO_ONE = $809F;
+  GL_SAMPLE_COVERAGE = $80A0;
+  GL_SAMPLE_BUFFERS = $80A8;
+  GL_SAMPLES = $80A9;
+  GL_SAMPLE_COVERAGE_VALUE = $80AA;
+  GL_SAMPLE_COVERAGE_INVERT = $80AB;
+  GL_MULTISAMPLE_BIT = $20000000;
+  GL_NORMAL_MAP = $8511;
+  GL_REFLECTION_MAP = $8512;
+  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_PROXY_TEXTURE_CUBE_MAP = $851B;
+  GL_MAX_CUBE_MAP_TEXTURE_SIZE = $851C;
+  GL_COMPRESSED_ALPHA = $84E9;
+  GL_COMPRESSED_LUMINANCE = $84EA;
+  GL_COMPRESSED_LUMINANCE_ALPHA = $84EB;
+  GL_COMPRESSED_INTENSITY = $84EC;
+  GL_COMPRESSED_RGB = $84ED;
+  GL_COMPRESSED_RGBA = $84EE;
+  GL_TEXTURE_COMPRESSION_HINT = $84EF;
+  GL_TEXTURE_COMPRESSED_IMAGE_SIZE = $86A0;
+  GL_TEXTURE_COMPRESSED = $86A1;
+  GL_NUM_COMPRESSED_TEXTURE_FORMATS = $86A2;
+  GL_COMPRESSED_TEXTURE_FORMATS = $86A3;
+  GL_CLAMP_TO_BORDER = $812D;
+  GL_CLAMP_TO_BORDER_SGIS = $812D;
+  GL_COMBINE = $8570;
+  GL_COMBINE_RGB = $8571;
+  GL_COMBINE_ALPHA = $8572;
+  GL_SOURCE0_RGB = $8580;
+  GL_SOURCE1_RGB = $8581;
+  GL_SOURCE2_RGB = $8582;
+  GL_SOURCE0_ALPHA = $8588;
+  GL_SOURCE1_ALPHA = $8589;
+  GL_SOURCE2_ALPHA = $858A;
+  GL_OPERAND0_RGB = $8590;
+  GL_OPERAND1_RGB = $8591;
+  GL_OPERAND2_RGB = $8592;
+  GL_OPERAND0_ALPHA = $8598;
+  GL_OPERAND1_ALPHA = $8599;
+  GL_OPERAND2_ALPHA = $859A;
+  GL_RGB_SCALE = $8573;
+  GL_ADD_SIGNED = $8574;
+  GL_INTERPOLATE = $8575;
+  GL_SUBTRACT = $84E7;
+  GL_CONSTANT = $8576;
+  GL_PRIMARY_COLOR = $8577;
+  GL_PREVIOUS = $8578;
+  GL_DOT3_RGB = $86AE;
+  GL_DOT3_RGBA = $86AF;
+var
+  glActiveTexture: procedure(texture: GLenum); extdecl;
+  glClientActiveTexture: procedure(texture: GLenum); extdecl;
+  glMultiTexCoord1d: procedure(target: GLenum; s: GLdouble); extdecl;
+  glMultiTexCoord1dv: procedure(target: GLenum; const v: PGLdouble); extdecl;
+  glMultiTexCoord1f: procedure(target: GLenum; s: GLfloat); extdecl;
+  glMultiTexCoord1fv: procedure(target: GLenum; const v: PGLfloat); extdecl;
+  glMultiTexCoord1i: procedure(target: GLenum; s: GLint); extdecl;
+  glMultiTexCoord1iv: procedure(target: GLenum; const v: PGLint); extdecl;
+  glMultiTexCoord1s: procedure(target: GLenum; s: GLshort); extdecl;
+  glMultiTexCoord1sv: procedure(target: GLenum; const v: PGLshort); extdecl;
+  glMultiTexCoord2d: procedure(target: GLenum; s: GLdouble; t: GLdouble); extdecl;
+  glMultiTexCoord2dv: procedure(target: GLenum; const v: PGLdouble); extdecl;
+  glMultiTexCoord2f: procedure(target: GLenum; s: GLfloat; t: GLfloat); extdecl;
+  glMultiTexCoord2fv: procedure(target: GLenum; const v: PGLfloat); extdecl;
+  glMultiTexCoord2i: procedure(target: GLenum; s: GLint; t: GLint); extdecl;
+  glMultiTexCoord2iv: procedure(target: GLenum; const v: PGLint); extdecl;
+  glMultiTexCoord2s: procedure(target: GLenum; s: GLshort; t: GLshort); extdecl;
+  glMultiTexCoord2sv: procedure(target: GLenum; const v: PGLshort); extdecl;
+  glMultiTexCoord3d: procedure(target: GLenum; s: GLdouble; t: GLdouble; r: GLdouble); extdecl;
+  glMultiTexCoord3dv: procedure(target: GLenum; const v: PGLdouble); extdecl;
+  glMultiTexCoord3f: procedure(target: GLenum; s: GLfloat; t: GLfloat; r: GLfloat); extdecl;
+  glMultiTexCoord3fv: procedure(target: GLenum; const v: PGLfloat); extdecl;
+  glMultiTexCoord3i: procedure(target: GLenum; s: GLint; t: GLint; r: GLint); extdecl;
+  glMultiTexCoord3iv: procedure(target: GLenum; const v: PGLint); extdecl;
+  glMultiTexCoord3s: procedure(target: GLenum; s: GLshort; t: GLshort; r: GLshort); extdecl;
+  glMultiTexCoord3sv: procedure(target: GLenum; const v: PGLshort); extdecl;
+  glMultiTexCoord4d: procedure(target: GLenum; s: GLdouble; t: GLdouble; r: GLdouble; q: GLdouble); extdecl;
+  glMultiTexCoord4dv: procedure(target: GLenum; const v: PGLdouble); extdecl;
+  glMultiTexCoord4f: procedure(target: GLenum; s: GLfloat; t: GLfloat; r: GLfloat; q: GLfloat); extdecl;
+  glMultiTexCoord4fv: procedure(target: GLenum; const v: PGLfloat); extdecl;
+  glMultiTexCoord4i: procedure(target: GLenum; s: GLint; t: GLint; r: GLint; q: GLint); extdecl;
+  glMultiTexCoord4iv: procedure(target: GLenum; const v: PGLint); extdecl;
+  glMultiTexCoord4s: procedure(target: GLenum; s: GLshort; t: GLshort; r: GLshort; q: GLshort); extdecl;
+  glMultiTexCoord4sv: procedure(target: GLenum; const v: PGLshort); extdecl;
+  glLoadTransposeMatrixf: procedure(const m: PGLfloat); extdecl;
+  glLoadTransposeMatrixd: procedure(const m: PGLdouble); extdecl;
+  glMultTransposeMatrixf: procedure(const m: PGLfloat); extdecl;
+  glMultTransposeMatrixd: procedure(const m: PGLdouble); extdecl;
+  glSampleCoverage: procedure(value: GLclampf; invert: GLboolean); extdecl;
+  glCompressedTexImage3D: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; depth: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexImage2D: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexImage1D: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexSubImage3D: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexSubImage2D: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; width: GLsizei; height: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexSubImage1D: procedure(target: GLenum; level: GLint; xoffset: GLint; width: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glGetCompressedTexImage: procedure(target: GLenum; level: GLint; img: PGLvoid); extdecl;
+
+function Load_GL_version_1_3: Boolean;
+
+//***** GL_ARB_multitexture *****//
+const
+  GL_TEXTURE0_ARB = $84C0;
+  GL_TEXTURE1_ARB = $84C1;
+  GL_TEXTURE2_ARB = $84C2;
+  GL_TEXTURE3_ARB = $84C3;
+  GL_TEXTURE4_ARB = $84C4;
+  GL_TEXTURE5_ARB = $84C5;
+  GL_TEXTURE6_ARB = $84C6;
+  GL_TEXTURE7_ARB = $84C7;
+  GL_TEXTURE8_ARB = $84C8;
+  GL_TEXTURE9_ARB = $84C9;
+  GL_TEXTURE10_ARB = $84CA;
+  GL_TEXTURE11_ARB = $84CB;
+  GL_TEXTURE12_ARB = $84CC;
+  GL_TEXTURE13_ARB = $84CD;
+  GL_TEXTURE14_ARB = $84CE;
+  GL_TEXTURE15_ARB = $84CF;
+  GL_TEXTURE16_ARB = $84D0;
+  GL_TEXTURE17_ARB = $84D1;
+  GL_TEXTURE18_ARB = $84D2;
+  GL_TEXTURE19_ARB = $84D3;
+  GL_TEXTURE20_ARB = $84D4;
+  GL_TEXTURE21_ARB = $84D5;
+  GL_TEXTURE22_ARB = $84D6;
+  GL_TEXTURE23_ARB = $84D7;
+  GL_TEXTURE24_ARB = $84D8;
+  GL_TEXTURE25_ARB = $84D9;
+  GL_TEXTURE26_ARB = $84DA;
+  GL_TEXTURE27_ARB = $84DB;
+  GL_TEXTURE28_ARB = $84DC;
+  GL_TEXTURE29_ARB = $84DD;
+  GL_TEXTURE30_ARB = $84DE;
+  GL_TEXTURE31_ARB = $84DF;
+  GL_ACTIVE_TEXTURE_ARB = $84E0;
+  GL_CLIENT_ACTIVE_TEXTURE_ARB = $84E1;
+  GL_MAX_TEXTURE_UNITS_ARB = $84E2;
+var
+  glActiveTextureARB: procedure(texture: GLenum); extdecl;
+  glClientActiveTextureARB: procedure(texture: GLenum); extdecl;
+  glMultiTexCoord1dARB: procedure(target: GLenum; s: GLdouble); extdecl;
+  glMultiTexCoord1dvARB: procedure(target: GLenum; const v: PGLdouble); extdecl;
+  glMultiTexCoord1fARB: procedure(target: GLenum; s: GLfloat); extdecl;
+  glMultiTexCoord1fvARB: procedure(target: GLenum; const v: PGLfloat); extdecl;
+  glMultiTexCoord1iARB: procedure(target: GLenum; s: GLint); extdecl;
+  glMultiTexCoord1ivARB: procedure(target: GLenum; const v: PGLint); extdecl;
+  glMultiTexCoord1sARB: procedure(target: GLenum; s: GLshort); extdecl;
+  glMultiTexCoord1svARB: procedure(target: GLenum; const v: PGLshort); extdecl;
+  glMultiTexCoord2dARB: procedure(target: GLenum; s: GLdouble; t: GLdouble); extdecl;
+  glMultiTexCoord2dvARB: procedure(target: GLenum; const v: PGLdouble); extdecl;
+  glMultiTexCoord2fARB: procedure(target: GLenum; s: GLfloat; t: GLfloat); extdecl;
+  glMultiTexCoord2fvARB: procedure(target: GLenum; const v: PGLfloat); extdecl;
+  glMultiTexCoord2iARB: procedure(target: GLenum; s: GLint; t: GLint); extdecl;
+  glMultiTexCoord2ivARB: procedure(target: GLenum; const v: PGLint); extdecl;
+  glMultiTexCoord2sARB: procedure(target: GLenum; s: GLshort; t: GLshort); extdecl;
+  glMultiTexCoord2svARB: procedure(target: GLenum; const v: PGLshort); extdecl;
+  glMultiTexCoord3dARB: procedure(target: GLenum; s: GLdouble; t: GLdouble; r: GLdouble); extdecl;
+  glMultiTexCoord3dvARB: procedure(target: GLenum; const v: PGLdouble); extdecl;
+  glMultiTexCoord3fARB: procedure(target: GLenum; s: GLfloat; t: GLfloat; r: GLfloat); extdecl;
+  glMultiTexCoord3fvARB: procedure(target: GLenum; const v: PGLfloat); extdecl;
+  glMultiTexCoord3iARB: procedure(target: GLenum; s: GLint; t: GLint; r: GLint); extdecl;
+  glMultiTexCoord3ivARB: procedure(target: GLenum; const v: PGLint); extdecl;
+  glMultiTexCoord3sARB: procedure(target: GLenum; s: GLshort; t: GLshort; r: GLshort); extdecl;
+  glMultiTexCoord3svARB: procedure(target: GLenum; const v: PGLshort); extdecl;
+  glMultiTexCoord4dARB: procedure(target: GLenum; s: GLdouble; t: GLdouble; r: GLdouble; q: GLdouble); extdecl;
+  glMultiTexCoord4dvARB: procedure(target: GLenum; const v: PGLdouble); extdecl;
+  glMultiTexCoord4fARB: procedure(target: GLenum; s: GLfloat; t: GLfloat; r: GLfloat; q: GLfloat); extdecl;
+  glMultiTexCoord4fvARB: procedure(target: GLenum; const v: PGLfloat); extdecl;
+  glMultiTexCoord4iARB: procedure(target: GLenum; s: GLint; t: GLint; r: GLint; q: GLint); extdecl;
+  glMultiTexCoord4ivARB: procedure(target: GLenum; const v: PGLint); extdecl;
+  glMultiTexCoord4sARB: procedure(target: GLenum; s: GLshort; t: GLshort; r: GLshort; q: GLshort); extdecl;
+  glMultiTexCoord4svARB: procedure(target: GLenum; const v: PGLshort); extdecl;
+
+function Load_GL_ARB_multitexture: Boolean;
+
+//***** GL_ARB_transpose_matrix *****//
+const
+  GL_TRANSPOSE_MODELVIEW_MATRIX_ARB = $84E3;
+  GL_TRANSPOSE_PROJECTION_MATRIX_ARB = $84E4;
+  GL_TRANSPOSE_TEXTURE_MATRIX_ARB = $84E5;
+  GL_TRANSPOSE_COLOR_MATRIX_ARB = $84E6;
+var
+  glLoadTransposeMatrixfARB: procedure(m: PGLfloat); extdecl;
+  glLoadTransposeMatrixdARB: procedure(m: PGLdouble); extdecl;
+  glMultTransposeMatrixfARB: procedure(m: PGLfloat); extdecl;
+  glMultTransposeMatrixdARB: procedure(m: PGLdouble); extdecl;
+
+function Load_GL_ARB_transpose_matrix: Boolean;
+
+//***** GL_ARB_multisample *****//
+const
+  WGL_SAMPLE_BUFFERS_ARB = $2041;
+  WGL_SAMPLES_ARB = $2042;
+  GL_MULTISAMPLE_ARB = $809D;
+  GL_SAMPLE_ALPHA_TO_COVERAGE_ARB = $809E;
+  GL_SAMPLE_ALPHA_TO_ONE_ARB = $809F;
+  GL_SAMPLE_COVERAGE_ARB = $80A0;
+  GL_MULTISAMPLE_BIT_ARB = $20000000;
+  GL_SAMPLE_BUFFERS_ARB = $80A8;
+  GL_SAMPLES_ARB = $80A9;
+  GL_SAMPLE_COVERAGE_VALUE_ARB = $80AA;
+  GL_SAMPLE_COVERAGE_INVERT_ARB = $80AB;
+var
+  glSampleCoverageARB: procedure(value: GLclampf; invert: GLboolean); extdecl;
+
+function Load_GL_ARB_multisample: Boolean;
+
+//***** GL_ARB_texture_env_add *****//
+
+function Load_GL_ARB_texture_env_add: Boolean;
+
+{$IFDEF Windows}
+//***** WGL_ARB_extensions_string *****//
+var
+  wglGetExtensionsStringARB: function(hdc: HDC): Pchar; extdecl;
+
+function Load_WGL_ARB_extensions_string: Boolean;
+
+//***** WGL_ARB_buffer_region *****//
+const
+  WGL_FRONT_COLOR_BUFFER_BIT_ARB = $0001;
+  WGL_BACK_COLOR_BUFFER_BIT_ARB = $0002;
+  WGL_DEPTH_BUFFER_BIT_ARB = $0004;
+  WGL_STENCIL_BUFFER_BIT_ARB = $0008;
+var
+  wglCreateBufferRegionARB: function(hDC: HDC; iLayerPlane: GLint; uType: GLuint): THandle; extdecl;
+  wglDeleteBufferRegionARB: procedure(hRegion: THandle); extdecl;
+  wglSaveBufferRegionARB: function(hRegion: THandle; x: GLint; y: GLint; width: GLint; height: GLint): BOOL; extdecl;
+  wglRestoreBufferRegionARB: function(hRegion: THandle; x: GLint; y: GLint; width: GLint; height: GLint; xSrc: GLint; ySrc: GLint): BOOL; extdecl;
+
+function Load_WGL_ARB_buffer_region: Boolean;
+{$ENDIF}
+
+//***** GL_ARB_texture_cube_map *****//
+const
+  GL_NORMAL_MAP_ARB = $8511;
+  GL_REFLECTION_MAP_ARB = $8512;
+  GL_TEXTURE_CUBE_MAP_ARB = $8513;
+  GL_TEXTURE_BINDING_CUBE_MAP_ARB = $8514;
+  GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = $8515;
+  GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = $8516;
+  GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = $8517;
+  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = $8518;
+  GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = $8519;
+  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = $851A;
+  GL_PROXY_TEXTURE_CUBE_MAP_ARB = $851B;
+  GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB = $851C;
+
+function Load_GL_ARB_texture_cube_map: Boolean;
+
+//***** GL_ARB_depth_texture *****//
+const
+  GL_DEPTH_COMPONENT16_ARB = $81A5;
+  GL_DEPTH_COMPONENT24_ARB = $81A6;
+  GL_DEPTH_COMPONENT32_ARB = $81A7;
+  GL_TEXTURE_DEPTH_SIZE_ARB = $884A;
+  GL_DEPTH_TEXTURE_MODE_ARB = $884B;
+
+function Load_GL_ARB_depth_texture: Boolean;
+
+//***** GL_ARB_point_parameters *****//
+const
+  GL_POINT_SIZE_MIN_ARB = $8126;
+  GL_POINT_SIZE_MAX_ARB = $8127;
+  GL_POINT_FADE_THRESHOLD_SIZE_ARB = $8128;
+  GL_POINT_DISTANCE_ATTENUATION_ARB = $8129;
+var
+  glPointParameterfARB: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glPointParameterfvARB: procedure(pname: GLenum; params: PGLfloat); extdecl;
+
+function Load_GL_ARB_point_parameters: Boolean;
+
+//***** GL_ARB_shadow *****//
+const
+  GL_TEXTURE_COMPARE_MODE_ARB = $884C;
+  GL_TEXTURE_COMPARE_FUNC_ARB = $884D;
+  GL_COMPARE_R_TO_TEXTURE_ARB = $884E;
+
+function Load_GL_ARB_shadow: Boolean;
+
+//***** GL_ARB_shadow_ambient *****//
+const
+  GL_TEXTURE_COMPARE_FAIL_VALUE_ARB = $80BF;
+
+function Load_GL_ARB_shadow_ambient: Boolean;
+
+//***** GL_ARB_texture_border_clamp *****//
+const
+  GL_CLAMP_TO_BORDER_ARB = $812D;
+
+function Load_GL_ARB_texture_border_clamp: Boolean;
+
+//***** GL_ARB_texture_compression *****//
+const
+  GL_COMPRESSED_ALPHA_ARB = $84E9;
+  GL_COMPRESSED_LUMINANCE_ARB = $84EA;
+  GL_COMPRESSED_LUMINANCE_ALPHA_ARB = $84EB;
+  GL_COMPRESSED_INTENSITY_ARB = $84EC;
+  GL_COMPRESSED_RGB_ARB = $84ED;
+  GL_COMPRESSED_RGBA_ARB = $84EE;
+  GL_TEXTURE_COMPRESSION_HINT_ARB = $84EF;
+  GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB = $86A0;
+  GL_TEXTURE_COMPRESSED_ARB = $86A1;
+  GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB = $86A2;
+  GL_COMPRESSED_TEXTURE_FORMATS_ARB = $86A3;
+var
+  glCompressedTexImage3DARB: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; depth: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexImage2DARB: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexImage1DARB: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexSubImage3DARB: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexSubImage2DARB: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; width: GLsizei; height: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glCompressedTexSubImage1DARB: procedure(target: GLenum; level: GLint; xoffset: GLint; width: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); extdecl;
+  glGetCompressedTexImageARB: procedure(target: GLenum; lod: GLint; img: PGLvoid); extdecl;
+
+function Load_GL_ARB_texture_compression: Boolean;
+
+//***** GL_ARB_texture_env_combine *****//
+const
+  GL_COMBINE_ARB = $8570;
+  GL_COMBINE_RGB_ARB = $8571;
+  GL_COMBINE_ALPHA_ARB = $8572;
+  GL_SOURCE0_RGB_ARB = $8580;
+  GL_SOURCE1_RGB_ARB = $8581;
+  GL_SOURCE2_RGB_ARB = $8582;
+  GL_SOURCE0_ALPHA_ARB = $8588;
+  GL_SOURCE1_ALPHA_ARB = $8589;
+  GL_SOURCE2_ALPHA_ARB = $858A;
+  GL_OPERAND0_RGB_ARB = $8590;
+  GL_OPERAND1_RGB_ARB = $8591;
+  GL_OPERAND2_RGB_ARB = $8592;
+  GL_OPERAND0_ALPHA_ARB = $8598;
+  GL_OPERAND1_ALPHA_ARB = $8599;
+  GL_OPERAND2_ALPHA_ARB = $859A;
+  GL_RGB_SCALE_ARB = $8573;
+  GL_ADD_SIGNED_ARB = $8574;
+  GL_INTERPOLATE_ARB = $8575;
+  GL_SUBTRACT_ARB = $84E7;
+  GL_CONSTANT_ARB = $8576;
+  GL_PRIMARY_COLOR_ARB = $8577;
+  GL_PREVIOUS_ARB = $8578;
+
+function Load_GL_ARB_texture_env_combine: Boolean;
+
+//***** GL_ARB_texture_env_crossbar *****//
+
+function Load_GL_ARB_texture_env_crossbar: Boolean;
+
+//***** GL_ARB_texture_env_dot3 *****//
+const
+  GL_DOT3_RGB_ARB = $86AE;
+  GL_DOT3_RGBA_ARB = $86AF;
+
+function Load_GL_ARB_texture_env_dot3: Boolean;
+
+//***** GL_ARB_texture_mirrored_repeat *****//
+const
+  GL_MIRRORED_REPEAT_ARB = $8370;
+
+function Load_GL_ARB_texture_mirrored_repeat: Boolean;
+
+//***** GL_ARB_vertex_blend *****//
+const
+  GL_MAX_VERTEX_UNITS_ARB = $86A4;
+  GL_ACTIVE_VERTEX_UNITS_ARB = $86A5;
+  GL_WEIGHT_SUM_UNITY_ARB = $86A6;
+  GL_VERTEX_BLEND_ARB = $86A7;
+  GL_MODELVIEW0_ARB = $1700;
+  GL_MODELVIEW1_ARB = $850A;
+  GL_MODELVIEW2_ARB = $8722;
+  GL_MODELVIEW3_ARB = $8723;
+  GL_MODELVIEW4_ARB = $8724;
+  GL_MODELVIEW5_ARB = $8725;
+  GL_MODELVIEW6_ARB = $8726;
+  GL_MODELVIEW7_ARB = $8727;
+  GL_MODELVIEW8_ARB = $8728;
+  GL_MODELVIEW9_ARB = $8729;
+  GL_MODELVIEW10_ARB = $872A;
+  GL_MODELVIEW11_ARB = $872B;
+  GL_MODELVIEW12_ARB = $872C;
+  GL_MODELVIEW13_ARB = $872D;
+  GL_MODELVIEW14_ARB = $872E;
+  GL_MODELVIEW15_ARB = $872F;
+  GL_MODELVIEW16_ARB = $8730;
+  GL_MODELVIEW17_ARB = $8731;
+  GL_MODELVIEW18_ARB = $8732;
+  GL_MODELVIEW19_ARB = $8733;
+  GL_MODELVIEW20_ARB = $8734;
+  GL_MODELVIEW21_ARB = $8735;
+  GL_MODELVIEW22_ARB = $8736;
+  GL_MODELVIEW23_ARB = $8737;
+  GL_MODELVIEW24_ARB = $8738;
+  GL_MODELVIEW25_ARB = $8739;
+  GL_MODELVIEW26_ARB = $873A;
+  GL_MODELVIEW27_ARB = $873B;
+  GL_MODELVIEW28_ARB = $873C;
+  GL_MODELVIEW29_ARB = $873D;
+  GL_MODELVIEW30_ARB = $873E;
+  GL_MODELVIEW31_ARB = $873F;
+  GL_CURRENT_WEIGHT_ARB = $86A8;
+  GL_WEIGHT_ARRAY_TYPE_ARB = $86A9;
+  GL_WEIGHT_ARRAY_STRIDE_ARB = $86AA;
+  GL_WEIGHT_ARRAY_SIZE_ARB = $86AB;
+  GL_WEIGHT_ARRAY_POINTER_ARB = $86AC;
+  GL_WEIGHT_ARRAY_ARB = $86AD;
+var
+  glWeightbvARB: procedure(size: GLint; weights: PGLbyte); extdecl;
+  glWeightsvARB: procedure(size: GLint; weights: PGLshort); extdecl;
+  glWeightivARB: procedure(size: GLint; weights: PGLint); extdecl;
+  glWeightfvARB: procedure(size: GLint; weights: PGLfloat); extdecl;
+  glWeightdvARB: procedure(size: GLint; weights: PGLdouble); extdecl;
+  glWeightvARB: procedure(size: GLint; weights: PGLdouble); extdecl;
+  glWeightubvARB: procedure(size: GLint; weights: PGLubyte); extdecl;
+  glWeightusvARB: procedure(size: GLint; weights: PGLushort); extdecl;
+  glWeightuivARB: procedure(size: GLint; weights: PGLuint); extdecl;
+  glWeightPointerARB: procedure(size: GLint; _type: GLenum; stride: GLsizei; pointer: PGLvoid); extdecl;
+  glVertexBlendARB: procedure(count: GLint); extdecl;
+
+function Load_GL_ARB_vertex_blend: Boolean;
+
+//***** GL_ARB_vertex_program *****//
+const
+  GL_VERTEX_PROGRAM_ARB = $8620;
+  GL_VERTEX_PROGRAM_POINT_SIZE_ARB = $8642;
+  GL_VERTEX_PROGRAM_TWO_SIDE_ARB = $8643;
+  GL_COLOR_SUM_ARB = $8458;
+  GL_PROGRAM_FORMAT_ASCII_ARB = $8875;
+  GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = $8622;
+  GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = $8623;
+  GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = $8624;
+  GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = $8625;
+  GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = $886A;
+  GL_CURRENT_VERTEX_ATTRIB_ARB = $8626;
+  GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = $8645;
+  GL_PROGRAM_LENGTH_ARB = $8627;
+  GL_PROGRAM_FORMAT_ARB = $8876;
+  GL_PROGRAM_BINDING_ARB = $8677;
+  GL_PROGRAM_INSTRUCTIONS_ARB = $88A0;
+  GL_MAX_PROGRAM_INSTRUCTIONS_ARB = $88A1;
+  GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB = $88A2;
+  GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB = $88A3;
+  GL_PROGRAM_TEMPORARIES_ARB = $88A4;
+  GL_MAX_PROGRAM_TEMPORARIES_ARB = $88A5;
+  GL_PROGRAM_NATIVE_TEMPORARIES_ARB = $88A6;
+  GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB = $88A7;
+  GL_PROGRAM_PARAMETERS_ARB = $88A8;
+  GL_MAX_PROGRAM_PARAMETERS_ARB = $88A9;
+  GL_PROGRAM_NATIVE_PARAMETERS_ARB = $88AA;
+  GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB = $88AB;
+  GL_PROGRAM_ATTRIBS_ARB = $88AC;
+  GL_MAX_PROGRAM_ATTRIBS_ARB = $88AD;
+  GL_PROGRAM_NATIVE_ATTRIBS_ARB = $88AE;
+  GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB = $88AF;
+  GL_PROGRAM_ADDRESS_REGISTERS_ARB = $88B0;
+  GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB = $88B1;
+  GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = $88B2;
+  GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = $88B3;
+  GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB = $88B4;
+  GL_MAX_PROGRAM_ENV_PARAMETERS_ARB = $88B5;
+  GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB = $88B6;
+  GL_PROGRAM_STRING_ARB = $8628;
+  GL_PROGRAM_ERROR_POSITION_ARB = $864B;
+  GL_CURRENT_MATRIX_ARB = $8641;
+  GL_TRANSPOSE_CURRENT_MATRIX_ARB = $88B7;
+  GL_CURRENT_MATRIX_STACK_DEPTH_ARB = $8640;
+  GL_MAX_VERTEX_ATTRIBS_ARB = $8869;
+  GL_MAX_PROGRAM_MATRICES_ARB = $862F;
+  GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB = $862E;
+  GL_PROGRAM_ERROR_STRING_ARB = $8874;
+  GL_MATRIX0_ARB = $88C0;
+  GL_MATRIX1_ARB = $88C1;
+  GL_MATRIX2_ARB = $88C2;
+  GL_MATRIX3_ARB = $88C3;
+  GL_MATRIX4_ARB = $88C4;
+  GL_MATRIX5_ARB = $88C5;
+  GL_MATRIX6_ARB = $88C6;
+  GL_MATRIX7_ARB = $88C7;
+  GL_MATRIX8_ARB = $88C8;
+  GL_MATRIX9_ARB = $88C9;
+  GL_MATRIX10_ARB = $88CA;
+  GL_MATRIX11_ARB = $88CB;
+  GL_MATRIX12_ARB = $88CC;
+  GL_MATRIX13_ARB = $88CD;
+  GL_MATRIX14_ARB = $88CE;
+  GL_MATRIX15_ARB = $88CF;
+  GL_MATRIX16_ARB = $88D0;
+  GL_MATRIX17_ARB = $88D1;
+  GL_MATRIX18_ARB = $88D2;
+  GL_MATRIX19_ARB = $88D3;
+  GL_MATRIX20_ARB = $88D4;
+  GL_MATRIX21_ARB = $88D5;
+  GL_MATRIX22_ARB = $88D6;
+  GL_MATRIX23_ARB = $88D7;
+  GL_MATRIX24_ARB = $88D8;
+  GL_MATRIX25_ARB = $88D9;
+  GL_MATRIX26_ARB = $88DA;
+  GL_MATRIX27_ARB = $88DB;
+  GL_MATRIX28_ARB = $88DC;
+  GL_MATRIX29_ARB = $88DD;
+  GL_MATRIX30_ARB = $88DE;
+  GL_MATRIX31_ARB = $88DF;
+var
+  glVertexAttrib1sARB: procedure(index: GLuint; x: GLshort); extdecl;
+  glVertexAttrib1fARB: procedure(index: GLuint; x: GLfloat); extdecl;
+  glVertexAttrib1dARB: procedure(index: GLuint; x: GLdouble); extdecl;
+  glVertexAttrib2sARB: procedure(index: GLuint; x: GLshort; y: GLshort); extdecl;
+  glVertexAttrib2fARB: procedure(index: GLuint; x: GLfloat; y: GLfloat); extdecl;
+  glVertexAttrib2dARB: procedure(index: GLuint; x: GLdouble; y: GLdouble); extdecl;
+  glVertexAttrib3sARB: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort); extdecl;
+  glVertexAttrib3fARB: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glVertexAttrib3dARB: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble); extdecl;
+  glVertexAttrib4sARB: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort; w: GLshort); extdecl;
+  glVertexAttrib4fARB: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glVertexAttrib4dARB: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); extdecl;
+  glVertexAttrib4NubARB: procedure(index: GLuint; x: GLubyte; y: GLubyte; z: GLubyte; w: GLubyte); extdecl;
+  glVertexAttrib1svARB: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib1fvARB: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib1dvARB: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib2svARB: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib2fvARB: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib2dvARB: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib3svARB: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib3fvARB: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib3dvARB: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib4bvARB: procedure(index: GLuint; const v: PGLbyte); extdecl;
+  glVertexAttrib4svARB: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib4ivARB: procedure(index: GLuint; const v: PGLint); extdecl;
+  glVertexAttrib4ubvARB: procedure(index: GLuint; const v: PGLubyte); extdecl;
+  glVertexAttrib4usvARB: procedure(index: GLuint; const v: PGLushort); extdecl;
+  glVertexAttrib4uivARB: procedure(index: GLuint; const v: PGLuint); extdecl;
+  glVertexAttrib4fvARB: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib4dvARB: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib4NbvARB: procedure(index: GLuint; const v: PGLbyte); extdecl;
+  glVertexAttrib4NsvARB: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib4NivARB: procedure(index: GLuint; const v: PGLint); extdecl;
+  glVertexAttrib4NubvARB: procedure(index: GLuint; const v: PGLubyte); extdecl;
+  glVertexAttrib4NusvARB: procedure(index: GLuint; const v: PGLushort); extdecl;
+  glVertexAttrib4NuivARB: procedure(index: GLuint; const v: PGLuint); extdecl;
+  glVertexAttribPointerARB: procedure(index: GLuint; size: GLint; _type: GLenum; normalized: GLboolean; stride: GLsizei; const pointer: PGLvoid); extdecl;
+  glEnableVertexAttribArrayARB: procedure(index: GLuint); extdecl;
+  glDisableVertexAttribArrayARB: procedure(index: GLuint); extdecl;
+  glProgramStringARB: procedure(target: GLenum; format: GLenum; len: GLsizei; const _string: PGLvoid); extdecl;
+  glBindProgramARB: procedure(target: GLenum; _program: GLuint); extdecl;
+  glDeleteProgramsARB: procedure(n: GLsizei; const programs: PGLuint); extdecl;
+  glGenProgramsARB: procedure(n: GLsizei; programs: PGLuint); extdecl;
+  glProgramEnvParameter4dARB: procedure(target: GLenum; index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); extdecl;
+  glProgramEnvParameter4dvARB: procedure(target: GLenum; index: GLuint; const params: PGLdouble); extdecl;
+  glProgramEnvParameter4fARB: procedure(target: GLenum; index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glProgramEnvParameter4fvARB: procedure(target: GLenum; index: GLuint; const params: PGLfloat); extdecl;
+  glProgramLocalParameter4dARB: procedure(target: GLenum; index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); extdecl;
+  glProgramLocalParameter4dvARB: procedure(target: GLenum; index: GLuint; const params: PGLdouble); extdecl;
+  glProgramLocalParameter4fARB: procedure(target: GLenum; index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glProgramLocalParameter4fvARB: procedure(target: GLenum; index: GLuint; const params: PGLfloat); extdecl;
+  glGetProgramEnvParameterdvARB: procedure(target: GLenum; index: GLuint; params: PGLdouble); extdecl;
+  glGetProgramEnvParameterfvARB: procedure(target: GLenum; index: GLuint; params: PGLfloat); extdecl;
+  glGetProgramLocalParameterdvARB: procedure(target: GLenum; index: GLuint; params: PGLdouble); extdecl;
+  glGetProgramLocalParameterfvARB: procedure(target: GLenum; index: GLuint; params: PGLfloat); extdecl;
+  glGetProgramivARB: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetProgramStringARB: procedure(target: GLenum; pname: GLenum; _string: PGLvoid); extdecl;
+  glGetVertexAttribdvARB: procedure(index: GLuint; pname: GLenum; params: PGLdouble); extdecl;
+  glGetVertexAttribfvARB: procedure(index: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glGetVertexAttribivARB: procedure(index: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetVertexAttribPointervARB: procedure(index: GLuint; pname: GLenum; pointer: PGLvoid); extdecl;
+  glIsProgramARB: function(_program: GLuint): GLboolean; extdecl;
+
+function Load_GL_ARB_vertex_program: Boolean;
+
+//***** GL_ARB_window_pos *****//
+var
+  glWindowPos2dARB: procedure(x: GLdouble; y: GLdouble); extdecl;
+  glWindowPos2fARB: procedure(x: GLfloat; y: GLfloat); extdecl;
+  glWindowPos2iARB: procedure(x: GLint; y: GLint); extdecl;
+  glWindowPos2sARB: procedure(x: GLshort; y: GLshort); extdecl;
+  glWindowPos2dvARB: procedure(const p: PGLdouble); extdecl;
+  glWindowPos2fvARB: procedure(const p: PGLfloat); extdecl;
+  glWindowPos2ivARB: procedure(const p: PGLint); extdecl;
+  glWindowPos2svARB: procedure(const p: PGLshort); extdecl;
+  glWindowPos3dARB: procedure(x: GLdouble; y: GLdouble; z: GLdouble); extdecl;
+  glWindowPos3fARB: procedure(x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glWindowPos3iARB: procedure(x: GLint; y: GLint; z: GLint); extdecl;
+  glWindowPos3sARB: procedure(x: GLshort; y: GLshort; z: GLshort); extdecl;
+  glWindowPos3dvARB: procedure(const p: PGLdouble); extdecl;
+  glWindowPos3fvARB: procedure(const p: PGLfloat); extdecl;
+  glWindowPos3ivARB: procedure(const p: PGLint); extdecl;
+  glWindowPos3svARB: procedure(const p: PGLshort); extdecl;
+
+function Load_GL_ARB_window_pos: Boolean;
+
+//***** GL_EXT_422_pixels *****//
+const
+  GL_422_EXT = $80CC;
+  GL_422_REV_EXT = $80CD;
+  GL_422_AVERAGE_EXT = $80CE;
+  GL_422_REV_AVERAGE_EXT = $80CF;
+
+function Load_GL_EXT_422_pixels: Boolean;
+
+//***** GL_EXT_abgr *****//
+const
+  GL_ABGR_EXT = $8000;
+
+function Load_GL_EXT_abgr: Boolean;
+
+//***** GL_EXT_bgra *****//
+const
+  GL_BGR_EXT = $80E0;
+  GL_BGRA_EXT = $80E1;
+
+function Load_GL_EXT_bgra: Boolean;
+
+//***** GL_EXT_blend_color *****//
+const
+  GL_CONSTANT_COLOR_EXT = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR_EXT = $8002;
+  GL_CONSTANT_ALPHA_EXT = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA_EXT = $8004;
+  GL_BLEND_COLOR_EXT = $8005;
+var
+  glBlendColorEXT: procedure(red: GLclampf; green: GLclampf; blue: GLclampf; alpha: GLclampf); extdecl;
+
+function Load_GL_EXT_blend_color: Boolean;
+
+//***** GL_EXT_blend_func_separate *****//
+const
+  GL_BLEND_DST_RGB_EXT = $80C8;
+  GL_BLEND_SRC_RGB_EXT = $80C9;
+  GL_BLEND_DST_ALPHA_EXT = $80CA;
+  GL_BLEND_SRC_ALPHA_EXT = $80CB;
+var
+  glBlendFuncSeparateEXT: procedure(sfactorRGB: GLenum; dfactorRGB: GLenum; sfactorAlpha: GLenum; dfactorAlpha: GLenum); extdecl;
+
+function Load_GL_EXT_blend_func_separate: Boolean;
+
+//***** GL_EXT_blend_logic_op *****//
+
+function Load_GL_EXT_blend_logic_op: Boolean;
+
+//***** GL_EXT_blend_minmax *****//
+const
+  GL_FUNC_ADD_EXT = $8006;
+  GL_MIN_EXT = $8007;
+  GL_MAX_EXT = $8008;
+  GL_BLEND_EQUATION_EXT = $8009;
+var
+  glBlendEquationEXT: procedure(mode: GLenum); extdecl;
+
+function Load_GL_EXT_blend_minmax: Boolean;
+
+//***** GL_EXT_blend_subtract *****//
+const
+  GL_FUNC_SUBTRACT_EXT = $800A;
+  GL_FUNC_REVERSE_SUBTRACT_EXT = $800B;
+
+function Load_GL_EXT_blend_subtract: Boolean;
+
+//***** GL_EXT_clip_volume_hint *****//
+const
+  GL_CLIP_VOLUME_CLIPPING_HINT_EXT = $80F0;
+
+function Load_GL_EXT_clip_volume_hint: Boolean;
+
+//***** GL_EXT_color_subtable *****//
+var
+  glColorSubTableEXT: procedure(target: GLenum; start: GLsizei; count: GLsizei; format: GLenum; _type: GLenum; const data: PGLvoid); extdecl;
+  glCopyColorSubTableEXT: procedure(target: GLenum; start: GLsizei; x: GLint; y: GLint; width: GLsizei); extdecl;
+
+function Load_GL_EXT_color_subtable: Boolean;
+
+//***** GL_EXT_compiled_vertex_array *****//
+const
+  GL_ARRAY_ELEMENT_LOCK_FIRST_EXT = $81A8;
+  GL_ARRAY_ELEMENT_LOCK_COUNT_EXT = $81A9;
+var
+  glLockArraysEXT: procedure(first: GLint; count: GLsizei); extdecl;
+  glUnlockArraysEXT: procedure(); extdecl;
+
+function Load_GL_EXT_compiled_vertex_array: Boolean;
+
+//***** GL_EXT_convolution *****//
+const
+  GL_CONVOLUTION_1D_EXT = $8010;
+  GL_CONVOLUTION_2D_EXT = $8011;
+  GL_SEPARABLE_2D_EXT = $8012;
+  GL_CONVOLUTION_BORDER_MODE_EXT = $8013;
+  GL_CONVOLUTION_FILTER_SCALE_EXT = $8014;
+  GL_CONVOLUTION_FILTER_BIAS_EXT = $8015;
+  GL_REDUCE_EXT = $8016;
+  GL_CONVOLUTION_FORMAT_EXT = $8017;
+  GL_CONVOLUTION_WIDTH_EXT = $8018;
+  GL_CONVOLUTION_HEIGHT_EXT = $8019;
+  GL_MAX_CONVOLUTION_WIDTH_EXT = $801A;
+  GL_MAX_CONVOLUTION_HEIGHT_EXT = $801B;
+  GL_POST_CONVOLUTION_RED_SCALE_EXT = $801C;
+  GL_POST_CONVOLUTION_GREEN_SCALE_EXT = $801D;
+  GL_POST_CONVOLUTION_BLUE_SCALE_EXT = $801E;
+  GL_POST_CONVOLUTION_ALPHA_SCALE_EXT = $801F;
+  GL_POST_CONVOLUTION_RED_BIAS_EXT = $8020;
+  GL_POST_CONVOLUTION_GREEN_BIAS_EXT = $8021;
+  GL_POST_CONVOLUTION_BLUE_BIAS_EXT = $8022;
+  GL_POST_CONVOLUTION_ALPHA_BIAS_EXT = $8023;
+var
+  glConvolutionFilter1DEXT: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const image: PGLvoid); extdecl;
+  glConvolutionFilter2DEXT: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const image: PGLvoid); extdecl;
+  glCopyConvolutionFilter1DEXT: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei); extdecl;
+  glCopyConvolutionFilter2DEXT: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei; height: GLsizei); extdecl;
+  glGetConvolutionFilterEXT: procedure(target: GLenum; format: GLenum; _type: GLenum; image: PGLvoid); extdecl;
+  glSeparableFilter2DEXT: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const row: PGLvoid; const column: PGLvoid); extdecl;
+  glGetSeparableFilterEXT: procedure(target: GLenum; format: GLenum; _type: GLenum; row: PGLvoid; column: PGLvoid; span: PGLvoid); extdecl;
+  glConvolutionParameteriEXT: procedure(target: GLenum; pname: GLenum; param: GLint); extdecl;
+  glConvolutionParameterivEXT: procedure(target: GLenum; pname: GLenum; const params: PGLint); extdecl;
+  glConvolutionParameterfEXT: procedure(target: GLenum; pname: GLenum; param: GLfloat); extdecl;
+  glConvolutionParameterfvEXT: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glGetConvolutionParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetConvolutionParameterfvEXT: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+
+function Load_GL_EXT_convolution: Boolean;
+
+//***** GL_EXT_fog_coord *****//
+const
+  GL_FOG_COORDINATE_SOURCE_EXT = $8450;
+  GL_FOG_COORDINATE_EXT = $8451;
+  GL_FRAGMENT_DEPTH_EXT = $8452;
+  GL_CURRENT_FOG_COORDINATE_EXT = $8453;
+  GL_FOG_COORDINATE_ARRAY_TYPE_EXT = $8454;
+  GL_FOG_COORDINATE_ARRAY_STRIDE_EXT = $8455;
+  GL_FOG_COORDINATE_ARRAY_POINTER_EXT = $8456;
+  GL_FOG_COORDINATE_ARRAY_EXT = $8457;
+var
+  glFogCoordfEXT: procedure(coord: GLfloat); extdecl;
+  glFogCoorddEXT: procedure(coord: GLdouble); extdecl;
+  glFogCoordfvEXT: procedure(coord: PGLfloat); extdecl;
+  glFogCoorddvEXT: procedure(coord: PGLdouble); extdecl;
+  glFogCoordPointerEXT: procedure(_type: GLenum; stride: GLsizei; pointer: PGLvoid); extdecl;
+
+function Load_GL_EXT_fog_coord: Boolean;
+
+//***** GL_EXT_histogram *****//
+const
+  GL_HISTOGRAM_EXT = $8024;
+  GL_PROXY_HISTOGRAM_EXT = $8025;
+  GL_HISTOGRAM_WIDTH_EXT = $8026;
+  GL_HISTOGRAM_FORMAT_EXT = $8027;
+  GL_HISTOGRAM_RED_SIZE_EXT = $8028;
+  GL_HISTOGRAM_GREEN_SIZE_EXT = $8029;
+  GL_HISTOGRAM_BLUE_SIZE_EXT = $802A;
+  GL_HISTOGRAM_ALPHA_SIZE_EXT = $802B;
+  GL_HISTOGRAM_LUMINANCE_SIZE_EXT = $802C;
+  GL_HISTOGRAM_SINK_EXT = $802D;
+  GL_MINMAX_EXT = $802E;
+  GL_MINMAX_FORMAT_EXT = $802F;
+  GL_MINMAX_SINK_EXT = $8030;
+var
+  glHistogramEXT: procedure(target: GLenum; width: GLsizei; internalformat: GLenum; sink: GLboolean); extdecl;
+  glResetHistogramEXT: procedure(target: GLenum); extdecl;
+  glGetHistogramEXT: procedure(target: GLenum; reset: GLboolean; format: GLenum; _type: GLenum; values: PGLvoid); extdecl;
+  glGetHistogramParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetHistogramParameterfvEXT: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glMinmaxEXT: procedure(target: GLenum; internalformat: GLenum; sink: GLboolean); extdecl;
+  glResetMinmaxEXT: procedure(target: GLenum); extdecl;
+  glGetMinmaxEXT: procedure(target: GLenum; reset: GLboolean; format: GLenum; _type: GLenum; values: PGLvoid); extdecl;
+  glGetMinmaxParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetMinmaxParameterfvEXT: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+
+function Load_GL_EXT_histogram: Boolean;
+
+//***** GL_EXT_multi_draw_arrays *****//
+var
+  glMultiDrawArraysEXT: procedure(mode: GLenum; first: PGLint; count: PGLsizei; primcount: GLsizei); extdecl;
+  glMultiDrawElementsEXT: procedure(mode: GLenum; count: PGLsizei; _type: GLenum; const indices: PGLvoid; primcount: GLsizei); extdecl;
+
+function Load_GL_EXT_multi_draw_arrays: Boolean;
+
+//***** GL_EXT_packed_pixels *****//
+const
+  GL_UNSIGNED_BYTE_3_3_2_EXT = $8032;
+  GL_UNSIGNED_SHORT_4_4_4_4_EXT = $8033;
+  GL_UNSIGNED_SHORT_5_5_5_1_EXT = $8034;
+  GL_UNSIGNED_INT_8_8_8_8_EXT = $8035;
+  GL_UNSIGNED_INT_10_10_10_2_EXT = $8036;
+
+function Load_GL_EXT_packed_pixels: Boolean;
+
+//***** GL_EXT_paletted_texture *****//
+const
+  GL_COLOR_INDEX1_EXT = $80E2;
+  GL_COLOR_INDEX2_EXT = $80E3;
+  GL_COLOR_INDEX4_EXT = $80E4;
+  GL_COLOR_INDEX8_EXT = $80E5;
+  GL_COLOR_INDEX12_EXT = $80E6;
+  GL_COLOR_INDEX16_EXT = $80E7;
+  GL_COLOR_TABLE_FORMAT_EXT = $80D8;
+  GL_COLOR_TABLE_WIDTH_EXT = $80D9;
+  GL_COLOR_TABLE_RED_SIZE_EXT = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE_EXT = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE_EXT = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE_EXT = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE_EXT = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE_EXT = $80DF;
+  GL_TEXTURE_INDEX_SIZE_EXT = $80ED;
+  GL_TEXTURE_1D = $0DE0;
+  GL_TEXTURE_2D = $0DE1;
+  GL_TEXTURE_3D_EXT = $806F;
+  // GL_TEXTURE_CUBE_MAP_ARB  { already defined }
+  GL_PROXY_TEXTURE_1D = $8063;
+  GL_PROXY_TEXTURE_2D = $8064;
+  GL_PROXY_TEXTURE_3D_EXT = $8070;
+  // GL_PROXY_TEXTURE_CUBE_MAP_ARB  { already defined }
+  // GL_TEXTURE_1D  { already defined }
+  // GL_TEXTURE_2D  { already defined }
+  // GL_TEXTURE_3D_EXT  { already defined }
+  // GL_TEXTURE_CUBE_MAP_ARB  { already defined }
+var
+  glColorTableEXT: procedure(target: GLenum; internalFormat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const data: PGLvoid); extdecl;
+  // glColorSubTableEXT  { already defined }
+  glGetColorTableEXT: procedure(target: GLenum; format: GLenum; _type: GLenum; data: PGLvoid); extdecl;
+  glGetColorTableParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetColorTableParameterfvEXT: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+
+function Load_GL_EXT_paletted_texture: Boolean;
+
+//***** GL_EXT_point_parameters *****//
+const
+  GL_POINT_SIZE_MIN_EXT = $8126;
+  GL_POINT_SIZE_MAX_EXT = $8127;
+  GL_POINT_FADE_THRESHOLD_SIZE_EXT = $8128;
+  GL_DISTANCE_ATTENUATION_EXT = $8129;
+var
+  glPointParameterfEXT: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glPointParameterfvEXT: procedure(pname: GLenum; params: PGLfloat); extdecl;
+
+function Load_GL_EXT_point_parameters: Boolean;
+
+//***** GL_EXT_polygon_offset *****//
+const
+  GL_POLYGON_OFFSET_EXT = $8037;
+  GL_POLYGON_OFFSET_FACTOR_EXT = $8038;
+  GL_POLYGON_OFFSET_BIAS_EXT = $8039;
+var
+  glPolygonOffsetEXT: procedure(factor: GLfloat; bias: GLfloat); extdecl;
+
+function Load_GL_EXT_polygon_offset: Boolean;
+
+//***** GL_EXT_secondary_color *****//
+const
+  GL_COLOR_SUM_EXT = $8458;
+  GL_CURRENT_SECONDARY_COLOR_EXT = $8459;
+  GL_SECONDARY_COLOR_ARRAY_SIZE_EXT = $845A;
+  GL_SECONDARY_COLOR_ARRAY_TYPE_EXT = $845B;
+  GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT = $845C;
+  GL_SECONDARY_COLOR_ARRAY_POINTER_EXT = $845D;
+  GL_SECONDARY_COLOR_ARRAY_EXT = $845E;
+var
+  glSecondaryColor3bEXT: procedure(components: GLbyte); extdecl;
+  glSecondaryColor3sEXT: procedure(components: GLshort); extdecl;
+  glSecondaryColor3iEXT: procedure(components: GLint); extdecl;
+  glSecondaryColor3fEXT: procedure(components: GLfloat); extdecl;
+  glSecondaryColor3dEXT: procedure(components: GLdouble); extdecl;
+  glSecondaryColor3ubEXT: procedure(components: GLubyte); extdecl;
+  glSecondaryColor3usEXT: procedure(components: GLushort); extdecl;
+  glSecondaryColor3uiEXT: procedure(components: GLuint); extdecl;
+  glSecondaryColor3bvEXT: procedure(components: GLbyte); extdecl;
+  glSecondaryColor3svEXT: procedure(components: GLshort); extdecl;
+  glSecondaryColor3ivEXT: procedure(components: GLint); extdecl;
+  glSecondaryColor3fvEXT: procedure(components: GLfloat); extdecl;
+  glSecondaryColor3dvEXT: procedure(components: GLdouble); extdecl;
+  glSecondaryColor3ubvEXT: procedure(components: GLubyte); extdecl;
+  glSecondaryColor3usvEXT: procedure(components: GLushort); extdecl;
+  glSecondaryColor3uivEXT: procedure(components: GLuint); extdecl;
+  glSecondaryColorPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; pointer: PGLvoid); extdecl;
+
+function Load_GL_EXT_secondary_color: Boolean;
+
+//***** GL_EXT_separate_specular_color *****//
+const
+  GL_LIGHT_MODEL_COLOR_CONTROL_EXT = $81F8;
+  GL_SINGLE_COLOR_EXT = $81F9;
+  GL_SEPARATE_SPECULAR_COLOR_EXT = $81FA;
+
+function Load_GL_EXT_separate_specular_color: Boolean;
+
+//***** GL_EXT_shadow_funcs *****//
+
+function Load_GL_EXT_shadow_funcs: Boolean;
+
+//***** GL_EXT_shared_texture_palette *****//
+const
+  GL_SHARED_TEXTURE_PALETTE_EXT = $81FB;
+
+function Load_GL_EXT_shared_texture_palette: Boolean;
+
+//***** GL_EXT_stencil_two_side *****//
+const
+  GL_STENCIL_TEST_TWO_SIDE_EXT = $8910;
+  GL_ACTIVE_STENCIL_FACE_EXT = $8911;
+var
+  glActiveStencilFaceEXT: procedure(face: GLenum); extdecl;
+
+function Load_GL_EXT_stencil_two_side: Boolean;
+
+//***** GL_EXT_stencil_wrap *****//
+const
+  GL_INCR_WRAP_EXT = $8507;
+  GL_DECR_WRAP_EXT = $8508;
+
+function Load_GL_EXT_stencil_wrap: Boolean;
+
+//***** GL_EXT_subtexture *****//
+var
+  glTexSubImage1DEXT: procedure(target: GLenum; level: GLint; xoffset: GLint; width: GLsizei; format: GLenum; _type: GLenum; const pixels: PGLvoid); extdecl;
+  glTexSubImage2DEXT: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const pixels: PGLvoid); extdecl;
+  glTexSubImage3DEXT: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; format: GLenum; _type: GLenum; const pixels: PGLvoid); extdecl;
+
+function Load_GL_EXT_subtexture: Boolean;
+
+//***** GL_EXT_texture3D *****//
+const
+  GL_PACK_SKIP_IMAGES_EXT = $806B;
+  GL_PACK_IMAGE_HEIGHT_EXT = $806C;
+  GL_UNPACK_SKIP_IMAGES_EXT = $806D;
+  GL_UNPACK_IMAGE_HEIGHT_EXT = $806E;
+  // GL_TEXTURE_3D_EXT  { already defined }
+  // GL_PROXY_TEXTURE_3D_EXT  { already defined }
+  GL_TEXTURE_DEPTH_EXT = $8071;
+  GL_TEXTURE_WRAP_R_EXT = $8072;
+  GL_MAX_3D_TEXTURE_SIZE_EXT = $8073;
+var
+  glTexImage3DEXT: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; depth: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); extdecl;
+
+function Load_GL_EXT_texture3D: Boolean;
+
+//***** GL_EXT_texture_compression_s3tc *****//
+const
+  GL_COMPRESSED_RGB_S3TC_DXT1_EXT = $83F0;
+  GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = $83F1;
+  GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = $83F2;
+  GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = $83F3;
+
+function Load_GL_EXT_texture_compression_s3tc: Boolean;
+
+//***** GL_EXT_texture_env_add *****//
+
+function Load_GL_EXT_texture_env_add: Boolean;
+
+//***** GL_EXT_texture_env_combine *****//
+const
+  GL_COMBINE_EXT = $8570;
+  GL_COMBINE_RGB_EXT = $8571;
+  GL_COMBINE_ALPHA_EXT = $8572;
+  GL_SOURCE0_RGB_EXT = $8580;
+  GL_SOURCE1_RGB_EXT = $8581;
+  GL_SOURCE2_RGB_EXT = $8582;
+  GL_SOURCE0_ALPHA_EXT = $8588;
+  GL_SOURCE1_ALPHA_EXT = $8589;
+  GL_SOURCE2_ALPHA_EXT = $858A;
+  GL_OPERAND0_RGB_EXT = $8590;
+  GL_OPERAND1_RGB_EXT = $8591;
+  GL_OPERAND2_RGB_EXT = $8592;
+  GL_OPERAND0_ALPHA_EXT = $8598;
+  GL_OPERAND1_ALPHA_EXT = $8599;
+  GL_OPERAND2_ALPHA_EXT = $859A;
+  GL_RGB_SCALE_EXT = $8573;
+  GL_ADD_SIGNED_EXT = $8574;
+  GL_INTERPOLATE_EXT = $8575;
+  GL_CONSTANT_EXT = $8576;
+  GL_PRIMARY_COLOR_EXT = $8577;
+  GL_PREVIOUS_EXT = $8578;
+
+function Load_GL_EXT_texture_env_combine: Boolean;
+
+//***** GL_EXT_texture_env_dot3 *****//
+const
+  GL_DOT3_RGB_EXT = $8740;
+  GL_DOT3_RGBA_EXT = $8741;
+
+function Load_GL_EXT_texture_env_dot3: Boolean;
+
+//***** GL_EXT_texture_filter_anisotropic *****//
+const
+  GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE;
+  GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF;
+
+function Load_GL_EXT_texture_filter_anisotropic: Boolean;
+
+//***** GL_EXT_texture_lod_bias *****//
+const
+  GL_TEXTURE_FILTER_CONTROL_EXT = $8500;
+  GL_TEXTURE_LOD_BIAS_EXT = $8501;
+  GL_MAX_TEXTURE_LOD_BIAS_EXT = $84FD;
+
+function Load_GL_EXT_texture_lod_bias: Boolean;
+
+//***** GL_EXT_texture_object *****//
+const
+  GL_TEXTURE_PRIORITY_EXT = $8066;
+  GL_TEXTURE_RESIDENT_EXT = $8067;
+  GL_TEXTURE_1D_BINDING_EXT = $8068;
+  GL_TEXTURE_2D_BINDING_EXT = $8069;
+  GL_TEXTURE_3D_BINDING_EXT = $806A;
+var
+  glGenTexturesEXT: procedure(n: GLsizei; textures: PGLuint); extdecl;
+  glDeleteTexturesEXT: procedure(n: GLsizei; const textures: PGLuint); extdecl;
+  glBindTextureEXT: procedure(target: GLenum; texture: GLuint); extdecl;
+  glPrioritizeTexturesEXT: procedure(n: GLsizei; const textures: PGLuint; const priorities: PGLclampf); extdecl;
+  glAreTexturesResidentEXT: function(n: GLsizei; const textures: PGLuint; residences: PGLboolean): GLboolean; extdecl;
+  glIsTextureEXT: function(texture: GLuint): GLboolean; extdecl;
+
+function Load_GL_EXT_texture_object: Boolean;
+
+//***** GL_EXT_vertex_array *****//
+const
+  GL_VERTEX_ARRAY_EXT = $8074;
+  GL_NORMAL_ARRAY_EXT = $8075;
+  GL_COLOR_ARRAY_EXT = $8076;
+  GL_INDEX_ARRAY_EXT = $8077;
+  GL_TEXTURE_COORD_ARRAY_EXT = $8078;
+  GL_EDGE_FLAG_ARRAY_EXT = $8079;
+  GL_DOUBLE_EXT = $140A;
+  GL_VERTEX_ARRAY_SIZE_EXT = $807A;
+  GL_VERTEX_ARRAY_TYPE_EXT = $807B;
+  GL_VERTEX_ARRAY_STRIDE_EXT = $807C;
+  GL_VERTEX_ARRAY_COUNT_EXT = $807D;
+  GL_NORMAL_ARRAY_TYPE_EXT = $807E;
+  GL_NORMAL_ARRAY_STRIDE_EXT = $807F;
+  GL_NORMAL_ARRAY_COUNT_EXT = $8080;
+  GL_COLOR_ARRAY_SIZE_EXT = $8081;
+  GL_COLOR_ARRAY_TYPE_EXT = $8082;
+  GL_COLOR_ARRAY_STRIDE_EXT = $8083;
+  GL_COLOR_ARRAY_COUNT_EXT = $8084;
+  GL_INDEX_ARRAY_TYPE_EXT = $8085;
+  GL_INDEX_ARRAY_STRIDE_EXT = $8086;
+  GL_INDEX_ARRAY_COUNT_EXT = $8087;
+  GL_TEXTURE_COORD_ARRAY_SIZE_EXT = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE_EXT = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE_EXT = $808A;
+  GL_TEXTURE_COORD_ARRAY_COUNT_EXT = $808B;
+  GL_EDGE_FLAG_ARRAY_STRIDE_EXT = $808C;
+  GL_EDGE_FLAG_ARRAY_COUNT_EXT = $808D;
+  GL_VERTEX_ARRAY_POINTER_EXT = $808E;
+  GL_NORMAL_ARRAY_POINTER_EXT = $808F;
+  GL_COLOR_ARRAY_POINTER_EXT = $8090;
+  GL_INDEX_ARRAY_POINTER_EXT = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER_EXT = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER_EXT = $8093;
+var
+  glArrayElementEXT: procedure(i: GLint); extdecl;
+  glDrawArraysEXT: procedure(mode: GLenum; first: GLint; count: GLsizei); extdecl;
+  glVertexPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); extdecl;
+  glNormalPointerEXT: procedure(_type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); extdecl;
+  glColorPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); extdecl;
+  glIndexPointerEXT: procedure(_type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); extdecl;
+  glTexCoordPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); extdecl;
+  glEdgeFlagPointerEXT: procedure(stride: GLsizei; count: GLsizei; const pointer: PGLboolean); extdecl;
+  glGetPointervEXT: procedure(pname: GLenum; params: PGLvoid); extdecl;
+
+function Load_GL_EXT_vertex_array: Boolean;
+
+//***** GL_EXT_vertex_shader *****//
+const
+  GL_VERTEX_SHADER_EXT = $8780;
+  GL_VARIANT_VALUE_EXT = $87E4;
+  GL_VARIANT_DATATYPE_EXT = $87E5;
+  GL_VARIANT_ARRAY_STRIDE_EXT = $87E6;
+  GL_VARIANT_ARRAY_TYPE_EXT = $87E7;
+  GL_VARIANT_ARRAY_EXT = $87E8;
+  GL_VARIANT_ARRAY_POINTER_EXT = $87E9;
+  GL_INVARIANT_VALUE_EXT = $87EA;
+  GL_INVARIANT_DATATYPE_EXT = $87EB;
+  GL_LOCAL_CONSTANT_VALUE_EXT = $87EC;
+  GL_LOCAL_CONSTANT_DATATYPE_EXT = $87ED;
+  GL_OP_INDEX_EXT = $8782;
+  GL_OP_NEGATE_EXT = $8783;
+  GL_OP_DOT3_EXT = $8784;
+  GL_OP_DOT4_EXT = $8785;
+  GL_OP_MUL_EXT = $8786;
+  GL_OP_ADD_EXT = $8787;
+  GL_OP_MADD_EXT = $8788;
+  GL_OP_FRAC_EXT = $8789;
+  GL_OP_MAX_EXT = $878A;
+  GL_OP_MIN_EXT = $878B;
+  GL_OP_SET_GE_EXT = $878C;
+  GL_OP_SET_LT_EXT = $878D;
+  GL_OP_CLAMP_EXT = $878E;
+  GL_OP_FLOOR_EXT = $878F;
+  GL_OP_ROUND_EXT = $8790;
+  GL_OP_EXP_BASE_2_EXT = $8791;
+  GL_OP_LOG_BASE_2_EXT = $8792;
+  GL_OP_POWER_EXT = $8793;
+  GL_OP_RECIP_EXT = $8794;
+  GL_OP_RECIP_SQRT_EXT = $8795;
+  GL_OP_SUB_EXT = $8796;
+  GL_OP_CROSS_PRODUCT_EXT = $8797;
+  GL_OP_MULTIPLY_MATRIX_EXT = $8798;
+  GL_OP_MOV_EXT = $8799;
+  GL_OUTPUT_VERTEX_EXT = $879A;
+  GL_OUTPUT_COLOR0_EXT = $879B;
+  GL_OUTPUT_COLOR1_EXT = $879C;
+  GL_OUTPUT_TEXTURE_COORD0_EXT = $879D;
+  GL_OUTPUT_TEXTURE_COORD1_EXT = $879E;
+  GL_OUTPUT_TEXTURE_COORD2_EXT = $879F;
+  GL_OUTPUT_TEXTURE_COORD3_EXT = $87A0;
+  GL_OUTPUT_TEXTURE_COORD4_EXT = $87A1;
+  GL_OUTPUT_TEXTURE_COORD5_EXT = $87A2;
+  GL_OUTPUT_TEXTURE_COORD6_EXT = $87A3;
+  GL_OUTPUT_TEXTURE_COORD7_EXT = $87A4;
+  GL_OUTPUT_TEXTURE_COORD8_EXT = $87A5;
+  GL_OUTPUT_TEXTURE_COORD9_EXT = $87A6;
+  GL_OUTPUT_TEXTURE_COORD10_EXT = $87A7;
+  GL_OUTPUT_TEXTURE_COORD11_EXT = $87A8;
+  GL_OUTPUT_TEXTURE_COORD12_EXT = $87A9;
+  GL_OUTPUT_TEXTURE_COORD13_EXT = $87AA;
+  GL_OUTPUT_TEXTURE_COORD14_EXT = $87AB;
+  GL_OUTPUT_TEXTURE_COORD15_EXT = $87AC;
+  GL_OUTPUT_TEXTURE_COORD16_EXT = $87AD;
+  GL_OUTPUT_TEXTURE_COORD17_EXT = $87AE;
+  GL_OUTPUT_TEXTURE_COORD18_EXT = $87AF;
+  GL_OUTPUT_TEXTURE_COORD19_EXT = $87B0;
+  GL_OUTPUT_TEXTURE_COORD20_EXT = $87B1;
+  GL_OUTPUT_TEXTURE_COORD21_EXT = $87B2;
+  GL_OUTPUT_TEXTURE_COORD22_EXT = $87B3;
+  GL_OUTPUT_TEXTURE_COORD23_EXT = $87B4;
+  GL_OUTPUT_TEXTURE_COORD24_EXT = $87B5;
+  GL_OUTPUT_TEXTURE_COORD25_EXT = $87B6;
+  GL_OUTPUT_TEXTURE_COORD26_EXT = $87B7;
+  GL_OUTPUT_TEXTURE_COORD27_EXT = $87B8;
+  GL_OUTPUT_TEXTURE_COORD28_EXT = $87B9;
+  GL_OUTPUT_TEXTURE_COORD29_EXT = $87BA;
+  GL_OUTPUT_TEXTURE_COORD30_EXT = $87BB;
+  GL_OUTPUT_TEXTURE_COORD31_EXT = $87BC;
+  GL_OUTPUT_FOG_EXT = $87BD;
+  GL_SCALAR_EXT = $87BE;
+  GL_VECTOR_EXT = $87BF;
+  GL_MATRIX_EXT = $87C0;
+  GL_VARIANT_EXT = $87C1;
+  GL_INVARIANT_EXT = $87C2;
+  GL_LOCAL_CONSTANT_EXT = $87C3;
+  GL_LOCAL_EXT = $87C4;
+  GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT = $87C5;
+  GL_MAX_VERTEX_SHADER_VARIANTS_EXT = $87C6;
+  GL_MAX_VERTEX_SHADER_INVARIANTS_EXT = $87C7;
+  GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = $87C8;
+  GL_MAX_VERTEX_SHADER_LOCALS_EXT = $87C9;
+  GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT = $87CA;
+  GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT = $87CB;
+  GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = $87CC;
+  GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT = $87CD;
+  GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT = $87CE;
+  GL_VERTEX_SHADER_INSTRUCTIONS_EXT = $87CF;
+  GL_VERTEX_SHADER_VARIANTS_EXT = $87D0;
+  GL_VERTEX_SHADER_INVARIANTS_EXT = $87D1;
+  GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = $87D2;
+  GL_VERTEX_SHADER_LOCALS_EXT = $87D3;
+  GL_VERTEX_SHADER_BINDING_EXT = $8781;
+  GL_VERTEX_SHADER_OPTIMIZED_EXT = $87D4;
+  GL_X_EXT = $87D5;
+  GL_Y_EXT = $87D6;
+  GL_Z_EXT = $87D7;
+  GL_W_EXT = $87D8;
+  GL_NEGATIVE_X_EXT = $87D9;
+  GL_NEGATIVE_Y_EXT = $87DA;
+  GL_NEGATIVE_Z_EXT = $87DB;
+  GL_NEGATIVE_W_EXT = $87DC;
+  GL_ZERO_EXT = $87DD;
+  GL_ONE_EXT = $87DE;
+  GL_NEGATIVE_ONE_EXT = $87DF;
+  GL_NORMALIZED_RANGE_EXT = $87E0;
+  GL_FULL_RANGE_EXT = $87E1;
+  GL_CURRENT_VERTEX_EXT = $87E2;
+  GL_MVP_MATRIX_EXT = $87E3;
+var
+  glBeginVertexShaderEXT: procedure(); extdecl;
+  glEndVertexShaderEXT: procedure(); extdecl;
+  glBindVertexShaderEXT: procedure(id: GLuint); extdecl;
+  glGenVertexShadersEXT: function(range: GLuint): GLuint; extdecl;
+  glDeleteVertexShaderEXT: procedure(id: GLuint); extdecl;
+  glShaderOp1EXT: procedure(op: GLenum; res: GLuint; arg1: GLuint); extdecl;
+  glShaderOp2EXT: procedure(op: GLenum; res: GLuint; arg1: GLuint; arg2: GLuint); extdecl;
+  glShaderOp3EXT: procedure(op: GLenum; res: GLuint; arg1: GLuint; arg2: GLuint; arg3: GLuint); extdecl;
+  glSwizzleEXT: procedure(res: GLuint; _in: GLuint; outX: GLenum; outY: GLenum; outZ: GLenum; outW: GLenum); extdecl;
+  glWriteMaskEXT: procedure(res: GLuint; _in: GLuint; outX: GLenum; outY: GLenum; outZ: GLenum; outW: GLenum); extdecl;
+  glInsertComponentEXT: procedure(res: GLuint; src: GLuint; num: GLuint); extdecl;
+  glExtractComponentEXT: procedure(res: GLuint; src: GLuint; num: GLuint); extdecl;
+  glGenSymbolsEXT: function(datatype: GLenum; storagetype: GLenum; range: GLenum; components: GLuint): GLuint; extdecl;
+  glSetInvariantEXT: procedure(id: GLuint; _type: GLenum; addr: PGLvoid); extdecl;
+  glSetLocalConstantEXT: procedure(id: GLuint; _type: GLenum; addr: PGLvoid); extdecl;
+  glVariantbvEXT: procedure(id: GLuint; addr: PGLbyte); extdecl;
+  glVariantsvEXT: procedure(id: GLuint; addr: PGLshort); extdecl;
+  glVariantivEXT: procedure(id: GLuint; addr: PGLint); extdecl;
+  glVariantfvEXT: procedure(id: GLuint; addr: PGLfloat); extdecl;
+  glVariantdvEXT: procedure(id: GLuint; addr: PGLdouble); extdecl;
+  glVariantubvEXT: procedure(id: GLuint; addr: PGLubyte); extdecl;
+  glVariantusvEXT: procedure(id: GLuint; addr: PGLushort); extdecl;
+  glVariantuivEXT: procedure(id: GLuint; addr: PGLuint); extdecl;
+  glVariantPointerEXT: procedure(id: GLuint; _type: GLenum; stride: GLuint; addr: PGLvoid); extdecl;
+  glEnableVariantClientStateEXT: procedure(id: GLuint); extdecl;
+  glDisableVariantClientStateEXT: procedure(id: GLuint); extdecl;
+  glBindLightParameterEXT: function(light: GLenum; value: GLenum): GLuint; extdecl;
+  glBindMaterialParameterEXT: function(face: GLenum; value: GLenum): GLuint; extdecl;
+  glBindTexGenParameterEXT: function(_unit: GLenum; coord: GLenum; value: GLenum): GLuint; extdecl;
+  glBindTextureUnitParameterEXT: function(_unit: GLenum; value: GLenum): GLuint; extdecl;
+  glBindParameterEXT: function(value: GLenum): GLuint; extdecl;
+  glIsVariantEnabledEXT: function(id: GLuint; cap: GLenum): GLboolean; extdecl;
+  glGetVariantBooleanvEXT: procedure(id: GLuint; value: GLenum; data: PGLboolean); extdecl;
+  glGetVariantIntegervEXT: procedure(id: GLuint; value: GLenum; data: PGLint); extdecl;
+  glGetVariantFloatvEXT: procedure(id: GLuint; value: GLenum; data: PGLfloat); extdecl;
+  glGetVariantPointervEXT: procedure(id: GLuint; value: GLenum; data: PGLvoid); extdecl;
+  glGetInvariantBooleanvEXT: procedure(id: GLuint; value: GLenum; data: PGLboolean); extdecl;
+  glGetInvariantIntegervEXT: procedure(id: GLuint; value: GLenum; data: PGLint); extdecl;
+  glGetInvariantFloatvEXT: procedure(id: GLuint; value: GLenum; data: PGLfloat); extdecl;
+  glGetLocalConstantBooleanvEXT: procedure(id: GLuint; value: GLenum; data: PGLboolean); extdecl;
+  glGetLocalConstantIntegervEXT: procedure(id: GLuint; value: GLenum; data: PGLint); extdecl;
+  glGetLocalConstantFloatvEXT: procedure(id: GLuint; value: GLenum; data: PGLfloat); extdecl;
+
+function Load_GL_EXT_vertex_shader: Boolean;
+
+//***** GL_EXT_vertex_weighting *****//
+const
+  GL_VERTEX_WEIGHTING_EXT = $8509;
+  GL_MODELVIEW0_EXT = $1700;
+  GL_MODELVIEW1_EXT = $850A;
+  GL_MODELVIEW0_MATRIX_EXT = $0BA6;
+  GL_MODELVIEW1_MATRIX_EXT = $8506;
+  GL_CURRENT_VERTEX_WEIGHT_EXT = $850B;
+  GL_VERTEX_WEIGHT_ARRAY_EXT = $850C;
+  GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT = $850D;
+  GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT = $850E;
+  GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT = $850F;
+  GL_MODELVIEW0_STACK_DEPTH_EXT = $0BA3;
+  GL_MODELVIEW1_STACK_DEPTH_EXT = $8502;
+  GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT = $8510;
+var
+  glVertexWeightfEXT: procedure(weight: GLfloat); extdecl;
+  glVertexWeightfvEXT: procedure(weight: PGLfloat); extdecl;
+  glVertexWeightPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; pointer: PGLvoid); extdecl;
+
+function Load_GL_EXT_vertex_weighting: Boolean;
+
+//***** GL_HP_occlusion_test *****//
+const
+  GL_OCCLUSION_TEST_HP = $8165;
+  GL_OCCLUSION_TEST_RESULT_HP = $8166;
+
+function Load_GL_HP_occlusion_test: Boolean;
+
+//***** GL_NV_blend_square *****//
+
+function Load_GL_NV_blend_square: Boolean;
+
+//***** GL_NV_copy_depth_to_color *****//
+const
+  GL_DEPTH_STENCIL_TO_RGBA_NV = $886E;
+  GL_DEPTH_STENCIL_TO_BGRA_NV = $886F;
+
+function Load_GL_NV_copy_depth_to_color: Boolean;
+
+//***** GL_NV_depth_clamp *****//
+const
+  GL_DEPTH_CLAMP_NV = $864F;
+
+function Load_GL_NV_depth_clamp: Boolean;
+
+//***** GL_NV_evaluators *****//
+const
+  GL_EVAL_2D_NV = $86C0;
+  GL_EVAL_TRIANGULAR_2D_NV = $86C1;
+  GL_MAP_TESSELLATION_NV = $86C2;
+  GL_MAP_ATTRIB_U_ORDER_NV = $86C3;
+  GL_MAP_ATTRIB_V_ORDER_NV = $86C4;
+  GL_EVAL_FRACTIONAL_TESSELLATION_NV = $86C5;
+  GL_EVAL_VERTEX_ATTRIB0_NV = $86C6;
+  GL_EVAL_VERTEX_ATTRIB1_NV = $86C7;
+  GL_EVAL_VERTEX_ATTRIB2_NV = $86C8;
+  GL_EVAL_VERTEX_ATTRIB3_NV = $86C9;
+  GL_EVAL_VERTEX_ATTRIB4_NV = $86CA;
+  GL_EVAL_VERTEX_ATTRIB5_NV = $86CB;
+  GL_EVAL_VERTEX_ATTRIB6_NV = $86CC;
+  GL_EVAL_VERTEX_ATTRIB7_NV = $86CD;
+  GL_EVAL_VERTEX_ATTRIB8_NV = $86CE;
+  GL_EVAL_VERTEX_ATTRIB9_NV = $86CF;
+  GL_EVAL_VERTEX_ATTRIB10_NV = $86D0;
+  GL_EVAL_VERTEX_ATTRIB11_NV = $86D1;
+  GL_EVAL_VERTEX_ATTRIB12_NV = $86D2;
+  GL_EVAL_VERTEX_ATTRIB13_NV = $86D3;
+  GL_EVAL_VERTEX_ATTRIB14_NV = $86D4;
+  GL_EVAL_VERTEX_ATTRIB15_NV = $86D5;
+  GL_MAX_MAP_TESSELLATION_NV = $86D6;
+  GL_MAX_RATIONAL_EVAL_ORDER_NV = $86D7;
+var
+  glMapControlPointsNV: procedure(target: GLenum; index: GLuint; _type: GLenum; ustride: GLsizei; vstride: GLsizei; uorder: GLint; vorder: GLint; _packed: GLboolean; const points: PGLvoid); extdecl;
+  glMapParameterivNV: procedure(target: GLenum; pname: GLenum; const params: PGLint); extdecl;
+  glMapParameterfvNV: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glGetMapControlPointsNV: procedure(target: GLenum; index: GLuint; _type: GLenum; ustride: GLsizei; vstride: GLsizei; _packed: GLboolean; points: PGLvoid); extdecl;
+  glGetMapParameterivNV: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetMapParameterfvNV: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetMapAttribParameterivNV: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetMapAttribParameterfvNV: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glEvalMapsNV: procedure(target: GLenum; mode: GLenum); extdecl;
+
+function Load_GL_NV_evaluators: Boolean;
+
+//***** GL_NV_fence *****//
+const
+  GL_ALL_COMPLETED_NV = $84F2;
+  GL_FENCE_STATUS_NV = $84F3;
+  GL_FENCE_CONDITION_NV = $84F4;
+var
+  glGenFencesNV: procedure(n: GLsizei; fences: PGLuint); extdecl;
+  glDeleteFencesNV: procedure(n: GLsizei; const fences: PGLuint); extdecl;
+  glSetFenceNV: procedure(fence: GLuint; condition: GLenum); extdecl;
+  glTestFenceNV: function(fence: GLuint): GLboolean; extdecl;
+  glFinishFenceNV: procedure(fence: GLuint); extdecl;
+  glIsFenceNV: function(fence: GLuint): GLboolean; extdecl;
+  glGetFenceivNV: procedure(fence: GLuint; pname: GLenum; params: PGLint); extdecl;
+
+function Load_GL_NV_fence: Boolean;
+
+//***** GL_NV_fog_distance *****//
+const
+  GL_FOG_DISTANCE_MODE_NV = $855A;
+  GL_EYE_RADIAL_NV = $855B;
+  GL_EYE_PLANE_ABSOLUTE_NV = $855C;
+
+function Load_GL_NV_fog_distance: Boolean;
+
+//***** GL_NV_light_max_exponent *****//
+const
+  GL_MAX_SHININESS_NV = $8504;
+  GL_MAX_SPOT_EXPONENT_NV = $8505;
+
+function Load_GL_NV_light_max_exponent: Boolean;
+
+//***** GL_NV_multisample_filter_hint *****//
+const
+  GL_MULTISAMPLE_FILTER_HINT_NV = $8534;
+
+function Load_GL_NV_multisample_filter_hint: Boolean;
+
+//***** GL_NV_occlusion_query *****//
+  // GL_OCCLUSION_TEST_HP  { already defined }
+  // GL_OCCLUSION_TEST_RESULT_HP  { already defined }
+const
+  GL_PIXEL_COUNTER_BITS_NV = $8864;
+  GL_CURRENT_OCCLUSION_QUERY_ID_NV = $8865;
+  GL_PIXEL_COUNT_NV = $8866;
+  GL_PIXEL_COUNT_AVAILABLE_NV = $8867;
+var
+  glGenOcclusionQueriesNV: procedure(n: GLsizei; ids: PGLuint); extdecl;
+  glDeleteOcclusionQueriesNV: procedure(n: GLsizei; const ids: PGLuint); extdecl;
+  glIsOcclusionQueryNV: function(id: GLuint): GLboolean; extdecl;
+  glBeginOcclusionQueryNV: procedure(id: GLuint); extdecl;
+  glEndOcclusionQueryNV: procedure(); extdecl;
+  glGetOcclusionQueryivNV: procedure(id: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetOcclusionQueryuivNV: procedure(id: GLuint; pname: GLenum; params: PGLuint); extdecl;
+
+function Load_GL_NV_occlusion_query: Boolean;
+
+//***** GL_NV_packed_depth_stencil *****//
+const
+  GL_DEPTH_STENCIL_NV = $84F9;
+  GL_UNSIGNED_INT_24_8_NV = $84FA;
+
+function Load_GL_NV_packed_depth_stencil: Boolean;
+
+//***** GL_NV_point_sprite *****//
+const
+  GL_POINT_SPRITE_NV = $8861;
+  GL_COORD_REPLACE_NV = $8862;
+  GL_POINT_SPRITE_R_MODE_NV = $8863;
+var
+  glPointParameteriNV: procedure(pname: GLenum; param: GLint); extdecl;
+  glPointParameterivNV: procedure(pname: GLenum; const params: PGLint); extdecl;
+
+function Load_GL_NV_point_sprite: Boolean;
+
+//***** GL_NV_register_combiners *****//
+const
+  GL_REGISTER_COMBINERS_NV = $8522;
+  GL_COMBINER0_NV = $8550;
+  GL_COMBINER1_NV = $8551;
+  GL_COMBINER2_NV = $8552;
+  GL_COMBINER3_NV = $8553;
+  GL_COMBINER4_NV = $8554;
+  GL_COMBINER5_NV = $8555;
+  GL_COMBINER6_NV = $8556;
+  GL_COMBINER7_NV = $8557;
+  GL_VARIABLE_A_NV = $8523;
+  GL_VARIABLE_B_NV = $8524;
+  GL_VARIABLE_C_NV = $8525;
+  GL_VARIABLE_D_NV = $8526;
+  GL_VARIABLE_E_NV = $8527;
+  GL_VARIABLE_F_NV = $8528;
+  GL_VARIABLE_G_NV = $8529;
+  GL_CONSTANT_COLOR0_NV = $852A;
+  GL_CONSTANT_COLOR1_NV = $852B;
+  GL_PRIMARY_COLOR_NV = $852C;
+  GL_SECONDARY_COLOR_NV = $852D;
+  GL_SPARE0_NV = $852E;
+  GL_SPARE1_NV = $852F;
+  GL_UNSIGNED_IDENTITY_NV = $8536;
+  GL_UNSIGNED_INVERT_NV = $8537;
+  GL_EXPAND_NORMAL_NV = $8538;
+  GL_EXPAND_NEGATE_NV = $8539;
+  GL_HALF_BIAS_NORMAL_NV = $853A;
+  GL_HALF_BIAS_NEGATE_NV = $853B;
+  GL_SIGNED_IDENTITY_NV = $853C;
+  GL_SIGNED_NEGATE_NV = $853D;
+  GL_E_TIMES_F_NV = $8531;
+  GL_SPARE0_PLUS_SECONDARY_COLOR_NV = $8532;
+  GL_SCALE_BY_TWO_NV = $853E;
+  GL_SCALE_BY_FOUR_NV = $853F;
+  GL_SCALE_BY_ONE_HALF_NV = $8540;
+  GL_BIAS_BY_NEGATIVE_ONE_HALF_NV = $8541;
+  GL_DISCARD_NV = $8530;
+  GL_COMBINER_INPUT_NV = $8542;
+  GL_COMBINER_MAPPING_NV = $8543;
+  GL_COMBINER_COMPONENT_USAGE_NV = $8544;
+  GL_COMBINER_AB_DOT_PRODUCT_NV = $8545;
+  GL_COMBINER_CD_DOT_PRODUCT_NV = $8546;
+  GL_COMBINER_MUX_SUM_NV = $8547;
+  GL_COMBINER_SCALE_NV = $8548;
+  GL_COMBINER_BIAS_NV = $8549;
+  GL_COMBINER_AB_OUTPUT_NV = $854A;
+  GL_COMBINER_CD_OUTPUT_NV = $854B;
+  GL_COMBINER_SUM_OUTPUT_NV = $854C;
+  GL_NUM_GENERAL_COMBINERS_NV = $854E;
+  GL_COLOR_SUM_CLAMP_NV = $854F;
+  GL_MAX_GENERAL_COMBINERS_NV = $854D;
+var
+  glCombinerParameterfvNV: procedure(pname: GLenum; const params: PGLfloat); extdecl;
+  glCombinerParameterivNV: procedure(pname: GLenum; const params: PGLint); extdecl;
+  glCombinerParameterfNV: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glCombinerParameteriNV: procedure(pname: GLenum; param: GLint); extdecl;
+  glCombinerInputNV: procedure(stage: GLenum; portion: GLenum; variable: GLenum; input: GLenum; mapping: GLenum; componentUsage: GLenum); extdecl;
+  glCombinerOutputNV: procedure(stage: GLenum; portion: GLenum; abOutput: GLenum; cdOutput: GLenum; sumOutput: GLenum; scale: GLenum; bias: GLenum; abDotProduct: GLboolean; cdDotProduct: GLboolean; muxSum: GLboolean); extdecl;
+  glFinalCombinerInputNV: procedure(variable: GLenum; input: GLenum; mapping: GLenum; componentUsage: GLenum); extdecl;
+  glGetCombinerInputParameterfvNV: procedure(stage: GLenum; portion: GLenum; variable: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetCombinerInputParameterivNV: procedure(stage: GLenum; portion: GLenum; variable: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetCombinerOutputParameterfvNV: procedure(stage: GLenum; portion: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetCombinerOutputParameterivNV: procedure(stage: GLenum; portion: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetFinalCombinerInputParameterfvNV: procedure(variable: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetFinalCombinerInputParameterivNV: procedure(variable: GLenum; pname: GLenum; params: PGLint); extdecl;
+
+function Load_GL_NV_register_combiners: Boolean;
+
+//***** GL_NV_register_combiners2 *****//
+const
+  GL_PER_STAGE_CONSTANTS_NV = $8535;
+var
+  glCombinerStageParameterfvNV: procedure(stage: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glGetCombinerStageParameterfvNV: procedure(stage: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+
+function Load_GL_NV_register_combiners2: Boolean;
+
+//***** GL_NV_texgen_emboss *****//
+const
+  GL_EMBOSS_MAP_NV = $855F;
+  GL_EMBOSS_LIGHT_NV = $855D;
+  GL_EMBOSS_CONSTANT_NV = $855E;
+
+function Load_GL_NV_texgen_emboss: Boolean;
+
+//***** GL_NV_texgen_reflection *****//
+const
+  GL_NORMAL_MAP_NV = $8511;
+  GL_REFLECTION_MAP_NV = $8512;
+
+function Load_GL_NV_texgen_reflection: Boolean;
+
+//***** GL_NV_texture_compression_vtc *****//
+  // GL_COMPRESSED_RGB_S3TC_DXT1_EXT  { already defined }
+  // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT  { already defined }
+  // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT  { already defined }
+  // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT  { already defined }
+
+function Load_GL_NV_texture_compression_vtc: Boolean;
+
+//***** GL_NV_texture_env_combine4 *****//
+const
+  GL_COMBINE4_NV = $8503;
+  GL_SOURCE3_RGB_NV = $8583;
+  GL_SOURCE3_ALPHA_NV = $858B;
+  GL_OPERAND3_RGB_NV = $8593;
+  GL_OPERAND3_ALPHA_NV = $859B;
+
+function Load_GL_NV_texture_env_combine4: Boolean;
+
+//***** GL_NV_texture_rectangle *****//
+const
+  GL_TEXTURE_RECTANGLE_NV = $84F5;
+  GL_TEXTURE_BINDING_RECTANGLE_NV = $84F6;
+  GL_PROXY_TEXTURE_RECTANGLE_NV = $84F7;
+  GL_MAX_RECTANGLE_TEXTURE_SIZE_NV = $84F8;
+
+function Load_GL_NV_texture_rectangle: Boolean;
+
+//***** GL_NV_texture_shader *****//
+const
+  GL_TEXTURE_SHADER_NV = $86DE;
+  GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV = $86D9;
+  GL_SHADER_OPERATION_NV = $86DF;
+  GL_CULL_MODES_NV = $86E0;
+  GL_OFFSET_TEXTURE_MATRIX_NV = $86E1;
+  GL_OFFSET_TEXTURE_SCALE_NV = $86E2;
+  GL_OFFSET_TEXTURE_BIAS_NV = $86E3;
+  GL_PREVIOUS_TEXTURE_INPUT_NV = $86E4;
+  GL_CONST_EYE_NV = $86E5;
+  GL_SHADER_CONSISTENT_NV = $86DD;
+  GL_PASS_THROUGH_NV = $86E6;
+  GL_CULL_FRAGMENT_NV = $86E7;
+  GL_OFFSET_TEXTURE_2D_NV = $86E8;
+  GL_OFFSET_TEXTURE_RECTANGLE_NV = $864C;
+  GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV = $864D;
+  GL_DEPENDENT_AR_TEXTURE_2D_NV = $86E9;
+  GL_DEPENDENT_GB_TEXTURE_2D_NV = $86EA;
+  GL_DOT_PRODUCT_NV = $86EC;
+  GL_DOT_PRODUCT_DEPTH_REPLACE_NV = $86ED;
+  GL_DOT_PRODUCT_TEXTURE_2D_NV = $86EE;
+  GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV = $864E;
+  GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV = $86F0;
+  GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV = $86F1;
+  GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV = $86F2;
+  GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV = $86F3;
+  GL_HILO_NV = $86F4;
+  GL_DSDT_NV = $86F5;
+  GL_DSDT_MAG_NV = $86F6;
+  GL_DSDT_MAG_VIB_NV = $86F7;
+  GL_UNSIGNED_INT_S8_S8_8_8_NV = $86DA;
+  GL_UNSIGNED_INT_8_8_S8_S8_REV_NV = $86DB;
+  GL_SIGNED_RGBA_NV = $86FB;
+  GL_SIGNED_RGBA8_NV = $86FC;
+  GL_SIGNED_RGB_NV = $86FE;
+  GL_SIGNED_RGB8_NV = $86FF;
+  GL_SIGNED_LUMINANCE_NV = $8701;
+  GL_SIGNED_LUMINANCE8_NV = $8702;
+  GL_SIGNED_LUMINANCE_ALPHA_NV = $8703;
+  GL_SIGNED_LUMINANCE8_ALPHA8_NV = $8704;
+  GL_SIGNED_ALPHA_NV = $8705;
+  GL_SIGNED_ALPHA8_NV = $8706;
+  GL_SIGNED_INTENSITY_NV = $8707;
+  GL_SIGNED_INTENSITY8_NV = $8708;
+  GL_SIGNED_RGB_UNSIGNED_ALPHA_NV = $870C;
+  GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV = $870D;
+  GL_HILO16_NV = $86F8;
+  GL_SIGNED_HILO_NV = $86F9;
+  GL_SIGNED_HILO16_NV = $86FA;
+  GL_DSDT8_NV = $8709;
+  GL_DSDT8_MAG8_NV = $870A;
+  GL_DSDT_MAG_INTENSITY_NV = $86DC;
+  GL_DSDT8_MAG8_INTENSITY8_NV = $870B;
+  GL_HI_SCALE_NV = $870E;
+  GL_LO_SCALE_NV = $870F;
+  GL_DS_SCALE_NV = $8710;
+  GL_DT_SCALE_NV = $8711;
+  GL_MAGNITUDE_SCALE_NV = $8712;
+  GL_VIBRANCE_SCALE_NV = $8713;
+  GL_HI_BIAS_NV = $8714;
+  GL_LO_BIAS_NV = $8715;
+  GL_DS_BIAS_NV = $8716;
+  GL_DT_BIAS_NV = $8717;
+  GL_MAGNITUDE_BIAS_NV = $8718;
+  GL_VIBRANCE_BIAS_NV = $8719;
+  GL_TEXTURE_BORDER_VALUES_NV = $871A;
+  GL_TEXTURE_HI_SIZE_NV = $871B;
+  GL_TEXTURE_LO_SIZE_NV = $871C;
+  GL_TEXTURE_DS_SIZE_NV = $871D;
+  GL_TEXTURE_DT_SIZE_NV = $871E;
+  GL_TEXTURE_MAG_SIZE_NV = $871F;
+
+function Load_GL_NV_texture_shader: Boolean;
+
+//***** GL_NV_texture_shader2 *****//
+const
+  GL_DOT_PRODUCT_TEXTURE_3D_NV = $86EF;
+  // GL_HILO_NV  { already defined }
+  // GL_DSDT_NV  { already defined }
+  // GL_DSDT_MAG_NV  { already defined }
+  // GL_DSDT_MAG_VIB_NV  { already defined }
+  // GL_UNSIGNED_INT_S8_S8_8_8_NV  { already defined }
+  // GL_UNSIGNED_INT_8_8_S8_S8_REV_NV  { already defined }
+  // GL_SIGNED_RGBA_NV  { already defined }
+  // GL_SIGNED_RGBA8_NV  { already defined }
+  // GL_SIGNED_RGB_NV  { already defined }
+  // GL_SIGNED_RGB8_NV  { already defined }
+  // GL_SIGNED_LUMINANCE_NV  { already defined }
+  // GL_SIGNED_LUMINANCE8_NV  { already defined }
+  // GL_SIGNED_LUMINANCE_ALPHA_NV  { already defined }
+  // GL_SIGNED_LUMINANCE8_ALPHA8_NV  { already defined }
+  // GL_SIGNED_ALPHA_NV  { already defined }
+  // GL_SIGNED_ALPHA8_NV  { already defined }
+  // GL_SIGNED_INTENSITY_NV  { already defined }
+  // GL_SIGNED_INTENSITY8_NV  { already defined }
+  // GL_SIGNED_RGB_UNSIGNED_ALPHA_NV  { already defined }
+  // GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV  { already defined }
+  // GL_HILO16_NV  { already defined }
+  // GL_SIGNED_HILO_NV  { already defined }
+  // GL_SIGNED_HILO16_NV  { already defined }
+  // GL_DSDT8_NV  { already defined }
+  // GL_DSDT8_MAG8_NV  { already defined }
+  // GL_DSDT_MAG_INTENSITY_NV  { already defined }
+  // GL_DSDT8_MAG8_INTENSITY8_NV  { already defined }
+
+function Load_GL_NV_texture_shader2: Boolean;
+
+//***** GL_NV_texture_shader3 *****//
+const
+  GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV = $8850;
+  GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV = $8851;
+  GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV = $8852;
+  GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV = $8853;
+  GL_OFFSET_HILO_TEXTURE_2D_NV = $8854;
+  GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV = $8855;
+  GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV = $8856;
+  GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV = $8857;
+  GL_DEPENDENT_HILO_TEXTURE_2D_NV = $8858;
+  GL_DEPENDENT_RGB_TEXTURE_3D_NV = $8859;
+  GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV = $885A;
+  GL_DOT_PRODUCT_PASS_THROUGH_NV = $885B;
+  GL_DOT_PRODUCT_TEXTURE_1D_NV = $885C;
+  GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV = $885D;
+  GL_HILO8_NV = $885E;
+  GL_SIGNED_HILO8_NV = $885F;
+  GL_FORCE_BLUE_TO_ONE_NV = $8860;
+
+function Load_GL_NV_texture_shader3: Boolean;
+
+//***** GL_NV_vertex_array_range *****//
+const
+  GL_VERTEX_ARRAY_RANGE_NV = $851D;
+  GL_VERTEX_ARRAY_RANGE_LENGTH_NV = $851E;
+  GL_VERTEX_ARRAY_RANGE_VALID_NV = $851F;
+  GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV = $8520;
+  GL_VERTEX_ARRAY_RANGE_POINTER_NV = $8521;
+var
+  glVertexArrayRangeNV: procedure(length: GLsizei; pointer: PGLvoid); extdecl;
+  glFlushVertexArrayRangeNV: procedure(); extdecl;
+{$IFDEF Windows}
+  wglAllocateMemoryNV: function(size: GLsizei; readFrequency: GLfloat; writeFrequency: GLfloat; priority: GLfloat): PGLvoid; extdecl;
+  wglFreeMemoryNV: procedure(pointer: PGLvoid); extdecl;
+{$ENDIF}
+
+function Load_GL_NV_vertex_array_range: Boolean;
+
+//***** GL_NV_vertex_array_range2 *****//
+const
+  GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV = $8533;
+
+function Load_GL_NV_vertex_array_range2: Boolean;
+
+//***** GL_NV_vertex_program *****//
+const
+  GL_VERTEX_PROGRAM_NV = $8620;
+  GL_VERTEX_PROGRAM_POINT_SIZE_NV = $8642;
+  GL_VERTEX_PROGRAM_TWO_SIDE_NV = $8643;
+  GL_VERTEX_STATE_PROGRAM_NV = $8621;
+  GL_ATTRIB_ARRAY_SIZE_NV = $8623;
+  GL_ATTRIB_ARRAY_STRIDE_NV = $8624;
+  GL_ATTRIB_ARRAY_TYPE_NV = $8625;
+  GL_CURRENT_ATTRIB_NV = $8626;
+  GL_PROGRAM_PARAMETER_NV = $8644;
+  GL_ATTRIB_ARRAY_POINTER_NV = $8645;
+  GL_PROGRAM_TARGET_NV = $8646;
+  GL_PROGRAM_LENGTH_NV = $8627;
+  GL_PROGRAM_RESIDENT_NV = $8647;
+  GL_PROGRAM_STRING_NV = $8628;
+  GL_TRACK_MATRIX_NV = $8648;
+  GL_TRACK_MATRIX_TRANSFORM_NV = $8649;
+  GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV = $862E;
+  GL_MAX_TRACK_MATRICES_NV = $862F;
+  GL_CURRENT_MATRIX_STACK_DEPTH_NV = $8640;
+  GL_CURRENT_MATRIX_NV = $8641;
+  GL_VERTEX_PROGRAM_BINDING_NV = $864A;
+  GL_PROGRAM_ERROR_POSITION_NV = $864B;
+  GL_MODELVIEW_PROJECTION_NV = $8629;
+  GL_MATRIX0_NV = $8630;
+  GL_MATRIX1_NV = $8631;
+  GL_MATRIX2_NV = $8632;
+  GL_MATRIX3_NV = $8633;
+  GL_MATRIX4_NV = $8634;
+  GL_MATRIX5_NV = $8635;
+  GL_MATRIX6_NV = $8636;
+  GL_MATRIX7_NV = $8637;
+  GL_IDENTITY_NV = $862A;
+  GL_INVERSE_NV = $862B;
+  GL_TRANSPOSE_NV = $862C;
+  GL_INVERSE_TRANSPOSE_NV = $862D;
+  GL_VERTEX_ATTRIB_ARRAY0_NV = $8650;
+  GL_VERTEX_ATTRIB_ARRAY1_NV = $8651;
+  GL_VERTEX_ATTRIB_ARRAY2_NV = $8652;
+  GL_VERTEX_ATTRIB_ARRAY3_NV = $8653;
+  GL_VERTEX_ATTRIB_ARRAY4_NV = $8654;
+  GL_VERTEX_ATTRIB_ARRAY5_NV = $8655;
+  GL_VERTEX_ATTRIB_ARRAY6_NV = $8656;
+  GL_VERTEX_ATTRIB_ARRAY7_NV = $8657;
+  GL_VERTEX_ATTRIB_ARRAY8_NV = $8658;
+  GL_VERTEX_ATTRIB_ARRAY9_NV = $8659;
+  GL_VERTEX_ATTRIB_ARRAY10_NV = $865A;
+  GL_VERTEX_ATTRIB_ARRAY11_NV = $865B;
+  GL_VERTEX_ATTRIB_ARRAY12_NV = $865C;
+  GL_VERTEX_ATTRIB_ARRAY13_NV = $865D;
+  GL_VERTEX_ATTRIB_ARRAY14_NV = $865E;
+  GL_VERTEX_ATTRIB_ARRAY15_NV = $865F;
+  GL_MAP1_VERTEX_ATTRIB0_4_NV = $8660;
+  GL_MAP1_VERTEX_ATTRIB1_4_NV = $8661;
+  GL_MAP1_VERTEX_ATTRIB2_4_NV = $8662;
+  GL_MAP1_VERTEX_ATTRIB3_4_NV = $8663;
+  GL_MAP1_VERTEX_ATTRIB4_4_NV = $8664;
+  GL_MAP1_VERTEX_ATTRIB5_4_NV = $8665;
+  GL_MAP1_VERTEX_ATTRIB6_4_NV = $8666;
+  GL_MAP1_VERTEX_ATTRIB7_4_NV = $8667;
+  GL_MAP1_VERTEX_ATTRIB8_4_NV = $8668;
+  GL_MAP1_VERTEX_ATTRIB9_4_NV = $8669;
+  GL_MAP1_VERTEX_ATTRIB10_4_NV = $866A;
+  GL_MAP1_VERTEX_ATTRIB11_4_NV = $866B;
+  GL_MAP1_VERTEX_ATTRIB12_4_NV = $866C;
+  GL_MAP1_VERTEX_ATTRIB13_4_NV = $866D;
+  GL_MAP1_VERTEX_ATTRIB14_4_NV = $866E;
+  GL_MAP1_VERTEX_ATTRIB15_4_NV = $866F;
+  GL_MAP2_VERTEX_ATTRIB0_4_NV = $8670;
+  GL_MAP2_VERTEX_ATTRIB1_4_NV = $8671;
+  GL_MAP2_VERTEX_ATTRIB2_4_NV = $8672;
+  GL_MAP2_VERTEX_ATTRIB3_4_NV = $8673;
+  GL_MAP2_VERTEX_ATTRIB4_4_NV = $8674;
+  GL_MAP2_VERTEX_ATTRIB5_4_NV = $8675;
+  GL_MAP2_VERTEX_ATTRIB6_4_NV = $8676;
+  GL_MAP2_VERTEX_ATTRIB7_4_NV = $8677;
+  GL_MAP2_VERTEX_ATTRIB8_4_NV = $8678;
+  GL_MAP2_VERTEX_ATTRIB9_4_NV = $8679;
+  GL_MAP2_VERTEX_ATTRIB10_4_NV = $867A;
+  GL_MAP2_VERTEX_ATTRIB11_4_NV = $867B;
+  GL_MAP2_VERTEX_ATTRIB12_4_NV = $867C;
+  GL_MAP2_VERTEX_ATTRIB13_4_NV = $867D;
+  GL_MAP2_VERTEX_ATTRIB14_4_NV = $867E;
+  GL_MAP2_VERTEX_ATTRIB15_4_NV = $867F;
+var
+  glBindProgramNV: procedure(target: GLenum; id: GLuint); extdecl;
+  glDeleteProgramsNV: procedure(n: GLsizei; const ids: PGLuint); extdecl;
+  glExecuteProgramNV: procedure(target: GLenum; id: GLuint; const params: PGLfloat); extdecl;
+  glGenProgramsNV: procedure(n: GLsizei; ids: PGLuint); extdecl;
+  glAreProgramsResidentNV: function(n: GLsizei; const ids: PGLuint; residences: PGLboolean): GLboolean; extdecl;
+  glRequestResidentProgramsNV: procedure(n: GLsizei; ids: PGLuint); extdecl;
+  glGetProgramParameterfvNV: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glGetProgramParameterdvNV: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLdouble); extdecl;
+  glGetProgramivNV: procedure(id: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetProgramStringNV: procedure(id: GLuint; pname: GLenum; _program: PGLubyte); extdecl;
+  glGetTrackMatrixivNV: procedure(target: GLenum; address: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetVertexAttribdvNV: procedure(index: GLuint; pname: GLenum; params: PGLdouble); extdecl;
+  glGetVertexAttribfvNV: procedure(index: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glGetVertexAttribivNV: procedure(index: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetVertexAttribPointervNV: procedure(index: GLuint; pname: GLenum; pointer: PGLvoid); extdecl;
+  glIsProgramNV: function(id: GLuint): GLboolean; extdecl;
+  glLoadProgramNV: procedure(target: GLenum; id: GLuint; len: GLsizei; const _program: PGLubyte); extdecl;
+  glProgramParameter4fNV: procedure(target: GLenum; index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glProgramParameter4fvNV: procedure(target: GLenum; index: GLuint; const params: PGLfloat); extdecl;
+  glProgramParameters4dvNV: procedure(target: GLenum; index: GLuint; num: GLuint; const params: PGLdouble); extdecl;
+  glProgramParameters4fvNV: procedure(target: GLenum; index: GLuint; num: GLuint; const params: PGLfloat); extdecl;
+  glTrackMatrixNV: procedure(target: GLenum; address: GLuint; matrix: GLenum; transform: GLenum); extdecl;
+  glVertexAttribPointerNV: procedure(index: GLuint; size: GLint; _type: GLenum; stride: GLsizei; const pointer: PGLvoid); extdecl;
+  glVertexAttrib1sNV: procedure(index: GLuint; x: GLshort); extdecl;
+  glVertexAttrib1fNV: procedure(index: GLuint; x: GLfloat); extdecl;
+  glVertexAttrib1dNV: procedure(index: GLuint; x: GLdouble); extdecl;
+  glVertexAttrib2sNV: procedure(index: GLuint; x: GLshort; y: GLshort); extdecl;
+  glVertexAttrib2fNV: procedure(index: GLuint; x: GLfloat; y: GLfloat); extdecl;
+  glVertexAttrib2dNV: procedure(index: GLuint; x: GLdouble; y: GLdouble); extdecl;
+  glVertexAttrib3sNV: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort); extdecl;
+  glVertexAttrib3fNV: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glVertexAttrib3dNV: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble); extdecl;
+  glVertexAttrib4sNV: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort; w: GLshort); extdecl;
+  glVertexAttrib4fNV: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glVertexAttrib4dNV: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); extdecl;
+  glVertexAttrib4ubNV: procedure(index: GLuint; x: GLubyte; y: GLubyte; z: GLubyte; w: GLubyte); extdecl;
+  glVertexAttrib1svNV: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib1fvNV: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib1dvNV: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib2svNV: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib2fvNV: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib2dvNV: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib3svNV: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib3fvNV: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib3dvNV: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib4svNV: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib4fvNV: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib4dvNV: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib4ubvNV: procedure(index: GLuint; const v: PGLubyte); extdecl;
+  glVertexAttribs1svNV: procedure(index: GLuint; n: GLsizei; const v: PGLshort); extdecl;
+  glVertexAttribs1fvNV: procedure(index: GLuint; n: GLsizei; const v: PGLfloat); extdecl;
+  glVertexAttribs1dvNV: procedure(index: GLuint; n: GLsizei; const v: PGLdouble); extdecl;
+  glVertexAttribs2svNV: procedure(index: GLuint; n: GLsizei; const v: PGLshort); extdecl;
+  glVertexAttribs2fvNV: procedure(index: GLuint; n: GLsizei; const v: PGLfloat); extdecl;
+  glVertexAttribs2dvNV: procedure(index: GLuint; n: GLsizei; const v: PGLdouble); extdecl;
+  glVertexAttribs3svNV: procedure(index: GLuint; n: GLsizei; const v: PGLshort); extdecl;
+  glVertexAttribs3fvNV: procedure(index: GLuint; n: GLsizei; const v: PGLfloat); extdecl;
+  glVertexAttribs3dvNV: procedure(index: GLuint; n: GLsizei; const v: PGLdouble); extdecl;
+  glVertexAttribs4svNV: procedure(index: GLuint; n: GLsizei; const v: PGLshort); extdecl;
+  glVertexAttribs4fvNV: procedure(index: GLuint; n: GLsizei; const v: PGLfloat); extdecl;
+  glVertexAttribs4dvNV: procedure(index: GLuint; n: GLsizei; const v: PGLdouble); extdecl;
+  glVertexAttribs4ubvNV: procedure(index: GLuint; n: GLsizei; const v: PGLubyte); extdecl;
+
+function Load_GL_NV_vertex_program: Boolean;
+
+//***** GL_NV_vertex_program1_1 *****//
+
+function Load_GL_NV_vertex_program1_1: Boolean;
+
+//***** GL_ATI_element_array *****//
+const
+  GL_ELEMENT_ARRAY_ATI = $8768;
+  GL_ELEMENT_ARRAY_TYPE_ATI = $8769;
+  GL_ELEMENT_ARRAY_POINTER_ATI = $876A;
+var
+  glElementPointerATI: procedure(_type: GLenum; const pointer: PGLvoid); extdecl;
+  glDrawElementArrayATI: procedure(mode: GLenum; count: GLsizei); extdecl;
+  glDrawRangeElementArrayATI: procedure(mode: GLenum; start: GLuint; _end: GLuint; count: GLsizei); extdecl;
+
+function Load_GL_ATI_element_array: Boolean;
+
+//***** GL_ATI_envmap_bumpmap *****//
+const
+  GL_BUMP_ROT_MATRIX_ATI = $8775;
+  GL_BUMP_ROT_MATRIX_SIZE_ATI = $8776;
+  GL_BUMP_NUM_TEX_UNITS_ATI = $8777;
+  GL_BUMP_TEX_UNITS_ATI = $8778;
+  GL_DUDV_ATI = $8779;
+  GL_DU8DV8_ATI = $877A;
+  GL_BUMP_ENVMAP_ATI = $877B;
+  GL_BUMP_TARGET_ATI = $877C;
+var
+  glTexBumpParameterivATI: procedure(pname: GLenum; param: PGLint); extdecl;
+  glTexBumpParameterfvATI: procedure(pname: GLenum; param: PGLfloat); extdecl;
+  glGetTexBumpParameterivATI: procedure(pname: GLenum; param: PGLint); extdecl;
+  glGetTexBumpParameterfvATI: procedure(pname: GLenum; param: PGLfloat); extdecl;
+
+function Load_GL_ATI_envmap_bumpmap: Boolean;
+
+//***** GL_ATI_fragment_shader *****//
+const
+  GL_FRAGMENT_SHADER_ATI = $8920;
+  GL_REG_0_ATI = $8921;
+  GL_REG_1_ATI = $8922;
+  GL_REG_2_ATI = $8923;
+  GL_REG_3_ATI = $8924;
+  GL_REG_4_ATI = $8925;
+  GL_REG_5_ATI = $8926;
+  GL_CON_0_ATI = $8941;
+  GL_CON_1_ATI = $8942;
+  GL_CON_2_ATI = $8943;
+  GL_CON_3_ATI = $8944;
+  GL_CON_4_ATI = $8945;
+  GL_CON_5_ATI = $8946;
+  GL_CON_6_ATI = $8947;
+  GL_CON_7_ATI = $8948;
+  GL_MOV_ATI = $8961;
+  GL_ADD_ATI = $8963;
+  GL_MUL_ATI = $8964;
+  GL_SUB_ATI = $8965;
+  GL_DOT3_ATI = $8966;
+  GL_DOT4_ATI = $8967;
+  GL_MAD_ATI = $8968;
+  GL_LERP_ATI = $8969;
+  GL_CND_ATI = $896A;
+  GL_CND0_ATI = $896B;
+  GL_DOT2_ADD_ATI = $896C;
+  GL_SECONDARY_INTERPOLATOR_ATI = $896D;
+  GL_SWIZZLE_STR_ATI = $8976;
+  GL_SWIZZLE_STQ_ATI = $8977;
+  GL_SWIZZLE_STR_DR_ATI = $8978;
+  GL_SWIZZLE_STQ_DQ_ATI = $8979;
+  GL_RED_BIT_ATI = $0001;
+  GL_GREEN_BIT_ATI = $0002;
+  GL_BLUE_BIT_ATI = $0004;
+  GL_2X_BIT_ATI = $0001;
+  GL_4X_BIT_ATI = $0002;
+  GL_8X_BIT_ATI = $0004;
+  GL_HALF_BIT_ATI = $0008;
+  GL_QUARTER_BIT_ATI = $0010;
+  GL_EIGHTH_BIT_ATI = $0020;
+  GL_SATURATE_BIT_ATI = $0040;
+  // GL_2X_BIT_ATI  { already defined }
+  GL_COMP_BIT_ATI = $0002;
+  GL_NEGATE_BIT_ATI = $0004;
+  GL_BIAS_BIT_ATI = $0008;
+var
+  glGenFragmentShadersATI: function(range: GLuint): GLuint; extdecl;
+  glBindFragmentShaderATI: procedure(id: GLuint); extdecl;
+  glDeleteFragmentShaderATI: procedure(id: GLuint); extdecl;
+  glBeginFragmentShaderATI: procedure(); extdecl;
+  glEndFragmentShaderATI: procedure(); extdecl;
+  glPassTexCoordATI: procedure(dst: GLuint; coord: GLuint; swizzle: GLenum); extdecl;
+  glSampleMapATI: procedure(dst: GLuint; interp: GLuint; swizzle: GLenum); extdecl;
+  glColorFragmentOp1ATI: procedure(op: GLenum; dst: GLuint; dstMask: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint); extdecl;
+  glColorFragmentOp2ATI: procedure(op: GLenum; dst: GLuint; dstMask: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint; arg2: GLuint; arg2Rep: GLuint; arg2Mod: GLuint); extdecl;
+  glColorFragmentOp3ATI: procedure(op: GLenum; dst: GLuint; dstMask: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint; arg2: GLuint; arg2Rep: GLuint; arg2Mod: GLuint; arg3: GLuint; arg3Rep: GLuint; arg3Mod: GLuint); extdecl;
+  glAlphaFragmentOp1ATI: procedure(op: GLenum; dst: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint); extdecl;
+  glAlphaFragmentOp2ATI: procedure(op: GLenum; dst: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint; arg2: GLuint; arg2Rep: GLuint; arg2Mod: GLuint); extdecl;
+  glAlphaFragmentOp3ATI: procedure(op: GLenum; dst: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint; arg2: GLuint; arg2Rep: GLuint; arg2Mod: GLuint; arg3: GLuint; arg3Rep: GLuint; arg3Mod: GLuint); extdecl;
+  glSetFragmentShaderConstantATI: procedure(dst: GLuint; const value: PGLfloat); extdecl;
+
+function Load_GL_ATI_fragment_shader: Boolean;
+
+//***** GL_ATI_pn_triangles *****//
+const
+  GL_PN_TRIANGLES_ATI = $87F0;
+  GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI = $87F1;
+  GL_PN_TRIANGLES_POINT_MODE_ATI = $87F2;
+  GL_PN_TRIANGLES_NORMAL_MODE_ATI = $87F3;
+  GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI = $87F4;
+  GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI = $87F5;
+  GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI = $87F6;
+  GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI = $87F7;
+  GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI = $87F8;
+var
+  glPNTrianglesiATI: procedure(pname: GLenum; param: GLint); extdecl;
+  glPNTrianglesfATI: procedure(pname: GLenum; param: GLfloat); extdecl;
+
+function Load_GL_ATI_pn_triangles: Boolean;
+
+//***** GL_ATI_texture_mirror_once *****//
+const
+  GL_MIRROR_CLAMP_ATI = $8742;
+  GL_MIRROR_CLAMP_TO_EDGE_ATI = $8743;
+
+function Load_GL_ATI_texture_mirror_once: Boolean;
+
+//***** GL_ATI_vertex_array_object *****//
+const
+  GL_STATIC_ATI = $8760;
+  GL_DYNAMIC_ATI = $8761;
+  GL_PRESERVE_ATI = $8762;
+  GL_DISCARD_ATI = $8763;
+  GL_OBJECT_BUFFER_SIZE_ATI = $8764;
+  GL_OBJECT_BUFFER_USAGE_ATI = $8765;
+  GL_ARRAY_OBJECT_BUFFER_ATI = $8766;
+  GL_ARRAY_OBJECT_OFFSET_ATI = $8767;
+var
+  glNewObjectBufferATI: function(size: GLsizei; const pointer: PGLvoid; usage: GLenum): GLuint; extdecl;
+  glIsObjectBufferATI: function(buffer: GLuint): GLboolean; extdecl;
+  glUpdateObjectBufferATI: procedure(buffer: GLuint; offset: GLuint; size: GLsizei; const pointer: PGLvoid; preserve: GLenum); extdecl;
+  glGetObjectBufferfvATI: procedure(buffer: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glGetObjectBufferivATI: procedure(buffer: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glDeleteObjectBufferATI: procedure(buffer: GLuint); extdecl;
+  glArrayObjectATI: procedure(_array: GLenum; size: GLint; _type: GLenum; stride: GLsizei; buffer: GLuint; offset: GLuint); extdecl;
+  glGetArrayObjectfvATI: procedure(_array: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+  glGetArrayObjectivATI: procedure(_array: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glVariantArrayObjectATI: procedure(id: GLuint; _type: GLenum; stride: GLsizei; buffer: GLuint; offset: GLuint); extdecl;
+  glGetVariantArrayObjectfvATI: procedure(id: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glGetVariantArrayObjectivATI: procedure(id: GLuint; pname: GLenum; params: PGLint); extdecl;
+
+function Load_GL_ATI_vertex_array_object: Boolean;
+
+//***** GL_ATI_vertex_streams *****//
+const
+  GL_MAX_VERTEX_STREAMS_ATI = $876B;
+  GL_VERTEX_STREAM0_ATI = $876C;
+  GL_VERTEX_STREAM1_ATI = $876D;
+  GL_VERTEX_STREAM2_ATI = $876E;
+  GL_VERTEX_STREAM3_ATI = $876F;
+  GL_VERTEX_STREAM4_ATI = $8770;
+  GL_VERTEX_STREAM5_ATI = $8771;
+  GL_VERTEX_STREAM6_ATI = $8772;
+  GL_VERTEX_STREAM7_ATI = $8773;
+  GL_VERTEX_SOURCE_ATI = $8774;
+var
+  glVertexStream1s: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glVertexStream1i: procedure(stream: GLenum; coords: GLint); extdecl;
+  glVertexStream1f: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glVertexStream1d: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glVertexStream1sv: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glVertexStream1iv: procedure(stream: GLenum; coords: GLint); extdecl;
+  glVertexStream1fv: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glVertexStream1dv: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glVertexStream2s: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glVertexStream2i: procedure(stream: GLenum; coords: GLint); extdecl;
+  glVertexStream2f: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glVertexStream2d: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glVertexStream2sv: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glVertexStream2iv: procedure(stream: GLenum; coords: GLint); extdecl;
+  glVertexStream2fv: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glVertexStream2dv: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glVertexStream3s: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glVertexStream3i: procedure(stream: GLenum; coords: GLint); extdecl;
+  glVertexStream3f: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glVertexStream3d: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glVertexStream3sv: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glVertexStream3iv: procedure(stream: GLenum; coords: GLint); extdecl;
+  glVertexStream3fv: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glVertexStream3dv: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glVertexStream4s: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glVertexStream4i: procedure(stream: GLenum; coords: GLint); extdecl;
+  glVertexStream4f: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glVertexStream4d: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glVertexStream4sv: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glVertexStream4iv: procedure(stream: GLenum; coords: GLint); extdecl;
+  glVertexStream4fv: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glVertexStream4dv: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glNormalStream3b: procedure(stream: GLenum; coords: GLbyte); extdecl;
+  glNormalStream3s: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glNormalStream3i: procedure(stream: GLenum; coords: GLint); extdecl;
+  glNormalStream3f: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glNormalStream3d: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glNormalStream3bv: procedure(stream: GLenum; coords: GLbyte); extdecl;
+  glNormalStream3sv: procedure(stream: GLenum; coords: GLshort); extdecl;
+  glNormalStream3iv: procedure(stream: GLenum; coords: GLint); extdecl;
+  glNormalStream3fv: procedure(stream: GLenum; coords: GLfloat); extdecl;
+  glNormalStream3dv: procedure(stream: GLenum; coords: GLdouble); extdecl;
+  glClientActiveVertexStream: procedure(stream: GLenum); extdecl;
+  glVertexBlendEnvi: procedure(pname: GLenum; param: GLint); extdecl;
+  glVertexBlendEnvf: procedure(pname: GLenum; param: GLfloat); extdecl;
+
+function Load_GL_ATI_vertex_streams: Boolean;
+
+{$IFDEF Windows}
+//***** WGL_I3D_image_buffer *****//
+const
+  WGL_IMAGE_BUFFER_MIN_ACCESS_I3D = $0001;
+  WGL_IMAGE_BUFFER_LOCK_I3D = $0002;
+var
+  wglCreateImageBufferI3D: function(hDC: HDC; dwSize: DWORD; uFlags: UINT): PGLvoid; extdecl;
+  wglDestroyImageBufferI3D: function(hDC: HDC; pAddress: PGLvoid): BOOL; extdecl;
+  wglAssociateImageBufferEventsI3D: function(hdc: HDC; pEvent: PHandle; pAddress: PGLvoid; pSize: PDWORD; count: UINT): BOOL; extdecl;
+  wglReleaseImageBufferEventsI3D: function(hdc: HDC; pAddress: PGLvoid; count: UINT): BOOL; extdecl;
+
+function Load_WGL_I3D_image_buffer: Boolean;
+
+//***** WGL_I3D_swap_frame_lock *****//
+var
+  wglEnableFrameLockI3D: function(): BOOL; extdecl;
+  wglDisableFrameLockI3D: function(): BOOL; extdecl;
+  wglIsEnabledFrameLockI3D: function(pFlag: PBOOL): BOOL; extdecl;
+  wglQueryFrameLockMasterI3D: function(pFlag: PBOOL): BOOL; extdecl;
+
+function Load_WGL_I3D_swap_frame_lock: Boolean;
+
+//***** WGL_I3D_swap_frame_usage *****//
+var
+  wglGetFrameUsageI3D: function(pUsage: PGLfloat): BOOL; extdecl;
+  wglBeginFrameTrackingI3D: function(): BOOL; extdecl;
+  wglEndFrameTrackingI3D: function(): BOOL; extdecl;
+  wglQueryFrameTrackingI3D: function(pFrameCount: PDWORD; pMissedFrames: PDWORD; pLastMissedUsage: PGLfloat): BOOL; extdecl;
+
+function Load_WGL_I3D_swap_frame_usage: Boolean;
+{$ENDIF}
+
+//***** GL_3DFX_texture_compression_FXT1 *****//
+const
+  GL_COMPRESSED_RGB_FXT1_3DFX = $86B0;
+  GL_COMPRESSED_RGBA_FXT1_3DFX = $86B1;
+
+function Load_GL_3DFX_texture_compression_FXT1: Boolean;
+
+//***** GL_IBM_cull_vertex *****//
+const
+  GL_CULL_VERTEX_IBM = $1928A;
+
+function Load_GL_IBM_cull_vertex: Boolean;
+
+//***** GL_IBM_multimode_draw_arrays *****//
+var
+  glMultiModeDrawArraysIBM: procedure(mode: PGLenum; first: PGLint; count: PGLsizei; primcount: GLsizei; modestride: GLint); extdecl;
+  glMultiModeDrawElementsIBM: procedure(mode: PGLenum; count: PGLsizei; _type: GLenum; const indices: PGLvoid; primcount: GLsizei; modestride: GLint); extdecl;
+
+function Load_GL_IBM_multimode_draw_arrays: Boolean;
+
+//***** GL_IBM_raster_pos_clip *****//
+const
+  GL_RASTER_POSITION_UNCLIPPED_IBM = $19262;
+
+function Load_GL_IBM_raster_pos_clip: Boolean;
+
+//***** GL_IBM_texture_mirrored_repeat *****//
+const
+  GL_MIRRORED_REPEAT_IBM = $8370;
+
+function Load_GL_IBM_texture_mirrored_repeat: Boolean;
+
+//***** GL_IBM_vertex_array_lists *****//
+const
+  GL_VERTEX_ARRAY_LIST_IBM = $1929E;
+  GL_NORMAL_ARRAY_LIST_IBM = $1929F;
+  GL_COLOR_ARRAY_LIST_IBM = $192A0;
+  GL_INDEX_ARRAY_LIST_IBM = $192A1;
+  GL_TEXTURE_COORD_ARRAY_LIST_IBM = $192A2;
+  GL_EDGE_FLAG_ARRAY_LIST_IBM = $192A3;
+  GL_FOG_COORDINATE_ARRAY_LIST_IBM = $192A4;
+  GL_SECONDARY_COLOR_ARRAY_LIST_IBM = $192A5;
+  GL_VERTEX_ARRAY_LIST_STRIDE_IBM = $192A8;
+  GL_NORMAL_ARRAY_LIST_STRIDE_IBM = $192A9;
+  GL_COLOR_ARRAY_LIST_STRIDE_IBM = $192AA;
+  GL_INDEX_ARRAY_LIST_STRIDE_IBM = $192AB;
+  GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM = $192AC;
+  GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM = $192AD;
+  GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM = $192AE;
+  GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM = $192AF;
+var
+  glColorPointerListIBM: procedure(size: GLint; _type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); extdecl;
+  glSecondaryColorPointerListIBM: procedure(size: GLint; _type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); extdecl;
+  glEdgeFlagPointerListIBM: procedure(stride: GLint; const pointer: PGLboolean; ptrstride: GLint); extdecl;
+  glFogCoordPointerListIBM: procedure(_type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); extdecl;
+  glNormalPointerListIBM: procedure(_type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); extdecl;
+  glTexCoordPointerListIBM: procedure(size: GLint; _type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); extdecl;
+  glVertexPointerListIBM: procedure(size: GLint; _type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); extdecl;
+
+function Load_GL_IBM_vertex_array_lists: Boolean;
+
+//***** GL_MESA_resize_buffers *****//
+var
+  glResizeBuffersMESA: procedure(); extdecl;
+
+function Load_GL_MESA_resize_buffers: Boolean;
+
+//***** GL_MESA_window_pos *****//
+var
+  glWindowPos2dMESA: procedure(x: GLdouble; y: GLdouble); extdecl;
+  glWindowPos2fMESA: procedure(x: GLfloat; y: GLfloat); extdecl;
+  glWindowPos2iMESA: procedure(x: GLint; y: GLint); extdecl;
+  glWindowPos2sMESA: procedure(x: GLshort; y: GLshort); extdecl;
+  glWindowPos2ivMESA: procedure(const p: PGLint); extdecl;
+  glWindowPos2svMESA: procedure(const p: PGLshort); extdecl;
+  glWindowPos2fvMESA: procedure(const p: PGLfloat); extdecl;
+  glWindowPos2dvMESA: procedure(const p: PGLdouble); extdecl;
+  glWindowPos3iMESA: procedure(x: GLint; y: GLint; z: GLint); extdecl;
+  glWindowPos3sMESA: procedure(x: GLshort; y: GLshort; z: GLshort); extdecl;
+  glWindowPos3fMESA: procedure(x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glWindowPos3dMESA: procedure(x: GLdouble; y: GLdouble; z: GLdouble); extdecl;
+  glWindowPos3ivMESA: procedure(const p: PGLint); extdecl;
+  glWindowPos3svMESA: procedure(const p: PGLshort); extdecl;
+  glWindowPos3fvMESA: procedure(const p: PGLfloat); extdecl;
+  glWindowPos3dvMESA: procedure(const p: PGLdouble); extdecl;
+  glWindowPos4iMESA: procedure(x: GLint; y: GLint; z: GLint; w: GLint); extdecl;
+  glWindowPos4sMESA: procedure(x: GLshort; y: GLshort; z: GLshort; w: GLshort); extdecl;
+  glWindowPos4fMESA: procedure(x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glWindowPos4dMESA: procedure(x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); extdecl;
+  glWindowPos4ivMESA: procedure(const p: PGLint); extdecl;
+  glWindowPos4svMESA: procedure(const p: PGLshort); extdecl;
+  glWindowPos4fvMESA: procedure(const p: PGLfloat); extdecl;
+  glWindowPos4dvMESA: procedure(const p: PGLdouble); extdecl;
+
+function Load_GL_MESA_window_pos: Boolean;
+
+//***** GL_OML_interlace *****//
+const
+  GL_INTERLACE_OML = $8980;
+  GL_INTERLACE_READ_OML = $8981;
+
+function Load_GL_OML_interlace: Boolean;
+
+//***** GL_OML_resample *****//
+const
+  GL_PACK_RESAMPLE_OML = $8984;
+  GL_UNPACK_RESAMPLE_OML = $8985;
+  GL_RESAMPLE_REPLICATE_OML = $8986;
+  GL_RESAMPLE_ZERO_FILL_OML = $8987;
+  GL_RESAMPLE_AVERAGE_OML = $8988;
+  GL_RESAMPLE_DECIMATE_OML = $8989;
+  // GL_RESAMPLE_AVERAGE_OML  { already defined }
+
+function Load_GL_OML_resample: Boolean;
+
+//***** GL_OML_subsample *****//
+const
+  GL_FORMAT_SUBSAMPLE_24_24_OML = $8982;
+  GL_FORMAT_SUBSAMPLE_244_244_OML = $8983;
+
+function Load_GL_OML_subsample: Boolean;
+
+//***** GL_SGIS_generate_mipmap *****//
+const
+  GL_GENERATE_MIPMAP_SGIS = $8191;
+  GL_GENERATE_MIPMAP_HINT_SGIS = $8192;
+
+function Load_GL_SGIS_generate_mipmap: Boolean;
+
+//***** GL_SGIS_multisample *****//
+const
+  GLX_SAMPLE_BUFFERS_SGIS = $186A0;
+  GLX_SAMPLES_SGIS = $186A1;
+  GL_MULTISAMPLE_SGIS = $809D;
+  GL_SAMPLE_ALPHA_TO_MASK_SGIS = $809E;
+  GL_SAMPLE_ALPHA_TO_ONE_SGIS = $809F;
+  GL_SAMPLE_MASK_SGIS = $80A0;
+  GL_MULTISAMPLE_BIT_EXT = $20000000;
+  GL_1PASS_SGIS = $80A1;
+  GL_2PASS_0_SGIS = $80A2;
+  GL_2PASS_1_SGIS = $80A3;
+  GL_4PASS_0_SGIS = $80A4;
+  GL_4PASS_1_SGIS = $80A5;
+  GL_4PASS_2_SGIS = $80A6;
+  GL_4PASS_3_SGIS = $80A7;
+  GL_SAMPLE_BUFFERS_SGIS = $80A8;
+  GL_SAMPLES_SGIS = $80A9;
+  GL_SAMPLE_MASK_VALUE_SGIS = $80AA;
+  GL_SAMPLE_MASK_INVERT_SGIS = $80AB;
+  GL_SAMPLE_PATTERN_SGIS = $80AC;
+var
+  glSampleMaskSGIS: procedure(value: GLclampf; invert: GLboolean); extdecl;
+  glSamplePatternSGIS: procedure(pattern: GLenum); extdecl;
+
+function Load_GL_SGIS_multisample: Boolean;
+
+//***** GL_SGIS_pixel_texture *****//
+const
+  GL_PIXEL_TEXTURE_SGIS = $8353;
+  GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS = $8354;
+  GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS = $8355;
+  GL_PIXEL_GROUP_COLOR_SGIS = $8356;
+var
+  glPixelTexGenParameteriSGIS: procedure(pname: GLenum; param: GLint); extdecl;
+  glPixelTexGenParameterfSGIS: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glGetPixelTexGenParameterivSGIS: procedure(pname: GLenum; params: GLint); extdecl;
+  glGetPixelTexGenParameterfvSGIS: procedure(pname: GLenum; params: GLfloat); extdecl;
+
+function Load_GL_SGIS_pixel_texture: Boolean;
+
+//***** GL_SGIS_texture_border_clamp *****//
+  // GL_CLAMP_TO_BORDER_SGIS  { already defined }
+
+function Load_GL_SGIS_texture_border_clamp: Boolean;
+
+//***** GL_SGIS_texture_color_mask *****//
+const
+  GL_TEXTURE_COLOR_WRITEMASK_SGIS = $81EF;
+var
+  glTextureColorMaskSGIS: procedure(r: GLboolean; g: GLboolean; b: GLboolean; a: GLboolean); extdecl;
+
+function Load_GL_SGIS_texture_color_mask: Boolean;
+
+//***** GL_SGIS_texture_edge_clamp *****//
+const
+  GL_CLAMP_TO_EDGE_SGIS = $812F;
+
+function Load_GL_SGIS_texture_edge_clamp: Boolean;
+
+//***** GL_SGIS_texture_lod *****//
+const
+  GL_TEXTURE_MIN_LOD_SGIS = $813A;
+  GL_TEXTURE_MAX_LOD_SGIS = $813B;
+  GL_TEXTURE_BASE_LEVEL_SGIS = $813C;
+  GL_TEXTURE_MAX_LEVEL_SGIS = $813D;
+
+function Load_GL_SGIS_texture_lod: Boolean;
+
+//***** GL_SGIS_depth_texture *****//
+const
+  GL_DEPTH_COMPONENT16_SGIX = $81A5;
+  GL_DEPTH_COMPONENT24_SGIX = $81A6;
+  GL_DEPTH_COMPONENT32_SGIX = $81A7;
+
+function Load_GL_SGIS_depth_texture: Boolean;
+
+//***** GL_SGIX_fog_offset *****//
+const
+  GL_FOG_OFFSET_SGIX = $8198;
+  GL_FOG_OFFSET_VALUE_SGIX = $8199;
+
+function Load_GL_SGIX_fog_offset: Boolean;
+
+//***** GL_SGIX_interlace *****//
+const
+  GL_INTERLACE_SGIX = $8094;
+
+function Load_GL_SGIX_interlace: Boolean;
+
+//***** GL_SGIX_shadow_ambient *****//
+const
+  GL_SHADOW_AMBIENT_SGIX = $80BF;
+
+function Load_GL_SGIX_shadow_ambient: Boolean;
+
+//***** GL_SGI_color_matrix *****//
+const
+  GL_COLOR_MATRIX_SGI = $80B1;
+  GL_COLOR_MATRIX_STACK_DEPTH_SGI = $80B2;
+  GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI = $80B3;
+  GL_POST_COLOR_MATRIX_RED_SCALE_SGI = $80B4;
+  GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI = $80B5;
+  GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI = $80B6;
+  GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI = $80B7;
+  GL_POST_COLOR_MATRIX_RED_BIAS_SGI = $80B8;
+  GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI = $80B9;
+  GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI = $80BA;
+  GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI = $80BB;
+
+function Load_GL_SGI_color_matrix: Boolean;
+
+//***** GL_SGI_color_table *****//
+const
+  GL_COLOR_TABLE_SGI = $80D0;
+  GL_POST_CONVOLUTION_COLOR_TABLE_SGI = $80D1;
+  GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI = $80D2;
+  GL_PROXY_COLOR_TABLE_SGI = $80D3;
+  GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI = $80D4;
+  GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI = $80D5;
+  GL_COLOR_TABLE_SCALE_SGI = $80D6;
+  GL_COLOR_TABLE_BIAS_SGI = $80D7;
+  GL_COLOR_TABLE_FORMAT_SGI = $80D8;
+  GL_COLOR_TABLE_WIDTH_SGI = $80D9;
+  GL_COLOR_TABLE_RED_SIZE_SGI = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE_SGI = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE_SGI = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE_SGI = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE_SGI = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE_SGI = $80DF;
+var
+  glColorTableSGI: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const table: PGLvoid); extdecl;
+  glCopyColorTableSGI: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei); extdecl;
+  glColorTableParameterivSGI: procedure(target: GLenum; pname: GLenum; const params: PGLint); extdecl;
+  glColorTableParameterfvSGI: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); extdecl;
+  glGetColorTableSGI: procedure(target: GLenum; format: GLenum; _type: GLenum; table: PGLvoid); extdecl;
+  glGetColorTableParameterivSGI: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetColorTableParameterfvSGI: procedure(target: GLenum; pname: GLenum; params: PGLfloat); extdecl;
+
+function Load_GL_SGI_color_table: Boolean;
+
+//***** GL_SGI_texture_color_table *****//
+const
+  GL_TEXTURE_COLOR_TABLE_SGI = $80BC;
+  GL_PROXY_TEXTURE_COLOR_TABLE_SGI = $80BD;
+
+function Load_GL_SGI_texture_color_table: Boolean;
+
+//***** GL_SUN_vertex *****//
+var
+  glColor4ubVertex2fSUN: procedure(r: GLubyte; g: GLubyte; b: GLubyte; a: GLubyte; x: GLfloat; y: GLfloat); extdecl;
+  glColor4ubVertex2fvSUN: procedure(const c: PGLubyte; const v: PGLfloat); extdecl;
+  glColor4ubVertex3fSUN: procedure(r: GLubyte; g: GLubyte; b: GLubyte; a: GLubyte; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glColor4ubVertex3fvSUN: procedure(const c: PGLubyte; const v: PGLfloat); extdecl;
+  glColor3fVertex3fSUN: procedure(r: GLfloat; g: GLfloat; b: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glColor3fVertex3fvSUN: procedure(const c: PGLfloat; const v: PGLfloat); extdecl;
+  glNormal3fVertex3fSUN: procedure(nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glNormal3fVertex3fvSUN: procedure(const n: PGLfloat; const v: PGLfloat); extdecl;
+  glColor4fNormal3fVertex3fSUN: procedure(r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glColor4fNormal3fVertex3fvSUN: procedure(const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); extdecl;
+  glTexCoord2fVertex3fSUN: procedure(s: GLfloat; t: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glTexCoord2fVertex3fvSUN: procedure(const tc: PGLfloat; const v: PGLfloat); extdecl;
+  glTexCoord4fVertex4fSUN: procedure(s: GLfloat; t: GLfloat; p: GLfloat; q: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glTexCoord4fVertex4fvSUN: procedure(const tc: PGLfloat; const v: PGLfloat); extdecl;
+  glTexCoord2fColor4ubVertex3fSUN: procedure(s: GLfloat; t: GLfloat; r: GLubyte; g: GLubyte; b: GLubyte; a: GLubyte; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glTexCoord2fColor4ubVertex3fvSUN: procedure(const tc: PGLfloat; const c: PGLubyte; const v: PGLfloat); extdecl;
+  glTexCoord2fColor3fVertex3fSUN: procedure(s: GLfloat; t: GLfloat; r: GLfloat; g: GLfloat; b: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glTexCoord2fColor3fVertex3fvSUN: procedure(const tc: PGLfloat; const c: PGLfloat; const v: PGLfloat); extdecl;
+  glTexCoord2fNormal3fVertex3fSUN: procedure(s: GLfloat; t: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glTexCoord2fNormal3fVertex3fvSUN: procedure(const tc: PGLfloat; const n: PGLfloat; const v: PGLfloat); extdecl;
+  glTexCoord2fColor4fNormal3fVertex3fSUN: procedure(s: GLfloat; t: GLfloat; r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glTexCoord2fColor4fNormal3fVertex3fvSUN: procedure(const tc: PGLfloat; const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); extdecl;
+  glTexCoord4fColor4fNormal3fVertex4fSUN: procedure(s: GLfloat; t: GLfloat; p: GLfloat; q: GLfloat; r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glTexCoord4fColor4fNormal3fVertex4fvSUN: procedure(const tc: PGLfloat; const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); extdecl;
+  glReplacementCodeuiVertex3fSUN: procedure(rc: GLuint; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glReplacementCodeuiVertex3fvSUN: procedure(const rc: PGLuint; const v: PGLfloat); extdecl;
+  glReplacementCodeuiColor4ubVertex3fSUN: procedure(rc: GLuint; r: GLubyte; g: GLubyte; b: GLubyte; a: GLubyte; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glReplacementCodeuiColor4ubVertex3fvSUN: procedure(const rc: PGLuint; const c: PGLubyte; const v: PGLfloat); extdecl;
+  glReplacementCodeuiColor3fVertex3fSUN: procedure(rc: GLuint; r: GLfloat; g: GLfloat; b: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glReplacementCodeuiColor3fVertex3fvSUN: procedure(const rc: PGLuint; const c: PGLfloat; const v: PGLfloat); extdecl;
+  glReplacementCodeuiNormal3fVertex3fSUN: procedure(rc: GLuint; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glReplacementCodeuiNormal3fVertex3fvSUN: procedure(const rc: PGLuint; const n: PGLfloat; const v: PGLfloat); extdecl;
+  glReplacementCodeuiColor4fNormal3fVertex3fSUN: procedure(rc: GLuint; r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glReplacementCodeuiColor4fNormal3fVertex3fvSUN: procedure(const rc: PGLuint; const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); extdecl;
+  glReplacementCodeuiTexCoord2fVertex3fSUN: procedure(rc: GLuint; s: GLfloat; t: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glReplacementCodeuiTexCoord2fVertex3fvSUN: procedure(const rc: PGLuint; const tc: PGLfloat; const v: PGLfloat); extdecl;
+  glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: procedure(rc: GLuint; s: GLfloat; t: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: procedure(const rc: PGLuint; const tc: PGLfloat; const n: PGLfloat; const v: PGLfloat); extdecl;
+  glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: procedure(rc: GLuint; s: GLfloat; t: GLfloat; r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: procedure(const rc: PGLuint; const tc: PGLfloat; const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); extdecl;
+
+function Load_GL_SUN_vertex: Boolean;
+
+//***** GL_ARB_fragment_program *****//
+const
+  GL_FRAGMENT_PROGRAM_ARB = $8804;
+  // GL_PROGRAM_FORMAT_ASCII_ARB  { already defined }
+  // GL_PROGRAM_LENGTH_ARB  { already defined }
+  // GL_PROGRAM_FORMAT_ARB  { already defined }
+  // GL_PROGRAM_BINDING_ARB  { already defined }
+  // GL_PROGRAM_INSTRUCTIONS_ARB  { already defined }
+  // GL_MAX_PROGRAM_INSTRUCTIONS_ARB  { already defined }
+  // GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB  { already defined }
+  // GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB  { already defined }
+  // GL_PROGRAM_TEMPORARIES_ARB  { already defined }
+  // GL_MAX_PROGRAM_TEMPORARIES_ARB  { already defined }
+  // GL_PROGRAM_NATIVE_TEMPORARIES_ARB  { already defined }
+  // GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB  { already defined }
+  // GL_PROGRAM_PARAMETERS_ARB  { already defined }
+  // GL_MAX_PROGRAM_PARAMETERS_ARB  { already defined }
+  // GL_PROGRAM_NATIVE_PARAMETERS_ARB  { already defined }
+  // GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB  { already defined }
+  // GL_PROGRAM_ATTRIBS_ARB  { already defined }
+  // GL_MAX_PROGRAM_ATTRIBS_ARB  { already defined }
+  // GL_PROGRAM_NATIVE_ATTRIBS_ARB  { already defined }
+  // GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB  { already defined }
+  // GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB  { already defined }
+  // GL_MAX_PROGRAM_ENV_PARAMETERS_ARB  { already defined }
+  // GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB  { already defined }
+  GL_PROGRAM_ALU_INSTRUCTIONS_ARB = $8805;
+  GL_PROGRAM_TEX_INSTRUCTIONS_ARB = $8806;
+  GL_PROGRAM_TEX_INDIRECTIONS_ARB = $8807;
+  GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = $8808;
+  GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = $8809;
+  GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = $880A;
+  GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB = $880B;
+  GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB = $880C;
+  GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB = $880D;
+  GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = $880E;
+  GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = $880F;
+  GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = $8810;
+  // GL_PROGRAM_STRING_ARB  { already defined }
+  // GL_PROGRAM_ERROR_POSITION_ARB  { already defined }
+  // GL_CURRENT_MATRIX_ARB  { already defined }
+  // GL_TRANSPOSE_CURRENT_MATRIX_ARB  { already defined }
+  // GL_CURRENT_MATRIX_STACK_DEPTH_ARB  { already defined }
+  // GL_MAX_PROGRAM_MATRICES_ARB  { already defined }
+  // GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB  { already defined }
+  GL_MAX_TEXTURE_COORDS_ARB = $8871;
+  GL_MAX_TEXTURE_IMAGE_UNITS_ARB = $8872;
+  // GL_PROGRAM_ERROR_STRING_ARB  { already defined }
+  // GL_MATRIX0_ARB  { already defined }
+  // GL_MATRIX1_ARB  { already defined }
+  // GL_MATRIX2_ARB  { already defined }
+  // GL_MATRIX3_ARB  { already defined }
+  // GL_MATRIX4_ARB  { already defined }
+  // GL_MATRIX5_ARB  { already defined }
+  // GL_MATRIX6_ARB  { already defined }
+  // GL_MATRIX7_ARB  { already defined }
+  // GL_MATRIX8_ARB  { already defined }
+  // GL_MATRIX9_ARB  { already defined }
+  // GL_MATRIX10_ARB  { already defined }
+  // GL_MATRIX11_ARB  { already defined }
+  // GL_MATRIX12_ARB  { already defined }
+  // GL_MATRIX13_ARB  { already defined }
+  // GL_MATRIX14_ARB  { already defined }
+  // GL_MATRIX15_ARB  { already defined }
+  // GL_MATRIX16_ARB  { already defined }
+  // GL_MATRIX17_ARB  { already defined }
+  // GL_MATRIX18_ARB  { already defined }
+  // GL_MATRIX19_ARB  { already defined }
+  // GL_MATRIX20_ARB  { already defined }
+  // GL_MATRIX21_ARB  { already defined }
+  // GL_MATRIX22_ARB  { already defined }
+  // GL_MATRIX23_ARB  { already defined }
+  // GL_MATRIX24_ARB  { already defined }
+  // GL_MATRIX25_ARB  { already defined }
+  // GL_MATRIX26_ARB  { already defined }
+  // GL_MATRIX27_ARB  { already defined }
+  // GL_MATRIX28_ARB  { already defined }
+  // GL_MATRIX29_ARB  { already defined }
+  // GL_MATRIX30_ARB  { already defined }
+  // GL_MATRIX31_ARB  { already defined }
+  // glProgramStringARB  { already defined }
+  // glBindProgramARB  { already defined }
+  // glDeleteProgramsARB  { already defined }
+  // glGenProgramsARB  { already defined }
+  // glProgramEnvParameter4dARB  { already defined }
+  // glProgramEnvParameter4dvARB  { already defined }
+  // glProgramEnvParameter4fARB  { already defined }
+  // glProgramEnvParameter4fvARB  { already defined }
+  // glProgramLocalParameter4dARB  { already defined }
+  // glProgramLocalParameter4dvARB  { already defined }
+  // glProgramLocalParameter4fARB  { already defined }
+  // glProgramLocalParameter4fvARB  { already defined }
+  // glGetProgramEnvParameterdvARB  { already defined }
+  // glGetProgramEnvParameterfvARB  { already defined }
+  // glGetProgramLocalParameterdvARB  { already defined }
+  // glGetProgramLocalParameterfvARB  { already defined }
+  // glGetProgramivARB  { already defined }
+  // glGetProgramStringARB  { already defined }
+  // glIsProgramARB  { already defined }
+
+function Load_GL_ARB_fragment_program: Boolean;
+
+{***** GL_ATI_text_fragment_shader *****}
+const
+     GL_TEXT_FRAGMENT_SHADER_ATI = $8200;
+
+{***** GL_ARB_vertex_buffer_object *****}
+const
+     GL_BUFFER_SIZE_ARB = $8764;
+     GL_BUFFER_USAGE_ARB = $8765;
+     GL_ARRAY_BUFFER_ARB = $8892;
+     GL_ELEMENT_ARRAY_BUFFER_ARB = $8893;
+     GL_ARRAY_BUFFER_BINDING_ARB = $8894;
+     GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB = $8895;
+     GL_VERTEX_ARRAY_BUFFER_BINDING_ARB = $8896;
+     GL_NORMAL_ARRAY_BUFFER_BINDING_ARB = $8897;
+     GL_COLOR_ARRAY_BUFFER_BINDING_ARB = $8898;
+     GL_INDEX_ARRAY_BUFFER_BINDING_ARB = $8899;
+     GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB = $889A;
+     GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB = $889B;
+     GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB = $889C;
+     GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB = $889D;
+     GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB = $889E;
+     GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB = $889F;
+     GL_READ_ONLY_ARB = $88B8;
+     GL_WRITE_ONLY_ARB = $88B9;
+     GL_READ_WRITE_ARB = $88BA;
+     GL_BUFFER_ACCESS_ARB = $88BB;
+     GL_BUFFER_MAPPED_ARB = $88BC;
+     GL_BUFFER_MAP_POINTER_ARB = $88BD;
+     GL_STREAM_DRAW_ARB = $88E0;
+     GL_STREAM_READ_ARB = $88E1;
+     GL_STREAM_COPY_ARB = $88E2;
+     GL_STATIC_DRAW_ARB = $88E4;
+     GL_STATIC_READ_ARB = $88E5;
+     GL_STATIC_COPY_ARB = $88E6;
+     GL_DYNAMIC_DRAW_ARB = $88E8;
+     GL_DYNAMIC_READ_ARB = $88E9;
+     GL_DYNAMIC_COPY_ARB = $88EA;
+
+var
+     glBindBufferARB : procedure(target : GLenum; buffer: GLuint); extdecl;
+     glDeleteBuffersARB : procedure(n : GLsizei; buffers : PGLuint); extdecl;
+     glGenBuffersARB : procedure(n : GLsizei; buffers : PGLuint); extdecl;
+     glIsBufferARB : function (buffer : GLuint) :GLboolean; extdecl;
+     glBufferDataARB : procedure(target : GLenum; size:GLsizei; data:PGLvoid;usage: GLenum); extdecl;
+     glBufferSubDataARB : procedure(target : GLenum; offset :GLint; size : GLsizei; data: PGLvoid); extdecl;
+     glGetBufferSubDataARB : procedure(target : GLenum; offset :GLint; size : GLsizei; data: PGLvoid); extdecl;
+     glMapBufferARB : function (target :GLenum; access: GLenum) : PGLvoid; extdecl;
+     glUnmapBufferARB : function (target :GLenum) :GLboolean; extdecl;
+     glGetBufferParameterivARB:procedure(target:GLenum; pname:GLenum; params:PGLint); extdecl;
+     glGetBufferPointervARB : procedure(target: GLenum; pname:GLenum; params: PPGLvoid); extdecl;
+     function Load_GL_ARB_vertex_buffer_object : boolean;
+
+function Load_GL_ATI_text_fragment_shader: Boolean;
+
+//***** GL_APPLE_client_storage *****//
+const
+  GL_UNPACK_CLIENT_STORAGE_APPLE = $85B2;
+
+function Load_GL_APPLE_client_storage: Boolean;
+
+//***** GL_APPLE_element_array *****//
+const
+  GL_ELEMENT_ARRAY_APPLE = $8768;
+  GL_ELEMENT_ARRAY_TYPE_APPLE = $8769;
+  GL_ELEMENT_ARRAY_POINTER_APPLE = $876A;
+var
+  glElementPointerAPPLE: procedure(_type: GLenum; const pointer: PGLvoid); extdecl;
+  glDrawElementArrayAPPLE: procedure(mode: GLenum; first: GLint; count: GLsizei); extdecl;
+  glDrawRangeElementArrayAPPLE: procedure(mode: GLenum; start: GLuint; _end: GLuint; first: GLint; count: GLsizei); extdecl;
+  glMultiDrawElementArrayAPPLE: procedure(mode: GLenum; const first: PGLint; const count: PGLsizei; primcount: GLsizei); extdecl;
+  glMultiDrawRangeElementArrayAPPLE: procedure(mode: GLenum; start: GLuint; _end: GLuint; const first: PGLint; const count: PGLsizei; primcount: GLsizei); extdecl;
+
+function Load_GL_APPLE_element_array: Boolean;
+
+//***** GL_APPLE_fence *****//
+const
+  GL_DRAW_PIXELS_APPLE = $8A0A;
+  GL_FENCE_APPLE = $8A0B;
+var
+  glGenFencesAPPLE: procedure(n: GLsizei; fences: PGLuint); extdecl;
+  glDeleteFencesAPPLE: procedure(n: GLsizei; const fences: PGLuint); extdecl;
+  glSetFenceAPPLE: procedure(fence: GLuint); extdecl;
+  glIsFenceAPPLE: function(fence: GLuint): GLboolean; extdecl;
+  glTestFenceAPPLE: function(fence: GLuint): GLboolean; extdecl;
+  glFinishFenceAPPLE: procedure(fence: GLuint); extdecl;
+  glTestObjectAPPLE: function(_object: GLenum; name: GLuint): GLboolean; extdecl;
+  glFinishObjectAPPLE: procedure(_object: GLenum; name: GLint); extdecl;
+
+function Load_GL_APPLE_fence: Boolean;
+
+//***** GL_APPLE_vertex_array_object *****//
+const
+  GL_VERTEX_ARRAY_BINDING_APPLE = $85B5;
+var
+  glBindVertexArrayAPPLE: procedure(_array: GLuint); extdecl;
+  glDeleteVertexArraysAPPLE: procedure(n: GLsizei; const arrays: PGLuint); extdecl;
+  glGenVertexArraysAPPLE: procedure(n: GLsizei; const arrays: PGLuint); extdecl;
+  glIsVertexArrayAPPLE: function(_array: GLuint): GLboolean; extdecl;
+
+function Load_GL_APPLE_vertex_array_object: Boolean;
+
+//***** GL_APPLE_vertex_array_range *****//
+const
+  GL_VERTEX_ARRAY_RANGE_APPLE = $851D;
+  GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE = $851E;
+  GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE = $8520;
+  GL_VERTEX_ARRAY_RANGE_POINTER_APPLE = $8521;
+  GL_VERTEX_ARRAY_STORAGE_HINT_APPLE = $851F;
+  GL_STORAGE_CACHED_APPLE = $85BE;
+  GL_STORAGE_SHARED_APPLE = $85BF;
+var
+  glVertexArrayRangeAPPLE: procedure(length: GLsizei; pointer: PGLvoid); extdecl;
+  glFlushVertexArrayRangeAPPLE: procedure(length: GLsizei; pointer: PGLvoid); extdecl;
+  glVertexArrayParameteriAPPLE: procedure(pname: GLenum; param: GLint); extdecl;
+
+function Load_GL_APPLE_vertex_array_range: Boolean;
+
+{$IFDEF Windows}
+//***** WGL_ARB_pixel_format *****//
+const
+  WGL_NUMBER_PIXEL_FORMATS_ARB = $2000;
+  WGL_DRAW_TO_WINDOW_ARB = $2001;
+  WGL_DRAW_TO_BITMAP_ARB = $2002;
+  WGL_ACCELERATION_ARB = $2003;
+  WGL_NEED_PALETTE_ARB = $2004;
+  WGL_NEED_SYSTEM_PALETTE_ARB = $2005;
+  WGL_SWAP_LAYER_BUFFERS_ARB = $2006;
+  WGL_SWAP_METHOD_ARB = $2007;
+  WGL_NUMBER_OVERLAYS_ARB = $2008;
+  WGL_NUMBER_UNDERLAYS_ARB = $2009;
+  WGL_TRANSPARENT_ARB = $200A;
+  WGL_TRANSPARENT_RED_VALUE_ARB = $2037;
+  WGL_TRANSPARENT_GREEN_VALUE_ARB = $2038;
+  WGL_TRANSPARENT_BLUE_VALUE_ARB = $2039;
+  WGL_TRANSPARENT_ALPHA_VALUE_ARB = $203A;
+  WGL_TRANSPARENT_INDEX_VALUE_ARB = $203B;
+  WGL_SHARE_DEPTH_ARB = $200C;
+  WGL_SHARE_STENCIL_ARB = $200D;
+  WGL_SHARE_ACCUM_ARB = $200E;
+  WGL_SUPPORT_GDI_ARB = $200F;
+  WGL_SUPPORT_OPENGL_ARB = $2010;
+  WGL_DOUBLE_BUFFER_ARB = $2011;
+  WGL_STEREO_ARB = $2012;
+  WGL_PIXEL_TYPE_ARB = $2013;
+  WGL_COLOR_BITS_ARB = $2014;
+  WGL_RED_BITS_ARB = $2015;
+  WGL_RED_SHIFT_ARB = $2016;
+  WGL_GREEN_BITS_ARB = $2017;
+  WGL_GREEN_SHIFT_ARB = $2018;
+  WGL_BLUE_BITS_ARB = $2019;
+  WGL_BLUE_SHIFT_ARB = $201A;
+  WGL_ALPHA_BITS_ARB = $201B;
+  WGL_ALPHA_SHIFT_ARB = $201C;
+  WGL_ACCUM_BITS_ARB = $201D;
+  WGL_ACCUM_RED_BITS_ARB = $201E;
+  WGL_ACCUM_GREEN_BITS_ARB = $201F;
+  WGL_ACCUM_BLUE_BITS_ARB = $2020;
+  WGL_ACCUM_ALPHA_BITS_ARB = $2021;
+  WGL_DEPTH_BITS_ARB = $2022;
+  WGL_STENCIL_BITS_ARB = $2023;
+  WGL_AUX_BUFFERS_ARB = $2024;
+  WGL_NO_ACCELERATION_ARB = $2025;
+  WGL_GENERIC_ACCELERATION_ARB = $2026;
+  WGL_FULL_ACCELERATION_ARB = $2027;
+  WGL_SWAP_EXCHANGE_ARB = $2028;
+  WGL_SWAP_COPY_ARB = $2029;
+  WGL_SWAP_UNDEFINED_ARB = $202A;
+  WGL_TYPE_RGBA_ARB = $202B;
+  WGL_TYPE_COLORINDEX_ARB = $202C;
+var
+  wglGetPixelFormatAttribivARB: function(hdc: HDC; iPixelFormat: GLint; iLayerPlane: GLint; nAttributes: GLuint; const piAttributes: PGLint; piValues: PGLint): BOOL; extdecl;
+  wglGetPixelFormatAttribfvARB: function(hdc: HDC; iPixelFormat: GLint; iLayerPlane: GLint; nAttributes: GLuint; const piAttributes: PGLint; pfValues: PGLfloat): BOOL; extdecl;
+  wglChoosePixelFormatARB: function(hdc: HDC; const piAttribIList: PGLint; const pfAttribFList: PGLfloat; nMaxFormats: GLuint; piFormats: PGLint; nNumFormats: PGLuint): BOOL; extdecl;
+
+function Load_WGL_ARB_pixel_format: Boolean;
+
+//***** WGL_ARB_make_current_read *****//
+const
+  WGL_ERROR_INVALID_PIXEL_TYPE_ARB = $2043;
+  WGL_ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB = $2054;
+var
+  wglMakeContextCurrentARB: function(hDrawDC: HDC; hReadDC: HDC; hglrc: HGLRC): BOOL; extdecl;
+  wglGetCurrentReadDCARB: function(): HDC; extdecl;
+
+function Load_WGL_ARB_make_current_read: Boolean;
+
+//***** WGL_ARB_pbuffer *****//
+const
+  WGL_DRAW_TO_PBUFFER_ARB = $202D;
+  // WGL_DRAW_TO_PBUFFER_ARB  { already defined }
+  WGL_MAX_PBUFFER_PIXELS_ARB = $202E;
+  WGL_MAX_PBUFFER_WIDTH_ARB = $202F;
+  WGL_MAX_PBUFFER_HEIGHT_ARB = $2030;
+  WGL_PBUFFER_LARGEST_ARB = $2033;
+  WGL_PBUFFER_WIDTH_ARB = $2034;
+  WGL_PBUFFER_HEIGHT_ARB = $2035;
+  WGL_PBUFFER_LOST_ARB = $2036;
+var
+  wglCreatePbufferARB: function(hDC: HDC; iPixelFormat: GLint; iWidth: GLint; iHeight: GLint; const piAttribList: PGLint): THandle; extdecl;
+  wglGetPbufferDCARB: function(hPbuffer: THandle): HDC; extdecl;
+  wglReleasePbufferDCARB: function(hPbuffer: THandle; hDC: HDC): GLint; extdecl;
+  wglDestroyPbufferARB: function(hPbuffer: THandle): BOOL; extdecl;
+  wglQueryPbufferARB: function(hPbuffer: THandle; iAttribute: GLint; piValue: PGLint): BOOL; extdecl;
+
+function Load_WGL_ARB_pbuffer: Boolean;
+
+//***** WGL_EXT_swap_control *****//
+var
+  wglSwapIntervalEXT: function(interval: GLint): BOOL; extdecl;
+  wglGetSwapIntervalEXT: function(): GLint; extdecl;
+
+function Load_WGL_EXT_swap_control: Boolean;
+
+//***** WGL_ARB_render_texture *****//
+const
+  WGL_BIND_TO_TEXTURE_RGB_ARB = $2070;
+  WGL_BIND_TO_TEXTURE_RGBA_ARB = $2071;
+  WGL_TEXTURE_FORMAT_ARB = $2072;
+  WGL_TEXTURE_TARGET_ARB = $2073;
+  WGL_MIPMAP_TEXTURE_ARB = $2074;
+  WGL_TEXTURE_RGB_ARB = $2075;
+  WGL_TEXTURE_RGBA_ARB = $2076;
+  WGL_NO_TEXTURE_ARB = $2077;
+  WGL_TEXTURE_CUBE_MAP_ARB = $2078;
+  WGL_TEXTURE_1D_ARB = $2079;
+  WGL_TEXTURE_2D_ARB = $207A;
+  // WGL_NO_TEXTURE_ARB  { already defined }
+  WGL_MIPMAP_LEVEL_ARB = $207B;
+  WGL_CUBE_MAP_FACE_ARB = $207C;
+  WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = $207D;
+  WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = $207E;
+  WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = $207F;
+  WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = $2080;
+  WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = $2081;
+  WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = $2082;
+  WGL_FRONT_LEFT_ARB = $2083;
+  WGL_FRONT_RIGHT_ARB = $2084;
+  WGL_BACK_LEFT_ARB = $2085;
+  WGL_BACK_RIGHT_ARB = $2086;
+  WGL_AUX0_ARB = $2087;
+  WGL_AUX1_ARB = $2088;
+  WGL_AUX2_ARB = $2089;
+  WGL_AUX3_ARB = $208A;
+  WGL_AUX4_ARB = $208B;
+  WGL_AUX5_ARB = $208C;
+  WGL_AUX6_ARB = $208D;
+  WGL_AUX7_ARB = $208E;
+  WGL_AUX8_ARB = $208F;
+  WGL_AUX9_ARB = $2090;
+var
+  wglBindTexImageARB: function(hPbuffer: THandle; iBuffer: GLint): BOOL; extdecl;
+  wglReleaseTexImageARB: function(hPbuffer: THandle; iBuffer: GLint): BOOL; extdecl;
+  wglSetPbufferAttribARB: function(hPbuffer: THandle; const piAttribList: PGLint): BOOL; extdecl;
+
+function Load_WGL_ARB_render_texture: Boolean;
+
+//***** WGL_EXT_extensions_string *****//
+var
+  wglGetExtensionsStringEXT: function(): Pchar; extdecl;
+
+function Load_WGL_EXT_extensions_string: Boolean;
+
+//***** WGL_EXT_make_current_read *****//
+var
+  wglMakeContextCurrentEXT: function(hDrawDC: HDC; hReadDC: HDC; hglrc: HGLRC): BOOL; extdecl;
+  wglGetCurrentReadDCEXT: function(): HDC; extdecl;
+
+function Load_WGL_EXT_make_current_read: Boolean;
+
+//***** WGL_EXT_pbuffer *****//
+const
+  WGL_DRAW_TO_PBUFFER_EXT = $202D;
+  WGL_MAX_PBUFFER_PIXELS_EXT = $202E;
+  WGL_MAX_PBUFFER_WIDTH_EXT = $202F;
+  WGL_MAX_PBUFFER_HEIGHT_EXT = $2030;
+  WGL_OPTIMAL_PBUFFER_WIDTH_EXT = $2031;
+  WGL_OPTIMAL_PBUFFER_HEIGHT_EXT = $2032;
+  WGL_PBUFFER_LARGEST_EXT = $2033;
+  WGL_PBUFFER_WIDTH_EXT = $2034;
+  WGL_PBUFFER_HEIGHT_EXT = $2035;
+var
+  wglCreatePbufferEXT: function(hDC: HDC; iPixelFormat: GLint; iWidth: GLint; iHeight: GLint; const piAttribList: PGLint): THandle; extdecl;
+  wglGetPbufferDCEXT: function(hPbuffer: THandle): HDC; extdecl;
+  wglReleasePbufferDCEXT: function(hPbuffer: THandle; hDC: HDC): GLint; extdecl;
+  wglDestroyPbufferEXT: function(hPbuffer: THandle): BOOL; extdecl;
+  wglQueryPbufferEXT: function(hPbuffer: THandle; iAttribute: GLint; piValue: PGLint): BOOL; extdecl;
+
+function Load_WGL_EXT_pbuffer: Boolean;
+
+//***** WGL_EXT_pixel_format *****//
+const
+  WGL_NUMBER_PIXEL_FORMATS_EXT = $2000;
+  WGL_DRAW_TO_WINDOW_EXT = $2001;
+  WGL_DRAW_TO_BITMAP_EXT = $2002;
+  WGL_ACCELERATION_EXT = $2003;
+  WGL_NEED_PALETTE_EXT = $2004;
+  WGL_NEED_SYSTEM_PALETTE_EXT = $2005;
+  WGL_SWAP_LAYER_BUFFERS_EXT = $2006;
+  WGL_SWAP_METHOD_EXT = $2007;
+  WGL_NUMBER_OVERLAYS_EXT = $2008;
+  WGL_NUMBER_UNDERLAYS_EXT = $2009;
+  WGL_TRANSPARENT_EXT = $200A;
+  WGL_TRANSPARENT_VALUE_EXT = $200B;
+  WGL_SHARE_DEPTH_EXT = $200C;
+  WGL_SHARE_STENCIL_EXT = $200D;
+  WGL_SHARE_ACCUM_EXT = $200E;
+  WGL_SUPPORT_GDI_EXT = $200F;
+  WGL_SUPPORT_OPENGL_EXT = $2010;
+  WGL_DOUBLE_BUFFER_EXT = $2011;
+  WGL_STEREO_EXT = $2012;
+  WGL_PIXEL_TYPE_EXT = $2013;
+  WGL_COLOR_BITS_EXT = $2014;
+  WGL_RED_BITS_EXT = $2015;
+  WGL_RED_SHIFT_EXT = $2016;
+  WGL_GREEN_BITS_EXT = $2017;
+  WGL_GREEN_SHIFT_EXT = $2018;
+  WGL_BLUE_BITS_EXT = $2019;
+  WGL_BLUE_SHIFT_EXT = $201A;
+  WGL_ALPHA_BITS_EXT = $201B;
+  WGL_ALPHA_SHIFT_EXT = $201C;
+  WGL_ACCUM_BITS_EXT = $201D;
+  WGL_ACCUM_RED_BITS_EXT = $201E;
+  WGL_ACCUM_GREEN_BITS_EXT = $201F;
+  WGL_ACCUM_BLUE_BITS_EXT = $2020;
+  WGL_ACCUM_ALPHA_BITS_EXT = $2021;
+  WGL_DEPTH_BITS_EXT = $2022;
+  WGL_STENCIL_BITS_EXT = $2023;
+  WGL_AUX_BUFFERS_EXT = $2024;
+  WGL_NO_ACCELERATION_EXT = $2025;
+  WGL_GENERIC_ACCELERATION_EXT = $2026;
+  WGL_FULL_ACCELERATION_EXT = $2027;
+  WGL_SWAP_EXCHANGE_EXT = $2028;
+  WGL_SWAP_COPY_EXT = $2029;
+  WGL_SWAP_UNDEFINED_EXT = $202A;
+  WGL_TYPE_RGBA_EXT = $202B;
+  WGL_TYPE_COLORINDEX_EXT = $202C;
+var
+  wglGetPixelFormatAttribivEXT: function(hdc: HDC; iPixelFormat: GLint; iLayerPlane: GLint; nAttributes: GLuint; piAttributes: PGLint; piValues: PGLint): BOOL; extdecl;
+  wglGetPixelFormatAttribfvEXT: function(hdc: HDC; iPixelFormat: GLint; iLayerPlane: GLint; nAttributes: GLuint; piAttributes: PGLint; pfValues: PGLfloat): BOOL; extdecl;
+  wglChoosePixelFormatEXT: function(hdc: HDC; const piAttribIList: PGLint; const pfAttribFList: PGLfloat; nMaxFormats: GLuint; piFormats: PGLint; nNumFormats: PGLuint): BOOL; extdecl;
+
+function Load_WGL_EXT_pixel_format: Boolean;
+
+//***** WGL_I3D_digital_video_control *****//
+const
+  WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D = $2050;
+  WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D = $2051;
+  WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D = $2052;
+  WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D = $2053;
+var
+  wglGetDigitalVideoParametersI3D: function(hDC: HDC; iAttribute: GLint; piValue: PGLint): BOOL; extdecl;
+  wglSetDigitalVideoParametersI3D: function(hDC: HDC; iAttribute: GLint; const piValue: PGLint): BOOL; extdecl;
+
+function Load_WGL_I3D_digital_video_control: Boolean;
+
+//***** WGL_I3D_gamma *****//
+const
+  WGL_GAMMA_TABLE_SIZE_I3D = $204E;
+  WGL_GAMMA_EXCLUDE_DESKTOP_I3D = $204F;
+  // WGL_GAMMA_EXCLUDE_DESKTOP_I3D  { already defined }
+var
+  wglGetGammaTableParametersI3D: function(hDC: HDC; iAttribute: GLint; piValue: PGLint): BOOL; extdecl;
+  wglSetGammaTableParametersI3D: function(hDC: HDC; iAttribute: GLint; const piValue: PGLint): BOOL; extdecl;
+  wglGetGammaTableI3D: function(hDC: HDC; iEntries: GLint; puRed: PGLUSHORT; puGreen: PGLUSHORT; puBlue: PGLUSHORT): BOOL; extdecl;
+  wglSetGammaTableI3D: function(hDC: HDC; iEntries: GLint; const puRed: PGLUSHORT; const puGreen: PGLUSHORT; const puBlue: PGLUSHORT): BOOL; extdecl;
+
+function Load_WGL_I3D_gamma: Boolean;
+
+//***** WGL_I3D_genlock *****//
+const
+  WGL_GENLOCK_SOURCE_MULTIVIEW_I3D = $2044;
+  WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D = $2045;
+  WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D = $2046;
+  WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D = $2047;
+  WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D = $2048;
+  WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D = $2049;
+  WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D = $204A;
+  WGL_GENLOCK_SOURCE_EDGE_RISING_I3D = $204B;
+  WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D = $204C;
+var
+  wglEnableGenlockI3D: function(hDC: HDC): BOOL; extdecl;
+  wglDisableGenlockI3D: function(hDC: HDC): BOOL; extdecl;
+  wglIsEnabledGenlockI3D: function(hDC: HDC; pFlag: PBOOL): BOOL; extdecl;
+  wglGenlockSourceI3D: function(hDC: HDC; uSource: GLUINT): BOOL; extdecl;
+  wglGetGenlockSourceI3D: function(hDC: HDC; uSource: PGLUINT): BOOL; extdecl;
+  wglGenlockSourceEdgeI3D: function(hDC: HDC; uEdge: GLUINT): BOOL; extdecl;
+  wglGetGenlockSourceEdgeI3D: function(hDC: HDC; uEdge: PGLUINT): BOOL; extdecl;
+  wglGenlockSampleRateI3D: function(hDC: HDC; uRate: GLUINT): BOOL; extdecl;
+  wglGetGenlockSampleRateI3D: function(hDC: HDC; uRate: PGLUINT): BOOL; extdecl;
+  wglGenlockSourceDelayI3D: function(hDC: HDC; uDelay: GLUINT): BOOL; extdecl;
+  wglGetGenlockSourceDelayI3D: function(hDC: HDC; uDelay: PGLUINT): BOOL; extdecl;
+  wglQueryGenlockMaxSourceDelayI3D: function(hDC: HDC; uMaxLineDelay: PGLUINT; uMaxPixelDelay: PGLUINT): BOOL; extdecl;
+
+function Load_WGL_I3D_genlock: Boolean;
+{$ENDIF}
+
+//***** GL_ARB_matrix_palette *****//
+const
+  GL_MATRIX_PALETTE_ARB = $8840;
+  GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB = $8841;
+  GL_MAX_PALETTE_MATRICES_ARB = $8842;
+  GL_CURRENT_PALETTE_MATRIX_ARB = $8843;
+  GL_MATRIX_INDEX_ARRAY_ARB = $8844;
+  GL_CURRENT_MATRIX_INDEX_ARB = $8845;
+  GL_MATRIX_INDEX_ARRAY_SIZE_ARB = $8846;
+  GL_MATRIX_INDEX_ARRAY_TYPE_ARB = $8847;
+  GL_MATRIX_INDEX_ARRAY_STRIDE_ARB = $8848;
+  GL_MATRIX_INDEX_ARRAY_POINTER_ARB = $8849;
+var
+  glCurrentPaletteMatrixARB: procedure(index: GLint); extdecl;
+  glMatrixIndexubvARB: procedure(size: GLint; indices: PGLubyte); extdecl;
+  glMatrixIndexusvARB: procedure(size: GLint; indices: PGLushort); extdecl;
+  glMatrixIndexuivARB: procedure(size: GLint; indices: PGLuint); extdecl;
+  glMatrixIndexPointerARB: procedure(size: GLint; _type: GLenum; stride: GLsizei; pointer: PGLvoid); extdecl;
+
+function Load_GL_ARB_matrix_palette: Boolean;
+
+//***** GL_NV_element_array *****//
+const
+  GL_ELEMENT_ARRAY_TYPE_NV = $8769;
+  GL_ELEMENT_ARRAY_POINTER_NV = $876A;
+var
+  glElementPointerNV: procedure(_type: GLenum; const pointer: PGLvoid); extdecl;
+  glDrawElementArrayNV: procedure(mode: GLenum; first: GLint; count: GLsizei); extdecl;
+  glDrawRangeElementArrayNV: procedure(mode: GLenum; start: GLuint; _end: GLuint; first: GLint; count: GLsizei); extdecl;
+  glMultiDrawElementArrayNV: procedure(mode: GLenum; const first: PGLint; const count: PGLsizei; primcount: GLsizei); extdecl;
+  glMultiDrawRangeElementArrayNV: procedure(mode: GLenum; start: GLuint; _end: GLuint; const first: PGLint; const count: PGLsizei; primcount: GLsizei); extdecl;
+
+function Load_GL_NV_element_array: Boolean;
+
+//***** GL_NV_float_buffer *****//
+const
+  GL_FLOAT_R_NV = $8880;
+  GL_FLOAT_RG_NV = $8881;
+  GL_FLOAT_RGB_NV = $8882;
+  GL_FLOAT_RGBA_NV = $8883;
+  GL_FLOAT_R16_NV = $8884;
+  GL_FLOAT_R32_NV = $8885;
+  GL_FLOAT_RG16_NV = $8886;
+  GL_FLOAT_RG32_NV = $8887;
+  GL_FLOAT_RGB16_NV = $8888;
+  GL_FLOAT_RGB32_NV = $8889;
+  GL_FLOAT_RGBA16_NV = $888A;
+  GL_FLOAT_RGBA32_NV = $888B;
+  GL_TEXTURE_FLOAT_COMPONENTS_NV = $888C;
+  GL_FLOAT_CLEAR_COLOR_VALUE_NV = $888D;
+  GL_FLOAT_RGBA_MODE_NV = $888E;
+{$IFDEF Windows}
+  WGL_FLOAT_COMPONENTS_NV = $20B0;
+  WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV = $20B1;
+  WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV = $20B2;
+  WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV = $20B3;
+  WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV = $20B4;
+  WGL_TEXTURE_FLOAT_R_NV = $20B5;
+  WGL_TEXTURE_FLOAT_RG_NV = $20B6;
+  WGL_TEXTURE_FLOAT_RGB_NV = $20B7;
+  WGL_TEXTURE_FLOAT_RGBA_NV = $20B8;
+{$ENDIF}
+
+function Load_GL_NV_float_buffer: Boolean;
+
+//***** GL_NV_fragment_program *****//
+const
+  GL_FRAGMENT_PROGRAM_NV = $8870;
+  GL_MAX_TEXTURE_COORDS_NV = $8871;
+  GL_MAX_TEXTURE_IMAGE_UNITS_NV = $8872;
+  GL_FRAGMENT_PROGRAM_BINDING_NV = $8873;
+  GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV = $8868;
+  GL_PROGRAM_ERROR_STRING_NV = $8874;
+var
+  glProgramNamedParameter4fNV: procedure(id: GLuint; len: GLsizei; const name: PGLubyte; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glProgramNamedParameter4dNV: procedure(id: GLuint; len: GLsizei; const name: PGLubyte; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); extdecl;
+  glGetProgramNamedParameterfvNV: procedure(id: GLuint; len: GLsizei; const name: PGLubyte; params: PGLfloat); extdecl;
+  glGetProgramNamedParameterdvNV: procedure(id: GLuint; len: GLsizei; const name: PGLubyte; params: PGLdouble); extdecl;
+  // glProgramLocalParameter4dARB  { already defined }
+  // glProgramLocalParameter4dvARB  { already defined }
+  // glProgramLocalParameter4fARB  { already defined }
+  // glProgramLocalParameter4fvARB  { already defined }
+  // glGetProgramLocalParameterdvARB  { already defined }
+  // glGetProgramLocalParameterfvARB  { already defined }
+
+function Load_GL_NV_fragment_program: Boolean;
+
+//***** GL_NV_primitive_restart *****//
+const
+  GL_PRIMITIVE_RESTART_NV = $8558;
+  GL_PRIMITIVE_RESTART_INDEX_NV = $8559;
+var
+  glPrimitiveRestartNV: procedure(); extdecl;
+  glPrimitiveRestartIndexNV: procedure(index: GLuint); extdecl;
+
+function Load_GL_NV_primitive_restart: Boolean;
+
+//***** GL_NV_vertex_program2 *****//
+
+function Load_GL_NV_vertex_program2: Boolean;
+
+{$IFDEF Windows}
+//***** WGL_NV_render_texture_rectangle *****//
+const
+  WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV = $20A0;
+  WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV = $20A1;
+  WGL_TEXTURE_RECTANGLE_NV = $20A2;
+
+function Load_WGL_NV_render_texture_rectangle: Boolean;
+{$ENDIF}
+
+//***** GL_NV_pixel_data_range *****//
+const
+  GL_WRITE_PIXEL_DATA_RANGE_NV = $8878;
+  GL_READ_PIXEL_DATA_RANGE_NV = $8879;
+  GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV = $887A;
+  GL_READ_PIXEL_DATA_RANGE_LENGTH_NV = $887B;
+  GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV = $887C;
+  GL_READ_PIXEL_DATA_RANGE_POINTER_NV = $887D;
+var
+  glPixelDataRangeNV: procedure(target: GLenum; length: GLsizei; pointer: PGLvoid); extdecl;
+  glFlushPixelDataRangeNV: procedure(target: GLenum); extdecl;
+  // wglAllocateMemoryNV  { already defined }
+  // wglFreeMemoryNV  { already defined }
+
+function Load_GL_NV_pixel_data_range: Boolean;
+
+//***** GL_EXT_texture_rectangle *****//
+const
+  GL_TEXTURE_RECTANGLE_EXT = $84F5;
+  GL_TEXTURE_BINDING_RECTANGLE_EXT = $84F6;
+  GL_PROXY_TEXTURE_RECTANGLE_EXT = $84F7;
+  GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT = $84F8;
+
+function Load_GL_EXT_texture_rectangle: Boolean;
+
+//***** GL_S3_s3tc *****//
+const
+  GL_RGB_S3TC = $83A0;
+  GL_RGB4_S3TC = $83A1;
+  GL_RGBA_S3TC = $83A2;
+  GL_RGBA4_S3TC = $83A3;
+
+function Load_GL_S3_s3tc: Boolean;
+
+//***** GL_ATI_draw_buffers *****//
+const
+  GL_MAX_DRAW_BUFFERS_ATI = $8824;
+  GL_DRAW_BUFFER0_ATI = $8825;
+  GL_DRAW_BUFFER1_ATI = $8826;
+  GL_DRAW_BUFFER2_ATI = $8827;
+  GL_DRAW_BUFFER3_ATI = $8828;
+  GL_DRAW_BUFFER4_ATI = $8829;
+  GL_DRAW_BUFFER5_ATI = $882A;
+  GL_DRAW_BUFFER6_ATI = $882B;
+  GL_DRAW_BUFFER7_ATI = $882C;
+  GL_DRAW_BUFFER8_ATI = $882D;
+  GL_DRAW_BUFFER9_ATI = $882E;
+  GL_DRAW_BUFFER10_ATI = $882F;
+  GL_DRAW_BUFFER11_ATI = $8830;
+  GL_DRAW_BUFFER12_ATI = $8831;
+  GL_DRAW_BUFFER13_ATI = $8832;
+  GL_DRAW_BUFFER14_ATI = $8833;
+  GL_DRAW_BUFFER15_ATI = $8834;
+var
+  glDrawBuffersATI: procedure(n: GLsizei; const bufs: PGLenum); extdecl;
+
+function Load_GL_ATI_draw_buffers: Boolean;
+
+{$IFDEF Windows}
+//***** WGL_ATI_pixel_format_float *****//
+const
+  WGL_RGBA_FLOAT_MODE_ATI = $8820;
+  WGL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI = $8835;
+  WGL_TYPE_RGBA_FLOAT_ATI = $21A0;
+
+function Load_WGL_ATI_pixel_format_float: Boolean;
+{$ENDIF}
+
+//***** GL_ATI_texture_env_combine3 *****//
+const
+  GL_MODULATE_ADD_ATI = $8744;
+  GL_MODULATE_SIGNED_ADD_ATI = $8745;
+  GL_MODULATE_SUBTRACT_ATI = $8746;
+
+function Load_GL_ATI_texture_env_combine3: Boolean;
+
+//***** GL_ATI_texture_float *****//
+const
+  GL_RGBA_FLOAT32_ATI = $8814;
+  GL_RGB_FLOAT32_ATI = $8815;
+  GL_ALPHA_FLOAT32_ATI = $8816;
+  GL_INTENSITY_FLOAT32_ATI = $8817;
+  GL_LUMINANCE_FLOAT32_ATI = $8818;
+  GL_LUMINANCE_ALPHA_FLOAT32_ATI = $8819;
+  GL_RGBA_FLOAT16_ATI = $881A;
+  GL_RGB_FLOAT16_ATI = $881B;
+  GL_ALPHA_FLOAT16_ATI = $881C;
+  GL_INTENSITY_FLOAT16_ATI = $881D;
+  GL_LUMINANCE_FLOAT16_ATI = $881E;
+  GL_LUMINANCE_ALPHA_FLOAT16_ATI = $881F;
+
+function Load_GL_ATI_texture_float: Boolean;
+
+//***** GL_NV_texture_expand_normal *****//
+const
+  GL_TEXTURE_UNSIGNED_REMAP_MODE_NV = $888F;
+
+function Load_GL_NV_texture_expand_normal: Boolean;
+
+//***** GL_NV_half_float *****//
+const
+  GL_HALF_FLOAT_NV = $140B;
+var
+  glVertex2hNV: procedure(x: GLushort; y: GLushort); extdecl;
+  glVertex2hvNV: procedure(const v: PGLushort); extdecl;
+  glVertex3hNV: procedure(x: GLushort; y: GLushort; z: GLushort); extdecl;
+  glVertex3hvNV: procedure(const v: PGLushort); extdecl;
+  glVertex4hNV: procedure(x: GLushort; y: GLushort; z: GLushort; w: GLushort); extdecl;
+  glVertex4hvNV: procedure(const v: PGLushort); extdecl;
+  glNormal3hNV: procedure(nx: GLushort; ny: GLushort; nz: GLushort); extdecl;
+  glNormal3hvNV: procedure(const v: PGLushort); extdecl;
+  glColor3hNV: procedure(red: GLushort; green: GLushort; blue: GLushort); extdecl;
+  glColor3hvNV: procedure(const v: PGLushort); extdecl;
+  glColor4hNV: procedure(red: GLushort; green: GLushort; blue: GLushort; alpha: GLushort); extdecl;
+  glColor4hvNV: procedure(const v: PGLushort); extdecl;
+  glTexCoord1hNV: procedure(s: GLushort); extdecl;
+  glTexCoord1hvNV: procedure(const v: PGLushort); extdecl;
+  glTexCoord2hNV: procedure(s: GLushort; t: GLushort); extdecl;
+  glTexCoord2hvNV: procedure(const v: PGLushort); extdecl;
+  glTexCoord3hNV: procedure(s: GLushort; t: GLushort; r: GLushort); extdecl;
+  glTexCoord3hvNV: procedure(const v: PGLushort); extdecl;
+  glTexCoord4hNV: procedure(s: GLushort; t: GLushort; r: GLushort; q: GLushort); extdecl;
+  glTexCoord4hvNV: procedure(const v: PGLushort); extdecl;
+  glMultiTexCoord1hNV: procedure(target: GLenum; s: GLushort); extdecl;
+  glMultiTexCoord1hvNV: procedure(target: GLenum; const v: PGLushort); extdecl;
+  glMultiTexCoord2hNV: procedure(target: GLenum; s: GLushort; t: GLushort); extdecl;
+  glMultiTexCoord2hvNV: procedure(target: GLenum; const v: PGLushort); extdecl;
+  glMultiTexCoord3hNV: procedure(target: GLenum; s: GLushort; t: GLushort; r: GLushort); extdecl;
+  glMultiTexCoord3hvNV: procedure(target: GLenum; const v: PGLushort); extdecl;
+  glMultiTexCoord4hNV: procedure(target: GLenum; s: GLushort; t: GLushort; r: GLushort; q: GLushort); extdecl;
+  glMultiTexCoord4hvNV: procedure(target: GLenum; const v: PGLushort); extdecl;
+  glFogCoordhNV: procedure(fog: GLushort); extdecl;
+  glFogCoordhvNV: procedure(const fog: PGLushort); extdecl;
+  glSecondaryColor3hNV: procedure(red: GLushort; green: GLushort; blue: GLushort); extdecl;
+  glSecondaryColor3hvNV: procedure(const v: PGLushort); extdecl;
+  glVertexWeighthNV: procedure(weight: GLushort); extdecl;
+  glVertexWeighthvNV: procedure(const weight: PGLushort); extdecl;
+  glVertexAttrib1hNV: procedure(index: GLuint; x: GLushort); extdecl;
+  glVertexAttrib1hvNV: procedure(index: GLuint; const v: PGLushort); extdecl;
+  glVertexAttrib2hNV: procedure(index: GLuint; x: GLushort; y: GLushort); extdecl;
+  glVertexAttrib2hvNV: procedure(index: GLuint; const v: PGLushort); extdecl;
+  glVertexAttrib3hNV: procedure(index: GLuint; x: GLushort; y: GLushort; z: GLushort); extdecl;
+  glVertexAttrib3hvNV: procedure(index: GLuint; const v: PGLushort); extdecl;
+  glVertexAttrib4hNV: procedure(index: GLuint; x: GLushort; y: GLushort; z: GLushort; w: GLushort); extdecl;
+  glVertexAttrib4hvNV: procedure(index: GLuint; const v: PGLushort); extdecl;
+  glVertexAttribs1hvNV: procedure(index: GLuint; n: GLsizei; const v: PGLushort); extdecl;
+  glVertexAttribs2hvNV: procedure(index: GLuint; n: GLsizei; const v: PGLushort); extdecl;
+  glVertexAttribs3hvNV: procedure(index: GLuint; n: GLsizei; const v: PGLushort); extdecl;
+  glVertexAttribs4hvNV: procedure(index: GLuint; n: GLsizei; const v: PGLushort); extdecl;
+
+function Load_GL_NV_half_float: Boolean;
+
+//***** GL_ATI_map_object_buffer *****//
+var
+  glMapObjectBufferATI: function(buffer: GLuint): PGLvoid; extdecl;
+  glUnmapObjectBufferATI: procedure(buffer: GLuint); extdecl;
+
+function Load_GL_ATI_map_object_buffer: Boolean;
+
+//***** GL_ATI_separate_stencil *****//
+const
+  GL_KEEP = $1E00;
+  GL_ZERO = $0000;
+  GL_REPLACE = $1E01;
+  GL_INCR = $1E02;
+  GL_DECR = $1E03;
+  GL_INVERT = $150A;
+  GL_NEVER = $0200;
+  GL_LESS = $0201;
+  GL_LEQUAL = $0203;
+  GL_GREATER = $0204;
+  GL_GEQUAL = $0206;
+  GL_EQUAL = $0202;
+  GL_NOTEQUAL = $0205;
+  GL_ALWAYS = $0207;
+  GL_FRONT = $0404;
+  GL_BACK = $0405;
+  GL_FRONT_AND_BACK = $0408;
+  GL_STENCIL_BACK_FUNC_ATI = $8800;
+  GL_STENCIL_BACK_FAIL_ATI = $8801;
+  GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI = $8802;
+  GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI = $8803;
+var
+  glStencilOpSeparateATI: procedure(face: GLenum; sfail: GLenum; dpfail: GLenum; dppass: GLenum); extdecl;
+  glStencilFuncSeparateATI: procedure(frontfunc: GLenum; backfunc: GLenum; ref: GLint; mask: GLuint); extdecl;
+
+function Load_GL_ATI_separate_stencil: Boolean;
+
+//***** GL_ATI_vertex_attrib_array_object *****//
+var
+  glVertexAttribArrayObjectATI: procedure(index: GLuint; size: GLint; _type: GLenum; normalized: GLboolean; stride: GLsizei; buffer: GLuint; offset: GLuint); extdecl;
+  glGetVertexAttribArrayObjectfvATI: procedure(index: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glGetVertexAttribArrayObjectivATI: procedure(index: GLuint; pname: GLenum; params: PGLint); extdecl;
+
+function Load_GL_ATI_vertex_attrib_array_object: Boolean;
+
+//***** GL_ARB_occlusion_query *****//
+const
+  GL_SAMPLES_PASSED_ARB = $8914;
+  GL_QUERY_COUNTER_BITS_ARB = $8864;
+  GL_CURRENT_QUERY_ARB = $8865;
+  GL_QUERY_RESULT_ARB = $8866;
+  GL_QUERY_RESULT_AVAILABLE_ARB = $8867;
+var
+  glGenQueriesARB: procedure(n: GLsizei; ids: PGLuint); extdecl;
+  glDeleteQueriesARB: procedure(n: GLsizei; const ids: PGLuint); extdecl;
+  glIsQueryARB: function(id: GLuint): GLboolean; extdecl;
+  glBeginQueryARB: procedure(target: GLenum; id: GLuint); extdecl;
+  glEndQueryARB: procedure(target: GLenum); extdecl;
+  glGetQueryivARB: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetQueryObjectivARB: procedure(id: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetQueryObjectuivARB: procedure(id: GLuint; pname: GLenum; params: PGLuint); extdecl;
+
+function Load_GL_ARB_occlusion_query: Boolean;
+
+//***** GL_ARB_shader_objects *****//
+const
+  GL_PROGRAM_OBJECT_ARB = $8B40;
+  GL_OBJECT_TYPE_ARB = $8B4E;
+  GL_OBJECT_SUBTYPE_ARB = $8B4F;
+  GL_OBJECT_DELETE_STATUS_ARB = $8B80;
+  GL_OBJECT_COMPILE_STATUS_ARB = $8B81;
+  GL_OBJECT_LINK_STATUS_ARB = $8B82;
+  GL_OBJECT_VALIDATE_STATUS_ARB = $8B83;
+  GL_OBJECT_INFO_LOG_LENGTH_ARB = $8B84;
+  GL_OBJECT_ATTACHED_OBJECTS_ARB = $8B85;
+  GL_OBJECT_ACTIVE_UNIFORMS_ARB = $8B86;
+  GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB = $8B87;
+  GL_OBJECT_SHADER_SOURCE_LENGTH_ARB = $8B88;
+  GL_SHADER_OBJECT_ARB = $8B48;
+  GL_FLOAT = $1406;
+  GL_FLOAT_VEC2_ARB = $8B50;
+  GL_FLOAT_VEC3_ARB = $8B51;
+  GL_FLOAT_VEC4_ARB = $8B52;
+  GL_INT = $1404;
+  GL_INT_VEC2_ARB = $8B53;
+  GL_INT_VEC3_ARB = $8B54;
+  GL_INT_VEC4_ARB = $8B55;
+  GL_BOOL_ARB = $8B56;
+  GL_BOOL_VEC2_ARB = $8B57;
+  GL_BOOL_VEC3_ARB = $8B58;
+  GL_BOOL_VEC4_ARB = $8B59;
+  GL_FLOAT_MAT2_ARB = $8B5A;
+  GL_FLOAT_MAT3_ARB = $8B5B;
+  GL_FLOAT_MAT4_ARB = $8B5C;
+var
+  glDeleteObjectARB: procedure(obj: GLhandleARB); extdecl;
+  glGetHandleARB: function(pname: GLenum): GLhandleARB; extdecl;
+  glDetachObjectARB: procedure(containerObj: GLhandleARB; attachedObj: GLhandleARB); extdecl;
+  glCreateShaderObjectARB: function(shaderType: GLenum): GLhandleARB; extdecl;
+  glShaderSourceARB: procedure(shaderObj: GLhandleARB; count: GLsizei; const _string: PGLvoid; const length: PGLint); extdecl;
+  glCompileShaderARB: procedure(shaderObj: GLhandleARB); extdecl;
+  glCreateProgramObjectARB: function(): GLhandleARB; extdecl;
+  glAttachObjectARB: procedure(containerObj: GLhandleARB; obj: GLhandleARB); extdecl;
+  glLinkProgramARB: procedure(programObj: GLhandleARB); extdecl;
+  glUseProgramObjectARB: procedure(programObj: GLhandleARB); extdecl;
+  glValidateProgramARB: procedure(programObj: GLhandleARB); extdecl;
+  glUniform1fARB: procedure(location: GLint; v0: GLfloat); extdecl;
+  glUniform2fARB: procedure(location: GLint; v0: GLfloat; v1: GLfloat); extdecl;
+  glUniform3fARB: procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat); extdecl;
+  glUniform4fARB: procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat; v3: GLfloat); extdecl;
+  glUniform1iARB: procedure(location: GLint; v0: GLint); extdecl;
+  glUniform2iARB: procedure(location: GLint; v0: GLint; v1: GLint); extdecl;
+  glUniform3iARB: procedure(location: GLint; v0: GLint; v1: GLint; v2: GLint); extdecl;
+  glUniform4iARB: procedure(location: GLint; v0: GLint; v1: GLint; v2: GLint; v3: GLint); extdecl;
+  glUniform1fvARB: procedure(location: GLint; count: GLsizei; value: PGLfloat); extdecl;
+  glUniform2fvARB: procedure(location: GLint; count: GLsizei; value: PGLfloat); extdecl;
+  glUniform3fvARB: procedure(location: GLint; count: GLsizei; value: PGLfloat); extdecl;
+  glUniform4fvARB: procedure(location: GLint; count: GLsizei; value: PGLfloat); extdecl;
+  glUniform1ivARB: procedure(location: GLint; count: GLsizei; value: PGLint); extdecl;
+  glUniform2ivARB: procedure(location: GLint; count: GLsizei; value: PGLint); extdecl;
+  glUniform3ivARB: procedure(location: GLint; count: GLsizei; value: PGLint); extdecl;
+  glUniform4ivARB: procedure(location: GLint; count: GLsizei; value: PGLint); extdecl;
+  glUniformMatrix2fvARB: procedure(location: GLint; count: GLsizei; transpose: GLboolean; value: PGLfloat); extdecl;
+  glUniformMatrix3fvARB: procedure(location: GLint; count: GLsizei; transpose: GLboolean; value: PGLfloat); extdecl;
+  glUniformMatrix4fvARB: procedure(location: GLint; count: GLsizei; transpose: GLboolean; value: PGLfloat); extdecl;
+  glGetObjectParameterfvARB: procedure(obj: GLhandleARB; pname: GLenum; params: PGLfloat); extdecl;
+  glGetObjectParameterivARB: procedure(obj: GLhandleARB; pname: GLenum; params: PGLint); extdecl;
+  glGetInfoLogARB: procedure(obj: GLhandleARB; maxLength: GLsizei; length: PGLsizei; infoLog: PGLcharARB); extdecl;
+  glGetAttachedObjectsARB: procedure(containerObj: GLhandleARB; maxCount: GLsizei; count: PGLsizei; obj: PGLhandleARB); extdecl;
+  glGetUniformLocationARB: function(programObj: GLhandleARB; const name: PGLcharARB): GLint; extdecl;
+  glGetActiveUniformARB: procedure(programObj: GLhandleARB; index: GLuint; maxLength: GLsizei; length: PGLsizei; size: PGLint; _type: PGLenum; name: PGLcharARB); extdecl;
+  glGetUniformfvARB: procedure(programObj: GLhandleARB; location: GLint; params: PGLfloat); extdecl;
+  glGetUniformivARB: procedure(programObj: GLhandleARB; location: GLint; params: PGLint); extdecl;
+  glGetShaderSourceARB: procedure(obj: GLhandleARB; maxLength: GLsizei; length: PGLsizei; source: PGLcharARB); extdecl;
+
+function Load_GL_ARB_shader_objects: Boolean;
+
+//***** GL_ARB_vertex_shader *****//
+const
+  GL_VERTEX_SHADER_ARB = $8B31;
+  GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB = $8B4A;
+  GL_MAX_VARYING_FLOATS_ARB = $8B4B;
+  // GL_MAX_VERTEX_ATTRIBS_ARB  { already defined }
+  // GL_MAX_TEXTURE_IMAGE_UNITS_ARB  { already defined }
+  GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB = $8B4C;
+  GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB = $8B4D;
+  // GL_MAX_TEXTURE_COORDS_ARB  { already defined }
+  // GL_VERTEX_PROGRAM_POINT_SIZE_ARB  { already defined }
+  // GL_VERTEX_PROGRAM_TWO_SIDE_ARB  { already defined }
+  // GL_OBJECT_TYPE_ARB  { already defined }
+  // GL_OBJECT_SUBTYPE_ARB  { already defined }
+  GL_OBJECT_ACTIVE_ATTRIBUTES_ARB = $8B89;
+  GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB = $8B8A;
+  // GL_SHADER_OBJECT_ARB  { already defined }
+  // GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB  { already defined }
+  // GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB  { already defined }
+  // GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB  { already defined }
+  // GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB  { already defined }
+  // GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB  { already defined }
+  // GL_CURRENT_VERTEX_ATTRIB_ARB  { already defined }
+  // GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB  { already defined }
+  // GL_FLOAT  { already defined }
+  // GL_FLOAT_VEC2_ARB  { already defined }
+  // GL_FLOAT_VEC3_ARB  { already defined }
+  // GL_FLOAT_VEC4_ARB  { already defined }
+  // GL_FLOAT_MAT2_ARB  { already defined }
+  // GL_FLOAT_MAT3_ARB  { already defined }
+  // GL_FLOAT_MAT4_ARB  { already defined }
+  // glVertexAttrib1fARB  { already defined }
+  // glVertexAttrib1sARB  { already defined }
+  // glVertexAttrib1dARB  { already defined }
+  // glVertexAttrib2fARB  { already defined }
+  // glVertexAttrib2sARB  { already defined }
+  // glVertexAttrib2dARB  { already defined }
+  // glVertexAttrib3fARB  { already defined }
+  // glVertexAttrib3sARB  { already defined }
+  // glVertexAttrib3dARB  { already defined }
+  // glVertexAttrib4fARB  { already defined }
+  // glVertexAttrib4sARB  { already defined }
+  // glVertexAttrib4dARB  { already defined }
+  // glVertexAttrib4NubARB  { already defined }
+  // glVertexAttrib1fvARB  { already defined }
+  // glVertexAttrib1svARB  { already defined }
+  // glVertexAttrib1dvARB  { already defined }
+  // glVertexAttrib2fvARB  { already defined }
+  // glVertexAttrib2svARB  { already defined }
+  // glVertexAttrib2dvARB  { already defined }
+  // glVertexAttrib3fvARB  { already defined }
+  // glVertexAttrib3svARB  { already defined }
+  // glVertexAttrib3dvARB  { already defined }
+  // glVertexAttrib4fvARB  { already defined }
+  // glVertexAttrib4svARB  { already defined }
+  // glVertexAttrib4dvARB  { already defined }
+  // glVertexAttrib4ivARB  { already defined }
+  // glVertexAttrib4bvARB  { already defined }
+  // glVertexAttrib4ubvARB  { already defined }
+  // glVertexAttrib4usvARB  { already defined }
+  // glVertexAttrib4uivARB  { already defined }
+  // glVertexAttrib4NbvARB  { already defined }
+  // glVertexAttrib4NsvARB  { already defined }
+  // glVertexAttrib4NivARB  { already defined }
+  // glVertexAttrib4NubvARB  { already defined }
+  // glVertexAttrib4NusvARB  { already defined }
+  // glVertexAttrib4NuivARB  { already defined }
+  // glVertexAttribPointerARB  { already defined }
+  // glEnableVertexAttribArrayARB  { already defined }
+  // glDisableVertexAttribArrayARB  { already defined }
+var
+  glBindAttribLocationARB: procedure(programObj: GLhandleARB; index: GLuint; const name: PGLcharARB); extdecl;
+  glGetActiveAttribARB: procedure(programObj: GLhandleARB; index: GLuint; maxLength: GLsizei; length: PGLsizei; size: PGLint; _type: PGLenum; name: PGLcharARB); extdecl;
+  glGetAttribLocationARB: function(programObj: GLhandleARB; const name: PGLcharARB): GLint; extdecl;
+  // glGetVertexAttribdvARB  { already defined }
+  // glGetVertexAttribfvARB  { already defined }
+  // glGetVertexAttribivARB  { already defined }
+  // glGetVertexAttribPointervARB  { already defined }
+
+function Load_GL_ARB_vertex_shader: Boolean;
+
+//***** GL_ARB_fragment_shader *****//
+const
+  GL_FRAGMENT_SHADER_ARB = $8B30;
+  GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB = $8B49;
+  // GL_MAX_TEXTURE_COORDS_ARB  { already defined }
+  // GL_MAX_TEXTURE_IMAGE_UNITS_ARB  { already defined }
+  // GL_OBJECT_TYPE_ARB  { already defined }
+  // GL_OBJECT_SUBTYPE_ARB  { already defined }
+  // GL_SHADER_OBJECT_ARB  { already defined }
+
+function Load_GL_ARB_fragment_shader: Boolean;
+
+//***** GL_ARB_shading_language_100 *****//
+
+function Load_GL_ARB_shading_language_100: Boolean;
+
+//***** GL_ARB_texture_non_power_of_two *****//
+
+function Load_GL_ARB_texture_non_power_of_two: Boolean;
+
+//***** GL_ARB_point_sprite *****//
+const
+  GL_POINT_SPRITE_ARB = $8861;
+  GL_COORD_REPLACE_ARB = $8862;
+
+function Load_GL_ARB_point_sprite: Boolean;
+
+//***** GL_EXT_depth_bounds_test *****//
+const
+  GL_DEPTH_BOUNDS_TEST_EXT = $8890;
+  GL_DEPTH_BOUNDS_EXT = $8891;
+var
+  glDepthBoundsEXT: procedure(zmin: GLclampd; zmax: GLclampd); extdecl;
+
+function Load_GL_EXT_depth_bounds_test: Boolean;
+
+//***** GL_EXT_texture_mirror_clamp *****//
+const
+  GL_MIRROR_CLAMP_EXT = $8742;
+  GL_MIRROR_CLAMP_TO_EDGE_EXT = $8743;
+  GL_MIRROR_CLAMP_TO_BORDER_EXT = $8912;
+
+function Load_GL_EXT_texture_mirror_clamp: Boolean;
+
+//***** GL_EXT_blend_equation_separate *****//
+const
+  GL_BLEND_EQUATION_RGB_EXT = $8009;
+  GL_BLEND_EQUATION_ALPHA_EXT = $883D;
+var
+  glBlendEquationSeparateEXT: procedure(modeRGB: GLenum; modeAlpha: GLenum); extdecl;
+
+function Load_GL_EXT_blend_equation_separate: Boolean;
+
+//***** GL_MESA_pack_invert *****//
+const
+  GL_PACK_INVERT_MESA = $8758;
+
+function Load_GL_MESA_pack_invert: Boolean;
+
+//***** GL_MESA_ycbcr_texture *****//
+const
+  GL_YCBCR_MESA = $8757;
+  GL_UNSIGNED_SHORT_8_8_MESA = $85BA;
+  GL_UNSIGNED_SHORT_8_8_REV_MESA = $85BB;
+
+function Load_GL_MESA_ycbcr_texture: Boolean;
+
+//***** GL_ARB_fragment_program_shadow *****//
+
+function Load_GL_ARB_fragment_program_shadow: Boolean;
+
+//***** GL_NV_fragment_program_option *****//
+
+function Load_GL_NV_fragment_program_option: Boolean;
+
+//***** GL_EXT_pixel_buffer_object *****//
+const
+  GL_PIXEL_PACK_BUFFER_EXT = $88EB;
+  GL_PIXEL_UNPACK_BUFFER_EXT = $88EC;
+  GL_PIXEL_PACK_BUFFER_BINDING_EXT = $88ED;
+  GL_PIXEL_UNPACK_BUFFER_BINDING_EXT = $88EF;
+
+function Load_GL_EXT_pixel_buffer_object: Boolean;
+
+//***** GL_NV_fragment_program2 *****//
+const
+  GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV = $88F4;
+  GL_MAX_PROGRAM_CALL_DEPTH_NV = $88F5;
+  GL_MAX_PROGRAM_IF_DEPTH_NV = $88F6;
+  GL_MAX_PROGRAM_LOOP_DEPTH_NV = $88F7;
+  GL_MAX_PROGRAM_LOOP_COUNT_NV = $88F8;
+
+function Load_GL_NV_fragment_program2: Boolean;
+
+//***** GL_NV_vertex_program2_option *****//
+  // GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV  { already defined }
+  // GL_MAX_PROGRAM_CALL_DEPTH_NV  { already defined }
+
+function Load_GL_NV_vertex_program2_option: Boolean;
+
+//***** GL_NV_vertex_program3 *****//
+  // GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB  { already defined }
+
+function Load_GL_NV_vertex_program3: Boolean;
+
+//***** GL_ARB_draw_buffers *****//
+const
+  GL_MAX_DRAW_BUFFERS_ARB = $8824;
+  GL_DRAW_BUFFER0_ARB = $8825;
+  GL_DRAW_BUFFER1_ARB = $8826;
+  GL_DRAW_BUFFER2_ARB = $8827;
+  GL_DRAW_BUFFER3_ARB = $8828;
+  GL_DRAW_BUFFER4_ARB = $8829;
+  GL_DRAW_BUFFER5_ARB = $882A;
+  GL_DRAW_BUFFER6_ARB = $882B;
+  GL_DRAW_BUFFER7_ARB = $882C;
+  GL_DRAW_BUFFER8_ARB = $882D;
+  GL_DRAW_BUFFER9_ARB = $882E;
+  GL_DRAW_BUFFER10_ARB = $882F;
+  GL_DRAW_BUFFER11_ARB = $8830;
+  GL_DRAW_BUFFER12_ARB = $8831;
+  GL_DRAW_BUFFER13_ARB = $8832;
+  GL_DRAW_BUFFER14_ARB = $8833;
+  GL_DRAW_BUFFER15_ARB = $8834;
+var
+  glDrawBuffersARB: procedure(n: GLsizei; const bufs: PGLenum); extdecl;
+
+function Load_GL_ARB_draw_buffers: Boolean;
+
+//***** GL_ARB_texture_rectangle *****//
+const
+  GL_TEXTURE_RECTANGLE_ARB = $84F5;
+  GL_TEXTURE_BINDING_RECTANGLE_ARB = $84F6;
+  GL_PROXY_TEXTURE_RECTANGLE_ARB = $84F7;
+  GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB = $84F8;
+
+function Load_GL_ARB_texture_rectangle: Boolean;
+
+//***** GL_ARB_color_buffer_float *****//
+const
+  GL_RGBA_FLOAT_MODE_ARB = $8820;
+  GL_CLAMP_VERTEX_COLOR_ARB = $891A;
+  GL_CLAMP_FRAGMENT_COLOR_ARB = $891B;
+  GL_CLAMP_READ_COLOR_ARB = $891C;
+  GL_FIXED_ONLY_ARB = $891D;
+  WGL_TYPE_RGBA_FLOAT_ARB = $21A0;
+var
+  glClampColorARB: procedure(target: GLenum; clamp: GLenum); extdecl;
+
+function Load_GL_ARB_color_buffer_float: Boolean;
+
+//***** GL_ARB_half_float_pixel *****//
+const
+  GL_HALF_FLOAT_ARB = $140B;
+
+function Load_GL_ARB_half_float_pixel: Boolean;
+
+//***** GL_ARB_texture_float *****//
+const
+  GL_TEXTURE_RED_TYPE_ARB = $8C10;
+  GL_TEXTURE_GREEN_TYPE_ARB = $8C11;
+  GL_TEXTURE_BLUE_TYPE_ARB = $8C12;
+  GL_TEXTURE_ALPHA_TYPE_ARB = $8C13;
+  GL_TEXTURE_LUMINANCE_TYPE_ARB = $8C14;
+  GL_TEXTURE_INTENSITY_TYPE_ARB = $8C15;
+  GL_TEXTURE_DEPTH_TYPE_ARB = $8C16;
+  GL_UNSIGNED_NORMALIZED_ARB = $8C17;
+  GL_RGBA32F_ARB = $8814;
+  GL_RGB32F_ARB = $8815;
+  GL_ALPHA32F_ARB = $8816;
+  GL_INTENSITY32F_ARB = $8817;
+  GL_LUMINANCE32F_ARB = $8818;
+  GL_LUMINANCE_ALPHA32F_ARB = $8819;
+  GL_RGBA16F_ARB = $881A;
+  GL_RGB16F_ARB = $881B;
+  GL_ALPHA16F_ARB = $881C;
+  GL_INTENSITY16F_ARB = $881D;
+  GL_LUMINANCE16F_ARB = $881E;
+  GL_LUMINANCE_ALPHA16F_ARB = $881F;
+
+function Load_GL_ARB_texture_float: Boolean;
+
+//***** GL_EXT_texture_compression_dxt1 *****//
+  // GL_COMPRESSED_RGB_S3TC_DXT1_EXT  { already defined }
+  // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT  { already defined }
+
+function Load_GL_EXT_texture_compression_dxt1: Boolean;
+
+//***** GL_ARB_pixel_buffer_object *****//
+const
+  GL_PIXEL_PACK_BUFFER_ARB = $88EB;
+  GL_PIXEL_UNPACK_BUFFER_ARB = $88EC;
+  GL_PIXEL_PACK_BUFFER_BINDING_ARB = $88ED;
+  GL_PIXEL_UNPACK_BUFFER_BINDING_ARB = $88EF;
+
+function Load_GL_ARB_pixel_buffer_object: Boolean;
+
+//***** GL_EXT_framebuffer_object *****//
+const
+  GL_FRAMEBUFFER_EXT = $8D40;
+  GL_RENDERBUFFER_EXT = $8D41;
+  GL_STENCIL_INDEX_EXT = $8D45;
+  GL_STENCIL_INDEX1_EXT = $8D46;
+  GL_STENCIL_INDEX4_EXT = $8D47;
+  GL_STENCIL_INDEX8_EXT = $8D48;
+  GL_STENCIL_INDEX16_EXT = $8D49;
+  GL_RENDERBUFFER_WIDTH_EXT = $8D42;
+  GL_RENDERBUFFER_HEIGHT_EXT = $8D43;
+  GL_RENDERBUFFER_INTERNAL_FORMAT_EXT = $8D44;
+  GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT = $8CD0;
+  GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT = $8CD1;
+  GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT = $8CD2;
+  GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT = $8CD3;
+  GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT = $8CD4;
+  GL_COLOR_ATTACHMENT0_EXT = $8CE0;
+  GL_COLOR_ATTACHMENT1_EXT = $8CE1;
+  GL_COLOR_ATTACHMENT2_EXT = $8CE2;
+  GL_COLOR_ATTACHMENT3_EXT = $8CE3;
+  GL_COLOR_ATTACHMENT4_EXT = $8CE4;
+  GL_COLOR_ATTACHMENT5_EXT = $8CE5;
+  GL_COLOR_ATTACHMENT6_EXT = $8CE6;
+  GL_COLOR_ATTACHMENT7_EXT = $8CE7;
+  GL_COLOR_ATTACHMENT8_EXT = $8CE8;
+  GL_COLOR_ATTACHMENT9_EXT = $8CE9;
+  GL_COLOR_ATTACHMENT10_EXT = $8CEA;
+  GL_COLOR_ATTACHMENT11_EXT = $8CEB;
+  GL_COLOR_ATTACHMENT12_EXT = $8CEC;
+  GL_COLOR_ATTACHMENT13_EXT = $8CED;
+  GL_COLOR_ATTACHMENT14_EXT = $8CEE;
+  GL_COLOR_ATTACHMENT15_EXT = $8CEF;
+  GL_DEPTH_ATTACHMENT_EXT = $8D00;
+  GL_STENCIL_ATTACHMENT_EXT = $8D20;
+  GL_FRAMEBUFFER_COMPLETE_EXT = $8CD5;
+  GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT = $8CD6;
+  GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT = $8CD7;
+  GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT = $8CD8;
+  GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT = $8CD9;
+  GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT = $8CDA;
+  GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT = $8CDB;
+  GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT = $8CDC;
+  GL_FRAMEBUFFER_UNSUPPORTED_EXT = $8CDD;
+  GL_FRAMEBUFFER_STATUS_ERROR_EXT = $8CDE;
+  GL_FRAMEBUFFER_BINDING_EXT = $8CA6;
+  GL_RENDERBUFFER_BINDING_EXT = $8CA7;
+  GL_MAX_COLOR_ATTACHMENTS_EXT = $8CDF;
+  GL_MAX_RENDERBUFFER_SIZE_EXT = $84E8;
+  GL_INVALID_FRAMEBUFFER_OPERATION_EXT = $0506;
+var
+  glIsRenderbufferEXT: function(renderbuffer: GLuint): GLboolean; extdecl;
+  glBindRenderbufferEXT: procedure(target: GLenum; renderbuffer: GLuint); extdecl;
+  glDeleteRenderbuffersEXT: procedure(n: GLsizei; const renderbuffers: PGLuint); extdecl;
+  glGenRenderbuffersEXT: procedure(n: GLsizei; renderbuffers: PGLuint); extdecl;
+  glRenderbufferStorageEXT: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei); extdecl;
+  glGetRenderbufferParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glIsFramebufferEXT: function(framebuffer: GLuint): GLboolean; extdecl;
+  glBindFramebufferEXT: procedure(target: GLenum; framebuffer: GLuint); extdecl;
+  glDeleteFramebuffersEXT: procedure(n: GLsizei; const framebuffers: PGLuint); extdecl;
+  glGenFramebuffersEXT: procedure(n: GLsizei; framebuffers: PGLuint); extdecl;
+  glCheckFramebufferStatusEXT: function(target: GLenum): GLenum; extdecl;
+  glFramebufferTexture1DEXT: procedure(target: GLenum; attachment: GLenum; textarget: GLenum; texture: GLuint; level: GLint); extdecl;
+  glFramebufferTexture2DEXT: procedure(target: GLenum; attachment: GLenum; textarget: GLenum; texture: GLuint; level: GLint); extdecl;
+  glFramebufferTexture3DEXT: procedure(target: GLenum; attachment: GLenum; textarget: GLenum; texture: GLuint; level: GLint; zoffset: GLint); extdecl;
+  glFramebufferRenderbufferEXT: procedure(target: GLenum; attachment: GLenum; renderbuffertarget: GLenum; renderbuffer: GLuint); extdecl;
+  glGetFramebufferAttachmentParameterivEXT: procedure(target: GLenum; attachment: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGenerateMipmapEXT: procedure(target: GLenum); extdecl;
+
+function Load_GL_EXT_framebuffer_object: Boolean;
+
+//***** GL_version_1_4 *****//
+const
+  GL_BLEND_DST_RGB = $80C8;
+  GL_BLEND_SRC_RGB = $80C9;
+  GL_BLEND_DST_ALPHA = $80CA;
+  GL_BLEND_SRC_ALPHA = $80CB;
+  GL_POINT_SIZE_MIN = $8126;
+  GL_POINT_SIZE_MAX = $8127;
+  GL_POINT_FADE_THRESHOLD_SIZE = $8128;
+  GL_POINT_DISTANCE_ATTENUATION = $8129;
+  GL_GENERATE_MIPMAP = $8191;
+  GL_GENERATE_MIPMAP_HINT = $8192;
+  GL_DEPTH_COMPONENT16 = $81A5;
+  GL_DEPTH_COMPONENT24 = $81A6;
+  GL_DEPTH_COMPONENT32 = $81A7;
+  GL_MIRRORED_REPEAT = $8370;
+  GL_FOG_COORDINATE_SOURCE = $8450;
+  GL_FOG_COORDINATE = $8451;
+  GL_FRAGMENT_DEPTH = $8452;
+  GL_CURRENT_FOG_COORDINATE = $8453;
+  GL_FOG_COORDINATE_ARRAY_TYPE = $8454;
+  GL_FOG_COORDINATE_ARRAY_STRIDE = $8455;
+  GL_FOG_COORDINATE_ARRAY_POINTER = $8456;
+  GL_FOG_COORDINATE_ARRAY = $8457;
+  GL_COLOR_SUM = $8458;
+  GL_CURRENT_SECONDARY_COLOR = $8459;
+  GL_SECONDARY_COLOR_ARRAY_SIZE = $845A;
+  GL_SECONDARY_COLOR_ARRAY_TYPE = $845B;
+  GL_SECONDARY_COLOR_ARRAY_STRIDE = $845C;
+  GL_SECONDARY_COLOR_ARRAY_POINTER = $845D;
+  GL_SECONDARY_COLOR_ARRAY = $845E;
+  GL_MAX_TEXTURE_LOD_BIAS = $84FD;
+  GL_TEXTURE_FILTER_CONTROL = $8500;
+  GL_TEXTURE_LOD_BIAS = $8501;
+  GL_INCR_WRAP = $8507;
+  GL_DECR_WRAP = $8508;
+  GL_TEXTURE_DEPTH_SIZE = $884A;
+  GL_DEPTH_TEXTURE_MODE = $884B;
+  GL_TEXTURE_COMPARE_MODE = $884C;
+  GL_TEXTURE_COMPARE_FUNC = $884D;
+  GL_COMPARE_R_TO_TEXTURE = $884E;
+var
+  glBlendFuncSeparate: procedure(sfactorRGB: GLenum; dfactorRGB: GLenum; sfactorAlpha: GLenum; dfactorAlpha: GLenum); extdecl;
+  glFogCoordf: procedure(coord: GLfloat); extdecl;
+  glFogCoordfv: procedure(const coord: PGLfloat); extdecl;
+  glFogCoordd: procedure(coord: GLdouble); extdecl;
+  glFogCoorddv: procedure(const coord: PGLdouble); extdecl;
+  glFogCoordPointer: procedure(_type: GLenum; stride: GLsizei; const pointer: PGLvoid); extdecl;
+  glMultiDrawArrays: procedure(mode: GLenum; first: PGLint; count: PGLsizei; primcount: GLsizei); extdecl;
+  glMultiDrawElements: procedure(mode: GLenum; const count: PGLsizei; _type: GLenum; const indices: PGLvoid; primcount: GLsizei); extdecl;
+  glPointParameterf: procedure(pname: GLenum; param: GLfloat); extdecl;
+  glPointParameterfv: procedure(pname: GLenum; const params: PGLfloat); extdecl;
+  glPointParameteri: procedure(pname: GLenum; param: GLint); extdecl;
+  glPointParameteriv: procedure(pname: GLenum; const params: PGLint); extdecl;
+  glSecondaryColor3b: procedure(red: GLbyte; green: GLbyte; blue: GLbyte); extdecl;
+  glSecondaryColor3bv: procedure(const v: PGLbyte); extdecl;
+  glSecondaryColor3d: procedure(red: GLdouble; green: GLdouble; blue: GLdouble); extdecl;
+  glSecondaryColor3dv: procedure(const v: PGLdouble); extdecl;
+  glSecondaryColor3f: procedure(red: GLfloat; green: GLfloat; blue: GLfloat); extdecl;
+  glSecondaryColor3fv: procedure(const v: PGLfloat); extdecl;
+  glSecondaryColor3i: procedure(red: GLint; green: GLint; blue: GLint); extdecl;
+  glSecondaryColor3iv: procedure(const v: PGLint); extdecl;
+  glSecondaryColor3s: procedure(red: GLshort; green: GLshort; blue: GLshort); extdecl;
+  glSecondaryColor3sv: procedure(const v: PGLshort); extdecl;
+  glSecondaryColor3ub: procedure(red: GLubyte; green: GLubyte; blue: GLubyte); extdecl;
+  glSecondaryColor3ubv: procedure(const v: PGLubyte); extdecl;
+  glSecondaryColor3ui: procedure(red: GLuint; green: GLuint; blue: GLuint); extdecl;
+  glSecondaryColor3uiv: procedure(const v: PGLuint); extdecl;
+  glSecondaryColor3us: procedure(red: GLushort; green: GLushort; blue: GLushort); extdecl;
+  glSecondaryColor3usv: procedure(const v: PGLushort); extdecl;
+  glSecondaryColorPointer: procedure(size: GLint; _type: GLenum; stride: GLsizei; const pointer: PGLvoid); extdecl;
+  glWindowPos2d: procedure(x: GLdouble; y: GLdouble); extdecl;
+  glWindowPos2dv: procedure(const v: PGLdouble); extdecl;
+  glWindowPos2f: procedure(x: GLfloat; y: GLfloat); extdecl;
+  glWindowPos2fv: procedure(const v: PGLfloat); extdecl;
+  glWindowPos2i: procedure(x: GLint; y: GLint); extdecl;
+  glWindowPos2iv: procedure(const v: PGLint); extdecl;
+  glWindowPos2s: procedure(x: GLshort; y: GLshort); extdecl;
+  glWindowPos2sv: procedure(const v: PGLshort); extdecl;
+  glWindowPos3d: procedure(x: GLdouble; y: GLdouble; z: GLdouble); extdecl;
+  glWindowPos3dv: procedure(const v: PGLdouble); extdecl;
+  glWindowPos3f: procedure(x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glWindowPos3fv: procedure(const v: PGLfloat); extdecl;
+  glWindowPos3i: procedure(x: GLint; y: GLint; z: GLint); extdecl;
+  glWindowPos3iv: procedure(const v: PGLint); extdecl;
+  glWindowPos3s: procedure(x: GLshort; y: GLshort; z: GLshort); extdecl;
+  glWindowPos3sv: procedure(const v: PGLshort); extdecl;
+
+function Load_GL_version_1_4: Boolean;
+
+//***** GL_version_1_5 *****//
+const
+  GL_BUFFER_SIZE = $8764;
+  GL_BUFFER_USAGE = $8765;
+  GL_QUERY_COUNTER_BITS = $8864;
+  GL_CURRENT_QUERY = $8865;
+  GL_QUERY_RESULT = $8866;
+  GL_QUERY_RESULT_AVAILABLE = $8867;
+  GL_ARRAY_BUFFER = $8892;
+  GL_ELEMENT_ARRAY_BUFFER = $8893;
+  GL_ARRAY_BUFFER_BINDING = $8894;
+  GL_ELEMENT_ARRAY_BUFFER_BINDING = $8895;
+  GL_VERTEX_ARRAY_BUFFER_BINDING = $8896;
+  GL_NORMAL_ARRAY_BUFFER_BINDING = $8897;
+  GL_COLOR_ARRAY_BUFFER_BINDING = $8898;
+  GL_INDEX_ARRAY_BUFFER_BINDING = $8899;
+  GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = $889A;
+  GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = $889B;
+  GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = $889C;
+  GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = $889D;
+  GL_WEIGHT_ARRAY_BUFFER_BINDING = $889E;
+  GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = $889F;
+  GL_READ_ONLY = $88B8;
+  GL_WRITE_ONLY = $88B9;
+  GL_READ_WRITE = $88BA;
+  GL_BUFFER_ACCESS = $88BB;
+  GL_BUFFER_MAPPED = $88BC;
+  GL_BUFFER_MAP_POINTER = $88BD;
+  GL_STREAM_DRAW = $88E0;
+  GL_STREAM_READ = $88E1;
+  GL_STREAM_COPY = $88E2;
+  GL_STATIC_DRAW = $88E4;
+  GL_STATIC_READ = $88E5;
+  GL_STATIC_COPY = $88E6;
+  GL_DYNAMIC_DRAW = $88E8;
+  GL_DYNAMIC_READ = $88E9;
+  GL_DYNAMIC_COPY = $88EA;
+  GL_SAMPLES_PASSED = $8914;
+  GL_FOG_COORD_SRC = $8450;
+  GL_FOG_COORD = $8451;
+  GL_CURRENT_FOG_COORD = $8453;
+  GL_FOG_COORD_ARRAY_TYPE = $8454;
+  GL_FOG_COORD_ARRAY_STRIDE = $8455;
+  GL_FOG_COORD_ARRAY_POINTER = $8456;
+  GL_FOG_COORD_ARRAY = $8457;
+  GL_FOG_COORD_ARRAY_BUFFER_BINDING = $889D;
+  GL_SRC0_RGB = $8580;
+  GL_SRC1_RGB = $8581;
+  GL_SRC2_RGB = $8582;
+  GL_SRC0_ALPHA = $8588;
+  GL_SRC1_ALPHA = $8589;
+  GL_SRC2_ALPHA = $858A;
+var
+  glGenQueries: procedure(n: GLsizei; ids: PGLuint); extdecl;
+  glDeleteQueries: procedure(n: GLsizei; const ids: PGLuint); extdecl;
+  glIsQuery: function(id: GLuint): GLboolean; extdecl;
+  glBeginQuery: procedure(target: GLenum; id: GLuint); extdecl;
+  glEndQuery: procedure(target: GLenum); extdecl;
+  glGetQueryiv: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetQueryObjectiv: procedure(id: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetQueryObjectuiv: procedure(id: GLuint; pname: GLenum; params: PGLuint); extdecl;
+  glBindBuffer: procedure(target: GLenum; buffer: GLuint); extdecl;
+  glDeleteBuffers: procedure(n: GLsizei; const buffers: PGLuint); extdecl;
+  glGenBuffers: procedure(n: GLsizei; buffers: PGLuint); extdecl;
+  glIsBuffer: function(buffer: GLuint): GLboolean; extdecl;
+  glBufferData: procedure(target: GLenum; size: GLsizeiptr; const data: PGLvoid; usage: GLenum); extdecl;
+  glBufferSubData: procedure(target: GLenum; offset: GLintptr; size: GLsizeiptr; const data: PGLvoid); extdecl;
+  glGetBufferSubData: procedure(target: GLenum; offset: GLintptr; size: GLsizeiptr; data: PGLvoid); extdecl;
+  glMapBuffer: function(target: GLenum; access: GLenum): PGLvoid; extdecl;
+  glUnmapBuffer: function(target: GLenum): GLboolean; extdecl;
+  glGetBufferParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); extdecl;
+  glGetBufferPointerv: procedure(target: GLenum; pname: GLenum; params: PGLvoid); extdecl;
+
+function Load_GL_version_1_5: Boolean;
+
+//***** GL_version_2_0 *****//
+const
+  GL_BLEND_EQUATION_RGB = $8009;
+  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_CURRENT_VERTEX_ATTRIB = $8626;
+  GL_VERTEX_PROGRAM_POINT_SIZE = $8642;
+  GL_VERTEX_PROGRAM_TWO_SIDE = $8643;
+  GL_VERTEX_ATTRIB_ARRAY_POINTER = $8645;
+  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_MAX_DRAW_BUFFERS = $8824;
+  GL_DRAW_BUFFER0 = $8825;
+  GL_DRAW_BUFFER1 = $8826;
+  GL_DRAW_BUFFER2 = $8827;
+  GL_DRAW_BUFFER3 = $8828;
+  GL_DRAW_BUFFER4 = $8829;
+  GL_DRAW_BUFFER5 = $882A;
+  GL_DRAW_BUFFER6 = $882B;
+  GL_DRAW_BUFFER7 = $882C;
+  GL_DRAW_BUFFER8 = $882D;
+  GL_DRAW_BUFFER9 = $882E;
+  GL_DRAW_BUFFER10 = $882F;
+  GL_DRAW_BUFFER11 = $8830;
+  GL_DRAW_BUFFER12 = $8831;
+  GL_DRAW_BUFFER13 = $8832;
+  GL_DRAW_BUFFER14 = $8833;
+  GL_DRAW_BUFFER15 = $8834;
+  GL_BLEND_EQUATION_ALPHA = $883D;
+  GL_POINT_SPRITE = $8861;
+  GL_COORD_REPLACE = $8862;
+  GL_MAX_VERTEX_ATTRIBS = $8869;
+  GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = $886A;
+  GL_MAX_TEXTURE_COORDS = $8871;
+  GL_MAX_TEXTURE_IMAGE_UNITS = $8872;
+  GL_FRAGMENT_SHADER = $8B30;
+  GL_VERTEX_SHADER = $8B31;
+  GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = $8B49;
+  GL_MAX_VERTEX_UNIFORM_COMPONENTS = $8B4A;
+  GL_MAX_VARYING_FLOATS = $8B4B;
+  GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = $8B4C;
+  GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = $8B4D;
+  GL_SHADER_TYPE = $8B4F;
+  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_1D = $8B5D;
+  GL_SAMPLER_2D = $8B5E;
+  GL_SAMPLER_3D = $8B5F;
+  GL_SAMPLER_CUBE = $8B60;
+  GL_SAMPLER_1D_SHADOW = $8B61;
+  GL_SAMPLER_2D_SHADOW = $8B62;
+  GL_DELETE_STATUS = $8B80;
+  GL_COMPILE_STATUS = $8B81;
+  GL_LINK_STATUS = $8B82;
+  GL_VALIDATE_STATUS = $8B83;
+  GL_INFO_LOG_LENGTH = $8B84;
+  GL_ATTACHED_SHADERS = $8B85;
+  GL_ACTIVE_UNIFORMS = $8B86;
+  GL_ACTIVE_UNIFORM_MAX_LENGTH = $8B87;
+  GL_SHADER_SOURCE_LENGTH = $8B88;
+  GL_ACTIVE_ATTRIBUTES = $8B89;
+  GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = $8B8A;
+  GL_FRAGMENT_SHADER_DERIVATIVE_HINT = $8B8B;
+  GL_SHADING_LANGUAGE_VERSION = $8B8C;
+  GL_CURRENT_PROGRAM = $8B8D;
+  GL_POINT_SPRITE_COORD_ORIGIN = $8CA0;
+  GL_LOWER_LEFT = $8CA1;
+  GL_UPPER_LEFT = $8CA2;
+  GL_STENCIL_BACK_REF = $8CA3;
+  GL_STENCIL_BACK_VALUE_MASK = $8CA4;
+  GL_STENCIL_BACK_WRITEMASK = $8CA5;
+var
+  glBlendEquationSeparate: procedure(modeRGB: GLenum; modeAlpha: GLenum); extdecl;
+  glDrawBuffers: procedure(n: GLsizei; const bufs: PGLenum); extdecl;
+  glStencilOpSeparate: procedure(face: GLenum; sfail: GLenum; dpfail: GLenum; dppass: GLenum); extdecl;
+  glStencilFuncSeparate: procedure(frontfunc: GLenum; backfunc: GLenum; ref: GLint; mask: GLuint); extdecl;
+  glStencilMaskSeparate: procedure(face: GLenum; mask: GLuint); extdecl;
+  glAttachShader: procedure(_program: GLuint; shader: GLuint); extdecl;
+  glBindAttribLocation: procedure(_program: GLuint; index: GLuint; const name: PGLchar); extdecl;
+  glCompileShader: procedure(shader: GLuint); extdecl;
+  glCreateProgram: function(): GLuint; extdecl;
+  glCreateShader: function(_type: GLenum): GLuint; extdecl;
+  glDeleteProgram: procedure(_program: GLuint); extdecl;
+  glDeleteShader: procedure(shader: GLuint); extdecl;
+  glDetachShader: procedure(_program: GLuint; shader: GLuint); extdecl;
+  glDisableVertexAttribArray: procedure(index: GLuint); extdecl;
+  glEnableVertexAttribArray: procedure(index: GLuint); extdecl;
+  glGetActiveAttrib: procedure(_program: GLuint; index: GLuint; bufSize: GLsizei; length: PGLsizei; size: PGLint; _type: PGLenum; name: PGLchar); extdecl;
+  glGetActiveUniform: procedure(_program: GLuint; index: GLuint; bufSize: GLsizei; length: PGLsizei; size: PGLint; _type: PGLenum; name: PGLchar); extdecl;
+  glGetAttachedShaders: procedure(_program: GLuint; maxCount: GLsizei; count: PGLsizei; obj: PGLuint); extdecl;
+  glGetAttribLocation: function(_program: GLuint; const name: PGLchar): GLint; extdecl;
+  glGetProgramiv: procedure(_program: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetProgramInfoLog: procedure(_program: GLuint; bufSize: GLsizei; length: PGLsizei; infoLog: PGLchar); extdecl;
+  glGetShaderiv: procedure(shader: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetShaderInfoLog: procedure(shader: GLuint; bufSize: GLsizei; length: PGLsizei; infoLog: PGLchar); extdecl;
+  glGetShaderSource: procedure(shader: GLuint; bufSize: GLsizei; length: PGLsizei; source: PGLchar); extdecl;
+  glGetUniformLocation: function(_program: GLuint; const name: PGLchar): GLint; extdecl;
+  glGetUniformfv: procedure(_program: GLuint; location: GLint; params: PGLfloat); extdecl;
+  glGetUniformiv: procedure(_program: GLuint; location: GLint; params: PGLint); extdecl;
+  glGetVertexAttribdv: procedure(index: GLuint; pname: GLenum; params: PGLdouble); extdecl;
+  glGetVertexAttribfv: procedure(index: GLuint; pname: GLenum; params: PGLfloat); extdecl;
+  glGetVertexAttribiv: procedure(index: GLuint; pname: GLenum; params: PGLint); extdecl;
+  glGetVertexAttribPointerv: procedure(index: GLuint; pname: GLenum; pointer: PGLvoid); extdecl;
+  glIsProgram: function(_program: GLuint): GLboolean; extdecl;
+  glIsShader: function(shader: GLuint): GLboolean; extdecl;
+  glLinkProgram: procedure(_program: GLuint); extdecl;
+  glShaderSource: procedure(shader: GLuint; count: GLsizei; const _string: PGLchar; const length: PGLint); extdecl;
+  glUseProgram: procedure(_program: GLuint); extdecl;
+  glUniform1f: procedure(location: GLint; v0: GLfloat); extdecl;
+  glUniform2f: procedure(location: GLint; v0: GLfloat; v1: GLfloat); extdecl;
+  glUniform3f: procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat); extdecl;
+  glUniform4f: procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat; v3: GLfloat); extdecl;
+  glUniform1i: procedure(location: GLint; v0: GLint); extdecl;
+  glUniform2i: procedure(location: GLint; v0: GLint; v1: GLint); extdecl;
+  glUniform3i: procedure(location: GLint; v0: GLint; v1: GLint; v2: GLint); extdecl;
+  glUniform4i: procedure(location: GLint; v0: GLint; v1: GLint; v2: GLint; v3: GLint); extdecl;
+  glUniform1fv: procedure(location: GLint; count: GLsizei; const value: PGLfloat); extdecl;
+  glUniform2fv: procedure(location: GLint; count: GLsizei; const value: PGLfloat); extdecl;
+  glUniform3fv: procedure(location: GLint; count: GLsizei; const value: PGLfloat); extdecl;
+  glUniform4fv: procedure(location: GLint; count: GLsizei; const value: PGLfloat); extdecl;
+  glUniform1iv: procedure(location: GLint; count: GLsizei; const value: PGLint); extdecl;
+  glUniform2iv: procedure(location: GLint; count: GLsizei; const value: PGLint); extdecl;
+  glUniform3iv: procedure(location: GLint; count: GLsizei; const value: PGLint); extdecl;
+  glUniform4iv: procedure(location: GLint; count: GLsizei; const value: PGLint); extdecl;
+  glUniformMatrix2fv: procedure(location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLfloat); extdecl;
+  glUniformMatrix3fv: procedure(location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLfloat); extdecl;
+  glUniformMatrix4fv: procedure(location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLfloat); extdecl;
+  glValidateProgram: procedure(_program: GLuint); extdecl;
+  glVertexAttrib1d: procedure(index: GLuint; x: GLdouble); extdecl;
+  glVertexAttrib1dv: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib1f: procedure(index: GLuint; x: GLfloat); extdecl;
+  glVertexAttrib1fv: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib1s: procedure(index: GLuint; x: GLshort); extdecl;
+  glVertexAttrib1sv: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib2d: procedure(index: GLuint; x: GLdouble; y: GLdouble); extdecl;
+  glVertexAttrib2dv: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib2f: procedure(index: GLuint; x: GLfloat; y: GLfloat); extdecl;
+  glVertexAttrib2fv: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib2s: procedure(index: GLuint; x: GLshort; y: GLshort); extdecl;
+  glVertexAttrib2sv: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib3d: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble); extdecl;
+  glVertexAttrib3dv: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib3f: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat); extdecl;
+  glVertexAttrib3fv: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib3s: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort); extdecl;
+  glVertexAttrib3sv: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib4Nbv: procedure(index: GLuint; const v: PGLbyte); extdecl;
+  glVertexAttrib4Niv: procedure(index: GLuint; const v: PGLint); extdecl;
+  glVertexAttrib4Nsv: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib4Nub: procedure(index: GLuint; x: GLubyte; y: GLubyte; z: GLubyte; w: GLubyte); extdecl;
+  glVertexAttrib4Nubv: procedure(index: GLuint; const v: PGLubyte); extdecl;
+  glVertexAttrib4Nuiv: procedure(index: GLuint; const v: PGLuint); extdecl;
+  glVertexAttrib4Nusv: procedure(index: GLuint; const v: PGLushort); extdecl;
+  glVertexAttrib4bv: procedure(index: GLuint; const v: PGLbyte); extdecl;
+  glVertexAttrib4d: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); extdecl;
+  glVertexAttrib4dv: procedure(index: GLuint; const v: PGLdouble); extdecl;
+  glVertexAttrib4f: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); extdecl;
+  glVertexAttrib4fv: procedure(index: GLuint; const v: PGLfloat); extdecl;
+  glVertexAttrib4iv: procedure(index: GLuint; const v: PGLint); extdecl;
+  glVertexAttrib4s: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort; w: GLshort); extdecl;
+  glVertexAttrib4sv: procedure(index: GLuint; const v: PGLshort); extdecl;
+  glVertexAttrib4ubv: procedure(index: GLuint; const v: PGLubyte); extdecl;
+  glVertexAttrib4uiv: procedure(index: GLuint; const v: PGLuint); extdecl;
+  glVertexAttrib4usv: procedure(index: GLuint; const v: PGLushort); extdecl;
+  glVertexAttribPointer: procedure(index: GLuint; size: GLint; _type: GLenum; normalized: GLboolean; stride: GLsizei; const pointer: PGLvoid); extdecl;
+
+function Load_GL_version_2_0: Boolean;
+
+
+implementation
+
+{$IFNDEF Windows}
+function wglGetProcAddress(proc: PChar): Pointer;
+begin
+  Result := GetProcAddress(LibGL, proc);
+end;
+{$ENDIF}
+
+function glext_ExtensionSupported(const extension: String; const searchIn: String): Boolean;
+var
+  extensions: PChar;
+  start: PChar;
+  where, terminator: PChar;
+begin
+
+  if (Pos(' ', extension) <> 0) or (extension = '') then
+  begin
+    Result := FALSE;
+    Exit;
+  end;
+
+  if searchIn = '' then extensions := PChar(glGetString(GL_EXTENSIONS))
+  else extensions := PChar(searchIn);
+  start := extensions;
+  while TRUE do
+  begin
+    where := StrPos(start, PChar(extension));
+    if where = nil then Break;
+    terminator := Pointer(PtrUInt(where) + Length(extension));
+    if (where = start) or (PChar(PtrUInt(where) - 1)^ = ' ') then
+    begin
+      if (terminator^ = ' ') or (terminator^ = #0) then
+      begin
+        Result := TRUE;
+        Exit;
+      end;
+    end;
+    start := terminator;
+  end;
+  Result := FALSE;
+
+end;
+
+function Load_GL_version_1_2: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+    glBlendColor := wglGetProcAddress('glBlendColor');
+    if not Assigned(glBlendColor) then Exit;
+    glBlendEquation := wglGetProcAddress('glBlendEquation');
+    if not Assigned(glBlendEquation) then Exit;
+    glDrawRangeElements := wglGetProcAddress('glDrawRangeElements');
+    if not Assigned(glDrawRangeElements) then Exit;
+    glColorTable := wglGetProcAddress('glColorTable');
+    if not Assigned(glColorTable) then Exit;
+    glColorTableParameterfv := wglGetProcAddress('glColorTableParameterfv');
+    if not Assigned(glColorTableParameterfv) then Exit;
+    glColorTableParameteriv := wglGetProcAddress('glColorTableParameteriv');
+    if not Assigned(glColorTableParameteriv) then Exit;
+    glCopyColorTable := wglGetProcAddress('glCopyColorTable');
+    if not Assigned(glCopyColorTable) then Exit;
+    glGetColorTable := wglGetProcAddress('glGetColorTable');
+    if not Assigned(glGetColorTable) then Exit;
+    glGetColorTableParameterfv := wglGetProcAddress('glGetColorTableParameterfv');
+    if not Assigned(glGetColorTableParameterfv) then Exit;
+    glGetColorTableParameteriv := wglGetProcAddress('glGetColorTableParameteriv');
+    if not Assigned(glGetColorTableParameteriv) then Exit;
+    glColorSubTable := wglGetProcAddress('glColorSubTable');
+    if not Assigned(glColorSubTable) then Exit;
+    glCopyColorSubTable := wglGetProcAddress('glCopyColorSubTable');
+    if not Assigned(glCopyColorSubTable) then Exit;
+    glConvolutionFilter1D := wglGetProcAddress('glConvolutionFilter1D');
+    if not Assigned(glConvolutionFilter1D) then Exit;
+    glConvolutionFilter2D := wglGetProcAddress('glConvolutionFilter2D');
+    if not Assigned(glConvolutionFilter2D) then Exit;
+    glConvolutionParameterf := wglGetProcAddress('glConvolutionParameterf');
+    if not Assigned(glConvolutionParameterf) then Exit;
+    glConvolutionParameterfv := wglGetProcAddress('glConvolutionParameterfv');
+    if not Assigned(glConvolutionParameterfv) then Exit;
+    glConvolutionParameteri := wglGetProcAddress('glConvolutionParameteri');
+    if not Assigned(glConvolutionParameteri) then Exit;
+    glConvolutionParameteriv := wglGetProcAddress('glConvolutionParameteriv');
+    if not Assigned(glConvolutionParameteriv) then Exit;
+    glCopyConvolutionFilter1D := wglGetProcAddress('glCopyConvolutionFilter1D');
+    if not Assigned(glCopyConvolutionFilter1D) then Exit;
+    glCopyConvolutionFilter2D := wglGetProcAddress('glCopyConvolutionFilter2D');
+    if not Assigned(glCopyConvolutionFilter2D) then Exit;
+    glGetConvolutionFilter := wglGetProcAddress('glGetConvolutionFilter');
+    if not Assigned(glGetConvolutionFilter) then Exit;
+    glGetConvolutionParameterfv := wglGetProcAddress('glGetConvolutionParameterfv');
+    if not Assigned(glGetConvolutionParameterfv) then Exit;
+    glGetConvolutionParameteriv := wglGetProcAddress('glGetConvolutionParameteriv');
+    if not Assigned(glGetConvolutionParameteriv) then Exit;
+    glGetSeparableFilter := wglGetProcAddress('glGetSeparableFilter');
+    if not Assigned(glGetSeparableFilter) then Exit;
+    glSeparableFilter2D := wglGetProcAddress('glSeparableFilter2D');
+    if not Assigned(glSeparableFilter2D) then Exit;
+    glGetHistogram := wglGetProcAddress('glGetHistogram');
+    if not Assigned(glGetHistogram) then Exit;
+    glGetHistogramParameterfv := wglGetProcAddress('glGetHistogramParameterfv');
+    if not Assigned(glGetHistogramParameterfv) then Exit;
+    glGetHistogramParameteriv := wglGetProcAddress('glGetHistogramParameteriv');
+    if not Assigned(glGetHistogramParameteriv) then Exit;
+    glGetMinmax := wglGetProcAddress('glGetMinmax');
+    if not Assigned(glGetMinmax) then Exit;
+    glGetMinmaxParameterfv := wglGetProcAddress('glGetMinmaxParameterfv');
+    if not Assigned(glGetMinmaxParameterfv) then Exit;
+    glGetMinmaxParameteriv := wglGetProcAddress('glGetMinmaxParameteriv');
+    if not Assigned(glGetMinmaxParameteriv) then Exit;
+    glHistogram := wglGetProcAddress('glHistogram');
+    if not Assigned(glHistogram) then Exit;
+    glMinmax := wglGetProcAddress('glMinmax');
+    if not Assigned(glMinmax) then Exit;
+    glResetHistogram := wglGetProcAddress('glResetHistogram');
+    if not Assigned(glResetHistogram) then Exit;
+    glResetMinmax := wglGetProcAddress('glResetMinmax');
+    if not Assigned(glResetMinmax) then Exit;
+    glTexImage3D := wglGetProcAddress('glTexImage3D');
+    if not Assigned(glTexImage3D) then Exit;
+    glTexSubImage3D := wglGetProcAddress('glTexSubImage3D');
+    if not Assigned(glTexSubImage3D) then Exit;
+    glCopyTexSubImage3D := wglGetProcAddress('glCopyTexSubImage3D');
+    if not Assigned(glCopyTexSubImage3D) then Exit;
+    Result := TRUE;
+
+end;
+
+function Load_GL_ARB_imaging: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_imaging', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_version_1_3: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+    glActiveTexture := wglGetProcAddress('glActiveTexture');
+    if not Assigned(glActiveTexture) then Exit;
+    glClientActiveTexture := wglGetProcAddress('glClientActiveTexture');
+    if not Assigned(glClientActiveTexture) then Exit;
+    glMultiTexCoord1d := wglGetProcAddress('glMultiTexCoord1d');
+    if not Assigned(glMultiTexCoord1d) then Exit;
+    glMultiTexCoord1dv := wglGetProcAddress('glMultiTexCoord1dv');
+    if not Assigned(glMultiTexCoord1dv) then Exit;
+    glMultiTexCoord1f := wglGetProcAddress('glMultiTexCoord1f');
+    if not Assigned(glMultiTexCoord1f) then Exit;
+    glMultiTexCoord1fv := wglGetProcAddress('glMultiTexCoord1fv');
+    if not Assigned(glMultiTexCoord1fv) then Exit;
+    glMultiTexCoord1i := wglGetProcAddress('glMultiTexCoord1i');
+    if not Assigned(glMultiTexCoord1i) then Exit;
+    glMultiTexCoord1iv := wglGetProcAddress('glMultiTexCoord1iv');
+    if not Assigned(glMultiTexCoord1iv) then Exit;
+    glMultiTexCoord1s := wglGetProcAddress('glMultiTexCoord1s');
+    if not Assigned(glMultiTexCoord1s) then Exit;
+    glMultiTexCoord1sv := wglGetProcAddress('glMultiTexCoord1sv');
+    if not Assigned(glMultiTexCoord1sv) then Exit;
+    glMultiTexCoord2d := wglGetProcAddress('glMultiTexCoord2d');
+    if not Assigned(glMultiTexCoord2d) then Exit;
+    glMultiTexCoord2dv := wglGetProcAddress('glMultiTexCoord2dv');
+    if not Assigned(glMultiTexCoord2dv) then Exit;
+    glMultiTexCoord2f := wglGetProcAddress('glMultiTexCoord2f');
+    if not Assigned(glMultiTexCoord2f) then Exit;
+    glMultiTexCoord2fv := wglGetProcAddress('glMultiTexCoord2fv');
+    if not Assigned(glMultiTexCoord2fv) then Exit;
+    glMultiTexCoord2i := wglGetProcAddress('glMultiTexCoord2i');
+    if not Assigned(glMultiTexCoord2i) then Exit;
+    glMultiTexCoord2iv := wglGetProcAddress('glMultiTexCoord2iv');
+    if not Assigned(glMultiTexCoord2iv) then Exit;
+    glMultiTexCoord2s := wglGetProcAddress('glMultiTexCoord2s');
+    if not Assigned(glMultiTexCoord2s) then Exit;
+    glMultiTexCoord2sv := wglGetProcAddress('glMultiTexCoord2sv');
+    if not Assigned(glMultiTexCoord2sv) then Exit;
+    glMultiTexCoord3d := wglGetProcAddress('glMultiTexCoord3d');
+    if not Assigned(glMultiTexCoord3d) then Exit;
+    glMultiTexCoord3dv := wglGetProcAddress('glMultiTexCoord3dv');
+    if not Assigned(glMultiTexCoord3dv) then Exit;
+    glMultiTexCoord3f := wglGetProcAddress('glMultiTexCoord3f');
+    if not Assigned(glMultiTexCoord3f) then Exit;
+    glMultiTexCoord3fv := wglGetProcAddress('glMultiTexCoord3fv');
+    if not Assigned(glMultiTexCoord3fv) then Exit;
+    glMultiTexCoord3i := wglGetProcAddress('glMultiTexCoord3i');
+    if not Assigned(glMultiTexCoord3i) then Exit;
+    glMultiTexCoord3iv := wglGetProcAddress('glMultiTexCoord3iv');
+    if not Assigned(glMultiTexCoord3iv) then Exit;
+    glMultiTexCoord3s := wglGetProcAddress('glMultiTexCoord3s');
+    if not Assigned(glMultiTexCoord3s) then Exit;
+    glMultiTexCoord3sv := wglGetProcAddress('glMultiTexCoord3sv');
+    if not Assigned(glMultiTexCoord3sv) then Exit;
+    glMultiTexCoord4d := wglGetProcAddress('glMultiTexCoord4d');
+    if not Assigned(glMultiTexCoord4d) then Exit;
+    glMultiTexCoord4dv := wglGetProcAddress('glMultiTexCoord4dv');
+    if not Assigned(glMultiTexCoord4dv) then Exit;
+    glMultiTexCoord4f := wglGetProcAddress('glMultiTexCoord4f');
+    if not Assigned(glMultiTexCoord4f) then Exit;
+    glMultiTexCoord4fv := wglGetProcAddress('glMultiTexCoord4fv');
+    if not Assigned(glMultiTexCoord4fv) then Exit;
+    glMultiTexCoord4i := wglGetProcAddress('glMultiTexCoord4i');
+    if not Assigned(glMultiTexCoord4i) then Exit;
+    glMultiTexCoord4iv := wglGetProcAddress('glMultiTexCoord4iv');
+    if not Assigned(glMultiTexCoord4iv) then Exit;
+    glMultiTexCoord4s := wglGetProcAddress('glMultiTexCoord4s');
+    if not Assigned(glMultiTexCoord4s) then Exit;
+    glMultiTexCoord4sv := wglGetProcAddress('glMultiTexCoord4sv');
+    if not Assigned(glMultiTexCoord4sv) then Exit;
+    glLoadTransposeMatrixf := wglGetProcAddress('glLoadTransposeMatrixf');
+    if not Assigned(glLoadTransposeMatrixf) then Exit;
+    glLoadTransposeMatrixd := wglGetProcAddress('glLoadTransposeMatrixd');
+    if not Assigned(glLoadTransposeMatrixd) then Exit;
+    glMultTransposeMatrixf := wglGetProcAddress('glMultTransposeMatrixf');
+    if not Assigned(glMultTransposeMatrixf) then Exit;
+    glMultTransposeMatrixd := wglGetProcAddress('glMultTransposeMatrixd');
+    if not Assigned(glMultTransposeMatrixd) then Exit;
+    glSampleCoverage := wglGetProcAddress('glSampleCoverage');
+    if not Assigned(glSampleCoverage) then Exit;
+    glCompressedTexImage3D := wglGetProcAddress('glCompressedTexImage3D');
+    if not Assigned(glCompressedTexImage3D) then Exit;
+    glCompressedTexImage2D := wglGetProcAddress('glCompressedTexImage2D');
+    if not Assigned(glCompressedTexImage2D) then Exit;
+    glCompressedTexImage1D := wglGetProcAddress('glCompressedTexImage1D');
+    if not Assigned(glCompressedTexImage1D) then Exit;
+    glCompressedTexSubImage3D := wglGetProcAddress('glCompressedTexSubImage3D');
+    if not Assigned(glCompressedTexSubImage3D) then Exit;
+    glCompressedTexSubImage2D := wglGetProcAddress('glCompressedTexSubImage2D');
+    if not Assigned(glCompressedTexSubImage2D) then Exit;
+    glCompressedTexSubImage1D := wglGetProcAddress('glCompressedTexSubImage1D');
+    if not Assigned(glCompressedTexSubImage1D) then Exit;
+    glGetCompressedTexImage := wglGetProcAddress('glGetCompressedTexImage');
+    if not Assigned(glGetCompressedTexImage) then Exit;
+    Result := TRUE;
+
+end;
+
+function Load_GL_ARB_multitexture: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_multitexture', extstring) then
+  begin
+    glActiveTextureARB := wglGetProcAddress('glActiveTextureARB');
+    if not Assigned(glActiveTextureARB) then Exit;
+    glClientActiveTextureARB := wglGetProcAddress('glClientActiveTextureARB');
+    if not Assigned(glClientActiveTextureARB) then Exit;
+    glMultiTexCoord1dARB := wglGetProcAddress('glMultiTexCoord1dARB');
+    if not Assigned(glMultiTexCoord1dARB) then Exit;
+    glMultiTexCoord1dvARB := wglGetProcAddress('glMultiTexCoord1dvARB');
+    if not Assigned(glMultiTexCoord1dvARB) then Exit;
+    glMultiTexCoord1fARB := wglGetProcAddress('glMultiTexCoord1fARB');
+    if not Assigned(glMultiTexCoord1fARB) then Exit;
+    glMultiTexCoord1fvARB := wglGetProcAddress('glMultiTexCoord1fvARB');
+    if not Assigned(glMultiTexCoord1fvARB) then Exit;
+    glMultiTexCoord1iARB := wglGetProcAddress('glMultiTexCoord1iARB');
+    if not Assigned(glMultiTexCoord1iARB) then Exit;
+    glMultiTexCoord1ivARB := wglGetProcAddress('glMultiTexCoord1ivARB');
+    if not Assigned(glMultiTexCoord1ivARB) then Exit;
+    glMultiTexCoord1sARB := wglGetProcAddress('glMultiTexCoord1sARB');
+    if not Assigned(glMultiTexCoord1sARB) then Exit;
+    glMultiTexCoord1svARB := wglGetProcAddress('glMultiTexCoord1svARB');
+    if not Assigned(glMultiTexCoord1svARB) then Exit;
+    glMultiTexCoord2dARB := wglGetProcAddress('glMultiTexCoord2dARB');
+    if not Assigned(glMultiTexCoord2dARB) then Exit;
+    glMultiTexCoord2dvARB := wglGetProcAddress('glMultiTexCoord2dvARB');
+    if not Assigned(glMultiTexCoord2dvARB) then Exit;
+    glMultiTexCoord2fARB := wglGetProcAddress('glMultiTexCoord2fARB');
+    if not Assigned(glMultiTexCoord2fARB) then Exit;
+    glMultiTexCoord2fvARB := wglGetProcAddress('glMultiTexCoord2fvARB');
+    if not Assigned(glMultiTexCoord2fvARB) then Exit;
+    glMultiTexCoord2iARB := wglGetProcAddress('glMultiTexCoord2iARB');
+    if not Assigned(glMultiTexCoord2iARB) then Exit;
+    glMultiTexCoord2ivARB := wglGetProcAddress('glMultiTexCoord2ivARB');
+    if not Assigned(glMultiTexCoord2ivARB) then Exit;
+    glMultiTexCoord2sARB := wglGetProcAddress('glMultiTexCoord2sARB');
+    if not Assigned(glMultiTexCoord2sARB) then Exit;
+    glMultiTexCoord2svARB := wglGetProcAddress('glMultiTexCoord2svARB');
+    if not Assigned(glMultiTexCoord2svARB) then Exit;
+    glMultiTexCoord3dARB := wglGetProcAddress('glMultiTexCoord3dARB');
+    if not Assigned(glMultiTexCoord3dARB) then Exit;
+    glMultiTexCoord3dvARB := wglGetProcAddress('glMultiTexCoord3dvARB');
+    if not Assigned(glMultiTexCoord3dvARB) then Exit;
+    glMultiTexCoord3fARB := wglGetProcAddress('glMultiTexCoord3fARB');
+    if not Assigned(glMultiTexCoord3fARB) then Exit;
+    glMultiTexCoord3fvARB := wglGetProcAddress('glMultiTexCoord3fvARB');
+    if not Assigned(glMultiTexCoord3fvARB) then Exit;
+    glMultiTexCoord3iARB := wglGetProcAddress('glMultiTexCoord3iARB');
+    if not Assigned(glMultiTexCoord3iARB) then Exit;
+    glMultiTexCoord3ivARB := wglGetProcAddress('glMultiTexCoord3ivARB');
+    if not Assigned(glMultiTexCoord3ivARB) then Exit;
+    glMultiTexCoord3sARB := wglGetProcAddress('glMultiTexCoord3sARB');
+    if not Assigned(glMultiTexCoord3sARB) then Exit;
+    glMultiTexCoord3svARB := wglGetProcAddress('glMultiTexCoord3svARB');
+    if not Assigned(glMultiTexCoord3svARB) then Exit;
+    glMultiTexCoord4dARB := wglGetProcAddress('glMultiTexCoord4dARB');
+    if not Assigned(glMultiTexCoord4dARB) then Exit;
+    glMultiTexCoord4dvARB := wglGetProcAddress('glMultiTexCoord4dvARB');
+    if not Assigned(glMultiTexCoord4dvARB) then Exit;
+    glMultiTexCoord4fARB := wglGetProcAddress('glMultiTexCoord4fARB');
+    if not Assigned(glMultiTexCoord4fARB) then Exit;
+    glMultiTexCoord4fvARB := wglGetProcAddress('glMultiTexCoord4fvARB');
+    if not Assigned(glMultiTexCoord4fvARB) then Exit;
+    glMultiTexCoord4iARB := wglGetProcAddress('glMultiTexCoord4iARB');
+    if not Assigned(glMultiTexCoord4iARB) then Exit;
+    glMultiTexCoord4ivARB := wglGetProcAddress('glMultiTexCoord4ivARB');
+    if not Assigned(glMultiTexCoord4ivARB) then Exit;
+    glMultiTexCoord4sARB := wglGetProcAddress('glMultiTexCoord4sARB');
+    if not Assigned(glMultiTexCoord4sARB) then Exit;
+    glMultiTexCoord4svARB := wglGetProcAddress('glMultiTexCoord4svARB');
+    if not Assigned(glMultiTexCoord4svARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_transpose_matrix: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_transpose_matrix', extstring) then
+  begin
+    glLoadTransposeMatrixfARB := wglGetProcAddress('glLoadTransposeMatrixfARB');
+    if not Assigned(glLoadTransposeMatrixfARB) then Exit;
+    glLoadTransposeMatrixdARB := wglGetProcAddress('glLoadTransposeMatrixdARB');
+    if not Assigned(glLoadTransposeMatrixdARB) then Exit;
+    glMultTransposeMatrixfARB := wglGetProcAddress('glMultTransposeMatrixfARB');
+    if not Assigned(glMultTransposeMatrixfARB) then Exit;
+    glMultTransposeMatrixdARB := wglGetProcAddress('glMultTransposeMatrixdARB');
+    if not Assigned(glMultTransposeMatrixdARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_multisample: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_multisample', extstring) then
+  begin
+    glSampleCoverageARB := wglGetProcAddress('glSampleCoverageARB');
+    if not Assigned(glSampleCoverageARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_env_add: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_env_add', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+{$IFDEF Windows}
+function Load_WGL_ARB_extensions_string: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_ARB_extensions_string', extstring) then
+  begin
+    wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+    if not Assigned(wglGetExtensionsStringARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_ARB_buffer_region: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_ARB_buffer_region', extstring) then
+  begin
+    wglCreateBufferRegionARB := wglGetProcAddress('wglCreateBufferRegionARB');
+    if not Assigned(wglCreateBufferRegionARB) then Exit;
+    wglDeleteBufferRegionARB := wglGetProcAddress('wglDeleteBufferRegionARB');
+    if not Assigned(wglDeleteBufferRegionARB) then Exit;
+    wglSaveBufferRegionARB := wglGetProcAddress('wglSaveBufferRegionARB');
+    if not Assigned(wglSaveBufferRegionARB) then Exit;
+    wglRestoreBufferRegionARB := wglGetProcAddress('wglRestoreBufferRegionARB');
+    if not Assigned(wglRestoreBufferRegionARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+{$ENDIF}
+
+function Load_GL_ARB_texture_cube_map: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_cube_map', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_depth_texture: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_depth_texture', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_point_parameters: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_point_parameters', extstring) then
+  begin
+    glPointParameterfARB := wglGetProcAddress('glPointParameterfARB');
+    if not Assigned(glPointParameterfARB) then Exit;
+    glPointParameterfvARB := wglGetProcAddress('glPointParameterfvARB');
+    if not Assigned(glPointParameterfvARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_shadow: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_shadow', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_shadow_ambient: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_shadow_ambient', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_border_clamp: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_border_clamp', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_compression: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_compression', extstring) then
+  begin
+    glCompressedTexImage3DARB := wglGetProcAddress('glCompressedTexImage3DARB');
+    if not Assigned(glCompressedTexImage3DARB) then Exit;
+    glCompressedTexImage2DARB := wglGetProcAddress('glCompressedTexImage2DARB');
+    if not Assigned(glCompressedTexImage2DARB) then Exit;
+    glCompressedTexImage1DARB := wglGetProcAddress('glCompressedTexImage1DARB');
+    if not Assigned(glCompressedTexImage1DARB) then Exit;
+    glCompressedTexSubImage3DARB := wglGetProcAddress('glCompressedTexSubImage3DARB');
+    if not Assigned(glCompressedTexSubImage3DARB) then Exit;
+    glCompressedTexSubImage2DARB := wglGetProcAddress('glCompressedTexSubImage2DARB');
+    if not Assigned(glCompressedTexSubImage2DARB) then Exit;
+    glCompressedTexSubImage1DARB := wglGetProcAddress('glCompressedTexSubImage1DARB');
+    if not Assigned(glCompressedTexSubImage1DARB) then Exit;
+    glGetCompressedTexImageARB := wglGetProcAddress('glGetCompressedTexImageARB');
+    if not Assigned(glGetCompressedTexImageARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_env_combine: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_env_combine', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_env_crossbar: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_env_crossbar', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_env_dot3: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_env_dot3', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_mirrored_repeat: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_mirrored_repeat', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_vertex_blend: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_vertex_blend', extstring) then
+  begin
+    glWeightbvARB := wglGetProcAddress('glWeightbvARB');
+    if not Assigned(glWeightbvARB) then Exit;
+    glWeightsvARB := wglGetProcAddress('glWeightsvARB');
+    if not Assigned(glWeightsvARB) then Exit;
+    glWeightivARB := wglGetProcAddress('glWeightivARB');
+    if not Assigned(glWeightivARB) then Exit;
+    glWeightfvARB := wglGetProcAddress('glWeightfvARB');
+    if not Assigned(glWeightfvARB) then Exit;
+    glWeightdvARB := wglGetProcAddress('glWeightdvARB');
+    if not Assigned(glWeightdvARB) then Exit;
+    glWeightvARB := wglGetProcAddress('glWeightvARB');
+    if not Assigned(glWeightvARB) then Exit;
+    glWeightubvARB := wglGetProcAddress('glWeightubvARB');
+    if not Assigned(glWeightubvARB) then Exit;
+    glWeightusvARB := wglGetProcAddress('glWeightusvARB');
+    if not Assigned(glWeightusvARB) then Exit;
+    glWeightuivARB := wglGetProcAddress('glWeightuivARB');
+    if not Assigned(glWeightuivARB) then Exit;
+    glWeightPointerARB := wglGetProcAddress('glWeightPointerARB');
+    if not Assigned(glWeightPointerARB) then Exit;
+    glVertexBlendARB := wglGetProcAddress('glVertexBlendARB');
+    if not Assigned(glVertexBlendARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_vertex_program: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_vertex_program', extstring) then
+  begin
+    glVertexAttrib1sARB := wglGetProcAddress('glVertexAttrib1sARB');
+    if not Assigned(glVertexAttrib1sARB) then Exit;
+    glVertexAttrib1fARB := wglGetProcAddress('glVertexAttrib1fARB');
+    if not Assigned(glVertexAttrib1fARB) then Exit;
+    glVertexAttrib1dARB := wglGetProcAddress('glVertexAttrib1dARB');
+    if not Assigned(glVertexAttrib1dARB) then Exit;
+    glVertexAttrib2sARB := wglGetProcAddress('glVertexAttrib2sARB');
+    if not Assigned(glVertexAttrib2sARB) then Exit;
+    glVertexAttrib2fARB := wglGetProcAddress('glVertexAttrib2fARB');
+    if not Assigned(glVertexAttrib2fARB) then Exit;
+    glVertexAttrib2dARB := wglGetProcAddress('glVertexAttrib2dARB');
+    if not Assigned(glVertexAttrib2dARB) then Exit;
+    glVertexAttrib3sARB := wglGetProcAddress('glVertexAttrib3sARB');
+    if not Assigned(glVertexAttrib3sARB) then Exit;
+    glVertexAttrib3fARB := wglGetProcAddress('glVertexAttrib3fARB');
+    if not Assigned(glVertexAttrib3fARB) then Exit;
+    glVertexAttrib3dARB := wglGetProcAddress('glVertexAttrib3dARB');
+    if not Assigned(glVertexAttrib3dARB) then Exit;
+    glVertexAttrib4sARB := wglGetProcAddress('glVertexAttrib4sARB');
+    if not Assigned(glVertexAttrib4sARB) then Exit;
+    glVertexAttrib4fARB := wglGetProcAddress('glVertexAttrib4fARB');
+    if not Assigned(glVertexAttrib4fARB) then Exit;
+    glVertexAttrib4dARB := wglGetProcAddress('glVertexAttrib4dARB');
+    if not Assigned(glVertexAttrib4dARB) then Exit;
+    glVertexAttrib4NubARB := wglGetProcAddress('glVertexAttrib4NubARB');
+    if not Assigned(glVertexAttrib4NubARB) then Exit;
+    glVertexAttrib1svARB := wglGetProcAddress('glVertexAttrib1svARB');
+    if not Assigned(glVertexAttrib1svARB) then Exit;
+    glVertexAttrib1fvARB := wglGetProcAddress('glVertexAttrib1fvARB');
+    if not Assigned(glVertexAttrib1fvARB) then Exit;
+    glVertexAttrib1dvARB := wglGetProcAddress('glVertexAttrib1dvARB');
+    if not Assigned(glVertexAttrib1dvARB) then Exit;
+    glVertexAttrib2svARB := wglGetProcAddress('glVertexAttrib2svARB');
+    if not Assigned(glVertexAttrib2svARB) then Exit;
+    glVertexAttrib2fvARB := wglGetProcAddress('glVertexAttrib2fvARB');
+    if not Assigned(glVertexAttrib2fvARB) then Exit;
+    glVertexAttrib2dvARB := wglGetProcAddress('glVertexAttrib2dvARB');
+    if not Assigned(glVertexAttrib2dvARB) then Exit;
+    glVertexAttrib3svARB := wglGetProcAddress('glVertexAttrib3svARB');
+    if not Assigned(glVertexAttrib3svARB) then Exit;
+    glVertexAttrib3fvARB := wglGetProcAddress('glVertexAttrib3fvARB');
+    if not Assigned(glVertexAttrib3fvARB) then Exit;
+    glVertexAttrib3dvARB := wglGetProcAddress('glVertexAttrib3dvARB');
+    if not Assigned(glVertexAttrib3dvARB) then Exit;
+    glVertexAttrib4bvARB := wglGetProcAddress('glVertexAttrib4bvARB');
+    if not Assigned(glVertexAttrib4bvARB) then Exit;
+    glVertexAttrib4svARB := wglGetProcAddress('glVertexAttrib4svARB');
+    if not Assigned(glVertexAttrib4svARB) then Exit;
+    glVertexAttrib4ivARB := wglGetProcAddress('glVertexAttrib4ivARB');
+    if not Assigned(glVertexAttrib4ivARB) then Exit;
+    glVertexAttrib4ubvARB := wglGetProcAddress('glVertexAttrib4ubvARB');
+    if not Assigned(glVertexAttrib4ubvARB) then Exit;
+    glVertexAttrib4usvARB := wglGetProcAddress('glVertexAttrib4usvARB');
+    if not Assigned(glVertexAttrib4usvARB) then Exit;
+    glVertexAttrib4uivARB := wglGetProcAddress('glVertexAttrib4uivARB');
+    if not Assigned(glVertexAttrib4uivARB) then Exit;
+    glVertexAttrib4fvARB := wglGetProcAddress('glVertexAttrib4fvARB');
+    if not Assigned(glVertexAttrib4fvARB) then Exit;
+    glVertexAttrib4dvARB := wglGetProcAddress('glVertexAttrib4dvARB');
+    if not Assigned(glVertexAttrib4dvARB) then Exit;
+    glVertexAttrib4NbvARB := wglGetProcAddress('glVertexAttrib4NbvARB');
+    if not Assigned(glVertexAttrib4NbvARB) then Exit;
+    glVertexAttrib4NsvARB := wglGetProcAddress('glVertexAttrib4NsvARB');
+    if not Assigned(glVertexAttrib4NsvARB) then Exit;
+    glVertexAttrib4NivARB := wglGetProcAddress('glVertexAttrib4NivARB');
+    if not Assigned(glVertexAttrib4NivARB) then Exit;
+    glVertexAttrib4NubvARB := wglGetProcAddress('glVertexAttrib4NubvARB');
+    if not Assigned(glVertexAttrib4NubvARB) then Exit;
+    glVertexAttrib4NusvARB := wglGetProcAddress('glVertexAttrib4NusvARB');
+    if not Assigned(glVertexAttrib4NusvARB) then Exit;
+    glVertexAttrib4NuivARB := wglGetProcAddress('glVertexAttrib4NuivARB');
+    if not Assigned(glVertexAttrib4NuivARB) then Exit;
+    glVertexAttribPointerARB := wglGetProcAddress('glVertexAttribPointerARB');
+    if not Assigned(glVertexAttribPointerARB) then Exit;
+    glEnableVertexAttribArrayARB := wglGetProcAddress('glEnableVertexAttribArrayARB');
+    if not Assigned(glEnableVertexAttribArrayARB) then Exit;
+    glDisableVertexAttribArrayARB := wglGetProcAddress('glDisableVertexAttribArrayARB');
+    if not Assigned(glDisableVertexAttribArrayARB) then Exit;
+    glProgramStringARB := wglGetProcAddress('glProgramStringARB');
+    if not Assigned(glProgramStringARB) then Exit;
+    glBindProgramARB := wglGetProcAddress('glBindProgramARB');
+    if not Assigned(glBindProgramARB) then Exit;
+    glDeleteProgramsARB := wglGetProcAddress('glDeleteProgramsARB');
+    if not Assigned(glDeleteProgramsARB) then Exit;
+    glGenProgramsARB := wglGetProcAddress('glGenProgramsARB');
+    if not Assigned(glGenProgramsARB) then Exit;
+    glProgramEnvParameter4dARB := wglGetProcAddress('glProgramEnvParameter4dARB');
+    if not Assigned(glProgramEnvParameter4dARB) then Exit;
+    glProgramEnvParameter4dvARB := wglGetProcAddress('glProgramEnvParameter4dvARB');
+    if not Assigned(glProgramEnvParameter4dvARB) then Exit;
+    glProgramEnvParameter4fARB := wglGetProcAddress('glProgramEnvParameter4fARB');
+    if not Assigned(glProgramEnvParameter4fARB) then Exit;
+    glProgramEnvParameter4fvARB := wglGetProcAddress('glProgramEnvParameter4fvARB');
+    if not Assigned(glProgramEnvParameter4fvARB) then Exit;
+    glProgramLocalParameter4dARB := wglGetProcAddress('glProgramLocalParameter4dARB');
+    if not Assigned(glProgramLocalParameter4dARB) then Exit;
+    glProgramLocalParameter4dvARB := wglGetProcAddress('glProgramLocalParameter4dvARB');
+    if not Assigned(glProgramLocalParameter4dvARB) then Exit;
+    glProgramLocalParameter4fARB := wglGetProcAddress('glProgramLocalParameter4fARB');
+    if not Assigned(glProgramLocalParameter4fARB) then Exit;
+    glProgramLocalParameter4fvARB := wglGetProcAddress('glProgramLocalParameter4fvARB');
+    if not Assigned(glProgramLocalParameter4fvARB) then Exit;
+    glGetProgramEnvParameterdvARB := wglGetProcAddress('glGetProgramEnvParameterdvARB');
+    if not Assigned(glGetProgramEnvParameterdvARB) then Exit;
+    glGetProgramEnvParameterfvARB := wglGetProcAddress('glGetProgramEnvParameterfvARB');
+    if not Assigned(glGetProgramEnvParameterfvARB) then Exit;
+    glGetProgramLocalParameterdvARB := wglGetProcAddress('glGetProgramLocalParameterdvARB');
+    if not Assigned(glGetProgramLocalParameterdvARB) then Exit;
+    glGetProgramLocalParameterfvARB := wglGetProcAddress('glGetProgramLocalParameterfvARB');
+    if not Assigned(glGetProgramLocalParameterfvARB) then Exit;
+    glGetProgramivARB := wglGetProcAddress('glGetProgramivARB');
+    if not Assigned(glGetProgramivARB) then Exit;
+    glGetProgramStringARB := wglGetProcAddress('glGetProgramStringARB');
+    if not Assigned(glGetProgramStringARB) then Exit;
+    glGetVertexAttribdvARB := wglGetProcAddress('glGetVertexAttribdvARB');
+    if not Assigned(glGetVertexAttribdvARB) then Exit;
+    glGetVertexAttribfvARB := wglGetProcAddress('glGetVertexAttribfvARB');
+    if not Assigned(glGetVertexAttribfvARB) then Exit;
+    glGetVertexAttribivARB := wglGetProcAddress('glGetVertexAttribivARB');
+    if not Assigned(glGetVertexAttribivARB) then Exit;
+    glGetVertexAttribPointervARB := wglGetProcAddress('glGetVertexAttribPointervARB');
+    if not Assigned(glGetVertexAttribPointervARB) then Exit;
+    glIsProgramARB := wglGetProcAddress('glIsProgramARB');
+    if not Assigned(glIsProgramARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_window_pos: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_window_pos', extstring) then
+  begin
+    glWindowPos2dARB := wglGetProcAddress('glWindowPos2dARB');
+    if not Assigned(glWindowPos2dARB) then Exit;
+    glWindowPos2fARB := wglGetProcAddress('glWindowPos2fARB');
+    if not Assigned(glWindowPos2fARB) then Exit;
+    glWindowPos2iARB := wglGetProcAddress('glWindowPos2iARB');
+    if not Assigned(glWindowPos2iARB) then Exit;
+    glWindowPos2sARB := wglGetProcAddress('glWindowPos2sARB');
+    if not Assigned(glWindowPos2sARB) then Exit;
+    glWindowPos2dvARB := wglGetProcAddress('glWindowPos2dvARB');
+    if not Assigned(glWindowPos2dvARB) then Exit;
+    glWindowPos2fvARB := wglGetProcAddress('glWindowPos2fvARB');
+    if not Assigned(glWindowPos2fvARB) then Exit;
+    glWindowPos2ivARB := wglGetProcAddress('glWindowPos2ivARB');
+    if not Assigned(glWindowPos2ivARB) then Exit;
+    glWindowPos2svARB := wglGetProcAddress('glWindowPos2svARB');
+    if not Assigned(glWindowPos2svARB) then Exit;
+    glWindowPos3dARB := wglGetProcAddress('glWindowPos3dARB');
+    if not Assigned(glWindowPos3dARB) then Exit;
+    glWindowPos3fARB := wglGetProcAddress('glWindowPos3fARB');
+    if not Assigned(glWindowPos3fARB) then Exit;
+    glWindowPos3iARB := wglGetProcAddress('glWindowPos3iARB');
+    if not Assigned(glWindowPos3iARB) then Exit;
+    glWindowPos3sARB := wglGetProcAddress('glWindowPos3sARB');
+    if not Assigned(glWindowPos3sARB) then Exit;
+    glWindowPos3dvARB := wglGetProcAddress('glWindowPos3dvARB');
+    if not Assigned(glWindowPos3dvARB) then Exit;
+    glWindowPos3fvARB := wglGetProcAddress('glWindowPos3fvARB');
+    if not Assigned(glWindowPos3fvARB) then Exit;
+    glWindowPos3ivARB := wglGetProcAddress('glWindowPos3ivARB');
+    if not Assigned(glWindowPos3ivARB) then Exit;
+    glWindowPos3svARB := wglGetProcAddress('glWindowPos3svARB');
+    if not Assigned(glWindowPos3svARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_422_pixels: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_422_pixels', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_abgr: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_abgr', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_bgra: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_bgra', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_blend_color: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_blend_color', extstring) then
+  begin
+    glBlendColorEXT := wglGetProcAddress('glBlendColorEXT');
+    if not Assigned(glBlendColorEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_blend_func_separate: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_blend_func_separate', extstring) then
+  begin
+    glBlendFuncSeparateEXT := wglGetProcAddress('glBlendFuncSeparateEXT');
+    if not Assigned(glBlendFuncSeparateEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_blend_logic_op: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_blend_logic_op', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_blend_minmax: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_blend_minmax', extstring) then
+  begin
+    glBlendEquationEXT := wglGetProcAddress('glBlendEquationEXT');
+    if not Assigned(glBlendEquationEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_blend_subtract: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_blend_subtract', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_clip_volume_hint: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_clip_volume_hint', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_color_subtable: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_color_subtable', extstring) then
+  begin
+    glColorSubTableEXT := wglGetProcAddress('glColorSubTableEXT');
+    if not Assigned(glColorSubTableEXT) then Exit;
+    glCopyColorSubTableEXT := wglGetProcAddress('glCopyColorSubTableEXT');
+    if not Assigned(glCopyColorSubTableEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_compiled_vertex_array: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_compiled_vertex_array', extstring) then
+  begin
+    glLockArraysEXT := wglGetProcAddress('glLockArraysEXT');
+    if not Assigned(glLockArraysEXT) then Exit;
+    glUnlockArraysEXT := wglGetProcAddress('glUnlockArraysEXT');
+    if not Assigned(glUnlockArraysEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_convolution: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_convolution', extstring) then
+  begin
+    glConvolutionFilter1DEXT := wglGetProcAddress('glConvolutionFilter1DEXT');
+    if not Assigned(glConvolutionFilter1DEXT) then Exit;
+    glConvolutionFilter2DEXT := wglGetProcAddress('glConvolutionFilter2DEXT');
+    if not Assigned(glConvolutionFilter2DEXT) then Exit;
+    glCopyConvolutionFilter1DEXT := wglGetProcAddress('glCopyConvolutionFilter1DEXT');
+    if not Assigned(glCopyConvolutionFilter1DEXT) then Exit;
+    glCopyConvolutionFilter2DEXT := wglGetProcAddress('glCopyConvolutionFilter2DEXT');
+    if not Assigned(glCopyConvolutionFilter2DEXT) then Exit;
+    glGetConvolutionFilterEXT := wglGetProcAddress('glGetConvolutionFilterEXT');
+    if not Assigned(glGetConvolutionFilterEXT) then Exit;
+    glSeparableFilter2DEXT := wglGetProcAddress('glSeparableFilter2DEXT');
+    if not Assigned(glSeparableFilter2DEXT) then Exit;
+    glGetSeparableFilterEXT := wglGetProcAddress('glGetSeparableFilterEXT');
+    if not Assigned(glGetSeparableFilterEXT) then Exit;
+    glConvolutionParameteriEXT := wglGetProcAddress('glConvolutionParameteriEXT');
+    if not Assigned(glConvolutionParameteriEXT) then Exit;
+    glConvolutionParameterivEXT := wglGetProcAddress('glConvolutionParameterivEXT');
+    if not Assigned(glConvolutionParameterivEXT) then Exit;
+    glConvolutionParameterfEXT := wglGetProcAddress('glConvolutionParameterfEXT');
+    if not Assigned(glConvolutionParameterfEXT) then Exit;
+    glConvolutionParameterfvEXT := wglGetProcAddress('glConvolutionParameterfvEXT');
+    if not Assigned(glConvolutionParameterfvEXT) then Exit;
+    glGetConvolutionParameterivEXT := wglGetProcAddress('glGetConvolutionParameterivEXT');
+    if not Assigned(glGetConvolutionParameterivEXT) then Exit;
+    glGetConvolutionParameterfvEXT := wglGetProcAddress('glGetConvolutionParameterfvEXT');
+    if not Assigned(glGetConvolutionParameterfvEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_fog_coord: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_fog_coord', extstring) then
+  begin
+    glFogCoordfEXT := wglGetProcAddress('glFogCoordfEXT');
+    if not Assigned(glFogCoordfEXT) then Exit;
+    glFogCoorddEXT := wglGetProcAddress('glFogCoorddEXT');
+    if not Assigned(glFogCoorddEXT) then Exit;
+    glFogCoordfvEXT := wglGetProcAddress('glFogCoordfvEXT');
+    if not Assigned(glFogCoordfvEXT) then Exit;
+    glFogCoorddvEXT := wglGetProcAddress('glFogCoorddvEXT');
+    if not Assigned(glFogCoorddvEXT) then Exit;
+    glFogCoordPointerEXT := wglGetProcAddress('glFogCoordPointerEXT');
+    if not Assigned(glFogCoordPointerEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_histogram: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_histogram', extstring) then
+  begin
+    glHistogramEXT := wglGetProcAddress('glHistogramEXT');
+    if not Assigned(glHistogramEXT) then Exit;
+    glResetHistogramEXT := wglGetProcAddress('glResetHistogramEXT');
+    if not Assigned(glResetHistogramEXT) then Exit;
+    glGetHistogramEXT := wglGetProcAddress('glGetHistogramEXT');
+    if not Assigned(glGetHistogramEXT) then Exit;
+    glGetHistogramParameterivEXT := wglGetProcAddress('glGetHistogramParameterivEXT');
+    if not Assigned(glGetHistogramParameterivEXT) then Exit;
+    glGetHistogramParameterfvEXT := wglGetProcAddress('glGetHistogramParameterfvEXT');
+    if not Assigned(glGetHistogramParameterfvEXT) then Exit;
+    glMinmaxEXT := wglGetProcAddress('glMinmaxEXT');
+    if not Assigned(glMinmaxEXT) then Exit;
+    glResetMinmaxEXT := wglGetProcAddress('glResetMinmaxEXT');
+    if not Assigned(glResetMinmaxEXT) then Exit;
+    glGetMinmaxEXT := wglGetProcAddress('glGetMinmaxEXT');
+    if not Assigned(glGetMinmaxEXT) then Exit;
+    glGetMinmaxParameterivEXT := wglGetProcAddress('glGetMinmaxParameterivEXT');
+    if not Assigned(glGetMinmaxParameterivEXT) then Exit;
+    glGetMinmaxParameterfvEXT := wglGetProcAddress('glGetMinmaxParameterfvEXT');
+    if not Assigned(glGetMinmaxParameterfvEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_multi_draw_arrays: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_multi_draw_arrays', extstring) then
+  begin
+    glMultiDrawArraysEXT := wglGetProcAddress('glMultiDrawArraysEXT');
+    if not Assigned(glMultiDrawArraysEXT) then Exit;
+    glMultiDrawElementsEXT := wglGetProcAddress('glMultiDrawElementsEXT');
+    if not Assigned(glMultiDrawElementsEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_packed_pixels: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_packed_pixels', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_paletted_texture: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_paletted_texture', extstring) then
+  begin
+    glColorTableEXT := wglGetProcAddress('glColorTableEXT');
+    if not Assigned(glColorTableEXT) then Exit;
+    glColorSubTableEXT := wglGetProcAddress('glColorSubTableEXT');
+    if not Assigned(glColorSubTableEXT) then Exit;
+    glGetColorTableEXT := wglGetProcAddress('glGetColorTableEXT');
+    if not Assigned(glGetColorTableEXT) then Exit;
+    glGetColorTableParameterivEXT := wglGetProcAddress('glGetColorTableParameterivEXT');
+    if not Assigned(glGetColorTableParameterivEXT) then Exit;
+    glGetColorTableParameterfvEXT := wglGetProcAddress('glGetColorTableParameterfvEXT');
+    if not Assigned(glGetColorTableParameterfvEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_point_parameters: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_point_parameters', extstring) then
+  begin
+    glPointParameterfEXT := wglGetProcAddress('glPointParameterfEXT');
+    if not Assigned(glPointParameterfEXT) then Exit;
+    glPointParameterfvEXT := wglGetProcAddress('glPointParameterfvEXT');
+    if not Assigned(glPointParameterfvEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_polygon_offset: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_polygon_offset', extstring) then
+  begin
+    glPolygonOffsetEXT := wglGetProcAddress('glPolygonOffsetEXT');
+    if not Assigned(glPolygonOffsetEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_secondary_color: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_secondary_color', extstring) then
+  begin
+    glSecondaryColor3bEXT := wglGetProcAddress('glSecondaryColor3bEXT');
+    if not Assigned(glSecondaryColor3bEXT) then Exit;
+    glSecondaryColor3sEXT := wglGetProcAddress('glSecondaryColor3sEXT');
+    if not Assigned(glSecondaryColor3sEXT) then Exit;
+    glSecondaryColor3iEXT := wglGetProcAddress('glSecondaryColor3iEXT');
+    if not Assigned(glSecondaryColor3iEXT) then Exit;
+    glSecondaryColor3fEXT := wglGetProcAddress('glSecondaryColor3fEXT');
+    if not Assigned(glSecondaryColor3fEXT) then Exit;
+    glSecondaryColor3dEXT := wglGetProcAddress('glSecondaryColor3dEXT');
+    if not Assigned(glSecondaryColor3dEXT) then Exit;
+    glSecondaryColor3ubEXT := wglGetProcAddress('glSecondaryColor3ubEXT');
+    if not Assigned(glSecondaryColor3ubEXT) then Exit;
+    glSecondaryColor3usEXT := wglGetProcAddress('glSecondaryColor3usEXT');
+    if not Assigned(glSecondaryColor3usEXT) then Exit;
+    glSecondaryColor3uiEXT := wglGetProcAddress('glSecondaryColor3uiEXT');
+    if not Assigned(glSecondaryColor3uiEXT) then Exit;
+    glSecondaryColor3bvEXT := wglGetProcAddress('glSecondaryColor3bvEXT');
+    if not Assigned(glSecondaryColor3bvEXT) then Exit;
+    glSecondaryColor3svEXT := wglGetProcAddress('glSecondaryColor3svEXT');
+    if not Assigned(glSecondaryColor3svEXT) then Exit;
+    glSecondaryColor3ivEXT := wglGetProcAddress('glSecondaryColor3ivEXT');
+    if not Assigned(glSecondaryColor3ivEXT) then Exit;
+    glSecondaryColor3fvEXT := wglGetProcAddress('glSecondaryColor3fvEXT');
+    if not Assigned(glSecondaryColor3fvEXT) then Exit;
+    glSecondaryColor3dvEXT := wglGetProcAddress('glSecondaryColor3dvEXT');
+    if not Assigned(glSecondaryColor3dvEXT) then Exit;
+    glSecondaryColor3ubvEXT := wglGetProcAddress('glSecondaryColor3ubvEXT');
+    if not Assigned(glSecondaryColor3ubvEXT) then Exit;
+    glSecondaryColor3usvEXT := wglGetProcAddress('glSecondaryColor3usvEXT');
+    if not Assigned(glSecondaryColor3usvEXT) then Exit;
+    glSecondaryColor3uivEXT := wglGetProcAddress('glSecondaryColor3uivEXT');
+    if not Assigned(glSecondaryColor3uivEXT) then Exit;
+    glSecondaryColorPointerEXT := wglGetProcAddress('glSecondaryColorPointerEXT');
+    if not Assigned(glSecondaryColorPointerEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_separate_specular_color: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_separate_specular_color', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_shadow_funcs: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_shadow_funcs', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_shared_texture_palette: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_shared_texture_palette', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_stencil_two_side: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_stencil_two_side', extstring) then
+  begin
+    glActiveStencilFaceEXT := wglGetProcAddress('glActiveStencilFaceEXT');
+    if not Assigned(glActiveStencilFaceEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_stencil_wrap: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_stencil_wrap', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_subtexture: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_subtexture', extstring) then
+  begin
+    glTexSubImage1DEXT := wglGetProcAddress('glTexSubImage1DEXT');
+    if not Assigned(glTexSubImage1DEXT) then Exit;
+    glTexSubImage2DEXT := wglGetProcAddress('glTexSubImage2DEXT');
+    if not Assigned(glTexSubImage2DEXT) then Exit;
+    glTexSubImage3DEXT := wglGetProcAddress('glTexSubImage3DEXT');
+    if not Assigned(glTexSubImage3DEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture3D: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture3D', extstring) then
+  begin
+    glTexImage3DEXT := wglGetProcAddress('glTexImage3DEXT');
+    if not Assigned(glTexImage3DEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_compression_s3tc: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_compression_s3tc', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_env_add: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_env_add', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_env_combine: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_env_combine', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_env_dot3: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_env_dot3', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_filter_anisotropic: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_filter_anisotropic', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_lod_bias: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_lod_bias', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_object: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_object', extstring) then
+  begin
+    glGenTexturesEXT := wglGetProcAddress('glGenTexturesEXT');
+    if not Assigned(glGenTexturesEXT) then Exit;
+    glDeleteTexturesEXT := wglGetProcAddress('glDeleteTexturesEXT');
+    if not Assigned(glDeleteTexturesEXT) then Exit;
+    glBindTextureEXT := wglGetProcAddress('glBindTextureEXT');
+    if not Assigned(glBindTextureEXT) then Exit;
+    glPrioritizeTexturesEXT := wglGetProcAddress('glPrioritizeTexturesEXT');
+    if not Assigned(glPrioritizeTexturesEXT) then Exit;
+    glAreTexturesResidentEXT := wglGetProcAddress('glAreTexturesResidentEXT');
+    if not Assigned(glAreTexturesResidentEXT) then Exit;
+    glIsTextureEXT := wglGetProcAddress('glIsTextureEXT');
+    if not Assigned(glIsTextureEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_vertex_array: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_vertex_array', extstring) then
+  begin
+    glArrayElementEXT := wglGetProcAddress('glArrayElementEXT');
+    if not Assigned(glArrayElementEXT) then Exit;
+    glDrawArraysEXT := wglGetProcAddress('glDrawArraysEXT');
+    if not Assigned(glDrawArraysEXT) then Exit;
+    glVertexPointerEXT := wglGetProcAddress('glVertexPointerEXT');
+    if not Assigned(glVertexPointerEXT) then Exit;
+    glNormalPointerEXT := wglGetProcAddress('glNormalPointerEXT');
+    if not Assigned(glNormalPointerEXT) then Exit;
+    glColorPointerEXT := wglGetProcAddress('glColorPointerEXT');
+    if not Assigned(glColorPointerEXT) then Exit;
+    glIndexPointerEXT := wglGetProcAddress('glIndexPointerEXT');
+    if not Assigned(glIndexPointerEXT) then Exit;
+    glTexCoordPointerEXT := wglGetProcAddress('glTexCoordPointerEXT');
+    if not Assigned(glTexCoordPointerEXT) then Exit;
+    glEdgeFlagPointerEXT := wglGetProcAddress('glEdgeFlagPointerEXT');
+    if not Assigned(glEdgeFlagPointerEXT) then Exit;
+    glGetPointervEXT := wglGetProcAddress('glGetPointervEXT');
+    if not Assigned(glGetPointervEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_vertex_shader: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_vertex_shader', extstring) then
+  begin
+    glBeginVertexShaderEXT := wglGetProcAddress('glBeginVertexShaderEXT');
+    if not Assigned(glBeginVertexShaderEXT) then Exit;
+    glEndVertexShaderEXT := wglGetProcAddress('glEndVertexShaderEXT');
+    if not Assigned(glEndVertexShaderEXT) then Exit;
+    glBindVertexShaderEXT := wglGetProcAddress('glBindVertexShaderEXT');
+    if not Assigned(glBindVertexShaderEXT) then Exit;
+    glGenVertexShadersEXT := wglGetProcAddress('glGenVertexShadersEXT');
+    if not Assigned(glGenVertexShadersEXT) then Exit;
+    glDeleteVertexShaderEXT := wglGetProcAddress('glDeleteVertexShaderEXT');
+    if not Assigned(glDeleteVertexShaderEXT) then Exit;
+    glShaderOp1EXT := wglGetProcAddress('glShaderOp1EXT');
+    if not Assigned(glShaderOp1EXT) then Exit;
+    glShaderOp2EXT := wglGetProcAddress('glShaderOp2EXT');
+    if not Assigned(glShaderOp2EXT) then Exit;
+    glShaderOp3EXT := wglGetProcAddress('glShaderOp3EXT');
+    if not Assigned(glShaderOp3EXT) then Exit;
+    glSwizzleEXT := wglGetProcAddress('glSwizzleEXT');
+    if not Assigned(glSwizzleEXT) then Exit;
+    glWriteMaskEXT := wglGetProcAddress('glWriteMaskEXT');
+    if not Assigned(glWriteMaskEXT) then Exit;
+    glInsertComponentEXT := wglGetProcAddress('glInsertComponentEXT');
+    if not Assigned(glInsertComponentEXT) then Exit;
+    glExtractComponentEXT := wglGetProcAddress('glExtractComponentEXT');
+    if not Assigned(glExtractComponentEXT) then Exit;
+    glGenSymbolsEXT := wglGetProcAddress('glGenSymbolsEXT');
+    if not Assigned(glGenSymbolsEXT) then Exit;
+    glSetInvariantEXT := wglGetProcAddress('glSetInvariantEXT');
+    if not Assigned(glSetInvariantEXT) then Exit;
+    glSetLocalConstantEXT := wglGetProcAddress('glSetLocalConstantEXT');
+    if not Assigned(glSetLocalConstantEXT) then Exit;
+    glVariantbvEXT := wglGetProcAddress('glVariantbvEXT');
+    if not Assigned(glVariantbvEXT) then Exit;
+    glVariantsvEXT := wglGetProcAddress('glVariantsvEXT');
+    if not Assigned(glVariantsvEXT) then Exit;
+    glVariantivEXT := wglGetProcAddress('glVariantivEXT');
+    if not Assigned(glVariantivEXT) then Exit;
+    glVariantfvEXT := wglGetProcAddress('glVariantfvEXT');
+    if not Assigned(glVariantfvEXT) then Exit;
+    glVariantdvEXT := wglGetProcAddress('glVariantdvEXT');
+    if not Assigned(glVariantdvEXT) then Exit;
+    glVariantubvEXT := wglGetProcAddress('glVariantubvEXT');
+    if not Assigned(glVariantubvEXT) then Exit;
+    glVariantusvEXT := wglGetProcAddress('glVariantusvEXT');
+    if not Assigned(glVariantusvEXT) then Exit;
+    glVariantuivEXT := wglGetProcAddress('glVariantuivEXT');
+    if not Assigned(glVariantuivEXT) then Exit;
+    glVariantPointerEXT := wglGetProcAddress('glVariantPointerEXT');
+    if not Assigned(glVariantPointerEXT) then Exit;
+    glEnableVariantClientStateEXT := wglGetProcAddress('glEnableVariantClientStateEXT');
+    if not Assigned(glEnableVariantClientStateEXT) then Exit;
+    glDisableVariantClientStateEXT := wglGetProcAddress('glDisableVariantClientStateEXT');
+    if not Assigned(glDisableVariantClientStateEXT) then Exit;
+    glBindLightParameterEXT := wglGetProcAddress('glBindLightParameterEXT');
+    if not Assigned(glBindLightParameterEXT) then Exit;
+    glBindMaterialParameterEXT := wglGetProcAddress('glBindMaterialParameterEXT');
+    if not Assigned(glBindMaterialParameterEXT) then Exit;
+    glBindTexGenParameterEXT := wglGetProcAddress('glBindTexGenParameterEXT');
+    if not Assigned(glBindTexGenParameterEXT) then Exit;
+    glBindTextureUnitParameterEXT := wglGetProcAddress('glBindTextureUnitParameterEXT');
+    if not Assigned(glBindTextureUnitParameterEXT) then Exit;
+    glBindParameterEXT := wglGetProcAddress('glBindParameterEXT');
+    if not Assigned(glBindParameterEXT) then Exit;
+    glIsVariantEnabledEXT := wglGetProcAddress('glIsVariantEnabledEXT');
+    if not Assigned(glIsVariantEnabledEXT) then Exit;
+    glGetVariantBooleanvEXT := wglGetProcAddress('glGetVariantBooleanvEXT');
+    if not Assigned(glGetVariantBooleanvEXT) then Exit;
+    glGetVariantIntegervEXT := wglGetProcAddress('glGetVariantIntegervEXT');
+    if not Assigned(glGetVariantIntegervEXT) then Exit;
+    glGetVariantFloatvEXT := wglGetProcAddress('glGetVariantFloatvEXT');
+    if not Assigned(glGetVariantFloatvEXT) then Exit;
+    glGetVariantPointervEXT := wglGetProcAddress('glGetVariantPointervEXT');
+    if not Assigned(glGetVariantPointervEXT) then Exit;
+    glGetInvariantBooleanvEXT := wglGetProcAddress('glGetInvariantBooleanvEXT');
+    if not Assigned(glGetInvariantBooleanvEXT) then Exit;
+    glGetInvariantIntegervEXT := wglGetProcAddress('glGetInvariantIntegervEXT');
+    if not Assigned(glGetInvariantIntegervEXT) then Exit;
+    glGetInvariantFloatvEXT := wglGetProcAddress('glGetInvariantFloatvEXT');
+    if not Assigned(glGetInvariantFloatvEXT) then Exit;
+    glGetLocalConstantBooleanvEXT := wglGetProcAddress('glGetLocalConstantBooleanvEXT');
+    if not Assigned(glGetLocalConstantBooleanvEXT) then Exit;
+    glGetLocalConstantIntegervEXT := wglGetProcAddress('glGetLocalConstantIntegervEXT');
+    if not Assigned(glGetLocalConstantIntegervEXT) then Exit;
+    glGetLocalConstantFloatvEXT := wglGetProcAddress('glGetLocalConstantFloatvEXT');
+    if not Assigned(glGetLocalConstantFloatvEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_vertex_weighting: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_vertex_weighting', extstring) then
+  begin
+    glVertexWeightfEXT := wglGetProcAddress('glVertexWeightfEXT');
+    if not Assigned(glVertexWeightfEXT) then Exit;
+    glVertexWeightfvEXT := wglGetProcAddress('glVertexWeightfvEXT');
+    if not Assigned(glVertexWeightfvEXT) then Exit;
+    glVertexWeightPointerEXT := wglGetProcAddress('glVertexWeightPointerEXT');
+    if not Assigned(glVertexWeightPointerEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_HP_occlusion_test: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_HP_occlusion_test', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_blend_square: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_blend_square', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_copy_depth_to_color: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_copy_depth_to_color', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_depth_clamp: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_depth_clamp', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_evaluators: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_evaluators', extstring) then
+  begin
+    glMapControlPointsNV := wglGetProcAddress('glMapControlPointsNV');
+    if not Assigned(glMapControlPointsNV) then Exit;
+    glMapParameterivNV := wglGetProcAddress('glMapParameterivNV');
+    if not Assigned(glMapParameterivNV) then Exit;
+    glMapParameterfvNV := wglGetProcAddress('glMapParameterfvNV');
+    if not Assigned(glMapParameterfvNV) then Exit;
+    glGetMapControlPointsNV := wglGetProcAddress('glGetMapControlPointsNV');
+    if not Assigned(glGetMapControlPointsNV) then Exit;
+    glGetMapParameterivNV := wglGetProcAddress('glGetMapParameterivNV');
+    if not Assigned(glGetMapParameterivNV) then Exit;
+    glGetMapParameterfvNV := wglGetProcAddress('glGetMapParameterfvNV');
+    if not Assigned(glGetMapParameterfvNV) then Exit;
+    glGetMapAttribParameterivNV := wglGetProcAddress('glGetMapAttribParameterivNV');
+    if not Assigned(glGetMapAttribParameterivNV) then Exit;
+    glGetMapAttribParameterfvNV := wglGetProcAddress('glGetMapAttribParameterfvNV');
+    if not Assigned(glGetMapAttribParameterfvNV) then Exit;
+    glEvalMapsNV := wglGetProcAddress('glEvalMapsNV');
+    if not Assigned(glEvalMapsNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_fence: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_fence', extstring) then
+  begin
+    glGenFencesNV := wglGetProcAddress('glGenFencesNV');
+    if not Assigned(glGenFencesNV) then Exit;
+    glDeleteFencesNV := wglGetProcAddress('glDeleteFencesNV');
+    if not Assigned(glDeleteFencesNV) then Exit;
+    glSetFenceNV := wglGetProcAddress('glSetFenceNV');
+    if not Assigned(glSetFenceNV) then Exit;
+    glTestFenceNV := wglGetProcAddress('glTestFenceNV');
+    if not Assigned(glTestFenceNV) then Exit;
+    glFinishFenceNV := wglGetProcAddress('glFinishFenceNV');
+    if not Assigned(glFinishFenceNV) then Exit;
+    glIsFenceNV := wglGetProcAddress('glIsFenceNV');
+    if not Assigned(glIsFenceNV) then Exit;
+    glGetFenceivNV := wglGetProcAddress('glGetFenceivNV');
+    if not Assigned(glGetFenceivNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_fog_distance: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_fog_distance', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_light_max_exponent: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_light_max_exponent', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_multisample_filter_hint: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_multisample_filter_hint', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_occlusion_query: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_occlusion_query', extstring) then
+  begin
+    glGenOcclusionQueriesNV := wglGetProcAddress('glGenOcclusionQueriesNV');
+    if not Assigned(glGenOcclusionQueriesNV) then Exit;
+    glDeleteOcclusionQueriesNV := wglGetProcAddress('glDeleteOcclusionQueriesNV');
+    if not Assigned(glDeleteOcclusionQueriesNV) then Exit;
+    glIsOcclusionQueryNV := wglGetProcAddress('glIsOcclusionQueryNV');
+    if not Assigned(glIsOcclusionQueryNV) then Exit;
+    glBeginOcclusionQueryNV := wglGetProcAddress('glBeginOcclusionQueryNV');
+    if not Assigned(glBeginOcclusionQueryNV) then Exit;
+    glEndOcclusionQueryNV := wglGetProcAddress('glEndOcclusionQueryNV');
+    if not Assigned(glEndOcclusionQueryNV) then Exit;
+    glGetOcclusionQueryivNV := wglGetProcAddress('glGetOcclusionQueryivNV');
+    if not Assigned(glGetOcclusionQueryivNV) then Exit;
+    glGetOcclusionQueryuivNV := wglGetProcAddress('glGetOcclusionQueryuivNV');
+    if not Assigned(glGetOcclusionQueryuivNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_packed_depth_stencil: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_packed_depth_stencil', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_point_sprite: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_point_sprite', extstring) then
+  begin
+    glPointParameteriNV := wglGetProcAddress('glPointParameteriNV');
+    if not Assigned(glPointParameteriNV) then Exit;
+    glPointParameterivNV := wglGetProcAddress('glPointParameterivNV');
+    if not Assigned(glPointParameterivNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_register_combiners: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_register_combiners', extstring) then
+  begin
+    glCombinerParameterfvNV := wglGetProcAddress('glCombinerParameterfvNV');
+    if not Assigned(glCombinerParameterfvNV) then Exit;
+    glCombinerParameterivNV := wglGetProcAddress('glCombinerParameterivNV');
+    if not Assigned(glCombinerParameterivNV) then Exit;
+    glCombinerParameterfNV := wglGetProcAddress('glCombinerParameterfNV');
+    if not Assigned(glCombinerParameterfNV) then Exit;
+    glCombinerParameteriNV := wglGetProcAddress('glCombinerParameteriNV');
+    if not Assigned(glCombinerParameteriNV) then Exit;
+    glCombinerInputNV := wglGetProcAddress('glCombinerInputNV');
+    if not Assigned(glCombinerInputNV) then Exit;
+    glCombinerOutputNV := wglGetProcAddress('glCombinerOutputNV');
+    if not Assigned(glCombinerOutputNV) then Exit;
+    glFinalCombinerInputNV := wglGetProcAddress('glFinalCombinerInputNV');
+    if not Assigned(glFinalCombinerInputNV) then Exit;
+    glGetCombinerInputParameterfvNV := wglGetProcAddress('glGetCombinerInputParameterfvNV');
+    if not Assigned(glGetCombinerInputParameterfvNV) then Exit;
+    glGetCombinerInputParameterivNV := wglGetProcAddress('glGetCombinerInputParameterivNV');
+    if not Assigned(glGetCombinerInputParameterivNV) then Exit;
+    glGetCombinerOutputParameterfvNV := wglGetProcAddress('glGetCombinerOutputParameterfvNV');
+    if not Assigned(glGetCombinerOutputParameterfvNV) then Exit;
+    glGetCombinerOutputParameterivNV := wglGetProcAddress('glGetCombinerOutputParameterivNV');
+    if not Assigned(glGetCombinerOutputParameterivNV) then Exit;
+    glGetFinalCombinerInputParameterfvNV := wglGetProcAddress('glGetFinalCombinerInputParameterfvNV');
+    if not Assigned(glGetFinalCombinerInputParameterfvNV) then Exit;
+    glGetFinalCombinerInputParameterivNV := wglGetProcAddress('glGetFinalCombinerInputParameterivNV');
+    if not Assigned(glGetFinalCombinerInputParameterivNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_register_combiners2: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_register_combiners2', extstring) then
+  begin
+    glCombinerStageParameterfvNV := wglGetProcAddress('glCombinerStageParameterfvNV');
+    if not Assigned(glCombinerStageParameterfvNV) then Exit;
+    glGetCombinerStageParameterfvNV := wglGetProcAddress('glGetCombinerStageParameterfvNV');
+    if not Assigned(glGetCombinerStageParameterfvNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texgen_emboss: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texgen_emboss', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texgen_reflection: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texgen_reflection', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texture_compression_vtc: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texture_compression_vtc', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texture_env_combine4: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texture_env_combine4', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texture_rectangle: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texture_rectangle', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texture_shader: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texture_shader', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texture_shader2: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texture_shader2', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texture_shader3: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texture_shader3', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_vertex_array_range: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_vertex_array_range', extstring) then
+  begin
+    glVertexArrayRangeNV := wglGetProcAddress('glVertexArrayRangeNV');
+    if not Assigned(glVertexArrayRangeNV) then Exit;
+    glFlushVertexArrayRangeNV := wglGetProcAddress('glFlushVertexArrayRangeNV');
+    if not Assigned(glFlushVertexArrayRangeNV) then Exit;
+{$IFDEF Windows}
+    wglAllocateMemoryNV := wglGetProcAddress('wglAllocateMemoryNV');
+    if not Assigned(wglAllocateMemoryNV) then Exit;
+    wglFreeMemoryNV := wglGetProcAddress('wglFreeMemoryNV');
+    if not Assigned(wglFreeMemoryNV) then Exit;
+{$ENDIF}
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_vertex_array_range2: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_vertex_array_range2', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_vertex_program: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_vertex_program', extstring) then
+  begin
+    glBindProgramNV := wglGetProcAddress('glBindProgramNV');
+    if not Assigned(glBindProgramNV) then Exit;
+    glDeleteProgramsNV := wglGetProcAddress('glDeleteProgramsNV');
+    if not Assigned(glDeleteProgramsNV) then Exit;
+    glExecuteProgramNV := wglGetProcAddress('glExecuteProgramNV');
+    if not Assigned(glExecuteProgramNV) then Exit;
+    glGenProgramsNV := wglGetProcAddress('glGenProgramsNV');
+    if not Assigned(glGenProgramsNV) then Exit;
+    glAreProgramsResidentNV := wglGetProcAddress('glAreProgramsResidentNV');
+    if not Assigned(glAreProgramsResidentNV) then Exit;
+    glRequestResidentProgramsNV := wglGetProcAddress('glRequestResidentProgramsNV');
+    if not Assigned(glRequestResidentProgramsNV) then Exit;
+    glGetProgramParameterfvNV := wglGetProcAddress('glGetProgramParameterfvNV');
+    if not Assigned(glGetProgramParameterfvNV) then Exit;
+    glGetProgramParameterdvNV := wglGetProcAddress('glGetProgramParameterdvNV');
+    if not Assigned(glGetProgramParameterdvNV) then Exit;
+    glGetProgramivNV := wglGetProcAddress('glGetProgramivNV');
+    if not Assigned(glGetProgramivNV) then Exit;
+    glGetProgramStringNV := wglGetProcAddress('glGetProgramStringNV');
+    if not Assigned(glGetProgramStringNV) then Exit;
+    glGetTrackMatrixivNV := wglGetProcAddress('glGetTrackMatrixivNV');
+    if not Assigned(glGetTrackMatrixivNV) then Exit;
+    glGetVertexAttribdvNV := wglGetProcAddress('glGetVertexAttribdvNV');
+    if not Assigned(glGetVertexAttribdvNV) then Exit;
+    glGetVertexAttribfvNV := wglGetProcAddress('glGetVertexAttribfvNV');
+    if not Assigned(glGetVertexAttribfvNV) then Exit;
+    glGetVertexAttribivNV := wglGetProcAddress('glGetVertexAttribivNV');
+    if not Assigned(glGetVertexAttribivNV) then Exit;
+    glGetVertexAttribPointervNV := wglGetProcAddress('glGetVertexAttribPointervNV');
+    if not Assigned(glGetVertexAttribPointervNV) then Exit;
+    glIsProgramNV := wglGetProcAddress('glIsProgramNV');
+    if not Assigned(glIsProgramNV) then Exit;
+    glLoadProgramNV := wglGetProcAddress('glLoadProgramNV');
+    if not Assigned(glLoadProgramNV) then Exit;
+    glProgramParameter4fNV := wglGetProcAddress('glProgramParameter4fNV');
+    if not Assigned(glProgramParameter4fNV) then Exit;
+    glProgramParameter4fvNV := wglGetProcAddress('glProgramParameter4fvNV');
+    if not Assigned(glProgramParameter4fvNV) then Exit;
+    glProgramParameters4dvNV := wglGetProcAddress('glProgramParameters4dvNV');
+    if not Assigned(glProgramParameters4dvNV) then Exit;
+    glProgramParameters4fvNV := wglGetProcAddress('glProgramParameters4fvNV');
+    if not Assigned(glProgramParameters4fvNV) then Exit;
+    glTrackMatrixNV := wglGetProcAddress('glTrackMatrixNV');
+    if not Assigned(glTrackMatrixNV) then Exit;
+    glVertexAttribPointerNV := wglGetProcAddress('glVertexAttribPointerNV');
+    if not Assigned(glVertexAttribPointerNV) then Exit;
+    glVertexAttrib1sNV := wglGetProcAddress('glVertexAttrib1sNV');
+    if not Assigned(glVertexAttrib1sNV) then Exit;
+    glVertexAttrib1fNV := wglGetProcAddress('glVertexAttrib1fNV');
+    if not Assigned(glVertexAttrib1fNV) then Exit;
+    glVertexAttrib1dNV := wglGetProcAddress('glVertexAttrib1dNV');
+    if not Assigned(glVertexAttrib1dNV) then Exit;
+    glVertexAttrib2sNV := wglGetProcAddress('glVertexAttrib2sNV');
+    if not Assigned(glVertexAttrib2sNV) then Exit;
+    glVertexAttrib2fNV := wglGetProcAddress('glVertexAttrib2fNV');
+    if not Assigned(glVertexAttrib2fNV) then Exit;
+    glVertexAttrib2dNV := wglGetProcAddress('glVertexAttrib2dNV');
+    if not Assigned(glVertexAttrib2dNV) then Exit;
+    glVertexAttrib3sNV := wglGetProcAddress('glVertexAttrib3sNV');
+    if not Assigned(glVertexAttrib3sNV) then Exit;
+    glVertexAttrib3fNV := wglGetProcAddress('glVertexAttrib3fNV');
+    if not Assigned(glVertexAttrib3fNV) then Exit;
+    glVertexAttrib3dNV := wglGetProcAddress('glVertexAttrib3dNV');
+    if not Assigned(glVertexAttrib3dNV) then Exit;
+    glVertexAttrib4sNV := wglGetProcAddress('glVertexAttrib4sNV');
+    if not Assigned(glVertexAttrib4sNV) then Exit;
+    glVertexAttrib4fNV := wglGetProcAddress('glVertexAttrib4fNV');
+    if not Assigned(glVertexAttrib4fNV) then Exit;
+    glVertexAttrib4dNV := wglGetProcAddress('glVertexAttrib4dNV');
+    if not Assigned(glVertexAttrib4dNV) then Exit;
+    glVertexAttrib4ubNV := wglGetProcAddress('glVertexAttrib4ubNV');
+    if not Assigned(glVertexAttrib4ubNV) then Exit;
+    glVertexAttrib1svNV := wglGetProcAddress('glVertexAttrib1svNV');
+    if not Assigned(glVertexAttrib1svNV) then Exit;
+    glVertexAttrib1fvNV := wglGetProcAddress('glVertexAttrib1fvNV');
+    if not Assigned(glVertexAttrib1fvNV) then Exit;
+    glVertexAttrib1dvNV := wglGetProcAddress('glVertexAttrib1dvNV');
+    if not Assigned(glVertexAttrib1dvNV) then Exit;
+    glVertexAttrib2svNV := wglGetProcAddress('glVertexAttrib2svNV');
+    if not Assigned(glVertexAttrib2svNV) then Exit;
+    glVertexAttrib2fvNV := wglGetProcAddress('glVertexAttrib2fvNV');
+    if not Assigned(glVertexAttrib2fvNV) then Exit;
+    glVertexAttrib2dvNV := wglGetProcAddress('glVertexAttrib2dvNV');
+    if not Assigned(glVertexAttrib2dvNV) then Exit;
+    glVertexAttrib3svNV := wglGetProcAddress('glVertexAttrib3svNV');
+    if not Assigned(glVertexAttrib3svNV) then Exit;
+    glVertexAttrib3fvNV := wglGetProcAddress('glVertexAttrib3fvNV');
+    if not Assigned(glVertexAttrib3fvNV) then Exit;
+    glVertexAttrib3dvNV := wglGetProcAddress('glVertexAttrib3dvNV');
+    if not Assigned(glVertexAttrib3dvNV) then Exit;
+    glVertexAttrib4svNV := wglGetProcAddress('glVertexAttrib4svNV');
+    if not Assigned(glVertexAttrib4svNV) then Exit;
+    glVertexAttrib4fvNV := wglGetProcAddress('glVertexAttrib4fvNV');
+    if not Assigned(glVertexAttrib4fvNV) then Exit;
+    glVertexAttrib4dvNV := wglGetProcAddress('glVertexAttrib4dvNV');
+    if not Assigned(glVertexAttrib4dvNV) then Exit;
+    glVertexAttrib4ubvNV := wglGetProcAddress('glVertexAttrib4ubvNV');
+    if not Assigned(glVertexAttrib4ubvNV) then Exit;
+    glVertexAttribs1svNV := wglGetProcAddress('glVertexAttribs1svNV');
+    if not Assigned(glVertexAttribs1svNV) then Exit;
+    glVertexAttribs1fvNV := wglGetProcAddress('glVertexAttribs1fvNV');
+    if not Assigned(glVertexAttribs1fvNV) then Exit;
+    glVertexAttribs1dvNV := wglGetProcAddress('glVertexAttribs1dvNV');
+    if not Assigned(glVertexAttribs1dvNV) then Exit;
+    glVertexAttribs2svNV := wglGetProcAddress('glVertexAttribs2svNV');
+    if not Assigned(glVertexAttribs2svNV) then Exit;
+    glVertexAttribs2fvNV := wglGetProcAddress('glVertexAttribs2fvNV');
+    if not Assigned(glVertexAttribs2fvNV) then Exit;
+    glVertexAttribs2dvNV := wglGetProcAddress('glVertexAttribs2dvNV');
+    if not Assigned(glVertexAttribs2dvNV) then Exit;
+    glVertexAttribs3svNV := wglGetProcAddress('glVertexAttribs3svNV');
+    if not Assigned(glVertexAttribs3svNV) then Exit;
+    glVertexAttribs3fvNV := wglGetProcAddress('glVertexAttribs3fvNV');
+    if not Assigned(glVertexAttribs3fvNV) then Exit;
+    glVertexAttribs3dvNV := wglGetProcAddress('glVertexAttribs3dvNV');
+    if not Assigned(glVertexAttribs3dvNV) then Exit;
+    glVertexAttribs4svNV := wglGetProcAddress('glVertexAttribs4svNV');
+    if not Assigned(glVertexAttribs4svNV) then Exit;
+    glVertexAttribs4fvNV := wglGetProcAddress('glVertexAttribs4fvNV');
+    if not Assigned(glVertexAttribs4fvNV) then Exit;
+    glVertexAttribs4dvNV := wglGetProcAddress('glVertexAttribs4dvNV');
+    if not Assigned(glVertexAttribs4dvNV) then Exit;
+    glVertexAttribs4ubvNV := wglGetProcAddress('glVertexAttribs4ubvNV');
+    if not Assigned(glVertexAttribs4ubvNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_vertex_program1_1: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_vertex_program1_1', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_element_array: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_element_array', extstring) then
+  begin
+    glElementPointerATI := wglGetProcAddress('glElementPointerATI');
+    if not Assigned(glElementPointerATI) then Exit;
+    glDrawElementArrayATI := wglGetProcAddress('glDrawElementArrayATI');
+    if not Assigned(glDrawElementArrayATI) then Exit;
+    glDrawRangeElementArrayATI := wglGetProcAddress('glDrawRangeElementArrayATI');
+    if not Assigned(glDrawRangeElementArrayATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_envmap_bumpmap: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_envmap_bumpmap', extstring) then
+  begin
+    glTexBumpParameterivATI := wglGetProcAddress('glTexBumpParameterivATI');
+    if not Assigned(glTexBumpParameterivATI) then Exit;
+    glTexBumpParameterfvATI := wglGetProcAddress('glTexBumpParameterfvATI');
+    if not Assigned(glTexBumpParameterfvATI) then Exit;
+    glGetTexBumpParameterivATI := wglGetProcAddress('glGetTexBumpParameterivATI');
+    if not Assigned(glGetTexBumpParameterivATI) then Exit;
+    glGetTexBumpParameterfvATI := wglGetProcAddress('glGetTexBumpParameterfvATI');
+    if not Assigned(glGetTexBumpParameterfvATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_fragment_shader: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_fragment_shader', extstring) then
+  begin
+    glGenFragmentShadersATI := wglGetProcAddress('glGenFragmentShadersATI');
+    if not Assigned(glGenFragmentShadersATI) then Exit;
+    glBindFragmentShaderATI := wglGetProcAddress('glBindFragmentShaderATI');
+    if not Assigned(glBindFragmentShaderATI) then Exit;
+    glDeleteFragmentShaderATI := wglGetProcAddress('glDeleteFragmentShaderATI');
+    if not Assigned(glDeleteFragmentShaderATI) then Exit;
+    glBeginFragmentShaderATI := wglGetProcAddress('glBeginFragmentShaderATI');
+    if not Assigned(glBeginFragmentShaderATI) then Exit;
+    glEndFragmentShaderATI := wglGetProcAddress('glEndFragmentShaderATI');
+    if not Assigned(glEndFragmentShaderATI) then Exit;
+    glPassTexCoordATI := wglGetProcAddress('glPassTexCoordATI');
+    if not Assigned(glPassTexCoordATI) then Exit;
+    glSampleMapATI := wglGetProcAddress('glSampleMapATI');
+    if not Assigned(glSampleMapATI) then Exit;
+    glColorFragmentOp1ATI := wglGetProcAddress('glColorFragmentOp1ATI');
+    if not Assigned(glColorFragmentOp1ATI) then Exit;
+    glColorFragmentOp2ATI := wglGetProcAddress('glColorFragmentOp2ATI');
+    if not Assigned(glColorFragmentOp2ATI) then Exit;
+    glColorFragmentOp3ATI := wglGetProcAddress('glColorFragmentOp3ATI');
+    if not Assigned(glColorFragmentOp3ATI) then Exit;
+    glAlphaFragmentOp1ATI := wglGetProcAddress('glAlphaFragmentOp1ATI');
+    if not Assigned(glAlphaFragmentOp1ATI) then Exit;
+    glAlphaFragmentOp2ATI := wglGetProcAddress('glAlphaFragmentOp2ATI');
+    if not Assigned(glAlphaFragmentOp2ATI) then Exit;
+    glAlphaFragmentOp3ATI := wglGetProcAddress('glAlphaFragmentOp3ATI');
+    if not Assigned(glAlphaFragmentOp3ATI) then Exit;
+    glSetFragmentShaderConstantATI := wglGetProcAddress('glSetFragmentShaderConstantATI');
+    if not Assigned(glSetFragmentShaderConstantATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_pn_triangles: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_pn_triangles', extstring) then
+  begin
+    glPNTrianglesiATI := wglGetProcAddress('glPNTrianglesiATI');
+    if not Assigned(glPNTrianglesiATI) then Exit;
+    glPNTrianglesfATI := wglGetProcAddress('glPNTrianglesfATI');
+    if not Assigned(glPNTrianglesfATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_texture_mirror_once: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_texture_mirror_once', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_vertex_array_object: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_vertex_array_object', extstring) then
+  begin
+    glNewObjectBufferATI := wglGetProcAddress('glNewObjectBufferATI');
+    if not Assigned(glNewObjectBufferATI) then Exit;
+    glIsObjectBufferATI := wglGetProcAddress('glIsObjectBufferATI');
+    if not Assigned(glIsObjectBufferATI) then Exit;
+    glUpdateObjectBufferATI := wglGetProcAddress('glUpdateObjectBufferATI');
+    if not Assigned(glUpdateObjectBufferATI) then Exit;
+    glGetObjectBufferfvATI := wglGetProcAddress('glGetObjectBufferfvATI');
+    if not Assigned(glGetObjectBufferfvATI) then Exit;
+    glGetObjectBufferivATI := wglGetProcAddress('glGetObjectBufferivATI');
+    if not Assigned(glGetObjectBufferivATI) then Exit;
+    glDeleteObjectBufferATI := wglGetProcAddress('glDeleteObjectBufferATI');
+    if not Assigned(glDeleteObjectBufferATI) then Exit;
+    glArrayObjectATI := wglGetProcAddress('glArrayObjectATI');
+    if not Assigned(glArrayObjectATI) then Exit;
+    glGetArrayObjectfvATI := wglGetProcAddress('glGetArrayObjectfvATI');
+    if not Assigned(glGetArrayObjectfvATI) then Exit;
+    glGetArrayObjectivATI := wglGetProcAddress('glGetArrayObjectivATI');
+    if not Assigned(glGetArrayObjectivATI) then Exit;
+    glVariantArrayObjectATI := wglGetProcAddress('glVariantArrayObjectATI');
+    if not Assigned(glVariantArrayObjectATI) then Exit;
+    glGetVariantArrayObjectfvATI := wglGetProcAddress('glGetVariantArrayObjectfvATI');
+    if not Assigned(glGetVariantArrayObjectfvATI) then Exit;
+    glGetVariantArrayObjectivATI := wglGetProcAddress('glGetVariantArrayObjectivATI');
+    if not Assigned(glGetVariantArrayObjectivATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_vertex_streams: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_vertex_streams', extstring) then
+  begin
+    glVertexStream1s := wglGetProcAddress('glVertexStream1s');
+    if not Assigned(glVertexStream1s) then Exit;
+    glVertexStream1i := wglGetProcAddress('glVertexStream1i');
+    if not Assigned(glVertexStream1i) then Exit;
+    glVertexStream1f := wglGetProcAddress('glVertexStream1f');
+    if not Assigned(glVertexStream1f) then Exit;
+    glVertexStream1d := wglGetProcAddress('glVertexStream1d');
+    if not Assigned(glVertexStream1d) then Exit;
+    glVertexStream1sv := wglGetProcAddress('glVertexStream1sv');
+    if not Assigned(glVertexStream1sv) then Exit;
+    glVertexStream1iv := wglGetProcAddress('glVertexStream1iv');
+    if not Assigned(glVertexStream1iv) then Exit;
+    glVertexStream1fv := wglGetProcAddress('glVertexStream1fv');
+    if not Assigned(glVertexStream1fv) then Exit;
+    glVertexStream1dv := wglGetProcAddress('glVertexStream1dv');
+    if not Assigned(glVertexStream1dv) then Exit;
+    glVertexStream2s := wglGetProcAddress('glVertexStream2s');
+    if not Assigned(glVertexStream2s) then Exit;
+    glVertexStream2i := wglGetProcAddress('glVertexStream2i');
+    if not Assigned(glVertexStream2i) then Exit;
+    glVertexStream2f := wglGetProcAddress('glVertexStream2f');
+    if not Assigned(glVertexStream2f) then Exit;
+    glVertexStream2d := wglGetProcAddress('glVertexStream2d');
+    if not Assigned(glVertexStream2d) then Exit;
+    glVertexStream2sv := wglGetProcAddress('glVertexStream2sv');
+    if not Assigned(glVertexStream2sv) then Exit;
+    glVertexStream2iv := wglGetProcAddress('glVertexStream2iv');
+    if not Assigned(glVertexStream2iv) then Exit;
+    glVertexStream2fv := wglGetProcAddress('glVertexStream2fv');
+    if not Assigned(glVertexStream2fv) then Exit;
+    glVertexStream2dv := wglGetProcAddress('glVertexStream2dv');
+    if not Assigned(glVertexStream2dv) then Exit;
+    glVertexStream3s := wglGetProcAddress('glVertexStream3s');
+    if not Assigned(glVertexStream3s) then Exit;
+    glVertexStream3i := wglGetProcAddress('glVertexStream3i');
+    if not Assigned(glVertexStream3i) then Exit;
+    glVertexStream3f := wglGetProcAddress('glVertexStream3f');
+    if not Assigned(glVertexStream3f) then Exit;
+    glVertexStream3d := wglGetProcAddress('glVertexStream3d');
+    if not Assigned(glVertexStream3d) then Exit;
+    glVertexStream3sv := wglGetProcAddress('glVertexStream3sv');
+    if not Assigned(glVertexStream3sv) then Exit;
+    glVertexStream3iv := wglGetProcAddress('glVertexStream3iv');
+    if not Assigned(glVertexStream3iv) then Exit;
+    glVertexStream3fv := wglGetProcAddress('glVertexStream3fv');
+    if not Assigned(glVertexStream3fv) then Exit;
+    glVertexStream3dv := wglGetProcAddress('glVertexStream3dv');
+    if not Assigned(glVertexStream3dv) then Exit;
+    glVertexStream4s := wglGetProcAddress('glVertexStream4s');
+    if not Assigned(glVertexStream4s) then Exit;
+    glVertexStream4i := wglGetProcAddress('glVertexStream4i');
+    if not Assigned(glVertexStream4i) then Exit;
+    glVertexStream4f := wglGetProcAddress('glVertexStream4f');
+    if not Assigned(glVertexStream4f) then Exit;
+    glVertexStream4d := wglGetProcAddress('glVertexStream4d');
+    if not Assigned(glVertexStream4d) then Exit;
+    glVertexStream4sv := wglGetProcAddress('glVertexStream4sv');
+    if not Assigned(glVertexStream4sv) then Exit;
+    glVertexStream4iv := wglGetProcAddress('glVertexStream4iv');
+    if not Assigned(glVertexStream4iv) then Exit;
+    glVertexStream4fv := wglGetProcAddress('glVertexStream4fv');
+    if not Assigned(glVertexStream4fv) then Exit;
+    glVertexStream4dv := wglGetProcAddress('glVertexStream4dv');
+    if not Assigned(glVertexStream4dv) then Exit;
+    glNormalStream3b := wglGetProcAddress('glNormalStream3b');
+    if not Assigned(glNormalStream3b) then Exit;
+    glNormalStream3s := wglGetProcAddress('glNormalStream3s');
+    if not Assigned(glNormalStream3s) then Exit;
+    glNormalStream3i := wglGetProcAddress('glNormalStream3i');
+    if not Assigned(glNormalStream3i) then Exit;
+    glNormalStream3f := wglGetProcAddress('glNormalStream3f');
+    if not Assigned(glNormalStream3f) then Exit;
+    glNormalStream3d := wglGetProcAddress('glNormalStream3d');
+    if not Assigned(glNormalStream3d) then Exit;
+    glNormalStream3bv := wglGetProcAddress('glNormalStream3bv');
+    if not Assigned(glNormalStream3bv) then Exit;
+    glNormalStream3sv := wglGetProcAddress('glNormalStream3sv');
+    if not Assigned(glNormalStream3sv) then Exit;
+    glNormalStream3iv := wglGetProcAddress('glNormalStream3iv');
+    if not Assigned(glNormalStream3iv) then Exit;
+    glNormalStream3fv := wglGetProcAddress('glNormalStream3fv');
+    if not Assigned(glNormalStream3fv) then Exit;
+    glNormalStream3dv := wglGetProcAddress('glNormalStream3dv');
+    if not Assigned(glNormalStream3dv) then Exit;
+    glClientActiveVertexStream := wglGetProcAddress('glClientActiveVertexStream');
+    if not Assigned(glClientActiveVertexStream) then Exit;
+    glVertexBlendEnvi := wglGetProcAddress('glVertexBlendEnvi');
+    if not Assigned(glVertexBlendEnvi) then Exit;
+    glVertexBlendEnvf := wglGetProcAddress('glVertexBlendEnvf');
+    if not Assigned(glVertexBlendEnvf) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+{$IFDEF Windows}
+function Load_WGL_I3D_image_buffer: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_I3D_image_buffer', extstring) then
+  begin
+    wglCreateImageBufferI3D := wglGetProcAddress('wglCreateImageBufferI3D');
+    if not Assigned(wglCreateImageBufferI3D) then Exit;
+    wglDestroyImageBufferI3D := wglGetProcAddress('wglDestroyImageBufferI3D');
+    if not Assigned(wglDestroyImageBufferI3D) then Exit;
+    wglAssociateImageBufferEventsI3D := wglGetProcAddress('wglAssociateImageBufferEventsI3D');
+    if not Assigned(wglAssociateImageBufferEventsI3D) then Exit;
+    wglReleaseImageBufferEventsI3D := wglGetProcAddress('wglReleaseImageBufferEventsI3D');
+    if not Assigned(wglReleaseImageBufferEventsI3D) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_I3D_swap_frame_lock: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_I3D_swap_frame_lock', extstring) then
+  begin
+    wglEnableFrameLockI3D := wglGetProcAddress('wglEnableFrameLockI3D');
+    if not Assigned(wglEnableFrameLockI3D) then Exit;
+    wglDisableFrameLockI3D := wglGetProcAddress('wglDisableFrameLockI3D');
+    if not Assigned(wglDisableFrameLockI3D) then Exit;
+    wglIsEnabledFrameLockI3D := wglGetProcAddress('wglIsEnabledFrameLockI3D');
+    if not Assigned(wglIsEnabledFrameLockI3D) then Exit;
+    wglQueryFrameLockMasterI3D := wglGetProcAddress('wglQueryFrameLockMasterI3D');
+    if not Assigned(wglQueryFrameLockMasterI3D) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_I3D_swap_frame_usage: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_I3D_swap_frame_usage', extstring) then
+  begin
+    wglGetFrameUsageI3D := wglGetProcAddress('wglGetFrameUsageI3D');
+    if not Assigned(wglGetFrameUsageI3D) then Exit;
+    wglBeginFrameTrackingI3D := wglGetProcAddress('wglBeginFrameTrackingI3D');
+    if not Assigned(wglBeginFrameTrackingI3D) then Exit;
+    wglEndFrameTrackingI3D := wglGetProcAddress('wglEndFrameTrackingI3D');
+    if not Assigned(wglEndFrameTrackingI3D) then Exit;
+    wglQueryFrameTrackingI3D := wglGetProcAddress('wglQueryFrameTrackingI3D');
+    if not Assigned(wglQueryFrameTrackingI3D) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+{$ENDIF}
+
+function Load_GL_3DFX_texture_compression_FXT1: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_3DFX_texture_compression_FXT1', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_IBM_cull_vertex: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_IBM_cull_vertex', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_IBM_multimode_draw_arrays: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_IBM_multimode_draw_arrays', extstring) then
+  begin
+    glMultiModeDrawArraysIBM := wglGetProcAddress('glMultiModeDrawArraysIBM');
+    if not Assigned(glMultiModeDrawArraysIBM) then Exit;
+    glMultiModeDrawElementsIBM := wglGetProcAddress('glMultiModeDrawElementsIBM');
+    if not Assigned(glMultiModeDrawElementsIBM) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_IBM_raster_pos_clip: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_IBM_raster_pos_clip', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_IBM_texture_mirrored_repeat: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_IBM_texture_mirrored_repeat', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_IBM_vertex_array_lists: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_IBM_vertex_array_lists', extstring) then
+  begin
+    glColorPointerListIBM := wglGetProcAddress('glColorPointerListIBM');
+    if not Assigned(glColorPointerListIBM) then Exit;
+    glSecondaryColorPointerListIBM := wglGetProcAddress('glSecondaryColorPointerListIBM');
+    if not Assigned(glSecondaryColorPointerListIBM) then Exit;
+    glEdgeFlagPointerListIBM := wglGetProcAddress('glEdgeFlagPointerListIBM');
+    if not Assigned(glEdgeFlagPointerListIBM) then Exit;
+    glFogCoordPointerListIBM := wglGetProcAddress('glFogCoordPointerListIBM');
+    if not Assigned(glFogCoordPointerListIBM) then Exit;
+    glNormalPointerListIBM := wglGetProcAddress('glNormalPointerListIBM');
+    if not Assigned(glNormalPointerListIBM) then Exit;
+    glTexCoordPointerListIBM := wglGetProcAddress('glTexCoordPointerListIBM');
+    if not Assigned(glTexCoordPointerListIBM) then Exit;
+    glVertexPointerListIBM := wglGetProcAddress('glVertexPointerListIBM');
+    if not Assigned(glVertexPointerListIBM) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_MESA_resize_buffers: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_MESA_resize_buffers', extstring) then
+  begin
+    glResizeBuffersMESA := wglGetProcAddress('glResizeBuffersMESA');
+    if not Assigned(glResizeBuffersMESA) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_MESA_window_pos: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_MESA_window_pos', extstring) then
+  begin
+    glWindowPos2dMESA := wglGetProcAddress('glWindowPos2dMESA');
+    if not Assigned(glWindowPos2dMESA) then Exit;
+    glWindowPos2fMESA := wglGetProcAddress('glWindowPos2fMESA');
+    if not Assigned(glWindowPos2fMESA) then Exit;
+    glWindowPos2iMESA := wglGetProcAddress('glWindowPos2iMESA');
+    if not Assigned(glWindowPos2iMESA) then Exit;
+    glWindowPos2sMESA := wglGetProcAddress('glWindowPos2sMESA');
+    if not Assigned(glWindowPos2sMESA) then Exit;
+    glWindowPos2ivMESA := wglGetProcAddress('glWindowPos2ivMESA');
+    if not Assigned(glWindowPos2ivMESA) then Exit;
+    glWindowPos2svMESA := wglGetProcAddress('glWindowPos2svMESA');
+    if not Assigned(glWindowPos2svMESA) then Exit;
+    glWindowPos2fvMESA := wglGetProcAddress('glWindowPos2fvMESA');
+    if not Assigned(glWindowPos2fvMESA) then Exit;
+    glWindowPos2dvMESA := wglGetProcAddress('glWindowPos2dvMESA');
+    if not Assigned(glWindowPos2dvMESA) then Exit;
+    glWindowPos3iMESA := wglGetProcAddress('glWindowPos3iMESA');
+    if not Assigned(glWindowPos3iMESA) then Exit;
+    glWindowPos3sMESA := wglGetProcAddress('glWindowPos3sMESA');
+    if not Assigned(glWindowPos3sMESA) then Exit;
+    glWindowPos3fMESA := wglGetProcAddress('glWindowPos3fMESA');
+    if not Assigned(glWindowPos3fMESA) then Exit;
+    glWindowPos3dMESA := wglGetProcAddress('glWindowPos3dMESA');
+    if not Assigned(glWindowPos3dMESA) then Exit;
+    glWindowPos3ivMESA := wglGetProcAddress('glWindowPos3ivMESA');
+    if not Assigned(glWindowPos3ivMESA) then Exit;
+    glWindowPos3svMESA := wglGetProcAddress('glWindowPos3svMESA');
+    if not Assigned(glWindowPos3svMESA) then Exit;
+    glWindowPos3fvMESA := wglGetProcAddress('glWindowPos3fvMESA');
+    if not Assigned(glWindowPos3fvMESA) then Exit;
+    glWindowPos3dvMESA := wglGetProcAddress('glWindowPos3dvMESA');
+    if not Assigned(glWindowPos3dvMESA) then Exit;
+    glWindowPos4iMESA := wglGetProcAddress('glWindowPos4iMESA');
+    if not Assigned(glWindowPos4iMESA) then Exit;
+    glWindowPos4sMESA := wglGetProcAddress('glWindowPos4sMESA');
+    if not Assigned(glWindowPos4sMESA) then Exit;
+    glWindowPos4fMESA := wglGetProcAddress('glWindowPos4fMESA');
+    if not Assigned(glWindowPos4fMESA) then Exit;
+    glWindowPos4dMESA := wglGetProcAddress('glWindowPos4dMESA');
+    if not Assigned(glWindowPos4dMESA) then Exit;
+    glWindowPos4ivMESA := wglGetProcAddress('glWindowPos4ivMESA');
+    if not Assigned(glWindowPos4ivMESA) then Exit;
+    glWindowPos4svMESA := wglGetProcAddress('glWindowPos4svMESA');
+    if not Assigned(glWindowPos4svMESA) then Exit;
+    glWindowPos4fvMESA := wglGetProcAddress('glWindowPos4fvMESA');
+    if not Assigned(glWindowPos4fvMESA) then Exit;
+    glWindowPos4dvMESA := wglGetProcAddress('glWindowPos4dvMESA');
+    if not Assigned(glWindowPos4dvMESA) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_OML_interlace: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_OML_interlace', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_OML_resample: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_OML_resample', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_OML_subsample: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_OML_subsample', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIS_generate_mipmap: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIS_generate_mipmap', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIS_multisample: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIS_multisample', extstring) then
+  begin
+    glSampleMaskSGIS := wglGetProcAddress('glSampleMaskSGIS');
+    if not Assigned(glSampleMaskSGIS) then Exit;
+    glSamplePatternSGIS := wglGetProcAddress('glSamplePatternSGIS');
+    if not Assigned(glSamplePatternSGIS) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIS_pixel_texture: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIS_pixel_texture', extstring) then
+  begin
+    glPixelTexGenParameteriSGIS := wglGetProcAddress('glPixelTexGenParameteriSGIS');
+    if not Assigned(glPixelTexGenParameteriSGIS) then Exit;
+    glPixelTexGenParameterfSGIS := wglGetProcAddress('glPixelTexGenParameterfSGIS');
+    if not Assigned(glPixelTexGenParameterfSGIS) then Exit;
+    glGetPixelTexGenParameterivSGIS := wglGetProcAddress('glGetPixelTexGenParameterivSGIS');
+    if not Assigned(glGetPixelTexGenParameterivSGIS) then Exit;
+    glGetPixelTexGenParameterfvSGIS := wglGetProcAddress('glGetPixelTexGenParameterfvSGIS');
+    if not Assigned(glGetPixelTexGenParameterfvSGIS) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIS_texture_border_clamp: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIS_texture_border_clamp', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIS_texture_color_mask: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIS_texture_color_mask', extstring) then
+  begin
+    glTextureColorMaskSGIS := wglGetProcAddress('glTextureColorMaskSGIS');
+    if not Assigned(glTextureColorMaskSGIS) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIS_texture_edge_clamp: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIS_texture_edge_clamp', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIS_texture_lod: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIS_texture_lod', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIS_depth_texture: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIS_depth_texture', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIX_fog_offset: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIX_fog_offset', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIX_interlace: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIX_interlace', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGIX_shadow_ambient: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGIX_shadow_ambient', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGI_color_matrix: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGI_color_matrix', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGI_color_table: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGI_color_table', extstring) then
+  begin
+    glColorTableSGI := wglGetProcAddress('glColorTableSGI');
+    if not Assigned(glColorTableSGI) then Exit;
+    glCopyColorTableSGI := wglGetProcAddress('glCopyColorTableSGI');
+    if not Assigned(glCopyColorTableSGI) then Exit;
+    glColorTableParameterivSGI := wglGetProcAddress('glColorTableParameterivSGI');
+    if not Assigned(glColorTableParameterivSGI) then Exit;
+    glColorTableParameterfvSGI := wglGetProcAddress('glColorTableParameterfvSGI');
+    if not Assigned(glColorTableParameterfvSGI) then Exit;
+    glGetColorTableSGI := wglGetProcAddress('glGetColorTableSGI');
+    if not Assigned(glGetColorTableSGI) then Exit;
+    glGetColorTableParameterivSGI := wglGetProcAddress('glGetColorTableParameterivSGI');
+    if not Assigned(glGetColorTableParameterivSGI) then Exit;
+    glGetColorTableParameterfvSGI := wglGetProcAddress('glGetColorTableParameterfvSGI');
+    if not Assigned(glGetColorTableParameterfvSGI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SGI_texture_color_table: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SGI_texture_color_table', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_SUN_vertex: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_SUN_vertex', extstring) then
+  begin
+    glColor4ubVertex2fSUN := wglGetProcAddress('glColor4ubVertex2fSUN');
+    if not Assigned(glColor4ubVertex2fSUN) then Exit;
+    glColor4ubVertex2fvSUN := wglGetProcAddress('glColor4ubVertex2fvSUN');
+    if not Assigned(glColor4ubVertex2fvSUN) then Exit;
+    glColor4ubVertex3fSUN := wglGetProcAddress('glColor4ubVertex3fSUN');
+    if not Assigned(glColor4ubVertex3fSUN) then Exit;
+    glColor4ubVertex3fvSUN := wglGetProcAddress('glColor4ubVertex3fvSUN');
+    if not Assigned(glColor4ubVertex3fvSUN) then Exit;
+    glColor3fVertex3fSUN := wglGetProcAddress('glColor3fVertex3fSUN');
+    if not Assigned(glColor3fVertex3fSUN) then Exit;
+    glColor3fVertex3fvSUN := wglGetProcAddress('glColor3fVertex3fvSUN');
+    if not Assigned(glColor3fVertex3fvSUN) then Exit;
+    glNormal3fVertex3fSUN := wglGetProcAddress('glNormal3fVertex3fSUN');
+    if not Assigned(glNormal3fVertex3fSUN) then Exit;
+    glNormal3fVertex3fvSUN := wglGetProcAddress('glNormal3fVertex3fvSUN');
+    if not Assigned(glNormal3fVertex3fvSUN) then Exit;
+    glColor4fNormal3fVertex3fSUN := wglGetProcAddress('glColor4fNormal3fVertex3fSUN');
+    if not Assigned(glColor4fNormal3fVertex3fSUN) then Exit;
+    glColor4fNormal3fVertex3fvSUN := wglGetProcAddress('glColor4fNormal3fVertex3fvSUN');
+    if not Assigned(glColor4fNormal3fVertex3fvSUN) then Exit;
+    glTexCoord2fVertex3fSUN := wglGetProcAddress('glTexCoord2fVertex3fSUN');
+    if not Assigned(glTexCoord2fVertex3fSUN) then Exit;
+    glTexCoord2fVertex3fvSUN := wglGetProcAddress('glTexCoord2fVertex3fvSUN');
+    if not Assigned(glTexCoord2fVertex3fvSUN) then Exit;
+    glTexCoord4fVertex4fSUN := wglGetProcAddress('glTexCoord4fVertex4fSUN');
+    if not Assigned(glTexCoord4fVertex4fSUN) then Exit;
+    glTexCoord4fVertex4fvSUN := wglGetProcAddress('glTexCoord4fVertex4fvSUN');
+    if not Assigned(glTexCoord4fVertex4fvSUN) then Exit;
+    glTexCoord2fColor4ubVertex3fSUN := wglGetProcAddress('glTexCoord2fColor4ubVertex3fSUN');
+    if not Assigned(glTexCoord2fColor4ubVertex3fSUN) then Exit;
+    glTexCoord2fColor4ubVertex3fvSUN := wglGetProcAddress('glTexCoord2fColor4ubVertex3fvSUN');
+    if not Assigned(glTexCoord2fColor4ubVertex3fvSUN) then Exit;
+    glTexCoord2fColor3fVertex3fSUN := wglGetProcAddress('glTexCoord2fColor3fVertex3fSUN');
+    if not Assigned(glTexCoord2fColor3fVertex3fSUN) then Exit;
+    glTexCoord2fColor3fVertex3fvSUN := wglGetProcAddress('glTexCoord2fColor3fVertex3fvSUN');
+    if not Assigned(glTexCoord2fColor3fVertex3fvSUN) then Exit;
+    glTexCoord2fNormal3fVertex3fSUN := wglGetProcAddress('glTexCoord2fNormal3fVertex3fSUN');
+    if not Assigned(glTexCoord2fNormal3fVertex3fSUN) then Exit;
+    glTexCoord2fNormal3fVertex3fvSUN := wglGetProcAddress('glTexCoord2fNormal3fVertex3fvSUN');
+    if not Assigned(glTexCoord2fNormal3fVertex3fvSUN) then Exit;
+    glTexCoord2fColor4fNormal3fVertex3fSUN := wglGetProcAddress('glTexCoord2fColor4fNormal3fVertex3fSUN');
+    if not Assigned(glTexCoord2fColor4fNormal3fVertex3fSUN) then Exit;
+    glTexCoord2fColor4fNormal3fVertex3fvSUN := wglGetProcAddress('glTexCoord2fColor4fNormal3fVertex3fvSUN');
+    if not Assigned(glTexCoord2fColor4fNormal3fVertex3fvSUN) then Exit;
+    glTexCoord4fColor4fNormal3fVertex4fSUN := wglGetProcAddress('glTexCoord4fColor4fNormal3fVertex4fSUN');
+    if not Assigned(glTexCoord4fColor4fNormal3fVertex4fSUN) then Exit;
+    glTexCoord4fColor4fNormal3fVertex4fvSUN := wglGetProcAddress('glTexCoord4fColor4fNormal3fVertex4fvSUN');
+    if not Assigned(glTexCoord4fColor4fNormal3fVertex4fvSUN) then Exit;
+    glReplacementCodeuiVertex3fSUN := wglGetProcAddress('glReplacementCodeuiVertex3fSUN');
+    if not Assigned(glReplacementCodeuiVertex3fSUN) then Exit;
+    glReplacementCodeuiVertex3fvSUN := wglGetProcAddress('glReplacementCodeuiVertex3fvSUN');
+    if not Assigned(glReplacementCodeuiVertex3fvSUN) then Exit;
+    glReplacementCodeuiColor4ubVertex3fSUN := wglGetProcAddress('glReplacementCodeuiColor4ubVertex3fSUN');
+    if not Assigned(glReplacementCodeuiColor4ubVertex3fSUN) then Exit;
+    glReplacementCodeuiColor4ubVertex3fvSUN := wglGetProcAddress('glReplacementCodeuiColor4ubVertex3fvSUN');
+    if not Assigned(glReplacementCodeuiColor4ubVertex3fvSUN) then Exit;
+    glReplacementCodeuiColor3fVertex3fSUN := wglGetProcAddress('glReplacementCodeuiColor3fVertex3fSUN');
+    if not Assigned(glReplacementCodeuiColor3fVertex3fSUN) then Exit;
+    glReplacementCodeuiColor3fVertex3fvSUN := wglGetProcAddress('glReplacementCodeuiColor3fVertex3fvSUN');
+    if not Assigned(glReplacementCodeuiColor3fVertex3fvSUN) then Exit;
+    glReplacementCodeuiNormal3fVertex3fSUN := wglGetProcAddress('glReplacementCodeuiNormal3fVertex3fSUN');
+    if not Assigned(glReplacementCodeuiNormal3fVertex3fSUN) then Exit;
+    glReplacementCodeuiNormal3fVertex3fvSUN := wglGetProcAddress('glReplacementCodeuiNormal3fVertex3fvSUN');
+    if not Assigned(glReplacementCodeuiNormal3fVertex3fvSUN) then Exit;
+    glReplacementCodeuiColor4fNormal3fVertex3fSUN := wglGetProcAddress('glReplacementCodeuiColor4fNormal3fVertex3fSUN');
+    if not Assigned(glReplacementCodeuiColor4fNormal3fVertex3fSUN) then Exit;
+    glReplacementCodeuiColor4fNormal3fVertex3fvSUN := wglGetProcAddress('glReplacementCodeuiColor4fNormal3fVertex3fvSUN');
+    if not Assigned(glReplacementCodeuiColor4fNormal3fVertex3fvSUN) then Exit;
+    glReplacementCodeuiTexCoord2fVertex3fSUN := wglGetProcAddress('glReplacementCodeuiTexCoord2fVertex3fSUN');
+    if not Assigned(glReplacementCodeuiTexCoord2fVertex3fSUN) then Exit;
+    glReplacementCodeuiTexCoord2fVertex3fvSUN := wglGetProcAddress('glReplacementCodeuiTexCoord2fVertex3fvSUN');
+    if not Assigned(glReplacementCodeuiTexCoord2fVertex3fvSUN) then Exit;
+    glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN := wglGetProcAddress('glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN');
+    if not Assigned(glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) then Exit;
+    glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN := wglGetProcAddress('glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN');
+    if not Assigned(glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) then Exit;
+    glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN := wglGetProcAddress('glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN');
+    if not Assigned(glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) then Exit;
+    glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN := wglGetProcAddress('glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN');
+    if not Assigned(glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_fragment_program: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_fragment_program', extstring) then
+  begin
+    glProgramStringARB := wglGetProcAddress('glProgramStringARB');
+    if not Assigned(glProgramStringARB) then Exit;
+    glBindProgramARB := wglGetProcAddress('glBindProgramARB');
+    if not Assigned(glBindProgramARB) then Exit;
+    glDeleteProgramsARB := wglGetProcAddress('glDeleteProgramsARB');
+    if not Assigned(glDeleteProgramsARB) then Exit;
+    glGenProgramsARB := wglGetProcAddress('glGenProgramsARB');
+    if not Assigned(glGenProgramsARB) then Exit;
+    glProgramEnvParameter4dARB := wglGetProcAddress('glProgramEnvParameter4dARB');
+    if not Assigned(glProgramEnvParameter4dARB) then Exit;
+    glProgramEnvParameter4dvARB := wglGetProcAddress('glProgramEnvParameter4dvARB');
+    if not Assigned(glProgramEnvParameter4dvARB) then Exit;
+    glProgramEnvParameter4fARB := wglGetProcAddress('glProgramEnvParameter4fARB');
+    if not Assigned(glProgramEnvParameter4fARB) then Exit;
+    glProgramEnvParameter4fvARB := wglGetProcAddress('glProgramEnvParameter4fvARB');
+    if not Assigned(glProgramEnvParameter4fvARB) then Exit;
+    glProgramLocalParameter4dARB := wglGetProcAddress('glProgramLocalParameter4dARB');
+    if not Assigned(glProgramLocalParameter4dARB) then Exit;
+    glProgramLocalParameter4dvARB := wglGetProcAddress('glProgramLocalParameter4dvARB');
+    if not Assigned(glProgramLocalParameter4dvARB) then Exit;
+    glProgramLocalParameter4fARB := wglGetProcAddress('glProgramLocalParameter4fARB');
+    if not Assigned(glProgramLocalParameter4fARB) then Exit;
+    glProgramLocalParameter4fvARB := wglGetProcAddress('glProgramLocalParameter4fvARB');
+    if not Assigned(glProgramLocalParameter4fvARB) then Exit;
+    glGetProgramEnvParameterdvARB := wglGetProcAddress('glGetProgramEnvParameterdvARB');
+    if not Assigned(glGetProgramEnvParameterdvARB) then Exit;
+    glGetProgramEnvParameterfvARB := wglGetProcAddress('glGetProgramEnvParameterfvARB');
+    if not Assigned(glGetProgramEnvParameterfvARB) then Exit;
+    glGetProgramLocalParameterdvARB := wglGetProcAddress('glGetProgramLocalParameterdvARB');
+    if not Assigned(glGetProgramLocalParameterdvARB) then Exit;
+    glGetProgramLocalParameterfvARB := wglGetProcAddress('glGetProgramLocalParameterfvARB');
+    if not Assigned(glGetProgramLocalParameterfvARB) then Exit;
+    glGetProgramivARB := wglGetProcAddress('glGetProgramivARB');
+    if not Assigned(glGetProgramivARB) then Exit;
+    glGetProgramStringARB := wglGetProcAddress('glGetProgramStringARB');
+    if not Assigned(glGetProgramStringARB) then Exit;
+    glIsProgramARB := wglGetProcAddress('glIsProgramARB');
+    if not Assigned(glIsProgramARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_text_fragment_shader: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_text_fragment_shader', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_APPLE_client_storage: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_APPLE_client_storage', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_APPLE_element_array: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_APPLE_element_array', extstring) then
+  begin
+    glElementPointerAPPLE := wglGetProcAddress('glElementPointerAPPLE');
+    if not Assigned(glElementPointerAPPLE) then Exit;
+    glDrawElementArrayAPPLE := wglGetProcAddress('glDrawElementArrayAPPLE');
+    if not Assigned(glDrawElementArrayAPPLE) then Exit;
+    glDrawRangeElementArrayAPPLE := wglGetProcAddress('glDrawRangeElementArrayAPPLE');
+    if not Assigned(glDrawRangeElementArrayAPPLE) then Exit;
+    glMultiDrawElementArrayAPPLE := wglGetProcAddress('glMultiDrawElementArrayAPPLE');
+    if not Assigned(glMultiDrawElementArrayAPPLE) then Exit;
+    glMultiDrawRangeElementArrayAPPLE := wglGetProcAddress('glMultiDrawRangeElementArrayAPPLE');
+    if not Assigned(glMultiDrawRangeElementArrayAPPLE) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_APPLE_fence: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_APPLE_fence', extstring) then
+  begin
+    glGenFencesAPPLE := wglGetProcAddress('glGenFencesAPPLE');
+    if not Assigned(glGenFencesAPPLE) then Exit;
+    glDeleteFencesAPPLE := wglGetProcAddress('glDeleteFencesAPPLE');
+    if not Assigned(glDeleteFencesAPPLE) then Exit;
+    glSetFenceAPPLE := wglGetProcAddress('glSetFenceAPPLE');
+    if not Assigned(glSetFenceAPPLE) then Exit;
+    glIsFenceAPPLE := wglGetProcAddress('glIsFenceAPPLE');
+    if not Assigned(glIsFenceAPPLE) then Exit;
+    glTestFenceAPPLE := wglGetProcAddress('glTestFenceAPPLE');
+    if not Assigned(glTestFenceAPPLE) then Exit;
+    glFinishFenceAPPLE := wglGetProcAddress('glFinishFenceAPPLE');
+    if not Assigned(glFinishFenceAPPLE) then Exit;
+    glTestObjectAPPLE := wglGetProcAddress('glTestObjectAPPLE');
+    if not Assigned(glTestObjectAPPLE) then Exit;
+    glFinishObjectAPPLE := wglGetProcAddress('glFinishObjectAPPLE');
+    if not Assigned(glFinishObjectAPPLE) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_APPLE_vertex_array_object: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_APPLE_vertex_array_object', extstring) then
+  begin
+    glBindVertexArrayAPPLE := wglGetProcAddress('glBindVertexArrayAPPLE');
+    if not Assigned(glBindVertexArrayAPPLE) then Exit;
+    glDeleteVertexArraysAPPLE := wglGetProcAddress('glDeleteVertexArraysAPPLE');
+    if not Assigned(glDeleteVertexArraysAPPLE) then Exit;
+    glGenVertexArraysAPPLE := wglGetProcAddress('glGenVertexArraysAPPLE');
+    if not Assigned(glGenVertexArraysAPPLE) then Exit;
+    glIsVertexArrayAPPLE := wglGetProcAddress('glIsVertexArrayAPPLE');
+    if not Assigned(glIsVertexArrayAPPLE) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_APPLE_vertex_array_range: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_APPLE_vertex_array_range', extstring) then
+  begin
+    glVertexArrayRangeAPPLE := wglGetProcAddress('glVertexArrayRangeAPPLE');
+    if not Assigned(glVertexArrayRangeAPPLE) then Exit;
+    glFlushVertexArrayRangeAPPLE := wglGetProcAddress('glFlushVertexArrayRangeAPPLE');
+    if not Assigned(glFlushVertexArrayRangeAPPLE) then Exit;
+    glVertexArrayParameteriAPPLE := wglGetProcAddress('glVertexArrayParameteriAPPLE');
+    if not Assigned(glVertexArrayParameteriAPPLE) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+
+function load_GL_ARB_vertex_buffer_object : boolean;
+
+var extstring:string;
+
+begin
+  load_GL_ARB_vertex_buffer_object:=false;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+  if glext_ExtensionSupported('GL_ARB_vertex_buffer_object',extstring) then
+    begin
+      glBindBufferARB := wglGetProcAddress('glBindBufferARB');
+      if not Assigned(glBindBufferARB) then Exit;
+      glDeleteBuffersARB := wglGetProcAddress('glDeleteBuffersARB');
+      if not Assigned(glDeleteBuffersARB) then Exit;
+      glGenBuffersARB := wglGetProcAddress('glGenBuffersARB');
+      if not Assigned(glGenBuffersARB) then Exit;
+      glIsBufferARB := wglGetProcAddress('glIsBufferARB');
+      if not Assigned(glIsBufferARB) then Exit;
+      glBufferDataARB := wglGetProcAddress('glBufferDataARB');
+      if not Assigned(glBufferDataARB) then Exit;
+      glGetBufferSubDataARB := wglGetProcAddress('glGetBufferSubDataARB');
+      if not Assigned(glGetBufferSubDataARB) then Exit;
+      glMapBufferARB := wglGetProcAddress('glMapBufferARB');
+      if not Assigned(glMapBufferARB) then Exit;
+      glUnmapBufferARB := wglGetProcAddress('glUnmapBufferARB');
+      if not Assigned(glMapBufferARB) then Exit;
+      glGetBufferParameterivARB := wglGetProcAddress('glGetBufferParameterivARB');
+      if not Assigned(glGetBufferParameterivARB) then Exit;
+      glGetBufferPointervARB := wglGetProcAddress('glGetBufferPointervARB');
+      if not Assigned(glGetBufferPointervARB) then Exit;
+    end;
+  load_GL_ARB_vertex_buffer_object:=true;
+end;
+
+{$IFDEF Windows}
+function Load_WGL_ARB_pixel_format: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_ARB_pixel_format', extstring) then
+  begin
+    wglGetPixelFormatAttribivARB := wglGetProcAddress('wglGetPixelFormatAttribivARB');
+    if not Assigned(wglGetPixelFormatAttribivARB) then Exit;
+    wglGetPixelFormatAttribfvARB := wglGetProcAddress('wglGetPixelFormatAttribfvARB');
+    if not Assigned(wglGetPixelFormatAttribfvARB) then Exit;
+    wglChoosePixelFormatARB := wglGetProcAddress('wglChoosePixelFormatARB');
+    if not Assigned(wglChoosePixelFormatARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_ARB_make_current_read: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_ARB_make_current_read', extstring) then
+  begin
+    wglMakeContextCurrentARB := wglGetProcAddress('wglMakeContextCurrentARB');
+    if not Assigned(wglMakeContextCurrentARB) then Exit;
+    wglGetCurrentReadDCARB := wglGetProcAddress('wglGetCurrentReadDCARB');
+    if not Assigned(wglGetCurrentReadDCARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_ARB_pbuffer: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_ARB_pbuffer', extstring) then
+  begin
+    wglCreatePbufferARB := wglGetProcAddress('wglCreatePbufferARB');
+    if not Assigned(wglCreatePbufferARB) then Exit;
+    wglGetPbufferDCARB := wglGetProcAddress('wglGetPbufferDCARB');
+    if not Assigned(wglGetPbufferDCARB) then Exit;
+    wglReleasePbufferDCARB := wglGetProcAddress('wglReleasePbufferDCARB');
+    if not Assigned(wglReleasePbufferDCARB) then Exit;
+    wglDestroyPbufferARB := wglGetProcAddress('wglDestroyPbufferARB');
+    if not Assigned(wglDestroyPbufferARB) then Exit;
+    wglQueryPbufferARB := wglGetProcAddress('wglQueryPbufferARB');
+    if not Assigned(wglQueryPbufferARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_EXT_swap_control: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_EXT_swap_control', extstring) then
+  begin
+    wglSwapIntervalEXT := wglGetProcAddress('wglSwapIntervalEXT');
+    if not Assigned(wglSwapIntervalEXT) then Exit;
+    wglGetSwapIntervalEXT := wglGetProcAddress('wglGetSwapIntervalEXT');
+    if not Assigned(wglGetSwapIntervalEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_ARB_render_texture: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_ARB_render_texture', extstring) then
+  begin
+    wglBindTexImageARB := wglGetProcAddress('wglBindTexImageARB');
+    if not Assigned(wglBindTexImageARB) then Exit;
+    wglReleaseTexImageARB := wglGetProcAddress('wglReleaseTexImageARB');
+    if not Assigned(wglReleaseTexImageARB) then Exit;
+    wglSetPbufferAttribARB := wglGetProcAddress('wglSetPbufferAttribARB');
+    if not Assigned(wglSetPbufferAttribARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_EXT_extensions_string: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_EXT_extensions_string', extstring) then
+  begin
+    wglGetExtensionsStringEXT := wglGetProcAddress('wglGetExtensionsStringEXT');
+    if not Assigned(wglGetExtensionsStringEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_EXT_make_current_read: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_EXT_make_current_read', extstring) then
+  begin
+    wglMakeContextCurrentEXT := wglGetProcAddress('wglMakeContextCurrentEXT');
+    if not Assigned(wglMakeContextCurrentEXT) then Exit;
+    wglGetCurrentReadDCEXT := wglGetProcAddress('wglGetCurrentReadDCEXT');
+    if not Assigned(wglGetCurrentReadDCEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_EXT_pbuffer: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_EXT_pbuffer', extstring) then
+  begin
+    wglCreatePbufferEXT := wglGetProcAddress('wglCreatePbufferEXT');
+    if not Assigned(wglCreatePbufferEXT) then Exit;
+    wglGetPbufferDCEXT := wglGetProcAddress('wglGetPbufferDCEXT');
+    if not Assigned(wglGetPbufferDCEXT) then Exit;
+    wglReleasePbufferDCEXT := wglGetProcAddress('wglReleasePbufferDCEXT');
+    if not Assigned(wglReleasePbufferDCEXT) then Exit;
+    wglDestroyPbufferEXT := wglGetProcAddress('wglDestroyPbufferEXT');
+    if not Assigned(wglDestroyPbufferEXT) then Exit;
+    wglQueryPbufferEXT := wglGetProcAddress('wglQueryPbufferEXT');
+    if not Assigned(wglQueryPbufferEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_EXT_pixel_format: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_EXT_pixel_format', extstring) then
+  begin
+    wglGetPixelFormatAttribivEXT := wglGetProcAddress('wglGetPixelFormatAttribivEXT');
+    if not Assigned(wglGetPixelFormatAttribivEXT) then Exit;
+    wglGetPixelFormatAttribfvEXT := wglGetProcAddress('wglGetPixelFormatAttribfvEXT');
+    if not Assigned(wglGetPixelFormatAttribfvEXT) then Exit;
+    wglChoosePixelFormatEXT := wglGetProcAddress('wglChoosePixelFormatEXT');
+    if not Assigned(wglChoosePixelFormatEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_I3D_digital_video_control: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_I3D_digital_video_control', extstring) then
+  begin
+    wglGetDigitalVideoParametersI3D := wglGetProcAddress('wglGetDigitalVideoParametersI3D');
+    if not Assigned(wglGetDigitalVideoParametersI3D) then Exit;
+    wglSetDigitalVideoParametersI3D := wglGetProcAddress('wglSetDigitalVideoParametersI3D');
+    if not Assigned(wglSetDigitalVideoParametersI3D) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_I3D_gamma: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_I3D_gamma', extstring) then
+  begin
+    wglGetGammaTableParametersI3D := wglGetProcAddress('wglGetGammaTableParametersI3D');
+    if not Assigned(wglGetGammaTableParametersI3D) then Exit;
+    wglSetGammaTableParametersI3D := wglGetProcAddress('wglSetGammaTableParametersI3D');
+    if not Assigned(wglSetGammaTableParametersI3D) then Exit;
+    wglGetGammaTableI3D := wglGetProcAddress('wglGetGammaTableI3D');
+    if not Assigned(wglGetGammaTableI3D) then Exit;
+    wglSetGammaTableI3D := wglGetProcAddress('wglSetGammaTableI3D');
+    if not Assigned(wglSetGammaTableI3D) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_WGL_I3D_genlock: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := String(PChar(wglGetExtensionsStringARB(wglGetCurrentDC)));
+
+  if glext_ExtensionSupported('WGL_I3D_genlock', extstring) then
+  begin
+    wglEnableGenlockI3D := wglGetProcAddress('wglEnableGenlockI3D');
+    if not Assigned(wglEnableGenlockI3D) then Exit;
+    wglDisableGenlockI3D := wglGetProcAddress('wglDisableGenlockI3D');
+    if not Assigned(wglDisableGenlockI3D) then Exit;
+    wglIsEnabledGenlockI3D := wglGetProcAddress('wglIsEnabledGenlockI3D');
+    if not Assigned(wglIsEnabledGenlockI3D) then Exit;
+    wglGenlockSourceI3D := wglGetProcAddress('wglGenlockSourceI3D');
+    if not Assigned(wglGenlockSourceI3D) then Exit;
+    wglGetGenlockSourceI3D := wglGetProcAddress('wglGetGenlockSourceI3D');
+    if not Assigned(wglGetGenlockSourceI3D) then Exit;
+    wglGenlockSourceEdgeI3D := wglGetProcAddress('wglGenlockSourceEdgeI3D');
+    if not Assigned(wglGenlockSourceEdgeI3D) then Exit;
+    wglGetGenlockSourceEdgeI3D := wglGetProcAddress('wglGetGenlockSourceEdgeI3D');
+    if not Assigned(wglGetGenlockSourceEdgeI3D) then Exit;
+    wglGenlockSampleRateI3D := wglGetProcAddress('wglGenlockSampleRateI3D');
+    if not Assigned(wglGenlockSampleRateI3D) then Exit;
+    wglGetGenlockSampleRateI3D := wglGetProcAddress('wglGetGenlockSampleRateI3D');
+    if not Assigned(wglGetGenlockSampleRateI3D) then Exit;
+    wglGenlockSourceDelayI3D := wglGetProcAddress('wglGenlockSourceDelayI3D');
+    if not Assigned(wglGenlockSourceDelayI3D) then Exit;
+    wglGetGenlockSourceDelayI3D := wglGetProcAddress('wglGetGenlockSourceDelayI3D');
+    if not Assigned(wglGetGenlockSourceDelayI3D) then Exit;
+    wglQueryGenlockMaxSourceDelayI3D := wglGetProcAddress('wglQueryGenlockMaxSourceDelayI3D');
+    if not Assigned(wglQueryGenlockMaxSourceDelayI3D) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+{$ENDIF}
+
+function Load_GL_ARB_matrix_palette: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_matrix_palette', extstring) then
+  begin
+    glCurrentPaletteMatrixARB := wglGetProcAddress('glCurrentPaletteMatrixARB');
+    if not Assigned(glCurrentPaletteMatrixARB) then Exit;
+    glMatrixIndexubvARB := wglGetProcAddress('glMatrixIndexubvARB');
+    if not Assigned(glMatrixIndexubvARB) then Exit;
+    glMatrixIndexusvARB := wglGetProcAddress('glMatrixIndexusvARB');
+    if not Assigned(glMatrixIndexusvARB) then Exit;
+    glMatrixIndexuivARB := wglGetProcAddress('glMatrixIndexuivARB');
+    if not Assigned(glMatrixIndexuivARB) then Exit;
+    glMatrixIndexPointerARB := wglGetProcAddress('glMatrixIndexPointerARB');
+    if not Assigned(glMatrixIndexPointerARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_element_array: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_element_array', extstring) then
+  begin
+    glElementPointerNV := wglGetProcAddress('glElementPointerNV');
+    if not Assigned(glElementPointerNV) then Exit;
+    glDrawElementArrayNV := wglGetProcAddress('glDrawElementArrayNV');
+    if not Assigned(glDrawElementArrayNV) then Exit;
+    glDrawRangeElementArrayNV := wglGetProcAddress('glDrawRangeElementArrayNV');
+    if not Assigned(glDrawRangeElementArrayNV) then Exit;
+    glMultiDrawElementArrayNV := wglGetProcAddress('glMultiDrawElementArrayNV');
+    if not Assigned(glMultiDrawElementArrayNV) then Exit;
+    glMultiDrawRangeElementArrayNV := wglGetProcAddress('glMultiDrawRangeElementArrayNV');
+    if not Assigned(glMultiDrawRangeElementArrayNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_float_buffer: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_float_buffer', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_fragment_program: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_fragment_program', extstring) then
+  begin
+    glProgramNamedParameter4fNV := wglGetProcAddress('glProgramNamedParameter4fNV');
+    if not Assigned(glProgramNamedParameter4fNV) then Exit;
+    glProgramNamedParameter4dNV := wglGetProcAddress('glProgramNamedParameter4dNV');
+    if not Assigned(glProgramNamedParameter4dNV) then Exit;
+    glGetProgramNamedParameterfvNV := wglGetProcAddress('glGetProgramNamedParameterfvNV');
+    if not Assigned(glGetProgramNamedParameterfvNV) then Exit;
+    glGetProgramNamedParameterdvNV := wglGetProcAddress('glGetProgramNamedParameterdvNV');
+    if not Assigned(glGetProgramNamedParameterdvNV) then Exit;
+    glProgramLocalParameter4dARB := wglGetProcAddress('glProgramLocalParameter4dARB');
+    if not Assigned(glProgramLocalParameter4dARB) then Exit;
+    glProgramLocalParameter4dvARB := wglGetProcAddress('glProgramLocalParameter4dvARB');
+    if not Assigned(glProgramLocalParameter4dvARB) then Exit;
+    glProgramLocalParameter4fARB := wglGetProcAddress('glProgramLocalParameter4fARB');
+    if not Assigned(glProgramLocalParameter4fARB) then Exit;
+    glProgramLocalParameter4fvARB := wglGetProcAddress('glProgramLocalParameter4fvARB');
+    if not Assigned(glProgramLocalParameter4fvARB) then Exit;
+    glGetProgramLocalParameterdvARB := wglGetProcAddress('glGetProgramLocalParameterdvARB');
+    if not Assigned(glGetProgramLocalParameterdvARB) then Exit;
+    glGetProgramLocalParameterfvARB := wglGetProcAddress('glGetProgramLocalParameterfvARB');
+    if not Assigned(glGetProgramLocalParameterfvARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_primitive_restart: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_primitive_restart', extstring) then
+  begin
+    glPrimitiveRestartNV := wglGetProcAddress('glPrimitiveRestartNV');
+    if not Assigned(glPrimitiveRestartNV) then Exit;
+    glPrimitiveRestartIndexNV := wglGetProcAddress('glPrimitiveRestartIndexNV');
+    if not Assigned(glPrimitiveRestartIndexNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_vertex_program2: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_vertex_program2', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+{$IFDEF Windows}
+function Load_WGL_NV_render_texture_rectangle: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  @wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+  if glext_ExtensionSupported('WGL_NV_render_texture_rectangle', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+{$ENDIF}
+
+function Load_GL_NV_pixel_data_range: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_pixel_data_range', extstring) then
+  begin
+    @glPixelDataRangeNV := wglGetProcAddress('glPixelDataRangeNV');
+    if not Assigned(glPixelDataRangeNV) then Exit;
+    @glFlushPixelDataRangeNV := wglGetProcAddress('glFlushPixelDataRangeNV');
+    if not Assigned(glFlushPixelDataRangeNV) then Exit;
+    {$IFDEF Windows}
+    @wglAllocateMemoryNV := wglGetProcAddress('wglAllocateMemoryNV');
+    if not Assigned(wglAllocateMemoryNV) then Exit;
+    @wglFreeMemoryNV := wglGetProcAddress('wglFreeMemoryNV');
+    if not Assigned(wglFreeMemoryNV) then Exit;
+    {$ENDIF}
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_rectangle: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_rectangle', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_S3_s3tc: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_S3_s3tc', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_draw_buffers: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_draw_buffers', extstring) then
+  begin
+    @glDrawBuffersATI := wglGetProcAddress('glDrawBuffersATI');
+    if not Assigned(glDrawBuffersATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+{$IFDEF Windows}
+function Load_WGL_ATI_pixel_format_float: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  @wglGetExtensionsStringARB := wglGetProcAddress('wglGetExtensionsStringARB');
+  if not Assigned(wglGetExtensionsStringARB) then Exit;
+  extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+  if glext_ExtensionSupported('WGL_ATI_pixel_format_float', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+{$ENDIF}
+
+function Load_GL_ATI_texture_env_combine3: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_texture_env_combine3', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_texture_float: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_texture_float', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_texture_expand_normal: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_texture_expand_normal', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_half_float: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_half_float', extstring) then
+  begin
+    @glVertex2hNV := wglGetProcAddress('glVertex2hNV');
+    if not Assigned(glVertex2hNV) then Exit;
+    @glVertex2hvNV := wglGetProcAddress('glVertex2hvNV');
+    if not Assigned(glVertex2hvNV) then Exit;
+    @glVertex3hNV := wglGetProcAddress('glVertex3hNV');
+    if not Assigned(glVertex3hNV) then Exit;
+    @glVertex3hvNV := wglGetProcAddress('glVertex3hvNV');
+    if not Assigned(glVertex3hvNV) then Exit;
+    @glVertex4hNV := wglGetProcAddress('glVertex4hNV');
+    if not Assigned(glVertex4hNV) then Exit;
+    @glVertex4hvNV := wglGetProcAddress('glVertex4hvNV');
+    if not Assigned(glVertex4hvNV) then Exit;
+    @glNormal3hNV := wglGetProcAddress('glNormal3hNV');
+    if not Assigned(glNormal3hNV) then Exit;
+    @glNormal3hvNV := wglGetProcAddress('glNormal3hvNV');
+    if not Assigned(glNormal3hvNV) then Exit;
+    @glColor3hNV := wglGetProcAddress('glColor3hNV');
+    if not Assigned(glColor3hNV) then Exit;
+    @glColor3hvNV := wglGetProcAddress('glColor3hvNV');
+    if not Assigned(glColor3hvNV) then Exit;
+    @glColor4hNV := wglGetProcAddress('glColor4hNV');
+    if not Assigned(glColor4hNV) then Exit;
+    @glColor4hvNV := wglGetProcAddress('glColor4hvNV');
+    if not Assigned(glColor4hvNV) then Exit;
+    @glTexCoord1hNV := wglGetProcAddress('glTexCoord1hNV');
+    if not Assigned(glTexCoord1hNV) then Exit;
+    @glTexCoord1hvNV := wglGetProcAddress('glTexCoord1hvNV');
+    if not Assigned(glTexCoord1hvNV) then Exit;
+    @glTexCoord2hNV := wglGetProcAddress('glTexCoord2hNV');
+    if not Assigned(glTexCoord2hNV) then Exit;
+    @glTexCoord2hvNV := wglGetProcAddress('glTexCoord2hvNV');
+    if not Assigned(glTexCoord2hvNV) then Exit;
+    @glTexCoord3hNV := wglGetProcAddress('glTexCoord3hNV');
+    if not Assigned(glTexCoord3hNV) then Exit;
+    @glTexCoord3hvNV := wglGetProcAddress('glTexCoord3hvNV');
+    if not Assigned(glTexCoord3hvNV) then Exit;
+    @glTexCoord4hNV := wglGetProcAddress('glTexCoord4hNV');
+    if not Assigned(glTexCoord4hNV) then Exit;
+    @glTexCoord4hvNV := wglGetProcAddress('glTexCoord4hvNV');
+    if not Assigned(glTexCoord4hvNV) then Exit;
+    @glMultiTexCoord1hNV := wglGetProcAddress('glMultiTexCoord1hNV');
+    if not Assigned(glMultiTexCoord1hNV) then Exit;
+    @glMultiTexCoord1hvNV := wglGetProcAddress('glMultiTexCoord1hvNV');
+    if not Assigned(glMultiTexCoord1hvNV) then Exit;
+    @glMultiTexCoord2hNV := wglGetProcAddress('glMultiTexCoord2hNV');
+    if not Assigned(glMultiTexCoord2hNV) then Exit;
+    @glMultiTexCoord2hvNV := wglGetProcAddress('glMultiTexCoord2hvNV');
+    if not Assigned(glMultiTexCoord2hvNV) then Exit;
+    @glMultiTexCoord3hNV := wglGetProcAddress('glMultiTexCoord3hNV');
+    if not Assigned(glMultiTexCoord3hNV) then Exit;
+    @glMultiTexCoord3hvNV := wglGetProcAddress('glMultiTexCoord3hvNV');
+    if not Assigned(glMultiTexCoord3hvNV) then Exit;
+    @glMultiTexCoord4hNV := wglGetProcAddress('glMultiTexCoord4hNV');
+    if not Assigned(glMultiTexCoord4hNV) then Exit;
+    @glMultiTexCoord4hvNV := wglGetProcAddress('glMultiTexCoord4hvNV');
+    if not Assigned(glMultiTexCoord4hvNV) then Exit;
+    @glFogCoordhNV := wglGetProcAddress('glFogCoordhNV');
+    if not Assigned(glFogCoordhNV) then Exit;
+    @glFogCoordhvNV := wglGetProcAddress('glFogCoordhvNV');
+    if not Assigned(glFogCoordhvNV) then Exit;
+    @glSecondaryColor3hNV := wglGetProcAddress('glSecondaryColor3hNV');
+    if not Assigned(glSecondaryColor3hNV) then Exit;
+    @glSecondaryColor3hvNV := wglGetProcAddress('glSecondaryColor3hvNV');
+    if not Assigned(glSecondaryColor3hvNV) then Exit;
+    @glVertexWeighthNV := wglGetProcAddress('glVertexWeighthNV');
+    if not Assigned(glVertexWeighthNV) then Exit;
+    @glVertexWeighthvNV := wglGetProcAddress('glVertexWeighthvNV');
+    if not Assigned(glVertexWeighthvNV) then Exit;
+    @glVertexAttrib1hNV := wglGetProcAddress('glVertexAttrib1hNV');
+    if not Assigned(glVertexAttrib1hNV) then Exit;
+    @glVertexAttrib1hvNV := wglGetProcAddress('glVertexAttrib1hvNV');
+    if not Assigned(glVertexAttrib1hvNV) then Exit;
+    @glVertexAttrib2hNV := wglGetProcAddress('glVertexAttrib2hNV');
+    if not Assigned(glVertexAttrib2hNV) then Exit;
+    @glVertexAttrib2hvNV := wglGetProcAddress('glVertexAttrib2hvNV');
+    if not Assigned(glVertexAttrib2hvNV) then Exit;
+    @glVertexAttrib3hNV := wglGetProcAddress('glVertexAttrib3hNV');
+    if not Assigned(glVertexAttrib3hNV) then Exit;
+    @glVertexAttrib3hvNV := wglGetProcAddress('glVertexAttrib3hvNV');
+    if not Assigned(glVertexAttrib3hvNV) then Exit;
+    @glVertexAttrib4hNV := wglGetProcAddress('glVertexAttrib4hNV');
+    if not Assigned(glVertexAttrib4hNV) then Exit;
+    @glVertexAttrib4hvNV := wglGetProcAddress('glVertexAttrib4hvNV');
+    if not Assigned(glVertexAttrib4hvNV) then Exit;
+    @glVertexAttribs1hvNV := wglGetProcAddress('glVertexAttribs1hvNV');
+    if not Assigned(glVertexAttribs1hvNV) then Exit;
+    @glVertexAttribs2hvNV := wglGetProcAddress('glVertexAttribs2hvNV');
+    if not Assigned(glVertexAttribs2hvNV) then Exit;
+    @glVertexAttribs3hvNV := wglGetProcAddress('glVertexAttribs3hvNV');
+    if not Assigned(glVertexAttribs3hvNV) then Exit;
+    @glVertexAttribs4hvNV := wglGetProcAddress('glVertexAttribs4hvNV');
+    if not Assigned(glVertexAttribs4hvNV) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_map_object_buffer: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_map_object_buffer', extstring) then
+  begin
+    @glMapObjectBufferATI := wglGetProcAddress('glMapObjectBufferATI');
+    if not Assigned(glMapObjectBufferATI) then Exit;
+    @glUnmapObjectBufferATI := wglGetProcAddress('glUnmapObjectBufferATI');
+    if not Assigned(glUnmapObjectBufferATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_separate_stencil: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_separate_stencil', extstring) then
+  begin
+    @glStencilOpSeparateATI := wglGetProcAddress('glStencilOpSeparateATI');
+    if not Assigned(glStencilOpSeparateATI) then Exit;
+    @glStencilFuncSeparateATI := wglGetProcAddress('glStencilFuncSeparateATI');
+    if not Assigned(glStencilFuncSeparateATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ATI_vertex_attrib_array_object: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ATI_vertex_attrib_array_object', extstring) then
+  begin
+    @glVertexAttribArrayObjectATI := wglGetProcAddress('glVertexAttribArrayObjectATI');
+    if not Assigned(glVertexAttribArrayObjectATI) then Exit;
+    @glGetVertexAttribArrayObjectfvATI := wglGetProcAddress('glGetVertexAttribArrayObjectfvATI');
+    if not Assigned(glGetVertexAttribArrayObjectfvATI) then Exit;
+    @glGetVertexAttribArrayObjectivATI := wglGetProcAddress('glGetVertexAttribArrayObjectivATI');
+    if not Assigned(glGetVertexAttribArrayObjectivATI) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_occlusion_query: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_occlusion_query', extstring) then
+  begin
+    @glGenQueriesARB := wglGetProcAddress('glGenQueriesARB');
+    if not Assigned(glGenQueriesARB) then Exit;
+    @glDeleteQueriesARB := wglGetProcAddress('glDeleteQueriesARB');
+    if not Assigned(glDeleteQueriesARB) then Exit;
+    @glIsQueryARB := wglGetProcAddress('glIsQueryARB');
+    if not Assigned(glIsQueryARB) then Exit;
+    @glBeginQueryARB := wglGetProcAddress('glBeginQueryARB');
+    if not Assigned(glBeginQueryARB) then Exit;
+    @glEndQueryARB := wglGetProcAddress('glEndQueryARB');
+    if not Assigned(glEndQueryARB) then Exit;
+    @glGetQueryivARB := wglGetProcAddress('glGetQueryivARB');
+    if not Assigned(glGetQueryivARB) then Exit;
+    @glGetQueryObjectivARB := wglGetProcAddress('glGetQueryObjectivARB');
+    if not Assigned(glGetQueryObjectivARB) then Exit;
+    @glGetQueryObjectuivARB := wglGetProcAddress('glGetQueryObjectuivARB');
+    if not Assigned(glGetQueryObjectuivARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_shader_objects: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_shader_objects', extstring) then
+  begin
+    @glDeleteObjectARB := wglGetProcAddress('glDeleteObjectARB');
+    if not Assigned(glDeleteObjectARB) then Exit;
+    @glGetHandleARB := wglGetProcAddress('glGetHandleARB');
+    if not Assigned(glGetHandleARB) then Exit;
+    @glDetachObjectARB := wglGetProcAddress('glDetachObjectARB');
+    if not Assigned(glDetachObjectARB) then Exit;
+    @glCreateShaderObjectARB := wglGetProcAddress('glCreateShaderObjectARB');
+    if not Assigned(glCreateShaderObjectARB) then Exit;
+    @glShaderSourceARB := wglGetProcAddress('glShaderSourceARB');
+    if not Assigned(glShaderSourceARB) then Exit;
+    @glCompileShaderARB := wglGetProcAddress('glCompileShaderARB');
+    if not Assigned(glCompileShaderARB) then Exit;
+    @glCreateProgramObjectARB := wglGetProcAddress('glCreateProgramObjectARB');
+    if not Assigned(glCreateProgramObjectARB) then Exit;
+    @glAttachObjectARB := wglGetProcAddress('glAttachObjectARB');
+    if not Assigned(glAttachObjectARB) then Exit;
+    @glLinkProgramARB := wglGetProcAddress('glLinkProgramARB');
+    if not Assigned(glLinkProgramARB) then Exit;
+    @glUseProgramObjectARB := wglGetProcAddress('glUseProgramObjectARB');
+    if not Assigned(glUseProgramObjectARB) then Exit;
+    @glValidateProgramARB := wglGetProcAddress('glValidateProgramARB');
+    if not Assigned(glValidateProgramARB) then Exit;
+    @glUniform1fARB := wglGetProcAddress('glUniform1fARB');
+    if not Assigned(glUniform1fARB) then Exit;
+    @glUniform2fARB := wglGetProcAddress('glUniform2fARB');
+    if not Assigned(glUniform2fARB) then Exit;
+    @glUniform3fARB := wglGetProcAddress('glUniform3fARB');
+    if not Assigned(glUniform3fARB) then Exit;
+    @glUniform4fARB := wglGetProcAddress('glUniform4fARB');
+    if not Assigned(glUniform4fARB) then Exit;
+    @glUniform1iARB := wglGetProcAddress('glUniform1iARB');
+    if not Assigned(glUniform1iARB) then Exit;
+    @glUniform2iARB := wglGetProcAddress('glUniform2iARB');
+    if not Assigned(glUniform2iARB) then Exit;
+    @glUniform3iARB := wglGetProcAddress('glUniform3iARB');
+    if not Assigned(glUniform3iARB) then Exit;
+    @glUniform4iARB := wglGetProcAddress('glUniform4iARB');
+    if not Assigned(glUniform4iARB) then Exit;
+    @glUniform1fvARB := wglGetProcAddress('glUniform1fvARB');
+    if not Assigned(glUniform1fvARB) then Exit;
+    @glUniform2fvARB := wglGetProcAddress('glUniform2fvARB');
+    if not Assigned(glUniform2fvARB) then Exit;
+    @glUniform3fvARB := wglGetProcAddress('glUniform3fvARB');
+    if not Assigned(glUniform3fvARB) then Exit;
+    @glUniform4fvARB := wglGetProcAddress('glUniform4fvARB');
+    if not Assigned(glUniform4fvARB) then Exit;
+    @glUniform1ivARB := wglGetProcAddress('glUniform1ivARB');
+    if not Assigned(glUniform1ivARB) then Exit;
+    @glUniform2ivARB := wglGetProcAddress('glUniform2ivARB');
+    if not Assigned(glUniform2ivARB) then Exit;
+    @glUniform3ivARB := wglGetProcAddress('glUniform3ivARB');
+    if not Assigned(glUniform3ivARB) then Exit;
+    @glUniform4ivARB := wglGetProcAddress('glUniform4ivARB');
+    if not Assigned(glUniform4ivARB) then Exit;
+    @glUniformMatrix2fvARB := wglGetProcAddress('glUniformMatrix2fvARB');
+    if not Assigned(glUniformMatrix2fvARB) then Exit;
+    @glUniformMatrix3fvARB := wglGetProcAddress('glUniformMatrix3fvARB');
+    if not Assigned(glUniformMatrix3fvARB) then Exit;
+    @glUniformMatrix4fvARB := wglGetProcAddress('glUniformMatrix4fvARB');
+    if not Assigned(glUniformMatrix4fvARB) then Exit;
+    @glGetObjectParameterfvARB := wglGetProcAddress('glGetObjectParameterfvARB');
+    if not Assigned(glGetObjectParameterfvARB) then Exit;
+    @glGetObjectParameterivARB := wglGetProcAddress('glGetObjectParameterivARB');
+    if not Assigned(glGetObjectParameterivARB) then Exit;
+    @glGetInfoLogARB := wglGetProcAddress('glGetInfoLogARB');
+    if not Assigned(glGetInfoLogARB) then Exit;
+    @glGetAttachedObjectsARB := wglGetProcAddress('glGetAttachedObjectsARB');
+    if not Assigned(glGetAttachedObjectsARB) then Exit;
+    @glGetUniformLocationARB := wglGetProcAddress('glGetUniformLocationARB');
+    if not Assigned(glGetUniformLocationARB) then Exit;
+    @glGetActiveUniformARB := wglGetProcAddress('glGetActiveUniformARB');
+    if not Assigned(glGetActiveUniformARB) then Exit;
+    @glGetUniformfvARB := wglGetProcAddress('glGetUniformfvARB');
+    if not Assigned(glGetUniformfvARB) then Exit;
+    @glGetUniformivARB := wglGetProcAddress('glGetUniformivARB');
+    if not Assigned(glGetUniformivARB) then Exit;
+    @glGetShaderSourceARB := wglGetProcAddress('glGetShaderSourceARB');
+    if not Assigned(glGetShaderSourceARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_vertex_shader: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_vertex_shader', extstring) then
+  begin
+    @glVertexAttrib1fARB := wglGetProcAddress('glVertexAttrib1fARB');
+    if not Assigned(glVertexAttrib1fARB) then Exit;
+    @glVertexAttrib1sARB := wglGetProcAddress('glVertexAttrib1sARB');
+    if not Assigned(glVertexAttrib1sARB) then Exit;
+    @glVertexAttrib1dARB := wglGetProcAddress('glVertexAttrib1dARB');
+    if not Assigned(glVertexAttrib1dARB) then Exit;
+    @glVertexAttrib2fARB := wglGetProcAddress('glVertexAttrib2fARB');
+    if not Assigned(glVertexAttrib2fARB) then Exit;
+    @glVertexAttrib2sARB := wglGetProcAddress('glVertexAttrib2sARB');
+    if not Assigned(glVertexAttrib2sARB) then Exit;
+    @glVertexAttrib2dARB := wglGetProcAddress('glVertexAttrib2dARB');
+    if not Assigned(glVertexAttrib2dARB) then Exit;
+    @glVertexAttrib3fARB := wglGetProcAddress('glVertexAttrib3fARB');
+    if not Assigned(glVertexAttrib3fARB) then Exit;
+    @glVertexAttrib3sARB := wglGetProcAddress('glVertexAttrib3sARB');
+    if not Assigned(glVertexAttrib3sARB) then Exit;
+    @glVertexAttrib3dARB := wglGetProcAddress('glVertexAttrib3dARB');
+    if not Assigned(glVertexAttrib3dARB) then Exit;
+    @glVertexAttrib4fARB := wglGetProcAddress('glVertexAttrib4fARB');
+    if not Assigned(glVertexAttrib4fARB) then Exit;
+    @glVertexAttrib4sARB := wglGetProcAddress('glVertexAttrib4sARB');
+    if not Assigned(glVertexAttrib4sARB) then Exit;
+    @glVertexAttrib4dARB := wglGetProcAddress('glVertexAttrib4dARB');
+    if not Assigned(glVertexAttrib4dARB) then Exit;
+    @glVertexAttrib4NubARB := wglGetProcAddress('glVertexAttrib4NubARB');
+    if not Assigned(glVertexAttrib4NubARB) then Exit;
+    @glVertexAttrib1fvARB := wglGetProcAddress('glVertexAttrib1fvARB');
+    if not Assigned(glVertexAttrib1fvARB) then Exit;
+    @glVertexAttrib1svARB := wglGetProcAddress('glVertexAttrib1svARB');
+    if not Assigned(glVertexAttrib1svARB) then Exit;
+    @glVertexAttrib1dvARB := wglGetProcAddress('glVertexAttrib1dvARB');
+    if not Assigned(glVertexAttrib1dvARB) then Exit;
+    @glVertexAttrib2fvARB := wglGetProcAddress('glVertexAttrib2fvARB');
+    if not Assigned(glVertexAttrib2fvARB) then Exit;
+    @glVertexAttrib2svARB := wglGetProcAddress('glVertexAttrib2svARB');
+    if not Assigned(glVertexAttrib2svARB) then Exit;
+    @glVertexAttrib2dvARB := wglGetProcAddress('glVertexAttrib2dvARB');
+    if not Assigned(glVertexAttrib2dvARB) then Exit;
+    @glVertexAttrib3fvARB := wglGetProcAddress('glVertexAttrib3fvARB');
+    if not Assigned(glVertexAttrib3fvARB) then Exit;
+    @glVertexAttrib3svARB := wglGetProcAddress('glVertexAttrib3svARB');
+    if not Assigned(glVertexAttrib3svARB) then Exit;
+    @glVertexAttrib3dvARB := wglGetProcAddress('glVertexAttrib3dvARB');
+    if not Assigned(glVertexAttrib3dvARB) then Exit;
+    @glVertexAttrib4fvARB := wglGetProcAddress('glVertexAttrib4fvARB');
+    if not Assigned(glVertexAttrib4fvARB) then Exit;
+    @glVertexAttrib4svARB := wglGetProcAddress('glVertexAttrib4svARB');
+    if not Assigned(glVertexAttrib4svARB) then Exit;
+    @glVertexAttrib4dvARB := wglGetProcAddress('glVertexAttrib4dvARB');
+    if not Assigned(glVertexAttrib4dvARB) then Exit;
+    @glVertexAttrib4ivARB := wglGetProcAddress('glVertexAttrib4ivARB');
+    if not Assigned(glVertexAttrib4ivARB) then Exit;
+    @glVertexAttrib4bvARB := wglGetProcAddress('glVertexAttrib4bvARB');
+    if not Assigned(glVertexAttrib4bvARB) then Exit;
+    @glVertexAttrib4ubvARB := wglGetProcAddress('glVertexAttrib4ubvARB');
+    if not Assigned(glVertexAttrib4ubvARB) then Exit;
+    @glVertexAttrib4usvARB := wglGetProcAddress('glVertexAttrib4usvARB');
+    if not Assigned(glVertexAttrib4usvARB) then Exit;
+    @glVertexAttrib4uivARB := wglGetProcAddress('glVertexAttrib4uivARB');
+    if not Assigned(glVertexAttrib4uivARB) then Exit;
+    @glVertexAttrib4NbvARB := wglGetProcAddress('glVertexAttrib4NbvARB');
+    if not Assigned(glVertexAttrib4NbvARB) then Exit;
+    @glVertexAttrib4NsvARB := wglGetProcAddress('glVertexAttrib4NsvARB');
+    if not Assigned(glVertexAttrib4NsvARB) then Exit;
+    @glVertexAttrib4NivARB := wglGetProcAddress('glVertexAttrib4NivARB');
+    if not Assigned(glVertexAttrib4NivARB) then Exit;
+    @glVertexAttrib4NubvARB := wglGetProcAddress('glVertexAttrib4NubvARB');
+    if not Assigned(glVertexAttrib4NubvARB) then Exit;
+    @glVertexAttrib4NusvARB := wglGetProcAddress('glVertexAttrib4NusvARB');
+    if not Assigned(glVertexAttrib4NusvARB) then Exit;
+    @glVertexAttrib4NuivARB := wglGetProcAddress('glVertexAttrib4NuivARB');
+    if not Assigned(glVertexAttrib4NuivARB) then Exit;
+    @glVertexAttribPointerARB := wglGetProcAddress('glVertexAttribPointerARB');
+    if not Assigned(glVertexAttribPointerARB) then Exit;
+    @glEnableVertexAttribArrayARB := wglGetProcAddress('glEnableVertexAttribArrayARB');
+    if not Assigned(glEnableVertexAttribArrayARB) then Exit;
+    @glDisableVertexAttribArrayARB := wglGetProcAddress('glDisableVertexAttribArrayARB');
+    if not Assigned(glDisableVertexAttribArrayARB) then Exit;
+    @glBindAttribLocationARB := wglGetProcAddress('glBindAttribLocationARB');
+    if not Assigned(glBindAttribLocationARB) then Exit;
+    @glGetActiveAttribARB := wglGetProcAddress('glGetActiveAttribARB');
+    if not Assigned(glGetActiveAttribARB) then Exit;
+    @glGetAttribLocationARB := wglGetProcAddress('glGetAttribLocationARB');
+    if not Assigned(glGetAttribLocationARB) then Exit;
+    @glGetVertexAttribdvARB := wglGetProcAddress('glGetVertexAttribdvARB');
+    if not Assigned(glGetVertexAttribdvARB) then Exit;
+    @glGetVertexAttribfvARB := wglGetProcAddress('glGetVertexAttribfvARB');
+    if not Assigned(glGetVertexAttribfvARB) then Exit;
+    @glGetVertexAttribivARB := wglGetProcAddress('glGetVertexAttribivARB');
+    if not Assigned(glGetVertexAttribivARB) then Exit;
+    @glGetVertexAttribPointervARB := wglGetProcAddress('glGetVertexAttribPointervARB');
+    if not Assigned(glGetVertexAttribPointervARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_fragment_shader: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_fragment_shader', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_shading_language_100: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_shading_language_100', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_non_power_of_two: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_texture_non_power_of_two', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_point_sprite: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_point_sprite', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_depth_bounds_test: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_depth_bounds_test', extstring) then
+  begin
+    @glDepthBoundsEXT := wglGetProcAddress('glDepthBoundsEXT');
+    if not Assigned(glDepthBoundsEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_mirror_clamp: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_texture_mirror_clamp', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_blend_equation_separate: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_blend_equation_separate', extstring) then
+  begin
+    @glBlendEquationSeparateEXT := wglGetProcAddress('glBlendEquationSeparateEXT');
+    if not Assigned(glBlendEquationSeparateEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_MESA_pack_invert: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_MESA_pack_invert', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_MESA_ycbcr_texture: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_MESA_ycbcr_texture', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_fragment_program_shadow: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_ARB_fragment_program_shadow', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_fragment_program_option: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_fragment_program_option', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_pixel_buffer_object: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_EXT_pixel_buffer_object', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_fragment_program2: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_fragment_program2', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_vertex_program2_option: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_vertex_program2_option', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_NV_vertex_program3: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+  if glext_ExtensionSupported('GL_NV_vertex_program3', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_draw_buffers: Boolean;
+var
+  extstring: PChar;
+begin
+
+  Result := FALSE;
+  extstring := glGetString(GL_EXTENSIONS);
+
+  if glext_ExtensionSupported('GL_ARB_draw_buffers', extstring) then
+  begin
+    glDrawBuffersARB := wglGetProcAddress('glDrawBuffersARB');
+    if not Assigned(glDrawBuffersARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_rectangle: Boolean;
+var
+  extstring: PChar;
+begin
+
+  Result := FALSE;
+  extstring := glGetString(GL_EXTENSIONS);
+
+  if glext_ExtensionSupported('GL_ARB_texture_rectangle', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_color_buffer_float: Boolean;
+var
+  extstring: PChar;
+begin
+
+  Result := FALSE;
+  extstring := glGetString(GL_EXTENSIONS);
+
+  if glext_ExtensionSupported('GL_ARB_color_buffer_float', extstring) then
+  begin
+    glClampColorARB := wglGetProcAddress('glClampColorARB');
+    if not Assigned(glClampColorARB) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_half_float_pixel: Boolean;
+var
+  extstring: PChar;
+begin
+
+  Result := FALSE;
+  extstring := glGetString(GL_EXTENSIONS);
+
+  if glext_ExtensionSupported('GL_ARB_half_float_pixel', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_texture_float: Boolean;
+var
+  extstring: PChar;
+begin
+
+  Result := FALSE;
+  extstring := glGetString(GL_EXTENSIONS);
+
+  if glext_ExtensionSupported('GL_ARB_texture_float', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_texture_compression_dxt1: Boolean;
+var
+  extstring: PChar;
+begin
+
+  Result := FALSE;
+  extstring := glGetString(GL_EXTENSIONS);
+
+  if glext_ExtensionSupported('GL_EXT_texture_compression_dxt1', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_ARB_pixel_buffer_object: Boolean;
+var
+  extstring: PChar;
+begin
+
+  Result := FALSE;
+  extstring := glGetString(GL_EXTENSIONS);
+
+  if glext_ExtensionSupported('GL_ARB_pixel_buffer_object', extstring) then
+  begin
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_EXT_framebuffer_object: Boolean;
+var
+  extstring: PChar;
+begin
+
+  Result := FALSE;
+  extstring := glGetString(GL_EXTENSIONS);
+
+  if glext_ExtensionSupported('GL_EXT_framebuffer_object', extstring) then
+  begin
+    glIsRenderbufferEXT := wglGetProcAddress('glIsRenderbufferEXT');
+    if not Assigned(glIsRenderbufferEXT) then Exit;
+    glBindRenderbufferEXT := wglGetProcAddress('glBindRenderbufferEXT');
+    if not Assigned(glBindRenderbufferEXT) then Exit;
+    glDeleteRenderbuffersEXT := wglGetProcAddress('glDeleteRenderbuffersEXT');
+    if not Assigned(glDeleteRenderbuffersEXT) then Exit;
+    glGenRenderbuffersEXT := wglGetProcAddress('glGenRenderbuffersEXT');
+    if not Assigned(glGenRenderbuffersEXT) then Exit;
+    glRenderbufferStorageEXT := wglGetProcAddress('glRenderbufferStorageEXT');
+    if not Assigned(glRenderbufferStorageEXT) then Exit;
+    glGetRenderbufferParameterivEXT := wglGetProcAddress('glGetRenderbufferParameterivEXT');
+    if not Assigned(glGetRenderbufferParameterivEXT) then Exit;
+    glIsFramebufferEXT := wglGetProcAddress('glIsFramebufferEXT');
+    if not Assigned(glIsFramebufferEXT) then Exit;
+    glBindFramebufferEXT := wglGetProcAddress('glBindFramebufferEXT');
+    if not Assigned(glBindFramebufferEXT) then Exit;
+    glDeleteFramebuffersEXT := wglGetProcAddress('glDeleteFramebuffersEXT');
+    if not Assigned(glDeleteFramebuffersEXT) then Exit;
+    glGenFramebuffersEXT := wglGetProcAddress('glGenFramebuffersEXT');
+    if not Assigned(glGenFramebuffersEXT) then Exit;
+    glCheckFramebufferStatusEXT := wglGetProcAddress('glCheckFramebufferStatusEXT');
+    if not Assigned(glCheckFramebufferStatusEXT) then Exit;
+    glFramebufferTexture1DEXT := wglGetProcAddress('glFramebufferTexture1DEXT');
+    if not Assigned(glFramebufferTexture1DEXT) then Exit;
+    glFramebufferTexture2DEXT := wglGetProcAddress('glFramebufferTexture2DEXT');
+    if not Assigned(glFramebufferTexture2DEXT) then Exit;
+    glFramebufferTexture3DEXT := wglGetProcAddress('glFramebufferTexture3DEXT');
+    if not Assigned(glFramebufferTexture3DEXT) then Exit;
+    glFramebufferRenderbufferEXT := wglGetProcAddress('glFramebufferRenderbufferEXT');
+    if not Assigned(glFramebufferRenderbufferEXT) then Exit;
+    glGetFramebufferAttachmentParameterivEXT := wglGetProcAddress('glGetFramebufferAttachmentParameterivEXT');
+    if not Assigned(glGetFramebufferAttachmentParameterivEXT) then Exit;
+    glGenerateMipmapEXT := wglGetProcAddress('glGenerateMipmapEXT');
+    if not Assigned(glGenerateMipmapEXT) then Exit;
+    Result := TRUE;
+  end;
+
+end;
+
+function Load_GL_version_1_4: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+    glBlendFuncSeparate := wglGetProcAddress('glBlendFuncSeparate');
+    if not Assigned(glBlendFuncSeparate) then Exit;
+    glFogCoordf := wglGetProcAddress('glFogCoordf');
+    if not Assigned(glFogCoordf) then Exit;
+    glFogCoordfv := wglGetProcAddress('glFogCoordfv');
+    if not Assigned(glFogCoordfv) then Exit;
+    glFogCoordd := wglGetProcAddress('glFogCoordd');
+    if not Assigned(glFogCoordd) then Exit;
+    glFogCoorddv := wglGetProcAddress('glFogCoorddv');
+    if not Assigned(glFogCoorddv) then Exit;
+    glFogCoordPointer := wglGetProcAddress('glFogCoordPointer');
+    if not Assigned(glFogCoordPointer) then Exit;
+    glMultiDrawArrays := wglGetProcAddress('glMultiDrawArrays');
+    if not Assigned(glMultiDrawArrays) then Exit;
+    glMultiDrawElements := wglGetProcAddress('glMultiDrawElements');
+    if not Assigned(glMultiDrawElements) then Exit;
+    glPointParameterf := wglGetProcAddress('glPointParameterf');
+    if not Assigned(glPointParameterf) then Exit;
+    glPointParameterfv := wglGetProcAddress('glPointParameterfv');
+    if not Assigned(glPointParameterfv) then Exit;
+    glPointParameteri := wglGetProcAddress('glPointParameteri');
+    if not Assigned(glPointParameteri) then Exit;
+    glPointParameteriv := wglGetProcAddress('glPointParameteriv');
+    if not Assigned(glPointParameteriv) then Exit;
+    glSecondaryColor3b := wglGetProcAddress('glSecondaryColor3b');
+    if not Assigned(glSecondaryColor3b) then Exit;
+    glSecondaryColor3bv := wglGetProcAddress('glSecondaryColor3bv');
+    if not Assigned(glSecondaryColor3bv) then Exit;
+    glSecondaryColor3d := wglGetProcAddress('glSecondaryColor3d');
+    if not Assigned(glSecondaryColor3d) then Exit;
+    glSecondaryColor3dv := wglGetProcAddress('glSecondaryColor3dv');
+    if not Assigned(glSecondaryColor3dv) then Exit;
+    glSecondaryColor3f := wglGetProcAddress('glSecondaryColor3f');
+    if not Assigned(glSecondaryColor3f) then Exit;
+    glSecondaryColor3fv := wglGetProcAddress('glSecondaryColor3fv');
+    if not Assigned(glSecondaryColor3fv) then Exit;
+    glSecondaryColor3i := wglGetProcAddress('glSecondaryColor3i');
+    if not Assigned(glSecondaryColor3i) then Exit;
+    glSecondaryColor3iv := wglGetProcAddress('glSecondaryColor3iv');
+    if not Assigned(glSecondaryColor3iv) then Exit;
+    glSecondaryColor3s := wglGetProcAddress('glSecondaryColor3s');
+    if not Assigned(glSecondaryColor3s) then Exit;
+    glSecondaryColor3sv := wglGetProcAddress('glSecondaryColor3sv');
+    if not Assigned(glSecondaryColor3sv) then Exit;
+    glSecondaryColor3ub := wglGetProcAddress('glSecondaryColor3ub');
+    if not Assigned(glSecondaryColor3ub) then Exit;
+    glSecondaryColor3ubv := wglGetProcAddress('glSecondaryColor3ubv');
+    if not Assigned(glSecondaryColor3ubv) then Exit;
+    glSecondaryColor3ui := wglGetProcAddress('glSecondaryColor3ui');
+    if not Assigned(glSecondaryColor3ui) then Exit;
+    glSecondaryColor3uiv := wglGetProcAddress('glSecondaryColor3uiv');
+    if not Assigned(glSecondaryColor3uiv) then Exit;
+    glSecondaryColor3us := wglGetProcAddress('glSecondaryColor3us');
+    if not Assigned(glSecondaryColor3us) then Exit;
+    glSecondaryColor3usv := wglGetProcAddress('glSecondaryColor3usv');
+    if not Assigned(glSecondaryColor3usv) then Exit;
+    glSecondaryColorPointer := wglGetProcAddress('glSecondaryColorPointer');
+    if not Assigned(glSecondaryColorPointer) then Exit;
+    glWindowPos2d := wglGetProcAddress('glWindowPos2d');
+    if not Assigned(glWindowPos2d) then Exit;
+    glWindowPos2dv := wglGetProcAddress('glWindowPos2dv');
+    if not Assigned(glWindowPos2dv) then Exit;
+    glWindowPos2f := wglGetProcAddress('glWindowPos2f');
+    if not Assigned(glWindowPos2f) then Exit;
+    glWindowPos2fv := wglGetProcAddress('glWindowPos2fv');
+    if not Assigned(glWindowPos2fv) then Exit;
+    glWindowPos2i := wglGetProcAddress('glWindowPos2i');
+    if not Assigned(glWindowPos2i) then Exit;
+    glWindowPos2iv := wglGetProcAddress('glWindowPos2iv');
+    if not Assigned(glWindowPos2iv) then Exit;
+    glWindowPos2s := wglGetProcAddress('glWindowPos2s');
+    if not Assigned(glWindowPos2s) then Exit;
+    glWindowPos2sv := wglGetProcAddress('glWindowPos2sv');
+    if not Assigned(glWindowPos2sv) then Exit;
+    glWindowPos3d := wglGetProcAddress('glWindowPos3d');
+    if not Assigned(glWindowPos3d) then Exit;
+    glWindowPos3dv := wglGetProcAddress('glWindowPos3dv');
+    if not Assigned(glWindowPos3dv) then Exit;
+    glWindowPos3f := wglGetProcAddress('glWindowPos3f');
+    if not Assigned(glWindowPos3f) then Exit;
+    glWindowPos3fv := wglGetProcAddress('glWindowPos3fv');
+    if not Assigned(glWindowPos3fv) then Exit;
+    glWindowPos3i := wglGetProcAddress('glWindowPos3i');
+    if not Assigned(glWindowPos3i) then Exit;
+    glWindowPos3iv := wglGetProcAddress('glWindowPos3iv');
+    if not Assigned(glWindowPos3iv) then Exit;
+    glWindowPos3s := wglGetProcAddress('glWindowPos3s');
+    if not Assigned(glWindowPos3s) then Exit;
+    glWindowPos3sv := wglGetProcAddress('glWindowPos3sv');
+    if not Assigned(glWindowPos3sv) then Exit;
+    Result := TRUE;
+
+end;
+
+function Load_GL_version_1_5: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+    glGenQueries := wglGetProcAddress('glGenQueries');
+    if not Assigned(glGenQueries) then Exit;
+    glDeleteQueries := wglGetProcAddress('glDeleteQueries');
+    if not Assigned(glDeleteQueries) then Exit;
+    glIsQuery := wglGetProcAddress('glIsQuery');
+    if not Assigned(glIsQuery) then Exit;
+    glBeginQuery := wglGetProcAddress('glBeginQuery');
+    if not Assigned(glBeginQuery) then Exit;
+    glEndQuery := wglGetProcAddress('glEndQuery');
+    if not Assigned(glEndQuery) then Exit;
+    glGetQueryiv := wglGetProcAddress('glGetQueryiv');
+    if not Assigned(glGetQueryiv) then Exit;
+    glGetQueryObjectiv := wglGetProcAddress('glGetQueryObjectiv');
+    if not Assigned(glGetQueryObjectiv) then Exit;
+    glGetQueryObjectuiv := wglGetProcAddress('glGetQueryObjectuiv');
+    if not Assigned(glGetQueryObjectuiv) then Exit;
+    glBindBuffer := wglGetProcAddress('glBindBuffer');
+    if not Assigned(glBindBuffer) then Exit;
+    glDeleteBuffers := wglGetProcAddress('glDeleteBuffers');
+    if not Assigned(glDeleteBuffers) then Exit;
+    glGenBuffers := wglGetProcAddress('glGenBuffers');
+    if not Assigned(glGenBuffers) then Exit;
+    glIsBuffer := wglGetProcAddress('glIsBuffer');
+    if not Assigned(glIsBuffer) then Exit;
+    glBufferData := wglGetProcAddress('glBufferData');
+    if not Assigned(glBufferData) then Exit;
+    glBufferSubData := wglGetProcAddress('glBufferSubData');
+    if not Assigned(glBufferSubData) then Exit;
+    glGetBufferSubData := wglGetProcAddress('glGetBufferSubData');
+    if not Assigned(glGetBufferSubData) then Exit;
+    glMapBuffer := wglGetProcAddress('glMapBuffer');
+    if not Assigned(glMapBuffer) then Exit;
+    glUnmapBuffer := wglGetProcAddress('glUnmapBuffer');
+    if not Assigned(glUnmapBuffer) then Exit;
+    glGetBufferParameteriv := wglGetProcAddress('glGetBufferParameteriv');
+    if not Assigned(glGetBufferParameteriv) then Exit;
+    glGetBufferPointerv := wglGetProcAddress('glGetBufferPointerv');
+    if not Assigned(glGetBufferPointerv) then Exit;
+    Result := TRUE;
+
+end;
+
+function Load_GL_version_2_0: Boolean;
+var
+  extstring: String;
+begin
+
+  Result := FALSE;
+  extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+    glBlendEquationSeparate := wglGetProcAddress('glBlendEquationSeparate');
+    if not Assigned(glBlendEquationSeparate) then Exit;
+    glDrawBuffers := wglGetProcAddress('glDrawBuffers');
+    if not Assigned(glDrawBuffers) then Exit;
+    glStencilOpSeparate := wglGetProcAddress('glStencilOpSeparate');
+    if not Assigned(glStencilOpSeparate) then Exit;
+    glStencilFuncSeparate := wglGetProcAddress('glStencilFuncSeparate');
+    if not Assigned(glStencilFuncSeparate) then Exit;
+    glStencilMaskSeparate := wglGetProcAddress('glStencilMaskSeparate');
+    if not Assigned(glStencilMaskSeparate) then Exit;
+    glAttachShader := wglGetProcAddress('glAttachShader');
+    if not Assigned(glAttachShader) then Exit;
+    glBindAttribLocation := wglGetProcAddress('glBindAttribLocation');
+    if not Assigned(glBindAttribLocation) then Exit;
+    glCompileShader := wglGetProcAddress('glCompileShader');
+    if not Assigned(glCompileShader) then Exit;
+    glCreateProgram := wglGetProcAddress('glCreateProgram');
+    if not Assigned(glCreateProgram) then Exit;
+    glCreateShader := wglGetProcAddress('glCreateShader');
+    if not Assigned(glCreateShader) then Exit;
+    glDeleteProgram := wglGetProcAddress('glDeleteProgram');
+    if not Assigned(glDeleteProgram) then Exit;
+    glDeleteShader := wglGetProcAddress('glDeleteShader');
+    if not Assigned(glDeleteShader) then Exit;
+    glDetachShader := wglGetProcAddress('glDetachShader');
+    if not Assigned(glDetachShader) then Exit;
+    glDisableVertexAttribArray := wglGetProcAddress('glDisableVertexAttribArray');
+    if not Assigned(glDisableVertexAttribArray) then Exit;
+    glEnableVertexAttribArray := wglGetProcAddress('glEnableVertexAttribArray');
+    if not Assigned(glEnableVertexAttribArray) then Exit;
+    glGetActiveAttrib := wglGetProcAddress('glGetActiveAttrib');
+    if not Assigned(glGetActiveAttrib) then Exit;
+    glGetActiveUniform := wglGetProcAddress('glGetActiveUniform');
+    if not Assigned(glGetActiveUniform) then Exit;
+    glGetAttachedShaders := wglGetProcAddress('glGetAttachedShaders');
+    if not Assigned(glGetAttachedShaders) then Exit;
+    glGetAttribLocation := wglGetProcAddress('glGetAttribLocation');
+    if not Assigned(glGetAttribLocation) then Exit;
+    glGetProgramiv := wglGetProcAddress('glGetProgramiv');
+    if not Assigned(glGetProgramiv) then Exit;
+    glGetProgramInfoLog := wglGetProcAddress('glGetProgramInfoLog');
+    if not Assigned(glGetProgramInfoLog) then Exit;
+    glGetShaderiv := wglGetProcAddress('glGetShaderiv');
+    if not Assigned(glGetShaderiv) then Exit;
+    glGetShaderInfoLog := wglGetProcAddress('glGetShaderInfoLog');
+    if not Assigned(glGetShaderInfoLog) then Exit;
+    glGetShaderSource := wglGetProcAddress('glGetShaderSource');
+    if not Assigned(glGetShaderSource) then Exit;
+    glGetUniformLocation := wglGetProcAddress('glGetUniformLocation');
+    if not Assigned(glGetUniformLocation) then Exit;
+    glGetUniformfv := wglGetProcAddress('glGetUniformfv');
+    if not Assigned(glGetUniformfv) then Exit;
+    glGetUniformiv := wglGetProcAddress('glGetUniformiv');
+    if not Assigned(glGetUniformiv) then Exit;
+    glGetVertexAttribdv := wglGetProcAddress('glGetVertexAttribdv');
+    if not Assigned(glGetVertexAttribdv) then Exit;
+    glGetVertexAttribfv := wglGetProcAddress('glGetVertexAttribfv');
+    if not Assigned(glGetVertexAttribfv) then Exit;
+    glGetVertexAttribiv := wglGetProcAddress('glGetVertexAttribiv');
+    if not Assigned(glGetVertexAttribiv) then Exit;
+    glGetVertexAttribPointerv := wglGetProcAddress('glGetVertexAttribPointerv');
+    if not Assigned(glGetVertexAttribPointerv) then Exit;
+    glIsProgram := wglGetProcAddress('glIsProgram');
+    if not Assigned(glIsProgram) then Exit;
+    glIsShader := wglGetProcAddress('glIsShader');
+    if not Assigned(glIsShader) then Exit;
+    glLinkProgram := wglGetProcAddress('glLinkProgram');
+    if not Assigned(glLinkProgram) then Exit;
+    glShaderSource := wglGetProcAddress('glShaderSource');
+    if not Assigned(glShaderSource) then Exit;
+    glUseProgram := wglGetProcAddress('glUseProgram');
+    if not Assigned(glUseProgram) then Exit;
+    glUniform1f := wglGetProcAddress('glUniform1f');
+    if not Assigned(glUniform1f) then Exit;
+    glUniform2f := wglGetProcAddress('glUniform2f');
+    if not Assigned(glUniform2f) then Exit;
+    glUniform3f := wglGetProcAddress('glUniform3f');
+    if not Assigned(glUniform3f) then Exit;
+    glUniform4f := wglGetProcAddress('glUniform4f');
+    if not Assigned(glUniform4f) then Exit;
+    glUniform1i := wglGetProcAddress('glUniform1i');
+    if not Assigned(glUniform1i) then Exit;
+    glUniform2i := wglGetProcAddress('glUniform2i');
+    if not Assigned(glUniform2i) then Exit;
+    glUniform3i := wglGetProcAddress('glUniform3i');
+    if not Assigned(glUniform3i) then Exit;
+    glUniform4i := wglGetProcAddress('glUniform4i');
+    if not Assigned(glUniform4i) then Exit;
+    glUniform1fv := wglGetProcAddress('glUniform1fv');
+    if not Assigned(glUniform1fv) then Exit;
+    glUniform2fv := wglGetProcAddress('glUniform2fv');
+    if not Assigned(glUniform2fv) then Exit;
+    glUniform3fv := wglGetProcAddress('glUniform3fv');
+    if not Assigned(glUniform3fv) then Exit;
+    glUniform4fv := wglGetProcAddress('glUniform4fv');
+    if not Assigned(glUniform4fv) then Exit;
+    glUniform1iv := wglGetProcAddress('glUniform1iv');
+    if not Assigned(glUniform1iv) then Exit;
+    glUniform2iv := wglGetProcAddress('glUniform2iv');
+    if not Assigned(glUniform2iv) then Exit;
+    glUniform3iv := wglGetProcAddress('glUniform3iv');
+    if not Assigned(glUniform3iv) then Exit;
+    glUniform4iv := wglGetProcAddress('glUniform4iv');
+    if not Assigned(glUniform4iv) then Exit;
+    glUniformMatrix2fv := wglGetProcAddress('glUniformMatrix2fv');
+    if not Assigned(glUniformMatrix2fv) then Exit;
+    glUniformMatrix3fv := wglGetProcAddress('glUniformMatrix3fv');
+    if not Assigned(glUniformMatrix3fv) then Exit;
+    glUniformMatrix4fv := wglGetProcAddress('glUniformMatrix4fv');
+    if not Assigned(glUniformMatrix4fv) then Exit;
+    glValidateProgram := wglGetProcAddress('glValidateProgram');
+    if not Assigned(glValidateProgram) then Exit;
+    glVertexAttrib1d := wglGetProcAddress('glVertexAttrib1d');
+    if not Assigned(glVertexAttrib1d) then Exit;
+    glVertexAttrib1dv := wglGetProcAddress('glVertexAttrib1dv');
+    if not Assigned(glVertexAttrib1dv) then Exit;
+    glVertexAttrib1f := wglGetProcAddress('glVertexAttrib1f');
+    if not Assigned(glVertexAttrib1f) then Exit;
+    glVertexAttrib1fv := wglGetProcAddress('glVertexAttrib1fv');
+    if not Assigned(glVertexAttrib1fv) then Exit;
+    glVertexAttrib1s := wglGetProcAddress('glVertexAttrib1s');
+    if not Assigned(glVertexAttrib1s) then Exit;
+    glVertexAttrib1sv := wglGetProcAddress('glVertexAttrib1sv');
+    if not Assigned(glVertexAttrib1sv) then Exit;
+    glVertexAttrib2d := wglGetProcAddress('glVertexAttrib2d');
+    if not Assigned(glVertexAttrib2d) then Exit;
+    glVertexAttrib2dv := wglGetProcAddress('glVertexAttrib2dv');
+    if not Assigned(glVertexAttrib2dv) then Exit;
+    glVertexAttrib2f := wglGetProcAddress('glVertexAttrib2f');
+    if not Assigned(glVertexAttrib2f) then Exit;
+    glVertexAttrib2fv := wglGetProcAddress('glVertexAttrib2fv');
+    if not Assigned(glVertexAttrib2fv) then Exit;
+    glVertexAttrib2s := wglGetProcAddress('glVertexAttrib2s');
+    if not Assigned(glVertexAttrib2s) then Exit;
+    glVertexAttrib2sv := wglGetProcAddress('glVertexAttrib2sv');
+    if not Assigned(glVertexAttrib2sv) then Exit;
+    glVertexAttrib3d := wglGetProcAddress('glVertexAttrib3d');
+    if not Assigned(glVertexAttrib3d) then Exit;
+    glVertexAttrib3dv := wglGetProcAddress('glVertexAttrib3dv');
+    if not Assigned(glVertexAttrib3dv) then Exit;
+    glVertexAttrib3f := wglGetProcAddress('glVertexAttrib3f');
+    if not Assigned(glVertexAttrib3f) then Exit;
+    glVertexAttrib3fv := wglGetProcAddress('glVertexAttrib3fv');
+    if not Assigned(glVertexAttrib3fv) then Exit;
+    glVertexAttrib3s := wglGetProcAddress('glVertexAttrib3s');
+    if not Assigned(glVertexAttrib3s) then Exit;
+    glVertexAttrib3sv := wglGetProcAddress('glVertexAttrib3sv');
+    if not Assigned(glVertexAttrib3sv) then Exit;
+    glVertexAttrib4Nbv := wglGetProcAddress('glVertexAttrib4Nbv');
+    if not Assigned(glVertexAttrib4Nbv) then Exit;
+    glVertexAttrib4Niv := wglGetProcAddress('glVertexAttrib4Niv');
+    if not Assigned(glVertexAttrib4Niv) then Exit;
+    glVertexAttrib4Nsv := wglGetProcAddress('glVertexAttrib4Nsv');
+    if not Assigned(glVertexAttrib4Nsv) then Exit;
+    glVertexAttrib4Nub := wglGetProcAddress('glVertexAttrib4Nub');
+    if not Assigned(glVertexAttrib4Nub) then Exit;
+    glVertexAttrib4Nubv := wglGetProcAddress('glVertexAttrib4Nubv');
+    if not Assigned(glVertexAttrib4Nubv) then Exit;
+    glVertexAttrib4Nuiv := wglGetProcAddress('glVertexAttrib4Nuiv');
+    if not Assigned(glVertexAttrib4Nuiv) then Exit;
+    glVertexAttrib4Nusv := wglGetProcAddress('glVertexAttrib4Nusv');
+    if not Assigned(glVertexAttrib4Nusv) then Exit;
+    glVertexAttrib4bv := wglGetProcAddress('glVertexAttrib4bv');
+    if not Assigned(glVertexAttrib4bv) then Exit;
+    glVertexAttrib4d := wglGetProcAddress('glVertexAttrib4d');
+    if not Assigned(glVertexAttrib4d) then Exit;
+    glVertexAttrib4dv := wglGetProcAddress('glVertexAttrib4dv');
+    if not Assigned(glVertexAttrib4dv) then Exit;
+    glVertexAttrib4f := wglGetProcAddress('glVertexAttrib4f');
+    if not Assigned(glVertexAttrib4f) then Exit;
+    glVertexAttrib4fv := wglGetProcAddress('glVertexAttrib4fv');
+    if not Assigned(glVertexAttrib4fv) then Exit;
+    glVertexAttrib4iv := wglGetProcAddress('glVertexAttrib4iv');
+    if not Assigned(glVertexAttrib4iv) then Exit;
+    glVertexAttrib4s := wglGetProcAddress('glVertexAttrib4s');
+    if not Assigned(glVertexAttrib4s) then Exit;
+    glVertexAttrib4sv := wglGetProcAddress('glVertexAttrib4sv');
+    if not Assigned(glVertexAttrib4sv) then Exit;
+    glVertexAttrib4ubv := wglGetProcAddress('glVertexAttrib4ubv');
+    if not Assigned(glVertexAttrib4ubv) then Exit;
+    glVertexAttrib4uiv := wglGetProcAddress('glVertexAttrib4uiv');
+    if not Assigned(glVertexAttrib4uiv) then Exit;
+    glVertexAttrib4usv := wglGetProcAddress('glVertexAttrib4usv');
+    if not Assigned(glVertexAttrib4usv) then Exit;
+    glVertexAttribPointer := wglGetProcAddress('glVertexAttribPointer');
+    if not Assigned(glVertexAttribPointer) then Exit;
+    Result := TRUE;
+
+end;
+
+function glext_LoadExtension(ext: String): Boolean;
+begin
+
+  Result := FALSE;
+
+  if ext = 'GL_version_1_2' then Result := Load_GL_version_1_2
+  else if ext = 'GL_ARB_imaging' then Result := Load_GL_ARB_imaging
+  else if ext = 'GL_version_1_3' then Result := Load_GL_version_1_3
+  else if ext = 'GL_ARB_multitexture' then Result := Load_GL_ARB_multitexture
+  else if ext = 'GL_ARB_transpose_matrix' then Result := Load_GL_ARB_transpose_matrix
+  else if ext = 'GL_ARB_multisample' then Result := Load_GL_ARB_multisample
+  else if ext = 'GL_ARB_texture_env_add' then Result := Load_GL_ARB_texture_env_add
+{$IFDEF Windows}
+  else if ext = 'WGL_ARB_extensions_string' then Result := Load_WGL_ARB_extensions_string
+  else if ext = 'WGL_ARB_buffer_region' then Result := Load_WGL_ARB_buffer_region
+{$ENDIF}
+  else if ext = 'GL_ARB_texture_cube_map' then Result := Load_GL_ARB_texture_cube_map
+  else if ext = 'GL_ARB_depth_texture' then Result := Load_GL_ARB_depth_texture
+  else if ext = 'GL_ARB_point_parameters' then Result := Load_GL_ARB_point_parameters
+  else if ext = 'GL_ARB_shadow' then Result := Load_GL_ARB_shadow
+  else if ext = 'GL_ARB_shadow_ambient' then Result := Load_GL_ARB_shadow_ambient
+  else if ext = 'GL_ARB_texture_border_clamp' then Result := Load_GL_ARB_texture_border_clamp
+  else if ext = 'GL_ARB_texture_compression' then Result := Load_GL_ARB_texture_compression
+  else if ext = 'GL_ARB_texture_env_combine' then Result := Load_GL_ARB_texture_env_combine
+  else if ext = 'GL_ARB_texture_env_crossbar' then Result := Load_GL_ARB_texture_env_crossbar
+  else if ext = 'GL_ARB_texture_env_dot3' then Result := Load_GL_ARB_texture_env_dot3
+  else if ext = 'GL_ARB_texture_mirrored_repeat' then Result := Load_GL_ARB_texture_mirrored_repeat
+  else if ext = 'GL_ARB_vertex_blend' then Result := Load_GL_ARB_vertex_blend
+  else if ext = 'GL_ARB_vertex_program' then Result := Load_GL_ARB_vertex_program
+  else if ext = 'GL_ARB_window_pos' then Result := Load_GL_ARB_window_pos
+  else if ext = 'GL_EXT_422_pixels' then Result := Load_GL_EXT_422_pixels
+  else if ext = 'GL_EXT_abgr' then Result := Load_GL_EXT_abgr
+  else if ext = 'GL_EXT_bgra' then Result := Load_GL_EXT_bgra
+  else if ext = 'GL_EXT_blend_color' then Result := Load_GL_EXT_blend_color
+  else if ext = 'GL_EXT_blend_func_separate' then Result := Load_GL_EXT_blend_func_separate
+  else if ext = 'GL_EXT_blend_logic_op' then Result := Load_GL_EXT_blend_logic_op
+  else if ext = 'GL_EXT_blend_minmax' then Result := Load_GL_EXT_blend_minmax
+  else if ext = 'GL_EXT_blend_subtract' then Result := Load_GL_EXT_blend_subtract
+  else if ext = 'GL_EXT_clip_volume_hint' then Result := Load_GL_EXT_clip_volume_hint
+  else if ext = 'GL_EXT_color_subtable' then Result := Load_GL_EXT_color_subtable
+  else if ext = 'GL_EXT_compiled_vertex_array' then Result := Load_GL_EXT_compiled_vertex_array
+  else if ext = 'GL_EXT_convolution' then Result := Load_GL_EXT_convolution
+  else if ext = 'GL_EXT_fog_coord' then Result := Load_GL_EXT_fog_coord
+  else if ext = 'GL_EXT_histogram' then Result := Load_GL_EXT_histogram
+  else if ext = 'GL_EXT_multi_draw_arrays' then Result := Load_GL_EXT_multi_draw_arrays
+  else if ext = 'GL_EXT_packed_pixels' then Result := Load_GL_EXT_packed_pixels
+  else if ext = 'GL_EXT_paletted_texture' then Result := Load_GL_EXT_paletted_texture
+  else if ext = 'GL_EXT_point_parameters' then Result := Load_GL_EXT_point_parameters
+  else if ext = 'GL_EXT_polygon_offset' then Result := Load_GL_EXT_polygon_offset
+  else if ext = 'GL_EXT_secondary_color' then Result := Load_GL_EXT_secondary_color
+  else if ext = 'GL_EXT_separate_specular_color' then Result := Load_GL_EXT_separate_specular_color
+  else if ext = 'GL_EXT_shadow_funcs' then Result := Load_GL_EXT_shadow_funcs
+  else if ext = 'GL_EXT_shared_texture_palette' then Result := Load_GL_EXT_shared_texture_palette
+  else if ext = 'GL_EXT_stencil_two_side' then Result := Load_GL_EXT_stencil_two_side
+  else if ext = 'GL_EXT_stencil_wrap' then Result := Load_GL_EXT_stencil_wrap
+  else if ext = 'GL_EXT_subtexture' then Result := Load_GL_EXT_subtexture
+  else if ext = 'GL_EXT_texture3D' then Result := Load_GL_EXT_texture3D
+  else if ext = 'GL_EXT_texture_compression_s3tc' then Result := Load_GL_EXT_texture_compression_s3tc
+  else if ext = 'GL_EXT_texture_env_add' then Result := Load_GL_EXT_texture_env_add
+  else if ext = 'GL_EXT_texture_env_combine' then Result := Load_GL_EXT_texture_env_combine
+  else if ext = 'GL_EXT_texture_env_dot3' then Result := Load_GL_EXT_texture_env_dot3
+  else if ext = 'GL_EXT_texture_filter_anisotropic' then Result := Load_GL_EXT_texture_filter_anisotropic
+  else if ext = 'GL_EXT_texture_lod_bias' then Result := Load_GL_EXT_texture_lod_bias
+  else if ext = 'GL_EXT_texture_object' then Result := Load_GL_EXT_texture_object
+  else if ext = 'GL_EXT_vertex_array' then Result := Load_GL_EXT_vertex_array
+  else if ext = 'GL_EXT_vertex_shader' then Result := Load_GL_EXT_vertex_shader
+  else if ext = 'GL_EXT_vertex_weighting' then Result := Load_GL_EXT_vertex_weighting
+  else if ext = 'GL_HP_occlusion_test' then Result := Load_GL_HP_occlusion_test
+  else if ext = 'GL_NV_blend_square' then Result := Load_GL_NV_blend_square
+  else if ext = 'GL_NV_copy_depth_to_color' then Result := Load_GL_NV_copy_depth_to_color
+  else if ext = 'GL_NV_depth_clamp' then Result := Load_GL_NV_depth_clamp
+  else if ext = 'GL_NV_evaluators' then Result := Load_GL_NV_evaluators
+  else if ext = 'GL_NV_fence' then Result := Load_GL_NV_fence
+  else if ext = 'GL_NV_fog_distance' then Result := Load_GL_NV_fog_distance
+  else if ext = 'GL_NV_light_max_exponent' then Result := Load_GL_NV_light_max_exponent
+  else if ext = 'GL_NV_multisample_filter_hint' then Result := Load_GL_NV_multisample_filter_hint
+  else if ext = 'GL_NV_occlusion_query' then Result := Load_GL_NV_occlusion_query
+  else if ext = 'GL_NV_packed_depth_stencil' then Result := Load_GL_NV_packed_depth_stencil
+  else if ext = 'GL_NV_point_sprite' then Result := Load_GL_NV_point_sprite
+  else if ext = 'GL_NV_register_combiners' then Result := Load_GL_NV_register_combiners
+  else if ext = 'GL_NV_register_combiners2' then Result := Load_GL_NV_register_combiners2
+  else if ext = 'GL_NV_texgen_emboss' then Result := Load_GL_NV_texgen_emboss
+  else if ext = 'GL_NV_texgen_reflection' then Result := Load_GL_NV_texgen_reflection
+  else if ext = 'GL_NV_texture_compression_vtc' then Result := Load_GL_NV_texture_compression_vtc
+  else if ext = 'GL_NV_texture_env_combine4' then Result := Load_GL_NV_texture_env_combine4
+  else if ext = 'GL_NV_texture_rectangle' then Result := Load_GL_NV_texture_rectangle
+  else if ext = 'GL_NV_texture_shader' then Result := Load_GL_NV_texture_shader
+  else if ext = 'GL_NV_texture_shader2' then Result := Load_GL_NV_texture_shader2
+  else if ext = 'GL_NV_texture_shader3' then Result := Load_GL_NV_texture_shader3
+  else if ext = 'GL_NV_vertex_array_range' then Result := Load_GL_NV_vertex_array_range
+  else if ext = 'GL_NV_vertex_array_range2' then Result := Load_GL_NV_vertex_array_range2
+  else if ext = 'GL_NV_vertex_program' then Result := Load_GL_NV_vertex_program
+  else if ext = 'GL_NV_vertex_program1_1' then Result := Load_GL_NV_vertex_program1_1
+  else if ext = 'GL_ATI_element_array' then Result := Load_GL_ATI_element_array
+  else if ext = 'GL_ATI_envmap_bumpmap' then Result := Load_GL_ATI_envmap_bumpmap
+  else if ext = 'GL_ATI_fragment_shader' then Result := Load_GL_ATI_fragment_shader
+  else if ext = 'GL_ATI_pn_triangles' then Result := Load_GL_ATI_pn_triangles
+  else if ext = 'GL_ATI_texture_mirror_once' then Result := Load_GL_ATI_texture_mirror_once
+  else if ext = 'GL_ATI_vertex_array_object' then Result := Load_GL_ATI_vertex_array_object
+  else if ext = 'GL_ATI_vertex_streams' then Result := Load_GL_ATI_vertex_streams
+{$IFDEF Windows}
+  else if ext = 'WGL_I3D_image_buffer' then Result := Load_WGL_I3D_image_buffer
+  else if ext = 'WGL_I3D_swap_frame_lock' then Result := Load_WGL_I3D_swap_frame_lock
+  else if ext = 'WGL_I3D_swap_frame_usage' then Result := Load_WGL_I3D_swap_frame_usage
+{$ENDIF}
+  else if ext = 'GL_3DFX_texture_compression_FXT1' then Result := Load_GL_3DFX_texture_compression_FXT1
+  else if ext = 'GL_IBM_cull_vertex' then Result := Load_GL_IBM_cull_vertex
+  else if ext = 'GL_IBM_multimode_draw_arrays' then Result := Load_GL_IBM_multimode_draw_arrays
+  else if ext = 'GL_IBM_raster_pos_clip' then Result := Load_GL_IBM_raster_pos_clip
+  else if ext = 'GL_IBM_texture_mirrored_repeat' then Result := Load_GL_IBM_texture_mirrored_repeat
+  else if ext = 'GL_IBM_vertex_array_lists' then Result := Load_GL_IBM_vertex_array_lists
+  else if ext = 'GL_MESA_resize_buffers' then Result := Load_GL_MESA_resize_buffers
+  else if ext = 'GL_MESA_window_pos' then Result := Load_GL_MESA_window_pos
+  else if ext = 'GL_OML_interlace' then Result := Load_GL_OML_interlace
+  else if ext = 'GL_OML_resample' then Result := Load_GL_OML_resample
+  else if ext = 'GL_OML_subsample' then Result := Load_GL_OML_subsample
+  else if ext = 'GL_SGIS_generate_mipmap' then Result := Load_GL_SGIS_generate_mipmap
+  else if ext = 'GL_SGIS_multisample' then Result := Load_GL_SGIS_multisample
+  else if ext = 'GL_SGIS_pixel_texture' then Result := Load_GL_SGIS_pixel_texture
+  else if ext = 'GL_SGIS_texture_border_clamp' then Result := Load_GL_SGIS_texture_border_clamp
+  else if ext = 'GL_SGIS_texture_color_mask' then Result := Load_GL_SGIS_texture_color_mask
+  else if ext = 'GL_SGIS_texture_edge_clamp' then Result := Load_GL_SGIS_texture_edge_clamp
+  else if ext = 'GL_SGIS_texture_lod' then Result := Load_GL_SGIS_texture_lod
+  else if ext = 'GL_SGIS_depth_texture' then Result := Load_GL_SGIS_depth_texture
+  else if ext = 'GL_SGIX_fog_offset' then Result := Load_GL_SGIX_fog_offset
+  else if ext = 'GL_SGIX_interlace' then Result := Load_GL_SGIX_interlace
+  else if ext = 'GL_SGIX_shadow_ambient' then Result := Load_GL_SGIX_shadow_ambient
+  else if ext = 'GL_SGI_color_matrix' then Result := Load_GL_SGI_color_matrix
+  else if ext = 'GL_SGI_color_table' then Result := Load_GL_SGI_color_table
+  else if ext = 'GL_SGI_texture_color_table' then Result := Load_GL_SGI_texture_color_table
+  else if ext = 'GL_SUN_vertex' then Result := Load_GL_SUN_vertex
+  else if ext = 'GL_ARB_fragment_program' then Result := Load_GL_ARB_fragment_program
+  else if ext = 'GL_ATI_text_fragment_shader' then Result := Load_GL_ATI_text_fragment_shader
+  else if ext = 'GL_APPLE_client_storage' then Result := Load_GL_APPLE_client_storage
+  else if ext = 'GL_APPLE_element_array' then Result := Load_GL_APPLE_element_array
+  else if ext = 'GL_APPLE_fence' then Result := Load_GL_APPLE_fence
+  else if ext = 'GL_APPLE_vertex_array_object' then Result := Load_GL_APPLE_vertex_array_object
+  else if ext = 'GL_APPLE_vertex_array_range' then Result := Load_GL_APPLE_vertex_array_range
+{$IFDEF Windows}
+  else if ext = 'WGL_ARB_pixel_format' then Result := Load_WGL_ARB_pixel_format
+  else if ext = 'WGL_ARB_make_current_read' then Result := Load_WGL_ARB_make_current_read
+  else if ext = 'WGL_ARB_pbuffer' then Result := Load_WGL_ARB_pbuffer
+  else if ext = 'WGL_EXT_swap_control' then Result := Load_WGL_EXT_swap_control
+  else if ext = 'WGL_ARB_render_texture' then Result := Load_WGL_ARB_render_texture
+  else if ext = 'WGL_EXT_extensions_string' then Result := Load_WGL_EXT_extensions_string
+  else if ext = 'WGL_EXT_make_current_read' then Result := Load_WGL_EXT_make_current_read
+  else if ext = 'WGL_EXT_pbuffer' then Result := Load_WGL_EXT_pbuffer
+  else if ext = 'WGL_EXT_pixel_format' then Result := Load_WGL_EXT_pixel_format
+  else if ext = 'WGL_I3D_digital_video_control' then Result := Load_WGL_I3D_digital_video_control
+  else if ext = 'WGL_I3D_gamma' then Result := Load_WGL_I3D_gamma
+  else if ext = 'WGL_I3D_genlock' then Result := Load_WGL_I3D_genlock
+{$ENDIF}
+  else if ext = 'GL_ARB_matrix_palette' then Result := Load_GL_ARB_matrix_palette
+  else if ext = 'GL_NV_element_array' then Result := Load_GL_NV_element_array
+  else if ext = 'GL_NV_float_buffer' then Result := Load_GL_NV_float_buffer
+  else if ext = 'GL_NV_fragment_program' then Result := Load_GL_NV_fragment_program
+  else if ext = 'GL_NV_primitive_restart' then Result := Load_GL_NV_primitive_restart
+  else if ext = 'GL_NV_vertex_program2' then Result := Load_GL_NV_vertex_program2
+  {$IFDEF Windows}
+  else if ext = 'WGL_NV_render_texture_rectangle' then Result := Load_WGL_NV_render_texture_rectangle
+  {$ENDIF}
+  else if ext = 'GL_NV_pixel_data_range' then Result := Load_GL_NV_pixel_data_range
+  else if ext = 'GL_EXT_texture_rectangle' then Result := Load_GL_EXT_texture_rectangle
+  else if ext = 'GL_S3_s3tc' then Result := Load_GL_S3_s3tc
+  else if ext = 'GL_ATI_draw_buffers' then Result := Load_GL_ATI_draw_buffers
+  {$IFDEF Windows}
+  else if ext = 'WGL_ATI_pixel_format_float' then Result := Load_WGL_ATI_pixel_format_float
+  {$ENDIF}
+  else if ext = 'GL_ATI_texture_env_combine3' then Result := Load_GL_ATI_texture_env_combine3
+  else if ext = 'GL_ATI_texture_float' then Result := Load_GL_ATI_texture_float
+  else if ext = 'GL_NV_texture_expand_normal' then Result := Load_GL_NV_texture_expand_normal
+  else if ext = 'GL_NV_half_float' then Result := Load_GL_NV_half_float
+  else if ext = 'GL_ATI_map_object_buffer' then Result := Load_GL_ATI_map_object_buffer
+  else if ext = 'GL_ATI_separate_stencil' then Result := Load_GL_ATI_separate_stencil
+  else if ext = 'GL_ATI_vertex_attrib_array_object' then Result := Load_GL_ATI_vertex_attrib_array_object
+  else if ext = 'GL_ARB_vertex_buffer_object' then Result := Load_GL_ARB_vertex_buffer_object
+  else if ext = 'GL_ARB_occlusion_query' then Result := Load_GL_ARB_occlusion_query
+  else if ext = 'GL_ARB_shader_objects' then Result := Load_GL_ARB_shader_objects
+  else if ext = 'GL_ARB_vertex_shader' then Result := Load_GL_ARB_vertex_shader
+  else if ext = 'GL_ARB_fragment_shader' then Result := Load_GL_ARB_fragment_shader
+  else if ext = 'GL_ARB_shading_language_100' then Result := Load_GL_ARB_shading_language_100
+  else if ext = 'GL_ARB_texture_non_power_of_two' then Result := Load_GL_ARB_texture_non_power_of_two
+  else if ext = 'GL_ARB_point_sprite' then Result := Load_GL_ARB_point_sprite
+  else if ext = 'GL_EXT_depth_bounds_test' then Result := Load_GL_EXT_depth_bounds_test
+  else if ext = 'GL_EXT_texture_mirror_clamp' then Result := Load_GL_EXT_texture_mirror_clamp
+  else if ext = 'GL_EXT_blend_equation_separate' then Result := Load_GL_EXT_blend_equation_separate
+  else if ext = 'GL_MESA_pack_invert' then Result := Load_GL_MESA_pack_invert
+  else if ext = 'GL_MESA_ycbcr_texture' then Result := Load_GL_MESA_ycbcr_texture
+  else if ext = 'GL_ARB_fragment_program_shadow' then Result := Load_GL_ARB_fragment_program_shadow
+  else if ext = 'GL_NV_fragment_program_option' then Result := Load_GL_NV_fragment_program_option
+  else if ext = 'GL_EXT_pixel_buffer_object' then Result := Load_GL_EXT_pixel_buffer_object
+  else if ext = 'GL_NV_fragment_program2' then Result := Load_GL_NV_fragment_program2
+  else if ext = 'GL_NV_vertex_program2_option' then Result := Load_GL_NV_vertex_program2_option
+  else if ext = 'GL_NV_vertex_program3' then Result := Load_GL_NV_vertex_program3
+  else if ext = 'GL_ARB_draw_buffers' then Result := Load_GL_ARB_draw_buffers
+  else if ext = 'GL_ARB_texture_rectangle' then Result := Load_GL_ARB_texture_rectangle
+  else if ext = 'GL_ARB_color_buffer_float' then Result := Load_GL_ARB_color_buffer_float
+  else if ext = 'GL_ARB_half_float_pixel' then Result := Load_GL_ARB_half_float_pixel
+  else if ext = 'GL_ARB_texture_float' then Result := Load_GL_ARB_texture_float
+  else if ext = 'GL_EXT_texture_compression_dxt1' then Result := Load_GL_EXT_texture_compression_dxt1
+  else if ext = 'GL_ARB_pixel_buffer_object' then Result := Load_GL_ARB_pixel_buffer_object
+  else if ext = 'GL_EXT_framebuffer_object' then Result := Load_GL_EXT_framebuffer_object
+  else if ext = 'GL_version_1_4' then Result := Load_GL_version_1_4
+  else if ext = 'GL_version_1_5' then Result := Load_GL_version_1_5
+  else if ext = 'GL_version_2_0' then Result := Load_GL_version_2_0
+
+end;
+
+end.

+ 572 - 0
packages/opengl/src/glu.pp

@@ -0,0 +1,572 @@
+{
+
+  Adaption of the delphi3d.net OpenGL units to FreePascal
+  Sebastian Guenther ([email protected]) in 2002
+  These units are free to use
+}
+
+{*++ BUILD Version: 0004    // Increment this if a change has global effects
+
+Copyright (c) 1985-95, Microsoft Corporation
+
+Module Name:
+
+    glu.h
+
+Abstract:
+
+    Procedure declarations, constant definitions and macros for the OpenGL
+    Utility Library.
+
+--*}
+
+{*
+** Copyright 1991-1993, Silicon Graphics, Inc.
+** All Rights Reserved.
+**
+** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
+** the contents of this file may not be disclosed to third parties, copied or
+** duplicated in any form, in whole or in part, without the prior written
+** permission of Silicon Graphics, Inc.
+**
+** RESTRICTED RIGHTS LEGEND:
+** Use, duplication or disclosure by the Government is subject to restrictions
+** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
+** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
+** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
+** rights reserved under the Copyright Laws of the United States.
+*}
+
+{*
+** Return the error string associated with a particular error code.
+** This will return 0 for an invalid error code.
+**
+** The generic function prototype that can be compiled for ANSI or Unicode
+** is defined as follows:
+**
+** LPCTSTR APIENTRY gluErrorStringWIN (GLenum errCode);
+*}
+
+{******************************************************************************}
+{ Converted to Delphi by Tom Nuydens ([email protected])                        }
+{ For the latest updates, visit Delphi3D: http://www.delphi3d.net              }
+{******************************************************************************}
+
+{$MACRO ON}
+{$MODE Delphi}
+{$IFDEF Windows}
+  {$DEFINE extdecl := stdcall}
+{$ELSE}
+  {$DEFINE extdecl := cdecl}
+{$ENDIF}
+
+{$IFDEF MORPHOS}
+{$INLINE ON}
+{$DEFINE GLU_UNIT}
+{$ENDIF}
+
+unit GLu;
+
+interface
+
+uses
+  SysUtils,
+  {$IFDEF Windows}
+  Windows,
+  {$ELSE}
+  {$IFDEF MORPHOS}
+  TinyGL,
+  {$ENDIF}
+  {$ENDIF}
+  GL;
+
+type
+  TViewPortArray = array [0..3] of GLint;
+  T16dArray = array [0..15] of GLdouble;
+  TCallBack = procedure;
+  T3dArray = array [0..2] of GLdouble;
+  T4pArray = array [0..3] of Pointer;
+  T4fArray = array [0..3] of GLfloat;
+  PPointer = ^Pointer;
+
+type
+  GLUnurbs = record end;                PGLUnurbs = ^GLUnurbs;
+  GLUquadric = record end;              PGLUquadric = ^GLUquadric;
+  GLUtesselator = record end;           PGLUtesselator = ^GLUtesselator;
+
+  // backwards compatibility:
+  GLUnurbsObj = GLUnurbs;               PGLUnurbsObj = PGLUnurbs;
+  GLUquadricObj = GLUquadric;           PGLUquadricObj = PGLUquadric;
+  GLUtesselatorObj = GLUtesselator;     PGLUtesselatorObj = PGLUtesselator;
+  GLUtriangulatorObj = GLUtesselator;   PGLUtriangulatorObj = PGLUtesselator;
+
+  TGLUnurbs = GLUnurbs;
+  TGLUquadric = GLUquadric;
+  TGLUtesselator = GLUtesselator;
+
+  TGLUnurbsObj = GLUnurbsObj;
+  TGLUquadricObj = GLUquadricObj;
+  TGLUtesselatorObj = GLUtesselatorObj;
+  TGLUtriangulatorObj = GLUtriangulatorObj;
+
+{$IFDEF MORPHOS}
+
+{ MorphOS GL works differently due to different dynamic-library handling on Amiga-like }
+{ systems, so its headers are included here. }
+{$INCLUDE tinyglh.inc}
+
+{$ELSE MORPHOS}
+var
+  gluErrorString: function(errCode: GLenum): PChar; extdecl;
+  gluErrorUnicodeStringEXT: function(errCode: GLenum): PWideChar; extdecl;
+  gluGetString: function(name: GLenum): PChar; extdecl;
+  gluOrtho2D: procedure(left,right, bottom, top: GLdouble); extdecl;
+  gluPerspective: procedure(fovy, aspect, zNear, zFar: GLdouble); extdecl;
+  gluPickMatrix: procedure(x, y, width, height: GLdouble; var viewport: TViewPortArray); extdecl;
+  gluLookAt: procedure(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: GLdouble); extdecl;
+  gluProject: function(objx, objy, objz: GLdouble; var modelMatrix, projMatrix: T16dArray; var viewport: TViewPortArray; winx, winy, winz: PGLdouble): Integer; extdecl;
+  gluUnProject: function(winx, winy, winz: GLdouble; var modelMatrix, projMatrix: T16dArray; var viewport: TViewPortArray; objx, objy, objz: PGLdouble): Integer; extdecl;
+  gluScaleImage: function(format: GLenum; widthin, heightin: GLint; typein: GLenum; const datain: Pointer; widthout, heightout: GLint; typeout: GLenum; dataout: Pointer): Integer; extdecl;
+  gluBuild1DMipmaps: function(target: GLenum; components, width: GLint; format, atype: GLenum; const data: Pointer): Integer; extdecl;
+  gluBuild2DMipmaps: function(target: GLenum; components, width, height: GLint; format, atype: GLenum; const data: Pointer): Integer; extdecl;
+
+var
+  gluNewQuadric: function: PGLUquadric; extdecl;
+  gluDeleteQuadric: procedure(state: PGLUquadric); extdecl;
+  gluQuadricNormals: procedure(quadObject: PGLUquadric; normals: GLenum); extdecl;
+  gluQuadricTexture: procedure(quadObject: PGLUquadric; textureCoords: GLboolean); extdecl;
+  gluQuadricOrientation: procedure(quadObject: PGLUquadric; orientation: GLenum); extdecl;
+  gluQuadricDrawStyle: procedure(quadObject: PGLUquadric; drawStyle: GLenum); extdecl;
+  gluCylinder: procedure(qobj: PGLUquadric; baseRadius, topRadius, height: GLdouble; slices, stacks: GLint); extdecl;
+  gluDisk: procedure(qobj: PGLUquadric; innerRadius, outerRadius: GLdouble; slices, loops: GLint); extdecl;
+  gluPartialDisk: procedure(qobj: PGLUquadric; innerRadius, outerRadius: GLdouble; slices, loops: GLint; startAngle, sweepAngle: GLdouble); extdecl;
+  gluSphere: procedure(qobj: PGLuquadric; radius: GLdouble; slices, stacks: GLint); extdecl;
+  gluQuadricCallback: procedure(qobj: PGLUquadric; which: GLenum; fn: TCallBack); extdecl;
+  gluNewTess: function: PGLUtesselator; extdecl;
+  gluDeleteTess: procedure(tess: PGLUtesselator); extdecl;
+  gluTessBeginPolygon: procedure(tess: PGLUtesselator; polygon_data: Pointer); extdecl;
+  gluTessBeginContour: procedure(tess: PGLUtesselator); extdecl;
+  gluTessVertex: procedure(tess: PGLUtesselator; var coords: T3dArray; data: Pointer); extdecl;
+  gluTessEndContour: procedure(tess: PGLUtesselator); extdecl;
+  gluTessEndPolygon: procedure(tess: PGLUtesselator); extdecl;
+  gluTessProperty: procedure(tess: PGLUtesselator; which: GLenum; value: GLdouble); extdecl;
+  gluTessNormal: procedure(tess: PGLUtesselator; x, y, z: GLdouble); extdecl;
+  gluTessCallback: procedure(tess: PGLUtesselator; which: GLenum;fn: TCallBack); extdecl;
+  gluGetTessProperty: procedure(tess: PGLUtesselator; which: GLenum; value: PGLdouble); extdecl;
+  gluNewNurbsRenderer: function: PGLUnurbs; extdecl;
+  gluDeleteNurbsRenderer: procedure(nobj: PGLUnurbs); extdecl;
+  gluBeginSurface: procedure(nobj: PGLUnurbs); extdecl;
+  gluBeginCurve: procedure(nobj: PGLUnurbs); extdecl;
+  gluEndCurve: procedure(nobj: PGLUnurbs); extdecl;
+  gluEndSurface: procedure(nobj: PGLUnurbs); extdecl;
+  gluBeginTrim: procedure(nobj: PGLUnurbs); extdecl;
+  gluEndTrim: procedure(nobj: PGLUnurbs); extdecl;
+  gluPwlCurve: procedure(nobj: PGLUnurbs; count: GLint; aarray: PGLfloat; stride: GLint; atype: GLenum); extdecl;
+  gluNurbsCurve: procedure(nobj: PGLUnurbs; nknots: GLint; knot: PGLfloat; stride: GLint; ctlarray: PGLfloat; order: GLint; atype: GLenum); extdecl;
+  gluNurbsSurface: procedure(nobj: PGLUnurbs; sknot_count: GLint; sknot: PGLfloat; tknot_count: GLint; tknot: PGLfloat; s_stride, t_stride: GLint; ctlarray: PGLfloat; sorder, torder: GLint; atype: GLenum); extdecl;
+  gluLoadSamplingMatrices: procedure(nobj: PGLUnurbs; var modelMatrix, projMatrix: T16dArray; var viewport: TViewPortArray); extdecl;
+  gluNurbsProperty: procedure(nobj: PGLUnurbs; aproperty: GLenum; value: GLfloat); extdecl;
+  gluGetNurbsProperty: procedure(nobj: PGLUnurbs; aproperty: GLenum; value: PGLfloat); extdecl;
+  gluNurbsCallback: procedure(nobj: PGLUnurbs; which: GLenum; fn: TCallBack); extdecl;
+{$ENDIF MORPHOS}
+
+(**** Callback function prototypes ****)
+
+type
+  // gluQuadricCallback
+  GLUquadricErrorProc = procedure(p: GLenum); extdecl;
+
+  // gluTessCallback
+  GLUtessBeginProc = procedure(p: GLenum); extdecl;
+  GLUtessEdgeFlagProc = procedure(p: GLboolean); extdecl;
+  GLUtessVertexProc = procedure(p: Pointer); extdecl;
+  GLUtessEndProc = procedure; extdecl;
+  GLUtessErrorProc = procedure(p: GLenum); extdecl;
+  GLUtessCombineProc = procedure(var p1: T3dArray; p2: T4pArray; p3: T4fArray; p4: PPointer); extdecl;
+  GLUtessBeginDataProc = procedure(p1: GLenum; p2: Pointer); extdecl;
+  GLUtessEdgeFlagDataProc = procedure(p1: GLboolean; p2: Pointer); extdecl;
+  GLUtessVertexDataProc = procedure(p1, p2: Pointer); extdecl;
+  GLUtessEndDataProc = procedure(p: Pointer); extdecl;
+  GLUtessErrorDataProc = procedure(p1: GLenum; p2: Pointer); extdecl;
+  GLUtessCombineDataProc = procedure(var p1: T3dArray; var p2: T4pArray; var p3: T4fArray;
+                                     p4: PPointer; p5: Pointer); extdecl;
+
+  // gluNurbsCallback
+  GLUnurbsErrorProc = procedure(p: GLenum); extdecl;
+
+
+//***           Generic constants               ****/
+
+const
+  // Version
+  GLU_VERSION_1_1                 = 1;
+  GLU_VERSION_1_2                 = 1;
+
+  // Errors: (return value 0 = no error)
+  GLU_INVALID_ENUM                = 100900;
+  GLU_INVALID_VALUE               = 100901;
+  GLU_OUT_OF_MEMORY               = 100902;
+  GLU_INCOMPATIBLE_GL_VERSION     = 100903;
+
+  // StringName
+  GLU_VERSION                     = 100800;
+  GLU_EXTENSIONS                  = 100801;
+
+  // Boolean
+  GLU_TRUE                        = GL_TRUE;
+  GLU_FALSE                       = GL_FALSE;
+
+
+  //***           Quadric constants               ****/
+
+  // QuadricNormal
+  GLU_SMOOTH              = 100000;
+  GLU_FLAT                = 100001;
+  GLU_NONE                = 100002;
+
+  // QuadricDrawStyle
+  GLU_POINT               = 100010;
+  GLU_LINE                = 100011;
+  GLU_FILL                = 100012;
+  GLU_SILHOUETTE          = 100013;
+
+  // QuadricOrientation
+  GLU_OUTSIDE             = 100020;
+  GLU_INSIDE              = 100021;
+
+  // Callback types:
+  //      GLU_ERROR       = 100103;
+
+
+  //***           Tesselation constants           ****/
+
+  GLU_TESS_MAX_COORD              = 1.0e150;
+
+  // TessProperty
+  GLU_TESS_WINDING_RULE           = 100140;
+  GLU_TESS_BOUNDARY_ONLY          = 100141;
+  GLU_TESS_TOLERANCE              = 100142;
+
+  // TessWinding
+  GLU_TESS_WINDING_ODD            = 100130;
+  GLU_TESS_WINDING_NONZERO        = 100131;
+  GLU_TESS_WINDING_POSITIVE       = 100132;
+  GLU_TESS_WINDING_NEGATIVE       = 100133;
+  GLU_TESS_WINDING_ABS_GEQ_TWO    = 100134;
+
+  // TessCallback
+  GLU_TESS_BEGIN          = 100100;    // void (CALLBACK*)(GLenum    type)
+  GLU_TESS_VERTEX         = 100101;    // void (CALLBACK*)(void      *data)
+  GLU_TESS_END            = 100102;    // void (CALLBACK*)(void)
+  GLU_TESS_ERROR          = 100103;    // void (CALLBACK*)(GLenum    errno)
+  GLU_TESS_EDGE_FLAG      = 100104;    // void (CALLBACK*)(GLboolean boundaryEdge)
+  GLU_TESS_COMBINE        = 100105;    { void (CALLBACK*)(GLdouble  coords[3],
+                                                            void      *data[4],
+                                                            GLfloat   weight[4],
+                                                            void      **dataOut) }
+  GLU_TESS_BEGIN_DATA     = 100106;    { void (CALLBACK*)(GLenum    type,
+                                                            void      *polygon_data) }
+  GLU_TESS_VERTEX_DATA    = 100107;    { void (CALLBACK*)(void      *data,
+                                                            void      *polygon_data) }
+  GLU_TESS_END_DATA       = 100108;    // void (CALLBACK*)(void      *polygon_data)
+  GLU_TESS_ERROR_DATA     = 100109;    { void (CALLBACK*)(GLenum    errno,
+                                                            void      *polygon_data) }
+  GLU_TESS_EDGE_FLAG_DATA = 100110;    { void (CALLBACK*)(GLboolean boundaryEdge,
+                                                            void      *polygon_data) }
+  GLU_TESS_COMBINE_DATA   = 100111;    { void (CALLBACK*)(GLdouble  coords[3],
+                                                            void      *data[4],
+                                                            GLfloat   weight[4],
+                                                            void      **dataOut,
+                                                            void      *polygon_data) }
+
+  // TessError
+  GLU_TESS_ERROR1     = 100151;
+  GLU_TESS_ERROR2     = 100152;
+  GLU_TESS_ERROR3     = 100153;
+  GLU_TESS_ERROR4     = 100154;
+  GLU_TESS_ERROR5     = 100155;
+  GLU_TESS_ERROR6     = 100156;
+  GLU_TESS_ERROR7     = 100157;
+  GLU_TESS_ERROR8     = 100158;
+
+  GLU_TESS_MISSING_BEGIN_POLYGON  = GLU_TESS_ERROR1;
+  GLU_TESS_MISSING_BEGIN_CONTOUR  = GLU_TESS_ERROR2;
+  GLU_TESS_MISSING_END_POLYGON    = GLU_TESS_ERROR3;
+  GLU_TESS_MISSING_END_CONTOUR    = GLU_TESS_ERROR4;
+  GLU_TESS_COORD_TOO_LARGE        = GLU_TESS_ERROR5;
+  GLU_TESS_NEED_COMBINE_CALLBACK  = GLU_TESS_ERROR6;
+
+  //***           NURBS constants                 ****/
+
+  // NurbsProperty
+  GLU_AUTO_LOAD_MATRIX            = 100200;
+  GLU_CULLING                     = 100201;
+  GLU_SAMPLING_TOLERANCE          = 100203;
+  GLU_DISPLAY_MODE                = 100204;
+  GLU_PARAMETRIC_TOLERANCE        = 100202;
+  GLU_SAMPLING_METHOD             = 100205;
+  GLU_U_STEP                      = 100206;
+  GLU_V_STEP                      = 100207;
+
+  // NurbsSampling
+  GLU_PATH_LENGTH                 = 100215;
+  GLU_PARAMETRIC_ERROR            = 100216;
+  GLU_DOMAIN_DISTANCE             = 100217;
+
+
+  // NurbsTrim
+  GLU_MAP1_TRIM_2                 = 100210;
+  GLU_MAP1_TRIM_3                 = 100211;
+
+  // NurbsDisplay
+  //      GLU_FILL                = 100012;
+  GLU_OUTLINE_POLYGON             = 100240;
+  GLU_OUTLINE_PATCH               = 100241;
+
+  // NurbsCallback
+  //      GLU_ERROR               = 100103;
+
+  // NurbsErrors
+  GLU_NURBS_ERROR1        = 100251;
+  GLU_NURBS_ERROR2        = 100252;
+  GLU_NURBS_ERROR3        = 100253;
+  GLU_NURBS_ERROR4        = 100254;
+  GLU_NURBS_ERROR5        = 100255;
+  GLU_NURBS_ERROR6        = 100256;
+  GLU_NURBS_ERROR7        = 100257;
+  GLU_NURBS_ERROR8        = 100258;
+  GLU_NURBS_ERROR9        = 100259;
+  GLU_NURBS_ERROR10       = 100260;
+  GLU_NURBS_ERROR11       = 100261;
+  GLU_NURBS_ERROR12       = 100262;
+  GLU_NURBS_ERROR13       = 100263;
+  GLU_NURBS_ERROR14       = 100264;
+  GLU_NURBS_ERROR15       = 100265;
+  GLU_NURBS_ERROR16       = 100266;
+  GLU_NURBS_ERROR17       = 100267;
+  GLU_NURBS_ERROR18       = 100268;
+  GLU_NURBS_ERROR19       = 100269;
+  GLU_NURBS_ERROR20       = 100270;
+  GLU_NURBS_ERROR21       = 100271;
+  GLU_NURBS_ERROR22       = 100272;
+  GLU_NURBS_ERROR23       = 100273;
+  GLU_NURBS_ERROR24       = 100274;
+  GLU_NURBS_ERROR25       = 100275;
+  GLU_NURBS_ERROR26       = 100276;
+  GLU_NURBS_ERROR27       = 100277;
+  GLU_NURBS_ERROR28       = 100278;
+  GLU_NURBS_ERROR29       = 100279;
+  GLU_NURBS_ERROR30       = 100280;
+  GLU_NURBS_ERROR31       = 100281;
+  GLU_NURBS_ERROR32       = 100282;
+  GLU_NURBS_ERROR33       = 100283;
+  GLU_NURBS_ERROR34       = 100284;
+  GLU_NURBS_ERROR35       = 100285;
+  GLU_NURBS_ERROR36       = 100286;
+  GLU_NURBS_ERROR37       = 100287;
+
+//***           Backwards compatibility for old tesselator           ****/
+
+var
+  gluBeginPolygon: procedure(tess: PGLUtesselator); extdecl;
+  gluNextContour: procedure(tess: PGLUtesselator; atype: GLenum); extdecl;
+  gluEndPolygon: procedure(tess: PGLUtesselator); extdecl;
+
+const
+  // Contours types -- obsolete!
+  GLU_CW          = 100120;
+  GLU_CCW         = 100121;
+  GLU_INTERIOR    = 100122;
+  GLU_EXTERIOR    = 100123;
+  GLU_UNKNOWN     = 100124;
+
+  // Names without "TESS_" prefix
+  GLU_BEGIN       = GLU_TESS_BEGIN;
+  GLU_VERTEX      = GLU_TESS_VERTEX;
+  GLU_END         = GLU_TESS_END;
+  GLU_ERROR       = GLU_TESS_ERROR;
+  GLU_EDGE_FLAG   = GLU_TESS_EDGE_FLAG;
+
+procedure LoadGLu(const dll: String);
+procedure FreeGLu;
+
+implementation
+
+{$IFDEF MORPHOS}
+
+{ MorphOS GL works differently due to different dynamic-library handling on Amiga-like }
+{ systems, so its functions are included here. }
+{$INCLUDE tinygl.inc}
+
+{$ELSE MORPHOS}
+uses
+  dynlibs;
+
+var
+  hDLL: TLibHandle;
+
+{$ENDIF MORPHOS}
+
+procedure FreeGLu;
+begin
+{$IFDEF MORPHOS}
+  // MorphOS's GL will closed down by TinyGL unit, nothing is needed here.
+{$ELSE MORPHOS}
+  @gluErrorString := nil;
+  @gluErrorUnicodeStringEXT := nil;
+  @gluGetString := nil;
+  @gluOrtho2D := nil;
+  @gluPerspective := nil;
+  @gluPickMatrix := nil;
+  @gluLookAt := nil;
+  @gluProject := nil;
+  @gluUnProject := nil;
+  @gluScaleImage := nil;
+  @gluBuild1DMipmaps := nil;
+  @gluBuild2DMipmaps := nil;
+  @gluNewQuadric := nil;
+  @gluDeleteQuadric := nil;
+  @gluQuadricNormals := nil;
+  @gluQuadricTexture := nil;
+  @gluQuadricOrientation := nil;
+  @gluQuadricDrawStyle := nil;
+  @gluCylinder := nil;
+  @gluDisk := nil;
+  @gluPartialDisk := nil;
+  @gluSphere := nil;
+  @gluQuadricCallback := nil;
+  @gluNewTess := nil;
+  @gluDeleteTess := nil;
+  @gluTessBeginPolygon := nil;
+  @gluTessBeginContour := nil;
+  @gluTessVertex := nil;
+  @gluTessEndContour := nil;
+  @gluTessEndPolygon := nil;
+  @gluTessProperty := nil;
+  @gluTessNormal := nil;
+  @gluTessCallback := nil;
+  @gluGetTessProperty := nil;
+  @gluNewNurbsRenderer := nil;
+  @gluDeleteNurbsRenderer := nil;
+  @gluBeginSurface := nil;
+  @gluBeginCurve := nil;
+  @gluEndCurve := nil;
+  @gluEndSurface := nil;
+  @gluBeginTrim := nil;
+  @gluEndTrim := nil;
+  @gluPwlCurve := nil;
+  @gluNurbsCurve := nil;
+  @gluNurbsSurface := nil;
+  @gluLoadSamplingMatrices := nil;
+  @gluNurbsProperty := nil;
+  @gluGetNurbsProperty := nil;
+  @gluNurbsCallback := nil;
+  @gluBeginPolygon := nil;
+  @gluNextContour := nil;
+  @gluEndPolygon := nil;
+
+  if (hDLL <> 0) then
+    FreeLibrary(hDLL);
+{$ENDIF MORPHOS}
+end;
+
+procedure LoadGLu(const dll: String);
+{$IFDEF MORPHOS}
+begin
+  // MorphOS's GL has own initialization in TinyGL unit, nothing is needed here.
+end;
+{$ELSE MORPHOS}
+var
+  MethodName: string = '';
+
+  function GetGLuProcAddress(Lib: PtrInt; ProcName: PChar): Pointer;
+  begin
+    MethodName:=ProcName;
+    Result:=GetProcAddress(Lib, ProcName);
+  end;
+
+begin
+
+  FreeGLu;
+
+  hDLL := LoadLibrary(PChar(dll));
+  if hDLL = 0 then raise Exception.Create('Could not load GLu from ' + dll);
+  try
+    @gluErrorString := GetGLuProcAddress(hDLL, 'gluErrorString');
+    @gluErrorUnicodeStringEXT := GetGLuProcAddress(hDLL, 'gluErrorUnicodeStringEXT');
+    @gluGetString := GetGLuProcAddress(hDLL, 'gluGetString');
+    @gluOrtho2D := GetGLuProcAddress(hDLL, 'gluOrtho2D');
+    @gluPerspective := GetGLuProcAddress(hDLL, 'gluPerspective');
+    @gluPickMatrix := GetGLuProcAddress(hDLL, 'gluPickMatrix');
+    @gluLookAt := GetGLuProcAddress(hDLL, 'gluLookAt');
+    @gluProject := GetGLuProcAddress(hDLL, 'gluProject');
+    @gluUnProject := GetGLuProcAddress(hDLL, 'gluUnProject');
+    @gluScaleImage := GetGLuProcAddress(hDLL, 'gluScaleImage');
+    @gluBuild1DMipmaps := GetGLuProcAddress(hDLL, 'gluBuild1DMipmaps');
+    @gluBuild2DMipmaps := GetGLuProcAddress(hDLL, 'gluBuild2DMipmaps');
+    @gluNewQuadric := GetGLuProcAddress(hDLL, 'gluNewQuadric');
+    @gluDeleteQuadric := GetGLuProcAddress(hDLL, 'gluDeleteQuadric');
+    @gluQuadricNormals := GetGLuProcAddress(hDLL, 'gluQuadricNormals');
+    @gluQuadricTexture := GetGLuProcAddress(hDLL, 'gluQuadricTexture');
+    @gluQuadricOrientation := GetGLuProcAddress(hDLL, 'gluQuadricOrientation');
+    @gluQuadricDrawStyle := GetGLuProcAddress(hDLL, 'gluQuadricDrawStyle');
+    @gluCylinder := GetGLuProcAddress(hDLL, 'gluCylinder');
+    @gluDisk := GetGLuProcAddress(hDLL, 'gluDisk');
+    @gluPartialDisk := GetGLuProcAddress(hDLL, 'gluPartialDisk');
+    @gluSphere := GetGLuProcAddress(hDLL, 'gluSphere');
+    @gluQuadricCallback := GetGLuProcAddress(hDLL, 'gluQuadricCallback');
+    @gluNewTess := GetGLuProcAddress(hDLL, 'gluNewTess');
+    @gluDeleteTess := GetGLuProcAddress(hDLL, 'gluDeleteTess');
+    @gluTessBeginPolygon := GetGLuProcAddress(hDLL, 'gluTessBeginPolygon');
+    @gluTessBeginContour := GetGLuProcAddress(hDLL, 'gluTessBeginContour');
+    @gluTessVertex := GetGLuProcAddress(hDLL, 'gluTessVertex');
+    @gluTessEndContour := GetGLuProcAddress(hDLL, 'gluTessEndContour');
+    @gluTessEndPolygon := GetGLuProcAddress(hDLL, 'gluTessEndPolygon');
+    @gluTessProperty := GetGLuProcAddress(hDLL, 'gluTessProperty');
+    @gluTessNormal := GetGLuProcAddress(hDLL, 'gluTessNormal');
+    @gluTessCallback := GetGLuProcAddress(hDLL, 'gluTessCallback');
+    @gluGetTessProperty := GetGLuProcAddress(hDLL, 'gluGetTessProperty');
+    @gluNewNurbsRenderer := GetGLuProcAddress(hDLL, 'gluNewNurbsRenderer');
+    @gluDeleteNurbsRenderer := GetGLuProcAddress(hDLL, 'gluDeleteNurbsRenderer');
+    @gluBeginSurface := GetGLuProcAddress(hDLL, 'gluBeginSurface');
+    @gluBeginCurve := GetGLuProcAddress(hDLL, 'gluBeginCurve');
+    @gluEndCurve := GetGLuProcAddress(hDLL, 'gluEndCurve');
+    @gluEndSurface := GetGLuProcAddress(hDLL, 'gluEndSurface');
+    @gluBeginTrim := GetGLuProcAddress(hDLL, 'gluBeginTrim');
+    @gluEndTrim := GetGLuProcAddress(hDLL, 'gluEndTrim');
+    @gluPwlCurve := GetGLuProcAddress(hDLL, 'gluPwlCurve');
+    @gluNurbsCurve := GetGLuProcAddress(hDLL, 'gluNurbsCurve');
+    @gluNurbsSurface := GetGLuProcAddress(hDLL, 'gluNurbsSurface');
+    @gluLoadSamplingMatrices := GetGLuProcAddress(hDLL, 'gluLoadSamplingMatrices');
+    @gluNurbsProperty := GetGLuProcAddress(hDLL, 'gluNurbsProperty');
+    @gluGetNurbsProperty := GetGLuProcAddress(hDLL, 'gluGetNurbsProperty');
+    @gluNurbsCallback := GetGLuProcAddress(hDLL, 'gluNurbsCallback');
+
+    @gluBeginPolygon := GetGLuProcAddress(hDLL, 'gluBeginPolygon');
+    @gluNextContour := GetGLuProcAddress(hDLL, 'gluNextContour');
+    @gluEndPolygon := GetGLuProcAddress(hDLL, 'gluEndPolygon');
+  except
+    raise Exception.Create('Could not load ' + MethodName + ' from ' + dll);
+  end;
+end;
+{$ENDIF MORPHOS}
+
+initialization
+
+  {$IFDEF Windows}
+  LoadGLu('glu32.dll');
+  {$ELSE}
+  {$ifdef darwin}
+  LoadGLu('/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib');
+  {$else}
+  {$ifndef MorphOS}
+  LoadGLu('libGLU.so.1');
+  {$endif}
+  {$ENDIF}
+  {$endif}
+
+finalization
+
+  FreeGLu;
+
+end.

+ 2102 - 0
packages/opengl/src/glut.pp

@@ -0,0 +1,2102 @@
+{ Adaption of the delphi3d.net OpenGL units to FreePascal
+  Sebastian Guenther ([email protected]) in 2002
+  These units are free to use
+
+  19.6.07 : Added GLUT_EXCLUSIVE_FPUMODE to allow for
+  unsafe glut-libs, that don't handle FPU-exceptions in
+  a compatible way.  Jan Bruns ([email protected])
+}
+
+{$MACRO ON}
+{$MODE Delphi}
+{$IFDEF Windows}
+  {$DEFINE extdecl := stdcall}
+{$ELSE}
+  {$DEFINE extdecl := cdecl}
+{$ENDIF}
+
+
+{$IFDEF CPU86}
+  {$DEFINE GLUT_EXCLUSIVE_FPUMODE}
+  {$DEFINE mode_inline := register} //inine or local-calling
+{$ENDIF}
+
+
+{$IFDEF MORPHOS}
+{$INLINE ON}
+{$DEFINE GLUT_UNIT}
+{$ENDIF}
+
+unit Glut;
+
+// Copyright (c) Mark J. Kilgard, 1994, 1995, 1996. */
+
+(* This program is freely distributable without licensing fees  and is
+   provided without guarantee or warrantee expressed or  implied. This
+   program is -not- in the public domain. *)
+
+{******************************************************************************}
+{ Converted to Delphi by Tom Nuydens ([email protected])                        }
+{   Contributions by Igor Karpov ([email protected])                           }
+{   For the latest updates, visit Delphi3D: http://www.delphi3d.net            }
+{******************************************************************************}
+
+interface
+
+uses
+  SysUtils,
+  {$IFDEF Windows}
+  Windows, dynlibs,
+  {$ELSE}
+  {$IFDEF MORPHOS}
+  TinyGL,
+  {$ELSE}
+  dynlibs,
+  {$ENDIF}
+  {$ENDIF}
+  {$IFDEF GLUT_EXCLUSIVE_FPUMODE}
+  math,
+  {$ENDIF}
+  GL;
+
+type
+  PInteger = ^Integer;
+  PPChar = ^PChar;
+  TGlutVoidCallback = procedure; cdecl;
+  TGlut1IntCallback = procedure(value: Integer); cdecl;
+  TGlut2IntCallback = procedure(v1, v2: Integer); cdecl;
+  TGlut3IntCallback = procedure(v1, v2, v3: Integer); cdecl;
+  TGlut4IntCallback = procedure(v1, v2, v3, v4: Integer); cdecl;
+  TGlut1Char2IntCallback = procedure(c: Byte; v1, v2: Integer); cdecl;
+  TGlut1UInt3IntCallback = procedure(u: Cardinal; v1, v2, v3: Integer); cdecl;
+
+const
+  GLUT_API_VERSION                = 3;
+  GLUT_XLIB_IMPLEMENTATION        = 12;
+  // Display mode bit masks.
+  GLUT_RGB                        = 0;
+  GLUT_RGBA                       = GLUT_RGB;
+  GLUT_INDEX                      = 1;
+  GLUT_SINGLE                     = 0;
+  GLUT_DOUBLE                     = 2;
+  GLUT_ACCUM                      = 4;
+  GLUT_ALPHA                      = 8;
+  GLUT_DEPTH                      = 16;
+  GLUT_STENCIL                    = 32;
+  GLUT_MULTISAMPLE                = 128;
+  GLUT_STEREO                     = 256;
+  GLUT_LUMINANCE                  = 512;
+
+  // Mouse buttons.
+  GLUT_LEFT_BUTTON                = 0;
+  GLUT_MIDDLE_BUTTON              = 1;
+  GLUT_RIGHT_BUTTON               = 2;
+
+  // Mouse button state.
+  GLUT_DOWN                       = 0;
+  GLUT_UP                         = 1;
+
+  // function keys
+  GLUT_KEY_F1                     = 1;
+  GLUT_KEY_F2                     = 2;
+  GLUT_KEY_F3                     = 3;
+  GLUT_KEY_F4                     = 4;
+  GLUT_KEY_F5                     = 5;
+  GLUT_KEY_F6                     = 6;
+  GLUT_KEY_F7                     = 7;
+  GLUT_KEY_F8                     = 8;
+  GLUT_KEY_F9                     = 9;
+  GLUT_KEY_F10                    = 10;
+  GLUT_KEY_F11                    = 11;
+  GLUT_KEY_F12                    = 12;
+  // directional keys
+  GLUT_KEY_LEFT                   = 100;
+  GLUT_KEY_UP                     = 101;
+  GLUT_KEY_RIGHT                  = 102;
+  GLUT_KEY_DOWN                   = 103;
+  GLUT_KEY_PAGE_UP                = 104;
+  GLUT_KEY_PAGE_DOWN              = 105;
+  GLUT_KEY_HOME                   = 106;
+  GLUT_KEY_END                    = 107;
+  GLUT_KEY_INSERT                 = 108;
+
+  // Entry/exit  state.
+  GLUT_LEFT                       = 0;
+  GLUT_ENTERED                    = 1;
+
+  // Menu usage state.
+  GLUT_MENU_NOT_IN_USE            = 0;
+  GLUT_MENU_IN_USE                = 1;
+
+  // Visibility  state.
+  GLUT_NOT_VISIBLE                = 0;
+  GLUT_VISIBLE                    = 1;
+
+  // Window status  state.
+  GLUT_HIDDEN                     = 0;
+  GLUT_FULLY_RETAINED             = 1;
+  GLUT_PARTIALLY_RETAINED         = 2;
+  GLUT_FULLY_COVERED              = 3;
+
+  // Color index component selection values.
+  GLUT_RED                        = 0;
+  GLUT_GREEN                      = 1;
+  GLUT_BLUE                       = 2;
+
+  // Layers for use.
+  GLUT_NORMAL                     = 0;
+  GLUT_OVERLAY                    = 1;
+
+{$ifdef Windows}
+  // Stroke font constants (use these in GLUT program).
+  GLUT_STROKE_ROMAN               = Pointer(0);
+  GLUT_STROKE_MONO_ROMAN          = Pointer(1);
+
+  // Bitmap font constants (use these in GLUT program).
+  GLUT_BITMAP_9_BY_15             = Pointer(2);
+  GLUT_BITMAP_8_BY_13             = Pointer(3);
+  GLUT_BITMAP_TIMES_ROMAN_10      = Pointer(4);
+  GLUT_BITMAP_TIMES_ROMAN_24      = Pointer(5);
+  GLUT_BITMAP_HELVETICA_10        = Pointer(6);
+  GLUT_BITMAP_HELVETICA_12        = Pointer(7);
+  GLUT_BITMAP_HELVETICA_18        = Pointer(8);
+{$else Windows}
+var
+  // Stroke font constants (use these in GLUT program).
+  GLUT_STROKE_ROMAN               : Pointer;
+  GLUT_STROKE_MONO_ROMAN          : Pointer;
+
+  // Bitmap font constants (use these in GLUT program).
+  GLUT_BITMAP_9_BY_15             : Pointer;
+  GLUT_BITMAP_8_BY_13             : Pointer;
+  GLUT_BITMAP_TIMES_ROMAN_10      : Pointer;
+  GLUT_BITMAP_TIMES_ROMAN_24      : Pointer;
+  GLUT_BITMAP_HELVETICA_10        : Pointer;
+  GLUT_BITMAP_HELVETICA_12        : Pointer;
+  GLUT_BITMAP_HELVETICA_18        : Pointer;
+
+const
+{$endif Windows}
+
+  // glutGet parameters.
+  GLUT_WINDOW_X                   = 100;
+  GLUT_WINDOW_Y                   = 101;
+  GLUT_WINDOW_WIDTH               = 102;
+  GLUT_WINDOW_HEIGHT              = 103;
+  GLUT_WINDOW_BUFFER_SIZE         = 104;
+  GLUT_WINDOW_STENCIL_SIZE        = 105;
+  GLUT_WINDOW_DEPTH_SIZE          = 106;
+  GLUT_WINDOW_RED_SIZE            = 107;
+  GLUT_WINDOW_GREEN_SIZE          = 108;
+  GLUT_WINDOW_BLUE_SIZE           = 109;
+  GLUT_WINDOW_ALPHA_SIZE          = 110;
+  GLUT_WINDOW_ACCUM_RED_SIZE      = 111;
+  GLUT_WINDOW_ACCUM_GREEN_SIZE    = 112;
+  GLUT_WINDOW_ACCUM_BLUE_SIZE     = 113;
+  GLUT_WINDOW_ACCUM_ALPHA_SIZE    = 114;
+  GLUT_WINDOW_DOUBLEBUFFER        = 115;
+  GLUT_WINDOW_RGBA                = 116;
+  GLUT_WINDOW_PARENT              = 117;
+  GLUT_WINDOW_NUM_CHILDREN        = 118;
+  GLUT_WINDOW_COLORMAP_SIZE       = 119;
+  GLUT_WINDOW_NUM_SAMPLES         = 120;
+  GLUT_WINDOW_STEREO              = 121;
+  GLUT_WINDOW_CURSOR              = 122;
+  GLUT_SCREEN_WIDTH               = 200;
+  GLUT_SCREEN_HEIGHT              = 201;
+  GLUT_SCREEN_WIDTH_MM            = 202;
+  GLUT_SCREEN_HEIGHT_MM           = 203;
+  GLUT_MENU_NUM_ITEMS             = 300;
+  GLUT_DISPLAY_MODE_POSSIBLE      = 400;
+  GLUT_INIT_WINDOW_X              = 500;
+  GLUT_INIT_WINDOW_Y              = 501;
+  GLUT_INIT_WINDOW_WIDTH          = 502;
+  GLUT_INIT_WINDOW_HEIGHT         = 503;
+  GLUT_INIT_DISPLAY_MODE          = 504;
+  GLUT_ELAPSED_TIME               = 700;
+  GLUT_WINDOW_FORMAT_ID		  = 123;
+
+  // glutDeviceGet parameters.
+  GLUT_HAS_KEYBOARD               = 600;
+  GLUT_HAS_MOUSE                  = 601;
+  GLUT_HAS_SPACEBALL              = 602;
+  GLUT_HAS_DIAL_AND_BUTTON_BOX    = 603;
+  GLUT_HAS_TABLET                 = 604;
+  GLUT_NUM_MOUSE_BUTTONS          = 605;
+  GLUT_NUM_SPACEBALL_BUTTONS      = 606;
+  GLUT_NUM_BUTTON_BOX_BUTTONS     = 607;
+  GLUT_NUM_DIALS                  = 608;
+  GLUT_NUM_TABLET_BUTTONS         = 609;
+  GLUT_DEVICE_IGNORE_KEY_REPEAT   = 610;
+  GLUT_DEVICE_KEY_REPEAT          = 611;
+  GLUT_HAS_JOYSTICK               = 612;
+  GLUT_OWNS_JOYSTICK              = 613;
+  GLUT_JOYSTICK_BUTTONS           = 614;
+  GLUT_JOYSTICK_AXES              = 615;
+  GLUT_JOYSTICK_POLL_RATE         = 616;
+
+
+  // glutLayerGet parameters.
+  GLUT_OVERLAY_POSSIBLE           = 800;
+  GLUT_LAYER_IN_USE               = 801;
+  GLUT_HAS_OVERLAY                = 802;
+  GLUT_TRANSPARENT_INDEX          = 803;
+  GLUT_NORMAL_DAMAGED             = 804;
+  GLUT_OVERLAY_DAMAGED            = 805;
+
+  // glutVideoResizeGet parameters.
+  GLUT_VIDEO_RESIZE_POSSIBLE       = 900;
+  GLUT_VIDEO_RESIZE_IN_USE         = 901;
+  GLUT_VIDEO_RESIZE_X_DELTA        = 902;
+  GLUT_VIDEO_RESIZE_Y_DELTA        = 903;
+  GLUT_VIDEO_RESIZE_WIDTH_DELTA    = 904;
+  GLUT_VIDEO_RESIZE_HEIGHT_DELTA   = 905;
+  GLUT_VIDEO_RESIZE_X              = 906;
+  GLUT_VIDEO_RESIZE_Y              = 907;
+  GLUT_VIDEO_RESIZE_WIDTH          = 908;
+  GLUT_VIDEO_RESIZE_HEIGHT         = 909;
+
+  // glutGetModifiers return mask.
+  GLUT_ACTIVE_SHIFT                = 1;
+  GLUT_ACTIVE_CTRL                 = 2;
+  GLUT_ACTIVE_ALT                  = 4;
+
+  // glutSetCursor parameters.
+  // Basic arrows.
+  GLUT_CURSOR_RIGHT_ARROW          = 0;
+  GLUT_CURSOR_LEFT_ARROW           = 1;
+  // Symbolic cursor shapes.
+  GLUT_CURSOR_INFO                 = 2;
+  GLUT_CURSOR_DESTROY              = 3;
+  GLUT_CURSOR_HELP                 = 4;
+  GLUT_CURSOR_CYCLE                = 5;
+  GLUT_CURSOR_SPRAY                = 6;
+  GLUT_CURSOR_WAIT                 = 7;
+  GLUT_CURSOR_TEXT                 = 8;
+  GLUT_CURSOR_CROSSHAIR            = 9;
+  // Directional cursors.
+  GLUT_CURSOR_UP_DOWN              = 10;
+  GLUT_CURSOR_LEFT_RIGHT           = 11;
+  // Sizing cursors.
+  GLUT_CURSOR_TOP_SIDE             = 12;
+  GLUT_CURSOR_BOTTOM_SIDE          = 13;
+  GLUT_CURSOR_LEFT_SIDE            = 14;
+  GLUT_CURSOR_RIGHT_SIDE           = 15;
+  GLUT_CURSOR_TOP_LEFT_CORNER      = 16;
+  GLUT_CURSOR_TOP_RIGHT_CORNER     = 17;
+  GLUT_CURSOR_BOTTOM_RIGHT_CORNER  = 18;
+  GLUT_CURSOR_BOTTOM_LEFT_CORNER   = 19;
+  // Inherit from parent window.
+  GLUT_CURSOR_INHERIT              = 100;
+  // Blank cursor.
+  GLUT_CURSOR_NONE                 = 101;
+  // Fullscreen crosshair (if available).
+  GLUT_CURSOR_FULL_CROSSHAIR       = 102;
+
+  // GLUT device control sub-API.
+  // glutSetKeyRepeat modes.
+  GLUT_KEY_REPEAT_OFF      = 0;
+  GLUT_KEY_REPEAT_ON       = 1;
+  GLUT_KEY_REPEAT_DEFAULT  = 2;
+
+// Joystick button masks.
+  GLUT_JOYSTICK_BUTTON_A = 1;
+  GLUT_JOYSTICK_BUTTON_B = 2;
+  GLUT_JOYSTICK_BUTTON_C = 4;
+  GLUT_JOYSTICK_BUTTON_D = 8;
+
+  // GLUT game mode sub-API.
+  // glutGameModeGet.
+  GLUT_GAME_MODE_ACTIVE           = 0;
+  GLUT_GAME_MODE_POSSIBLE         = 1;
+  GLUT_GAME_MODE_WIDTH            = 2;
+  GLUT_GAME_MODE_HEIGHT           = 3;
+  GLUT_GAME_MODE_PIXEL_DEPTH      = 4;
+  GLUT_GAME_MODE_REFRESH_RATE     = 5;
+  GLUT_GAME_MODE_DISPLAY_CHANGED  = 6;
+
+{$IFDEF MORPHOS}
+
+{ MorphOS GL works differently due to different dynamic-library handling on Amiga-like }
+{ systems, so its headers are included here. }
+{$INCLUDE tinyglh.inc}
+
+{$ELSE MORPHOS}
+
+{$IFDEF GLUT_EXCLUSIVE_FPUMODE}
+var
+OLD_glutInit:procedure(argcp: PInteger; argv: PPChar); extdecl;
+OLD_glutInitDisplayMode:procedure(mode: Cardinal); extdecl;
+OLD_glutInitDisplayString:procedure(const str: PChar); extdecl;
+OLD_glutInitWindowPosition:procedure(x, y: Integer); extdecl;
+OLD_glutInitWindowSize:procedure(width, height: Integer); extdecl;
+OLD_glutMainLoop:procedure; extdecl;
+OLD_glutCreateWindow:function(const title: PChar): Integer; extdecl;
+OLD_glutCreateSubWindow:function(win, x, y, width, height: Integer): Integer; extdecl;
+OLD_glutDestroyWindow:procedure(win: Integer); extdecl;
+OLD_glutPostRedisplay:procedure; extdecl;
+OLD_glutPostWindowRedisplay:procedure(win: Integer); extdecl;
+OLD_glutSwapBuffers:procedure; extdecl;
+OLD_glutGetWindow:function: Integer; extdecl;
+OLD_glutSetWindow:procedure(win: Integer); extdecl;
+OLD_glutSetWindowTitle:procedure(const title: PChar); extdecl;
+OLD_glutSetIconTitle:procedure(const title: PChar); extdecl;
+OLD_glutPositionWindow:procedure(x, y: Integer); extdecl;
+OLD_glutReshapeWindow:procedure(width, height: Integer); extdecl;
+OLD_glutPopWindow:procedure; extdecl;
+OLD_glutPushWindow:procedure; extdecl;
+OLD_glutIconifyWindow:procedure; extdecl;
+OLD_glutShowWindow:procedure; extdecl;
+OLD_glutHideWindow:procedure; extdecl;
+OLD_glutFullScreen:procedure; extdecl;
+OLD_glutSetCursor:procedure(cursor: Integer); extdecl;
+OLD_glutWarpPointer:procedure(x, y: Integer); extdecl;
+OLD_glutEstablishOverlay:procedure; extdecl;
+OLD_glutRemoveOverlay:procedure; extdecl;
+OLD_glutUseLayer:procedure(layer: GLenum); extdecl;
+OLD_glutPostOverlayRedisplay:procedure; extdecl;
+OLD_glutPostWindowOverlayRedisplay:procedure(win: Integer); extdecl;
+OLD_glutShowOverlay:procedure; extdecl;
+OLD_glutHideOverlay:procedure; extdecl;
+OLD_glutCreateMenu:function(callback: TGlut1IntCallback): Integer; extdecl;
+OLD_glutDestroyMenu:procedure(menu: Integer); extdecl;
+OLD_glutGetMenu:function: Integer; extdecl;
+OLD_glutSetMenu:procedure(menu: Integer); extdecl;
+OLD_glutAddMenuEntry:procedure(const caption: PChar; value: Integer); extdecl;
+OLD_glutAddSubMenu:procedure(const caption: PChar; submenu: Integer); extdecl;
+OLD_glutChangeToMenuEntry:procedure(item: Integer; const caption: PChar; value: Integer); extdecl;
+OLD_glutChangeToSubMenu:procedure(item: Integer; const caption: PChar; submenu: Integer); extdecl;
+OLD_glutRemoveMenuItem:procedure(item: Integer); extdecl;
+OLD_glutAttachMenu:procedure(button: Integer); extdecl;
+OLD_glutDetachMenu:procedure(button: Integer); extdecl;
+OLD_glutDisplayFunc:procedure(f: TGlutVoidCallback); extdecl;
+OLD_glutReshapeFunc:procedure(f: TGlut2IntCallback); extdecl;
+OLD_glutKeyboardFunc:procedure(f: TGlut1Char2IntCallback); extdecl;
+OLD_glutMouseFunc:procedure(f: TGlut4IntCallback); extdecl;
+OLD_glutMotionFunc:procedure(f: TGlut2IntCallback); extdecl;
+OLD_glutPassiveMotionFunc:procedure(f: TGlut2IntCallback); extdecl;
+OLD_glutEntryFunc:procedure(f: TGlut1IntCallback); extdecl;
+OLD_glutVisibilityFunc:procedure(f: TGlut1IntCallback); extdecl;
+OLD_glutIdleFunc:procedure(f: TGlutVoidCallback); extdecl;
+OLD_glutTimerFunc:procedure(millis: Cardinal; f: TGlut1IntCallback; value: Integer); extdecl;
+OLD_glutMenuStateFunc:procedure(f: TGlut1IntCallback); extdecl;
+OLD_glutSpecialFunc:procedure(f: TGlut3IntCallback); extdecl;
+OLD_glutSpaceballMotionFunc:procedure(f: TGlut3IntCallback); extdecl;
+OLD_glutSpaceballRotateFunc:procedure(f: TGlut3IntCallback); extdecl;
+OLD_glutSpaceballButtonFunc:procedure(f: TGlut2IntCallback); extdecl;
+OLD_glutButtonBoxFunc:procedure(f: TGlut2IntCallback); extdecl;
+OLD_glutDialsFunc:procedure(f: TGlut2IntCallback); extdecl;
+OLD_glutTabletMotionFunc:procedure(f: TGlut2IntCallback); extdecl;
+OLD_glutTabletButtonFunc:procedure(f: TGlut4IntCallback); extdecl;
+OLD_glutMenuStatusFunc:procedure(f: TGlut3IntCallback); extdecl;
+OLD_glutOverlayDisplayFunc:procedure(f:TGlutVoidCallback); extdecl;
+OLD_glutWindowStatusFunc:procedure(f: TGlut1IntCallback); extdecl;
+OLD_glutKeyboardUpFunc:procedure(f: TGlut1Char2IntCallback); extdecl;
+OLD_glutSpecialUpFunc:procedure(f: TGlut3IntCallback); extdecl;
+OLD_glutJoystickFunc:procedure(f: TGlut1UInt3IntCallback; pollInterval: Integer); extdecl;
+OLD_glutSetColor:procedure(cell: Integer; red, green, blue: GLfloat); extdecl;
+OLD_glutGetColor:function(ndx, component: Integer): GLfloat; extdecl;
+OLD_glutCopyColormap:procedure(win: Integer); extdecl;
+OLD_glutGet:function(t: GLenum): Integer; extdecl;
+OLD_glutDeviceGet:function(t: GLenum): Integer; extdecl;
+OLD_glutExtensionSupported:function(const name: PChar): Integer; extdecl;
+OLD_glutGetModifiers:function: Integer; extdecl;
+OLD_glutLayerGet:function(t: GLenum): Integer; extdecl;
+OLD_glutBitmapCharacter:procedure(font : pointer; character: Integer); extdecl;
+OLD_glutBitmapWidth:function(font : pointer; character: Integer): Integer; extdecl;
+OLD_glutStrokeCharacter:procedure(font : pointer; character: Integer); extdecl;
+OLD_glutStrokeWidth:function(font : pointer; character: Integer): Integer; extdecl;
+OLD_glutBitmapLength:function(font: pointer; const str: PChar): Integer; extdecl;
+OLD_glutStrokeLength:function(font: pointer; const str: PChar): Integer; extdecl;
+OLD_glutWireSphere:procedure(radius: GLdouble; slices, stacks: GLint); extdecl;
+OLD_glutSolidSphere:procedure(radius: GLdouble; slices, stacks: GLint); extdecl;
+OLD_glutWireCone:procedure(base, height: GLdouble; slices, stacks: GLint); extdecl;
+OLD_glutSolidCone:procedure(base, height: GLdouble; slices, stacks: GLint); extdecl;
+OLD_glutWireCube:procedure(size: GLdouble); extdecl;
+OLD_glutSolidCube:procedure(size: GLdouble); extdecl;
+OLD_glutWireTorus:procedure(innerRadius, outerRadius: GLdouble; sides, rings: GLint); extdecl;
+OLD_glutSolidTorus:procedure(innerRadius, outerRadius: GLdouble; sides, rings: GLint); extdecl;
+OLD_glutWireDodecahedron:procedure; extdecl;
+OLD_glutSolidDodecahedron:procedure; extdecl;
+OLD_glutWireTeapot:procedure(size: GLdouble); extdecl;
+OLD_glutSolidTeapot:procedure(size: GLdouble); extdecl;
+OLD_glutWireOctahedron:procedure; extdecl;
+OLD_glutSolidOctahedron:procedure; extdecl;
+OLD_glutWireTetrahedron:procedure; extdecl;
+OLD_glutSolidTetrahedron:procedure; extdecl;
+OLD_glutWireIcosahedron:procedure; extdecl;
+OLD_glutSolidIcosahedron:procedure; extdecl;
+OLD_glutVideoResizeGet:function(param: GLenum): Integer; extdecl;
+OLD_glutSetupVideoResizing:procedure; extdecl;
+OLD_glutStopVideoResizing:procedure; extdecl;
+OLD_glutVideoResize:procedure(x, y, width, height: Integer); extdecl;
+OLD_glutVideoPan:procedure(x, y, width, height: Integer); extdecl;
+OLD_glutReportErrors:procedure; extdecl;
+OLD_glutIgnoreKeyRepeat:procedure(ignore: Integer); extdecl;
+OLD_glutSetKeyRepeat:procedure(repeatMode: Integer); extdecl;
+OLD_glutForceJoystickFunc:procedure; extdecl;
+OLD_glutGameModeString:procedure(const AString : PChar); extdecl;
+OLD_glutEnterGameMode:function: integer; extdecl;
+OLD_glutLeaveGameMode:procedure; extdecl;
+OLD_glutGameModeGet:function(mode : GLenum): integer; extdecl;
+
+procedure glutInit(argcp: PInteger; argv: PPChar); mode_inline;
+procedure glutInitDisplayMode(mode: Cardinal); mode_inline;
+procedure glutInitDisplayString(const str: PChar); mode_inline;
+procedure glutInitWindowPosition(x, y: Integer); mode_inline;
+procedure glutInitWindowSize(width, height: Integer); mode_inline;
+procedure glutMainLoop; mode_inline;
+function glutCreateWindow(const title: PChar): Integer; mode_inline;
+function glutCreateSubWindow(win, x, y, width, height: Integer): Integer; mode_inline;
+procedure glutDestroyWindow(win: Integer); mode_inline;
+procedure glutPostRedisplay; mode_inline;
+procedure glutPostWindowRedisplay(win: Integer); mode_inline;
+procedure glutSwapBuffers; mode_inline;
+function glutGetWindow: Integer; mode_inline;
+procedure glutSetWindow(win: Integer); mode_inline;
+procedure glutSetWindowTitle(const title: PChar); mode_inline;
+procedure glutSetIconTitle(const title: PChar); mode_inline;
+procedure glutPositionWindow(x, y: Integer); mode_inline;
+procedure glutReshapeWindow(width, height: Integer); mode_inline;
+procedure glutPopWindow; mode_inline;
+procedure glutPushWindow; mode_inline;
+procedure glutIconifyWindow; mode_inline;
+procedure glutShowWindow; mode_inline;
+procedure glutHideWindow; mode_inline;
+procedure glutFullScreen; mode_inline;
+procedure glutSetCursor(cursor: Integer); mode_inline;
+procedure glutWarpPointer(x, y: Integer); mode_inline;
+procedure glutEstablishOverlay; mode_inline;
+procedure glutRemoveOverlay; mode_inline;
+procedure glutUseLayer(layer: GLenum); mode_inline;
+procedure glutPostOverlayRedisplay; mode_inline;
+procedure glutPostWindowOverlayRedisplay(win: Integer); mode_inline;
+procedure glutShowOverlay; mode_inline;
+procedure glutHideOverlay; mode_inline;
+function glutCreateMenu(callback: TGlut1IntCallback): Integer; mode_inline;
+procedure glutDestroyMenu(menu: Integer); mode_inline;
+function glutGetMenu: Integer; mode_inline;
+procedure glutSetMenu(menu: Integer); mode_inline;
+procedure glutAddMenuEntry(const caption: PChar; value: Integer); mode_inline;
+procedure glutAddSubMenu(const caption: PChar; submenu: Integer); mode_inline;
+procedure glutChangeToMenuEntry(item: Integer; const caption: PChar; value: Integer); mode_inline;
+procedure glutChangeToSubMenu(item: Integer; const caption: PChar; submenu: Integer); mode_inline;
+procedure glutRemoveMenuItem(item: Integer); mode_inline;
+procedure glutAttachMenu(button: Integer); mode_inline;
+procedure glutDetachMenu(button: Integer); mode_inline;
+procedure glutDisplayFunc(f: TGlutVoidCallback); mode_inline;
+procedure glutReshapeFunc(f: TGlut2IntCallback); mode_inline;
+procedure glutKeyboardFunc(f: TGlut1Char2IntCallback); mode_inline;
+procedure glutMouseFunc(f: TGlut4IntCallback); mode_inline;
+procedure glutMotionFunc(f: TGlut2IntCallback); mode_inline;
+procedure glutPassiveMotionFunc(f: TGlut2IntCallback); mode_inline;
+procedure glutEntryFunc(f: TGlut1IntCallback); mode_inline;
+procedure glutVisibilityFunc(f: TGlut1IntCallback); mode_inline;
+procedure glutIdleFunc(f: TGlutVoidCallback); mode_inline;
+procedure glutTimerFunc(millis: Cardinal; f: TGlut1IntCallback; value: Integer); mode_inline;
+procedure glutMenuStateFunc(f: TGlut1IntCallback); mode_inline;
+procedure glutSpecialFunc(f: TGlut3IntCallback); mode_inline;
+procedure glutSpaceballMotionFunc(f: TGlut3IntCallback); mode_inline;
+procedure glutSpaceballRotateFunc(f: TGlut3IntCallback); mode_inline;
+procedure glutSpaceballButtonFunc(f: TGlut2IntCallback); mode_inline;
+procedure glutButtonBoxFunc(f: TGlut2IntCallback); mode_inline;
+procedure glutDialsFunc(f: TGlut2IntCallback); mode_inline;
+procedure glutTabletMotionFunc(f: TGlut2IntCallback); mode_inline;
+procedure glutTabletButtonFunc(f: TGlut4IntCallback); mode_inline;
+procedure glutMenuStatusFunc(f: TGlut3IntCallback); mode_inline;
+procedure glutOverlayDisplayFunc(f:TGlutVoidCallback); mode_inline;
+procedure glutWindowStatusFunc(f: TGlut1IntCallback); mode_inline;
+procedure glutKeyboardUpFunc(f: TGlut1Char2IntCallback); mode_inline;
+procedure glutSpecialUpFunc(f: TGlut3IntCallback); mode_inline;
+procedure glutJoystickFunc(f: TGlut1UInt3IntCallback; pollInterval: Integer); mode_inline;
+procedure glutSetColor(cell: Integer; red, green, blue: GLfloat); mode_inline;
+function glutGetColor(ndx, component: Integer): GLfloat; mode_inline;
+procedure glutCopyColormap(win: Integer); mode_inline;
+function glutGet(t: GLenum): Integer; mode_inline;
+function glutDeviceGet(t: GLenum): Integer; mode_inline;
+function glutExtensionSupported(const name: PChar): Integer; mode_inline;
+function glutGetModifiers: Integer; mode_inline;
+function glutLayerGet(t: GLenum): Integer; mode_inline;
+procedure glutBitmapCharacter(font : pointer; character: Integer); mode_inline;
+function glutBitmapWidth(font : pointer; character: Integer): Integer; mode_inline;
+procedure glutStrokeCharacter(font : pointer; character: Integer); mode_inline;
+function glutStrokeWidth(font : pointer; character: Integer): Integer; mode_inline;
+function glutBitmapLength(font: pointer; const str: PChar): Integer; mode_inline;
+function glutStrokeLength(font: pointer; const str: PChar): Integer; mode_inline;
+procedure glutWireSphere(radius: GLdouble; slices, stacks: GLint); mode_inline;
+procedure glutSolidSphere(radius: GLdouble; slices, stacks: GLint); mode_inline;
+procedure glutWireCone(base, height: GLdouble; slices, stacks: GLint); mode_inline;
+procedure glutSolidCone(base, height: GLdouble; slices, stacks: GLint); mode_inline;
+procedure glutWireCube(size: GLdouble); mode_inline;
+procedure glutSolidCube(size: GLdouble); mode_inline;
+procedure glutWireTorus(innerRadius, outerRadius: GLdouble; sides, rings: GLint); mode_inline;
+procedure glutSolidTorus(innerRadius, outerRadius: GLdouble; sides, rings: GLint); mode_inline;
+procedure glutWireDodecahedron; mode_inline;
+procedure glutSolidDodecahedron; mode_inline;
+procedure glutWireTeapot(size: GLdouble); mode_inline;
+procedure glutSolidTeapot(size: GLdouble); mode_inline;
+procedure glutWireOctahedron; mode_inline;
+procedure glutSolidOctahedron; mode_inline;
+procedure glutWireTetrahedron; mode_inline;
+procedure glutSolidTetrahedron; mode_inline;
+procedure glutWireIcosahedron; mode_inline;
+procedure glutSolidIcosahedron; mode_inline;
+function glutVideoResizeGet(param: GLenum): Integer; mode_inline;
+procedure glutSetupVideoResizing; mode_inline;
+procedure glutStopVideoResizing; mode_inline;
+procedure glutVideoResize(x, y, width, height: Integer); mode_inline;
+procedure glutVideoPan(x, y, width, height: Integer); mode_inline;
+procedure glutReportErrors; mode_inline;
+procedure glutIgnoreKeyRepeat(ignore: Integer); mode_inline;
+procedure glutSetKeyRepeat(repeatMode: Integer); mode_inline;
+procedure glutForceJoystickFunc; mode_inline;
+procedure glutGameModeString(const AString : PChar); mode_inline;
+function glutEnterGameMode: integer; mode_inline;
+procedure glutLeaveGameMode; mode_inline;
+function glutGameModeGet(mode : GLenum): integer; mode_inline;
+
+
+{$ELSE GLUT_EXCLUSIVE_FPUMODE}
+var
+// GLUT initialization sub-API.
+  glutInit: procedure(argcp: PInteger; argv: PPChar); extdecl;
+  glutInitDisplayMode: procedure(mode: Cardinal); extdecl;
+  glutInitDisplayString: procedure(const str: PChar); extdecl;
+  glutInitWindowPosition: procedure(x, y: Integer); extdecl;
+  glutInitWindowSize: procedure(width, height: Integer); extdecl;
+  glutMainLoop: procedure; extdecl;
+
+// GLUT window sub-API.
+  glutCreateWindow: function(const title: PChar): Integer; extdecl;
+  glutCreateSubWindow: function(win, x, y, width, height: Integer): Integer; extdecl;
+  glutDestroyWindow: procedure(win: Integer); extdecl;
+  glutPostRedisplay: procedure; extdecl;
+  glutPostWindowRedisplay: procedure(win: Integer); extdecl;
+  glutSwapBuffers: procedure; extdecl;
+  glutGetWindow: function: Integer; extdecl;
+  glutSetWindow: procedure(win: Integer); extdecl;
+  glutSetWindowTitle: procedure(const title: PChar); extdecl;
+  glutSetIconTitle: procedure(const title: PChar); extdecl;
+  glutPositionWindow: procedure(x, y: Integer); extdecl;
+  glutReshapeWindow: procedure(width, height: Integer); extdecl;
+  glutPopWindow: procedure; extdecl;
+  glutPushWindow: procedure; extdecl;
+  glutIconifyWindow: procedure; extdecl;
+  glutShowWindow: procedure; extdecl;
+  glutHideWindow: procedure; extdecl;
+  glutFullScreen: procedure; extdecl;
+  glutSetCursor: procedure(cursor: Integer); extdecl;
+  glutWarpPointer: procedure(x, y: Integer); extdecl;
+
+// GLUT overlay sub-API.
+  glutEstablishOverlay: procedure; extdecl;
+  glutRemoveOverlay: procedure; extdecl;
+  glutUseLayer: procedure(layer: GLenum); extdecl;
+  glutPostOverlayRedisplay: procedure; extdecl;
+  glutPostWindowOverlayRedisplay: procedure(win: Integer); extdecl;
+  glutShowOverlay: procedure; extdecl;
+  glutHideOverlay: procedure; extdecl;
+
+// GLUT menu sub-API.
+  glutCreateMenu: function(callback: TGlut1IntCallback): Integer; extdecl;
+  glutDestroyMenu: procedure(menu: Integer); extdecl;
+  glutGetMenu: function: Integer; extdecl;
+  glutSetMenu: procedure(menu: Integer); extdecl;
+  glutAddMenuEntry: procedure(const caption: PChar; value: Integer); extdecl;
+  glutAddSubMenu: procedure(const caption: PChar; submenu: Integer); extdecl;
+  glutChangeToMenuEntry: procedure(item: Integer; const caption: PChar; value: Integer); extdecl;
+  glutChangeToSubMenu: procedure(item: Integer; const caption: PChar; submenu: Integer); extdecl;
+  glutRemoveMenuItem: procedure(item: Integer); extdecl;
+  glutAttachMenu: procedure(button: Integer); extdecl;
+  glutDetachMenu: procedure(button: Integer); extdecl;
+
+// GLUT window callback sub-API.
+  glutDisplayFunc: procedure(f: TGlutVoidCallback); extdecl;
+  glutReshapeFunc: procedure(f: TGlut2IntCallback); extdecl;
+  glutKeyboardFunc: procedure(f: TGlut1Char2IntCallback); extdecl;
+  glutMouseFunc: procedure(f: TGlut4IntCallback); extdecl;
+  glutMotionFunc: procedure(f: TGlut2IntCallback); extdecl;
+  glutPassiveMotionFunc: procedure(f: TGlut2IntCallback); extdecl;
+  glutEntryFunc: procedure(f: TGlut1IntCallback); extdecl;
+  glutVisibilityFunc: procedure(f: TGlut1IntCallback); extdecl;
+  glutIdleFunc: procedure(f: TGlutVoidCallback); extdecl;
+  glutTimerFunc: procedure(millis: Cardinal; f: TGlut1IntCallback; value: Integer); extdecl;
+  glutMenuStateFunc: procedure(f: TGlut1IntCallback); extdecl;
+  glutSpecialFunc: procedure(f: TGlut3IntCallback); extdecl;
+  glutSpaceballMotionFunc: procedure(f: TGlut3IntCallback); extdecl;
+  glutSpaceballRotateFunc: procedure(f: TGlut3IntCallback); extdecl;
+  glutSpaceballButtonFunc: procedure(f: TGlut2IntCallback); extdecl;
+  glutButtonBoxFunc: procedure(f: TGlut2IntCallback); extdecl;
+  glutDialsFunc: procedure(f: TGlut2IntCallback); extdecl;
+  glutTabletMotionFunc: procedure(f: TGlut2IntCallback); extdecl;
+  glutTabletButtonFunc: procedure(f: TGlut4IntCallback); extdecl;
+  glutMenuStatusFunc: procedure(f: TGlut3IntCallback); extdecl;
+  glutOverlayDisplayFunc: procedure(f:TGlutVoidCallback); extdecl;
+  glutWindowStatusFunc: procedure(f: TGlut1IntCallback); extdecl;
+  glutKeyboardUpFunc: procedure(f: TGlut1Char2IntCallback); extdecl;
+  glutSpecialUpFunc: procedure(f: TGlut3IntCallback); extdecl;
+  glutJoystickFunc: procedure(f: TGlut1UInt3IntCallback; pollInterval: Integer); extdecl;
+
+// GLUT color index sub-API.
+  glutSetColor: procedure(cell: Integer; red, green, blue: GLfloat); extdecl;
+  glutGetColor: function(ndx, component: Integer): GLfloat; extdecl;
+  glutCopyColormap: procedure(win: Integer); extdecl;
+
+// GLUT state retrieval sub-API.
+  glutGet: function(t: GLenum): Integer; extdecl;
+  glutDeviceGet: function(t: GLenum): Integer; extdecl;
+
+// GLUT extension support sub-API
+  glutExtensionSupported: function(const name: PChar): Integer; extdecl;
+  glutGetModifiers: function: Integer; extdecl;
+  glutLayerGet: function(t: GLenum): Integer; extdecl;
+
+// GLUT font sub-API
+  glutBitmapCharacter: procedure(font : pointer; character: Integer); extdecl;
+  glutBitmapWidth: function(font : pointer; character: Integer): Integer; extdecl;
+  glutStrokeCharacter: procedure(font : pointer; character: Integer); extdecl;
+  glutStrokeWidth: function(font : pointer; character: Integer): Integer; extdecl;
+  glutBitmapLength: function(font: pointer; const str: PChar): Integer; extdecl;
+  glutStrokeLength: function(font: pointer; const str: PChar): Integer; extdecl;
+
+// GLUT pre-built models sub-API
+  glutWireSphere: procedure(radius: GLdouble; slices, stacks: GLint); extdecl;
+  glutSolidSphere: procedure(radius: GLdouble; slices, stacks: GLint); extdecl;
+  glutWireCone: procedure(base, height: GLdouble; slices, stacks: GLint); extdecl;
+  glutSolidCone: procedure(base, height: GLdouble; slices, stacks: GLint); extdecl;
+  glutWireCube: procedure(size: GLdouble); extdecl;
+  glutSolidCube: procedure(size: GLdouble); extdecl;
+  glutWireTorus: procedure(innerRadius, outerRadius: GLdouble; sides, rings: GLint); extdecl;
+  glutSolidTorus: procedure(innerRadius, outerRadius: GLdouble; sides, rings: GLint); extdecl;
+  glutWireDodecahedron: procedure; extdecl;
+  glutSolidDodecahedron: procedure; extdecl;
+  glutWireTeapot: procedure(size: GLdouble); extdecl;
+  glutSolidTeapot: procedure(size: GLdouble); extdecl;
+  glutWireOctahedron: procedure; extdecl;
+  glutSolidOctahedron: procedure; extdecl;
+  glutWireTetrahedron: procedure; extdecl;
+  glutSolidTetrahedron: procedure; extdecl;
+  glutWireIcosahedron: procedure; extdecl;
+  glutSolidIcosahedron: procedure; extdecl;
+
+// GLUT video resize sub-API.
+  glutVideoResizeGet: function(param: GLenum): Integer; extdecl;
+  glutSetupVideoResizing: procedure; extdecl;
+  glutStopVideoResizing: procedure; extdecl;
+  glutVideoResize: procedure(x, y, width, height: Integer); extdecl;
+  glutVideoPan: procedure(x, y, width, height: Integer); extdecl;
+
+// GLUT debugging sub-API.
+  glutReportErrors: procedure; extdecl;
+
+// GLUT device control sub-API.
+
+  glutIgnoreKeyRepeat: procedure(ignore: Integer); extdecl;
+  glutSetKeyRepeat: procedure(repeatMode: Integer); extdecl;
+  glutForceJoystickFunc: procedure; extdecl;
+
+// GLUT game mode sub-API.
+
+  //example glutGameModeString('1280x1024:32@75');
+  glutGameModeString : procedure (const AString : PChar); extdecl;
+  glutEnterGameMode : function : integer; extdecl;
+  glutLeaveGameMode : procedure; extdecl;
+  glutGameModeGet : function (mode : GLenum) : integer; extdecl;
+
+{$ENDIF GLUT_EXCLUSIVE_FPUMODE}
+{$ENDIF MORPHOS}
+
+procedure LoadGlut(const dll: String);
+procedure FreeGlut;
+
+implementation
+
+{$IFDEF MORPHOS}
+
+{ MorphOS GL works differently due to different dynamic-library handling on Amiga-like }
+{ systems, so its functions are included here. }
+{$INCLUDE tinygl.inc}
+
+{$ELSE MORPHOS}
+var
+  hDLL: TLibHandle;
+{$ENDIF MORPHOS}
+
+procedure FreeGlut;
+begin
+{$IFDEF MORPHOS}
+  // MorphOS's GL will closed down by TinyGL unit, nothing is needed here.
+{$ELSE MORPHOS}
+
+  if (hDLL <> 0) then
+    FreeLibrary(hDLL);
+
+{$IFDEF GLUT_EXCLUSIVE_FPUMODE}
+
+  @OLD_glutInit := nil;
+  @OLD_glutInitDisplayMode := nil;
+  @OLD_glutInitDisplayString := nil;
+  @OLD_glutInitWindowPosition := nil;
+  @OLD_glutInitWindowSize := nil;
+  @OLD_glutMainLoop := nil;
+  @OLD_glutCreateWindow := nil;
+  @OLD_glutCreateSubWindow := nil;
+  @OLD_glutDestroyWindow := nil;
+  @OLD_glutPostRedisplay := nil;
+  @OLD_glutPostWindowRedisplay := nil;
+  @OLD_glutSwapBuffers := nil;
+  @OLD_glutGetWindow := nil;
+  @OLD_glutSetWindow := nil;
+  @OLD_glutSetWindowTitle := nil;
+  @OLD_glutSetIconTitle := nil;
+  @OLD_glutPositionWindow := nil;
+  @OLD_glutReshapeWindow := nil;
+  @OLD_glutPopWindow := nil;
+  @OLD_glutPushWindow := nil;
+  @OLD_glutIconifyWindow := nil;
+  @OLD_glutShowWindow := nil;
+  @OLD_glutHideWindow := nil;
+  @OLD_glutFullScreen := nil;
+  @OLD_glutSetCursor := nil;
+  @OLD_glutWarpPointer := nil;
+  @OLD_glutEstablishOverlay := nil;
+  @OLD_glutRemoveOverlay := nil;
+  @OLD_glutUseLayer := nil;
+  @OLD_glutPostOverlayRedisplay := nil;
+  @OLD_glutPostWindowOverlayRedisplay := nil;
+  @OLD_glutShowOverlay := nil;
+  @OLD_glutHideOverlay := nil;
+  @OLD_glutCreateMenu := nil;
+  @OLD_glutDestroyMenu := nil;
+  @OLD_glutGetMenu := nil;
+  @OLD_glutSetMenu := nil;
+  @OLD_glutAddMenuEntry := nil;
+  @OLD_glutAddSubMenu := nil;
+  @OLD_glutChangeToMenuEntry := nil;
+  @OLD_glutChangeToSubMenu := nil;
+  @OLD_glutRemoveMenuItem := nil;
+  @OLD_glutAttachMenu := nil;
+  @OLD_glutDetachMenu := nil;
+  @OLD_glutDisplayFunc := nil;
+  @OLD_glutReshapeFunc := nil;
+  @OLD_glutKeyboardFunc := nil;
+  @OLD_glutMouseFunc := nil;
+  @OLD_glutMotionFunc := nil;
+  @OLD_glutPassiveMotionFunc := nil;
+  @OLD_glutEntryFunc := nil;
+  @OLD_glutVisibilityFunc := nil;
+  @OLD_glutIdleFunc := nil;
+  @OLD_glutTimerFunc := nil;
+  @OLD_glutMenuStateFunc := nil;
+  @OLD_glutSpecialFunc := nil;
+  @OLD_glutSpaceballMotionFunc := nil;
+  @OLD_glutSpaceballRotateFunc := nil;
+  @OLD_glutSpaceballButtonFunc := nil;
+  @OLD_glutButtonBoxFunc := nil;
+  @OLD_glutDialsFunc := nil;
+  @OLD_glutTabletMotionFunc := nil;
+  @OLD_glutTabletButtonFunc := nil;
+  @OLD_glutMenuStatusFunc := nil;
+  @OLD_glutOverlayDisplayFunc := nil;
+  @OLD_glutWindowStatusFunc := nil;
+  @OLD_glutKeyboardUpFunc := nil;
+  @OLD_glutSpecialUpFunc := nil;
+  @OLD_glutJoystickFunc := nil;
+  @OLD_glutSetColor := nil;
+  @OLD_glutGetColor := nil;
+  @OLD_glutCopyColormap := nil;
+  @OLD_glutGet := nil;
+  @OLD_glutDeviceGet := nil;
+  @OLD_glutExtensionSupported := nil;
+  @OLD_glutGetModifiers := nil;
+  @OLD_glutLayerGet := nil;
+  @OLD_glutBitmapCharacter := nil;
+  @OLD_glutBitmapWidth := nil;
+  @OLD_glutStrokeCharacter := nil;
+  @OLD_glutStrokeWidth := nil;
+  @OLD_glutBitmapLength := nil;
+  @OLD_glutStrokeLength := nil;
+  @OLD_glutWireSphere := nil;
+  @OLD_glutSolidSphere := nil;
+  @OLD_glutWireCone := nil;
+  @OLD_glutSolidCone := nil;
+  @OLD_glutWireCube := nil;
+  @OLD_glutSolidCube := nil;
+  @OLD_glutWireTorus := nil;
+  @OLD_glutSolidTorus := nil;
+  @OLD_glutWireDodecahedron := nil;
+  @OLD_glutSolidDodecahedron := nil;
+  @OLD_glutWireTeapot := nil;
+  @OLD_glutSolidTeapot := nil;
+  @OLD_glutWireOctahedron := nil;
+  @OLD_glutSolidOctahedron := nil;
+  @OLD_glutWireTetrahedron := nil;
+  @OLD_glutSolidTetrahedron := nil;
+  @OLD_glutWireIcosahedron := nil;
+  @OLD_glutSolidIcosahedron := nil;
+  @OLD_glutVideoResizeGet := nil;
+  @OLD_glutSetupVideoResizing := nil;
+  @OLD_glutStopVideoResizing := nil;
+  @OLD_glutVideoResize := nil;
+  @OLD_glutVideoPan := nil;
+  @OLD_glutReportErrors := nil;
+  @OLD_glutIgnoreKeyRepeat := nil;
+  @OLD_glutSetKeyRepeat := nil;
+  @OLD_glutForceJoystickFunc := nil;
+  @OLD_glutGameModeString := nil;
+  @OLD_glutEnterGameMode := nil;
+  @OLD_glutLeaveGameMode := nil;
+  @OLD_glutGameModeGet := nil;
+
+{$ELSE GLUT_EXCLUSIVE_FPUMODE}
+  @glutInit := nil;
+  @glutInitDisplayMode := nil;
+  @glutInitDisplayString := nil;
+  @glutInitWindowPosition := nil;
+  @glutInitWindowSize := nil;
+  @glutMainLoop := nil;
+  @glutCreateWindow := nil;
+  @glutCreateSubWindow := nil;
+  @glutDestroyWindow := nil;
+  @glutPostRedisplay := nil;
+  @glutPostWindowRedisplay := nil;
+  @glutSwapBuffers := nil;
+  @glutGetWindow := nil;
+  @glutSetWindow := nil;
+  @glutSetWindowTitle := nil;
+  @glutSetIconTitle := nil;
+  @glutPositionWindow := nil;
+  @glutReshapeWindow := nil;
+  @glutPopWindow := nil;
+  @glutPushWindow := nil;
+  @glutIconifyWindow := nil;
+  @glutShowWindow := nil;
+  @glutHideWindow := nil;
+  @glutFullScreen := nil;
+  @glutSetCursor := nil;
+  @glutWarpPointer := nil;
+  @glutEstablishOverlay := nil;
+  @glutRemoveOverlay := nil;
+  @glutUseLayer := nil;
+  @glutPostOverlayRedisplay := nil;
+  @glutPostWindowOverlayRedisplay := nil;
+  @glutShowOverlay := nil;
+  @glutHideOverlay := nil;
+  @glutCreateMenu := nil;
+  @glutDestroyMenu := nil;
+  @glutGetMenu := nil;
+  @glutSetMenu := nil;
+  @glutAddMenuEntry := nil;
+  @glutAddSubMenu := nil;
+  @glutChangeToMenuEntry := nil;
+  @glutChangeToSubMenu := nil;
+  @glutRemoveMenuItem := nil;
+  @glutAttachMenu := nil;
+  @glutDetachMenu := nil;
+  @glutDisplayFunc := nil;
+  @glutReshapeFunc := nil;
+  @glutKeyboardFunc := nil;
+  @glutMouseFunc := nil;
+  @glutMotionFunc := nil;
+  @glutPassiveMotionFunc := nil;
+  @glutEntryFunc := nil;
+  @glutVisibilityFunc := nil;
+  @glutIdleFunc := nil;
+  @glutTimerFunc := nil;
+  @glutMenuStateFunc := nil;
+  @glutSpecialFunc := nil;
+  @glutSpaceballMotionFunc := nil;
+  @glutSpaceballRotateFunc := nil;
+  @glutSpaceballButtonFunc := nil;
+  @glutButtonBoxFunc := nil;
+  @glutDialsFunc := nil;
+  @glutTabletMotionFunc := nil;
+  @glutTabletButtonFunc := nil;
+  @glutMenuStatusFunc := nil;
+  @glutOverlayDisplayFunc := nil;
+  @glutWindowStatusFunc := nil;
+  @glutKeyboardUpFunc := nil;
+  @glutSpecialUpFunc := nil;
+  @glutJoystickFunc := nil;
+  @glutSetColor := nil;
+  @glutGetColor := nil;
+  @glutCopyColormap := nil;
+  @glutGet := nil;
+  @glutDeviceGet := nil;
+  @glutExtensionSupported := nil;
+  @glutGetModifiers := nil;
+  @glutLayerGet := nil;
+  @glutBitmapCharacter := nil;
+  @glutBitmapWidth := nil;
+  @glutStrokeCharacter := nil;
+  @glutStrokeWidth := nil;
+  @glutBitmapLength := nil;
+  @glutStrokeLength := nil;
+  @glutWireSphere := nil;
+  @glutSolidSphere := nil;
+  @glutWireCone := nil;
+  @glutSolidCone := nil;
+  @glutWireCube := nil;
+  @glutSolidCube := nil;
+  @glutWireTorus := nil;
+  @glutSolidTorus := nil;
+  @glutWireDodecahedron := nil;
+  @glutSolidDodecahedron := nil;
+  @glutWireTeapot := nil;
+  @glutSolidTeapot := nil;
+  @glutWireOctahedron := nil;
+  @glutSolidOctahedron := nil;
+  @glutWireTetrahedron := nil;
+  @glutSolidTetrahedron := nil;
+  @glutWireIcosahedron := nil;
+  @glutSolidIcosahedron := nil;
+  @glutVideoResizeGet := nil;
+  @glutSetupVideoResizing := nil;
+  @glutStopVideoResizing := nil;
+  @glutVideoResize := nil;
+  @glutVideoPan := nil;
+  @glutReportErrors := nil;
+  @glutIgnoreKeyRepeat := nil;
+  @glutSetKeyRepeat := nil;
+  @glutForceJoystickFunc := nil;
+  @glutGameModeString := nil;
+  @glutEnterGameMode := nil;
+  @glutLeaveGameMode := nil;
+  @glutGameModeGet := nil;
+{$ENDIF GLUT_EXCLUSIVE_FPUMODE}
+{$ENDIF MORPHOS}
+end;
+
+procedure LoadGlut(const dll: String);
+{$IFDEF MORPHOS}
+begin
+  // MorphOS's GL has own initialization in TinyGL unit, nothing is needed here.
+end;
+{$ELSE MORPHOS}
+var
+  MethodName: string = '';
+
+  function GetGLutProcAddress(Lib: PtrInt; ProcName: PChar): Pointer;
+  begin
+    MethodName:=ProcName;
+    Result:=GetProcAddress(Lib, ProcName);
+  end;
+
+begin
+
+  FreeGlut;
+
+  hDLL := LoadLibrary(PChar(dll));
+  if hDLL = 0 then raise Exception.Create('Could not load Glut from ' + dll);
+  try
+{$IFDEF GLUT_EXCLUSIVE_FPUMODE}
+    @OLD_glutInit := GetGLutProcAddress(hDLL, 'glutInit');
+    @OLD_glutInitDisplayMode := GetGLutProcAddress(hDLL, 'glutInitDisplayMode');
+    @OLD_glutInitDisplayString := GetGLutProcAddress(hDLL, 'glutInitDisplayString');
+    @OLD_glutInitWindowPosition := GetGLutProcAddress(hDLL, 'glutInitWindowPosition');
+    @OLD_glutInitWindowSize := GetGLutProcAddress(hDLL, 'glutInitWindowSize');
+    @OLD_glutMainLoop := GetGLutProcAddress(hDLL, 'glutMainLoop');
+    @OLD_glutCreateWindow := GetGLutProcAddress(hDLL, 'glutCreateWindow');
+    @OLD_glutCreateSubWindow := GetGLutProcAddress(hDLL, 'glutCreateSubWindow');
+    @OLD_glutDestroyWindow := GetGLutProcAddress(hDLL, 'glutDestroyWindow');
+    @OLD_glutPostRedisplay := GetGLutProcAddress(hDLL, 'glutPostRedisplay');
+    @OLD_glutPostWindowRedisplay := GetGLutProcAddress(hDLL, 'glutPostWindowRedisplay');
+    @OLD_glutSwapBuffers := GetGLutProcAddress(hDLL, 'glutSwapBuffers');
+    @OLD_glutGetWindow := GetGLutProcAddress(hDLL, 'glutGetWindow');
+    @OLD_glutSetWindow := GetGLutProcAddress(hDLL, 'glutSetWindow');
+    @OLD_glutSetWindowTitle := GetGLutProcAddress(hDLL, 'glutSetWindowTitle');
+    @OLD_glutSetIconTitle := GetGLutProcAddress(hDLL, 'glutSetIconTitle');
+    @OLD_glutPositionWindow := GetGLutProcAddress(hDLL, 'glutPositionWindow');
+    @OLD_glutReshapeWindow := GetGLutProcAddress(hDLL, 'glutReshapeWindow');
+    @OLD_glutPopWindow := GetGLutProcAddress(hDLL, 'glutPopWindow');
+    @OLD_glutPushWindow := GetGLutProcAddress(hDLL, 'glutPushWindow');
+    @OLD_glutIconifyWindow := GetGLutProcAddress(hDLL, 'glutIconifyWindow');
+    @OLD_glutShowWindow := GetGLutProcAddress(hDLL, 'glutShowWindow');
+    @OLD_glutHideWindow := GetGLutProcAddress(hDLL, 'glutHideWindow');
+    @OLD_glutFullScreen := GetGLutProcAddress(hDLL, 'glutFullScreen');
+    @OLD_glutSetCursor := GetGLutProcAddress(hDLL, 'glutSetCursor');
+    @OLD_glutWarpPointer := GetGLutProcAddress(hDLL, 'glutWarpPointer');
+    @OLD_glutEstablishOverlay := GetGLutProcAddress(hDLL, 'glutEstablishOverlay');
+    @OLD_glutRemoveOverlay := GetGLutProcAddress(hDLL, 'glutRemoveOverlay');
+    @OLD_glutUseLayer := GetGLutProcAddress(hDLL, 'glutUseLayer');
+    @OLD_glutPostOverlayRedisplay := GetGLutProcAddress(hDLL, 'glutPostOverlayRedisplay');
+    @OLD_glutPostWindowOverlayRedisplay := GetGLutProcAddress(hDLL, 'glutPostWindowOverlayRedisplay');
+    @OLD_glutShowOverlay := GetGLutProcAddress(hDLL, 'glutShowOverlay');
+    @OLD_glutHideOverlay := GetGLutProcAddress(hDLL, 'glutHideOverlay');
+    @OLD_glutCreateMenu := GetGLutProcAddress(hDLL, 'glutCreateMenu');
+    @OLD_glutDestroyMenu := GetGLutProcAddress(hDLL, 'glutDestroyMenu');
+    @OLD_glutGetMenu := GetGLutProcAddress(hDLL, 'glutGetMenu');
+    @OLD_glutSetMenu := GetGLutProcAddress(hDLL, 'glutSetMenu');
+    @OLD_glutAddMenuEntry := GetGLutProcAddress(hDLL, 'glutAddMenuEntry');
+    @OLD_glutAddSubMenu := GetGLutProcAddress(hDLL, 'glutAddSubMenu');
+    @OLD_glutChangeToMenuEntry := GetGLutProcAddress(hDLL, 'glutChangeToMenuEntry');
+    @OLD_glutChangeToSubMenu := GetGLutProcAddress(hDLL, 'glutChangeToSubMenu');
+    @OLD_glutRemoveMenuItem := GetGLutProcAddress(hDLL, 'glutRemoveMenuItem');
+    @OLD_glutAttachMenu := GetGLutProcAddress(hDLL, 'glutAttachMenu');
+    @OLD_glutDetachMenu := GetGLutProcAddress(hDLL, 'glutDetachMenu');
+    @OLD_glutDisplayFunc := GetGLutProcAddress(hDLL, 'glutDisplayFunc');
+    @OLD_glutReshapeFunc := GetGLutProcAddress(hDLL, 'glutReshapeFunc');
+    @OLD_glutKeyboardFunc := GetGLutProcAddress(hDLL, 'glutKeyboardFunc');
+    @OLD_glutMouseFunc := GetGLutProcAddress(hDLL, 'glutMouseFunc');
+    @OLD_glutMotionFunc := GetGLutProcAddress(hDLL, 'glutMotionFunc');
+    @OLD_glutPassiveMotionFunc := GetGLutProcAddress(hDLL, 'glutPassiveMotionFunc');
+    @OLD_glutEntryFunc := GetGLutProcAddress(hDLL, 'glutEntryFunc');
+    @OLD_glutVisibilityFunc := GetGLutProcAddress(hDLL, 'glutVisibilityFunc');
+    @OLD_glutIdleFunc := GetGLutProcAddress(hDLL, 'glutIdleFunc');
+    @OLD_glutTimerFunc := GetGLutProcAddress(hDLL, 'glutTimerFunc');
+    @OLD_glutMenuStateFunc := GetGLutProcAddress(hDLL, 'glutMenuStateFunc');
+    @OLD_glutSpecialFunc := GetGLutProcAddress(hDLL, 'glutSpecialFunc');
+    @OLD_glutSpaceballMotionFunc := GetGLutProcAddress(hDLL, 'glutSpaceballMotionFunc');
+    @OLD_glutSpaceballRotateFunc := GetGLutProcAddress(hDLL, 'glutSpaceballRotateFunc');
+    @OLD_glutSpaceballButtonFunc := GetGLutProcAddress(hDLL, 'glutSpaceballButtonFunc');
+    @OLD_glutButtonBoxFunc := GetGLutProcAddress(hDLL, 'glutButtonBoxFunc');
+    @OLD_glutDialsFunc := GetGLutProcAddress(hDLL, 'glutDialsFunc');
+    @OLD_glutTabletMotionFunc := GetGLutProcAddress(hDLL, 'glutTabletMotionFunc');
+    @OLD_glutTabletButtonFunc := GetGLutProcAddress(hDLL, 'glutTabletButtonFunc');
+    @OLD_glutMenuStatusFunc := GetGLutProcAddress(hDLL, 'glutMenuStatusFunc');
+    @OLD_glutOverlayDisplayFunc := GetGLutProcAddress(hDLL, 'glutOverlayDisplayFunc');
+    @OLD_glutWindowStatusFunc := GetGLutProcAddress(hDLL, 'glutWindowStatusFunc');
+    @OLD_glutKeyboardUpFunc := GetGLutProcAddress(hDLL, 'glutKeyboardUpFunc');
+    @OLD_glutSpecialUpFunc := GetGLutProcAddress(hDLL, 'glutSpecialUpFunc');
+    @OLD_glutJoystickFunc := GetGLutProcAddress(hDLL, 'glutJoystickFunc');
+    @OLD_glutSetColor := GetGLutProcAddress(hDLL, 'glutSetColor');
+    @OLD_glutGetColor := GetGLutProcAddress(hDLL, 'glutGetColor');
+    @OLD_glutCopyColormap := GetGLutProcAddress(hDLL, 'glutCopyColormap');
+    @OLD_glutGet := GetGLutProcAddress(hDLL, 'glutGet');
+    @OLD_glutDeviceGet := GetGLutProcAddress(hDLL, 'glutDeviceGet');
+    @OLD_glutExtensionSupported := GetGLutProcAddress(hDLL, 'glutExtensionSupported');
+    @OLD_glutGetModifiers := GetGLutProcAddress(hDLL, 'glutGetModifiers');
+    @OLD_glutLayerGet := GetGLutProcAddress(hDLL, 'glutLayerGet');
+    @OLD_glutBitmapCharacter := GetGLutProcAddress(hDLL, 'glutBitmapCharacter');
+    @OLD_glutBitmapWidth := GetGLutProcAddress(hDLL, 'glutBitmapWidth');
+    @OLD_glutStrokeCharacter := GetGLutProcAddress(hDLL, 'glutStrokeCharacter');
+    @OLD_glutStrokeWidth := GetGLutProcAddress(hDLL, 'glutStrokeWidth');
+    @OLD_glutBitmapLength := GetGLutProcAddress(hDLL, 'glutBitmapLength');
+    @OLD_glutStrokeLength := GetGLutProcAddress(hDLL, 'glutStrokeLength');
+    @OLD_glutWireSphere := GetGLutProcAddress(hDLL, 'glutWireSphere');
+    @OLD_glutSolidSphere := GetGLutProcAddress(hDLL, 'glutSolidSphere');
+    @OLD_glutWireCone := GetGLutProcAddress(hDLL, 'glutWireCone');
+    @OLD_glutSolidCone := GetGLutProcAddress(hDLL, 'glutSolidCone');
+    @OLD_glutWireCube := GetGLutProcAddress(hDLL, 'glutWireCube');
+    @OLD_glutSolidCube := GetGLutProcAddress(hDLL, 'glutSolidCube');
+    @OLD_glutWireTorus := GetGLutProcAddress(hDLL, 'glutWireTorus');
+    @OLD_glutSolidTorus := GetGLutProcAddress(hDLL, 'glutSolidTorus');
+    @OLD_glutWireDodecahedron := GetGLutProcAddress(hDLL, 'glutWireDodecahedron');
+    @OLD_glutSolidDodecahedron := GetGLutProcAddress(hDLL, 'glutSolidDodecahedron');
+    @OLD_glutWireTeapot := GetGLutProcAddress(hDLL, 'glutWireTeapot');
+    @OLD_glutSolidTeapot := GetGLutProcAddress(hDLL, 'glutSolidTeapot');
+    @OLD_glutWireOctahedron := GetGLutProcAddress(hDLL, 'glutWireOctahedron');
+    @OLD_glutSolidOctahedron := GetGLutProcAddress(hDLL, 'glutSolidOctahedron');
+    @OLD_glutWireTetrahedron := GetGLutProcAddress(hDLL, 'glutWireTetrahedron');
+    @OLD_glutSolidTetrahedron := GetGLutProcAddress(hDLL, 'glutSolidTetrahedron');
+    @OLD_glutWireIcosahedron := GetGLutProcAddress(hDLL, 'glutWireIcosahedron');
+    @OLD_glutSolidIcosahedron := GetGLutProcAddress(hDLL, 'glutSolidIcosahedron');
+    @OLD_glutVideoResizeGet := GetGLutProcAddress(hDLL, 'glutVideoResizeGet');
+    @OLD_glutSetupVideoResizing := GetGLutProcAddress(hDLL, 'glutSetupVideoResizing');
+    @OLD_glutStopVideoResizing := GetGLutProcAddress(hDLL, 'glutStopVideoResizing');
+    @OLD_glutVideoResize := GetGLutProcAddress(hDLL, 'glutVideoResize');
+    @OLD_glutVideoPan := GetGLutProcAddress(hDLL, 'glutVideoPan');
+    @OLD_glutReportErrors := GetGLutProcAddress(hDLL, 'glutReportErrors');
+    @OLD_glutIgnoreKeyRepeat := GetGLutProcAddress(hDLL, 'glutIgnoreKeyRepeat');
+    @OLD_glutSetKeyRepeat := GetGLutProcAddress(hDLL, 'glutSetKeyRepeat');
+    @OLD_glutForceJoystickFunc := GetGLutProcAddress(hDLL, 'glutForceJoystickFunc');
+    @OLD_glutGameModeString := GetGLutProcAddress(hDLL, 'glutGameModeString');
+    @OLD_glutEnterGameMode := GetGLutProcAddress(hDLL, 'glutEnterGameMode');
+    @OLD_glutLeaveGameMode := GetGLutProcAddress(hDLL, 'glutLeaveGameMode');
+    @OLD_glutGameModeGet := GetGLutProcAddress(hDLL, 'glutGameModeGet');
+{$ELSE GLUT_EXCLUSIVE_FPUMODE}
+    @glutInit := GetGLutProcAddress(hDLL, 'glutInit');
+    @glutInitDisplayMode := GetGLutProcAddress(hDLL, 'glutInitDisplayMode');
+    @glutInitDisplayString := GetGLutProcAddress(hDLL, 'glutInitDisplayString');
+    @glutInitWindowPosition := GetGLutProcAddress(hDLL, 'glutInitWindowPosition');
+    @glutInitWindowSize := GetGLutProcAddress(hDLL, 'glutInitWindowSize');
+    @glutMainLoop := GetGLutProcAddress(hDLL, 'glutMainLoop');
+    @glutCreateWindow := GetGLutProcAddress(hDLL, 'glutCreateWindow');
+    @glutCreateSubWindow := GetGLutProcAddress(hDLL, 'glutCreateSubWindow');
+    @glutDestroyWindow := GetGLutProcAddress(hDLL, 'glutDestroyWindow');
+    @glutPostRedisplay := GetGLutProcAddress(hDLL, 'glutPostRedisplay');
+    @glutPostWindowRedisplay := GetGLutProcAddress(hDLL, 'glutPostWindowRedisplay');
+    @glutSwapBuffers := GetGLutProcAddress(hDLL, 'glutSwapBuffers');
+    @glutGetWindow := GetGLutProcAddress(hDLL, 'glutGetWindow');
+    @glutSetWindow := GetGLutProcAddress(hDLL, 'glutSetWindow');
+    @glutSetWindowTitle := GetGLutProcAddress(hDLL, 'glutSetWindowTitle');
+    @glutSetIconTitle := GetGLutProcAddress(hDLL, 'glutSetIconTitle');
+    @glutPositionWindow := GetGLutProcAddress(hDLL, 'glutPositionWindow');
+    @glutReshapeWindow := GetGLutProcAddress(hDLL, 'glutReshapeWindow');
+    @glutPopWindow := GetGLutProcAddress(hDLL, 'glutPopWindow');
+    @glutPushWindow := GetGLutProcAddress(hDLL, 'glutPushWindow');
+    @glutIconifyWindow := GetGLutProcAddress(hDLL, 'glutIconifyWindow');
+    @glutShowWindow := GetGLutProcAddress(hDLL, 'glutShowWindow');
+    @glutHideWindow := GetGLutProcAddress(hDLL, 'glutHideWindow');
+    @glutFullScreen := GetGLutProcAddress(hDLL, 'glutFullScreen');
+    @glutSetCursor := GetGLutProcAddress(hDLL, 'glutSetCursor');
+    @glutWarpPointer := GetGLutProcAddress(hDLL, 'glutWarpPointer');
+    @glutEstablishOverlay := GetGLutProcAddress(hDLL, 'glutEstablishOverlay');
+    @glutRemoveOverlay := GetGLutProcAddress(hDLL, 'glutRemoveOverlay');
+    @glutUseLayer := GetGLutProcAddress(hDLL, 'glutUseLayer');
+    @glutPostOverlayRedisplay := GetGLutProcAddress(hDLL, 'glutPostOverlayRedisplay');
+    @glutPostWindowOverlayRedisplay := GetGLutProcAddress(hDLL, 'glutPostWindowOverlayRedisplay');
+    @glutShowOverlay := GetGLutProcAddress(hDLL, 'glutShowOverlay');
+    @glutHideOverlay := GetGLutProcAddress(hDLL, 'glutHideOverlay');
+    @glutCreateMenu := GetGLutProcAddress(hDLL, 'glutCreateMenu');
+    @glutDestroyMenu := GetGLutProcAddress(hDLL, 'glutDestroyMenu');
+    @glutGetMenu := GetGLutProcAddress(hDLL, 'glutGetMenu');
+    @glutSetMenu := GetGLutProcAddress(hDLL, 'glutSetMenu');
+    @glutAddMenuEntry := GetGLutProcAddress(hDLL, 'glutAddMenuEntry');
+    @glutAddSubMenu := GetGLutProcAddress(hDLL, 'glutAddSubMenu');
+    @glutChangeToMenuEntry := GetGLutProcAddress(hDLL, 'glutChangeToMenuEntry');
+    @glutChangeToSubMenu := GetGLutProcAddress(hDLL, 'glutChangeToSubMenu');
+    @glutRemoveMenuItem := GetGLutProcAddress(hDLL, 'glutRemoveMenuItem');
+    @glutAttachMenu := GetGLutProcAddress(hDLL, 'glutAttachMenu');
+    @glutDetachMenu := GetGLutProcAddress(hDLL, 'glutDetachMenu');
+    @glutDisplayFunc := GetGLutProcAddress(hDLL, 'glutDisplayFunc');
+    @glutReshapeFunc := GetGLutProcAddress(hDLL, 'glutReshapeFunc');
+    @glutKeyboardFunc := GetGLutProcAddress(hDLL, 'glutKeyboardFunc');
+    @glutMouseFunc := GetGLutProcAddress(hDLL, 'glutMouseFunc');
+    @glutMotionFunc := GetGLutProcAddress(hDLL, 'glutMotionFunc');
+    @glutPassiveMotionFunc := GetGLutProcAddress(hDLL, 'glutPassiveMotionFunc');
+    @glutEntryFunc := GetGLutProcAddress(hDLL, 'glutEntryFunc');
+    @glutVisibilityFunc := GetGLutProcAddress(hDLL, 'glutVisibilityFunc');
+    @glutIdleFunc := GetGLutProcAddress(hDLL, 'glutIdleFunc');
+    @glutTimerFunc := GetGLutProcAddress(hDLL, 'glutTimerFunc');
+    @glutMenuStateFunc := GetGLutProcAddress(hDLL, 'glutMenuStateFunc');
+    @glutSpecialFunc := GetGLutProcAddress(hDLL, 'glutSpecialFunc');
+    @glutSpaceballMotionFunc := GetGLutProcAddress(hDLL, 'glutSpaceballMotionFunc');
+    @glutSpaceballRotateFunc := GetGLutProcAddress(hDLL, 'glutSpaceballRotateFunc');
+    @glutSpaceballButtonFunc := GetGLutProcAddress(hDLL, 'glutSpaceballButtonFunc');
+    @glutButtonBoxFunc := GetGLutProcAddress(hDLL, 'glutButtonBoxFunc');
+    @glutDialsFunc := GetGLutProcAddress(hDLL, 'glutDialsFunc');
+    @glutTabletMotionFunc := GetGLutProcAddress(hDLL, 'glutTabletMotionFunc');
+    @glutTabletButtonFunc := GetGLutProcAddress(hDLL, 'glutTabletButtonFunc');
+    @glutMenuStatusFunc := GetGLutProcAddress(hDLL, 'glutMenuStatusFunc');
+    @glutOverlayDisplayFunc := GetGLutProcAddress(hDLL, 'glutOverlayDisplayFunc');
+    @glutWindowStatusFunc := GetGLutProcAddress(hDLL, 'glutWindowStatusFunc');
+    @glutKeyboardUpFunc := GetGLutProcAddress(hDLL, 'glutKeyboardUpFunc');
+    @glutSpecialUpFunc := GetGLutProcAddress(hDLL, 'glutSpecialUpFunc');
+    @glutJoystickFunc := GetGLutProcAddress(hDLL, 'glutJoystickFunc');
+    @glutSetColor := GetGLutProcAddress(hDLL, 'glutSetColor');
+    @glutGetColor := GetGLutProcAddress(hDLL, 'glutGetColor');
+    @glutCopyColormap := GetGLutProcAddress(hDLL, 'glutCopyColormap');
+    @glutGet := GetGLutProcAddress(hDLL, 'glutGet');
+    @glutDeviceGet := GetGLutProcAddress(hDLL, 'glutDeviceGet');
+    @glutExtensionSupported := GetGLutProcAddress(hDLL, 'glutExtensionSupported');
+    @glutGetModifiers := GetGLutProcAddress(hDLL, 'glutGetModifiers');
+    @glutLayerGet := GetGLutProcAddress(hDLL, 'glutLayerGet');
+    @glutBitmapCharacter := GetGLutProcAddress(hDLL, 'glutBitmapCharacter');
+    @glutBitmapWidth := GetGLutProcAddress(hDLL, 'glutBitmapWidth');
+    @glutStrokeCharacter := GetGLutProcAddress(hDLL, 'glutStrokeCharacter');
+    @glutStrokeWidth := GetGLutProcAddress(hDLL, 'glutStrokeWidth');
+    @glutBitmapLength := GetGLutProcAddress(hDLL, 'glutBitmapLength');
+    @glutStrokeLength := GetGLutProcAddress(hDLL, 'glutStrokeLength');
+    @glutWireSphere := GetGLutProcAddress(hDLL, 'glutWireSphere');
+    @glutSolidSphere := GetGLutProcAddress(hDLL, 'glutSolidSphere');
+    @glutWireCone := GetGLutProcAddress(hDLL, 'glutWireCone');
+    @glutSolidCone := GetGLutProcAddress(hDLL, 'glutSolidCone');
+    @glutWireCube := GetGLutProcAddress(hDLL, 'glutWireCube');
+    @glutSolidCube := GetGLutProcAddress(hDLL, 'glutSolidCube');
+    @glutWireTorus := GetGLutProcAddress(hDLL, 'glutWireTorus');
+    @glutSolidTorus := GetGLutProcAddress(hDLL, 'glutSolidTorus');
+    @glutWireDodecahedron := GetGLutProcAddress(hDLL, 'glutWireDodecahedron');
+    @glutSolidDodecahedron := GetGLutProcAddress(hDLL, 'glutSolidDodecahedron');
+    @glutWireTeapot := GetGLutProcAddress(hDLL, 'glutWireTeapot');
+    @glutSolidTeapot := GetGLutProcAddress(hDLL, 'glutSolidTeapot');
+    @glutWireOctahedron := GetGLutProcAddress(hDLL, 'glutWireOctahedron');
+    @glutSolidOctahedron := GetGLutProcAddress(hDLL, 'glutSolidOctahedron');
+    @glutWireTetrahedron := GetGLutProcAddress(hDLL, 'glutWireTetrahedron');
+    @glutSolidTetrahedron := GetGLutProcAddress(hDLL, 'glutSolidTetrahedron');
+    @glutWireIcosahedron := GetGLutProcAddress(hDLL, 'glutWireIcosahedron');
+    @glutSolidIcosahedron := GetGLutProcAddress(hDLL, 'glutSolidIcosahedron');
+    @glutVideoResizeGet := GetGLutProcAddress(hDLL, 'glutVideoResizeGet');
+    @glutSetupVideoResizing := GetGLutProcAddress(hDLL, 'glutSetupVideoResizing');
+    @glutStopVideoResizing := GetGLutProcAddress(hDLL, 'glutStopVideoResizing');
+    @glutVideoResize := GetGLutProcAddress(hDLL, 'glutVideoResize');
+    @glutVideoPan := GetGLutProcAddress(hDLL, 'glutVideoPan');
+    @glutReportErrors := GetGLutProcAddress(hDLL, 'glutReportErrors');
+    @glutIgnoreKeyRepeat := GetGLutProcAddress(hDLL, 'glutIgnoreKeyRepeat');
+    @glutSetKeyRepeat := GetGLutProcAddress(hDLL, 'glutSetKeyRepeat');
+    @glutForceJoystickFunc := GetGLutProcAddress(hDLL, 'glutForceJoystickFunc');
+    @glutGameModeString := GetGLutProcAddress(hDLL, 'glutGameModeString');
+    @glutEnterGameMode := GetGLutProcAddress(hDLL, 'glutEnterGameMode');
+    @glutLeaveGameMode := GetGLutProcAddress(hDLL, 'glutLeaveGameMode');
+    @glutGameModeGet := GetGLutProcAddress(hDLL, 'glutGameModeGet');
+{$ENDIF GLUT_EXCLUSIVE_FPUMODE}
+
+{$ifndef Windows}
+    GLUT_STROKE_ROMAN := GetGLutProcAddress(hDll, 'glutStrokeRoman');
+    GLUT_STROKE_MONO_ROMAN := GetGLutProcAddress(hDll,'glutStrokeMonoRoman');
+    GLUT_BITMAP_9_BY_15 := GetGLutProcAddress(hDll, 'glutBitmap9By15');
+    GLUT_BITMAP_8_BY_13 := GetGLutProcAddress(hDll, 'glutBitmap8By13');
+    GLUT_BITMAP_TIMES_ROMAN_10 := GetGLutProcAddress(hDll, 'glutBitmapTimesRoman10');
+    GLUT_BITMAP_TIMES_ROMAN_24 := GetGLutProcAddress(hDll, 'glutBitmapTimesRoman24');
+    GLUT_BITMAP_HELVETICA_10 := GetGLutProcAddress(hDll, 'glutBitmapHelvetica10');
+    GLUT_BITMAP_HELVETICA_12 := GetGLutProcAddress(hDll, 'glutBitmapHelvetica12');
+    GLUT_BITMAP_HELVETICA_18 := GetGLutProcAddress(hDll, 'glutBitmapHelvetica18');
+{$endif Windows}
+  except
+    raise Exception.Create('Could not load ' + MethodName + ' from ' + dll);
+  end;
+end;
+{$ENDIF MORPHOS}
+
+{$IFDEF GLUT_EXCLUSIVE_FPUMODE}
+
+VAR
+GLUT_EXCLUSIVE_glut_ExceptionMask : TFPUExceptionMask;
+GLUT_EXCLUSIVE_fpc__ExceptionMask : TFPUExceptionMask;
+GLUT_EXCLUSIVE_glut_PrecisionMode : TFPUPrecisionMode;
+GLUT_EXCLUSIVE_fpc__PrecisionMode : TFPUPrecisionMode;
+GLUT_EXCLUSIVE_glut_RoundMode : TFPURoundingMode;
+GLUT_EXCLUSIVE_fpc__RoundMode : TFPURoundingMode;
+
+
+PROCEDURE init_fpumode;
+BEGIN
+  GLUT_EXCLUSIVE_glut_ExceptionMask := GetExceptionMask+[exDenormalized, exInvalidOp, exOverflow, exPrecision, exUnderflow, exZeroDivide];
+  GLUT_EXCLUSIVE_glut_PrecisionMode := GetPrecisionMode;
+  GLUT_EXCLUSIVE_glut_RoundMode     := GetRoundMode;
+END;
+
+
+PROCEDURE switch_to_glut_fpumode; mode_inline;
+BEGIN
+  GLUT_EXCLUSIVE_fpc__ExceptionMask := GetExceptionMask;
+  GLUT_EXCLUSIVE_fpc__PrecisionMode := GetPrecisionMode;
+  GLUT_EXCLUSIVE_fpc__RoundMode     := GetRoundMode;
+  SetExceptionMask(GLUT_EXCLUSIVE_glut_ExceptionMask);
+  SetPrecisionMode(GLUT_EXCLUSIVE_glut_PrecisionMode);
+  SetRoundMode(GLUT_EXCLUSIVE_glut_RoundMode);
+END;
+
+PROCEDURE switch_to_FPC_fpumode; mode_inline;
+BEGIN
+  GLUT_EXCLUSIVE_glut_ExceptionMask := GetExceptionMask;
+  GLUT_EXCLUSIVE_glut_PrecisionMode := GetPrecisionMode;
+  GLUT_EXCLUSIVE_glut_RoundMode     := GetRoundMode;
+  SetExceptionMask(GLUT_EXCLUSIVE_fpc__ExceptionMask);
+  SetPrecisionMode(GLUT_EXCLUSIVE_fpc__PrecisionMode);
+  SetRoundMode(GLUT_EXCLUSIVE_fpc__RoundMode);
+END;
+
+
+procedure glutInit(argcp: PInteger; argv: PPChar);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutInit(argcp,argv);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutInitDisplayMode(mode: Cardinal);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutInitDisplayMode(mode);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutInitDisplayString(const str: PChar);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutInitDisplayString(str);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutInitWindowPosition(x, y: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutInitWindowPosition(x,y);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutInitWindowSize(width, height: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutInitWindowSize(width,height);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutMainLoop;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutMainLoop();
+  switch_to_FPC_fpumode;
+end;
+
+function glutCreateWindow(const title: PChar): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutCreateWindow := OLD_glutCreateWindow(title);
+  switch_to_FPC_fpumode;
+end;
+
+function glutCreateSubWindow(win, x, y, width, height: Integer): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutCreateSubWindow := OLD_glutCreateSubWindow(win,x,y,width,height);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutDestroyWindow(win: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutDestroyWindow(win);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutPostRedisplay;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutPostRedisplay();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutPostWindowRedisplay(win: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutPostWindowRedisplay(win);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSwapBuffers;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSwapBuffers();
+  switch_to_FPC_fpumode;
+end;
+
+function glutGetWindow: Integer;
+begin
+  switch_to_glut_fpumode;
+  glutGetWindow := OLD_glutGetWindow();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSetWindow(win: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSetWindow(win);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSetWindowTitle(const title: PChar);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSetWindowTitle(title);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSetIconTitle(const title: PChar);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSetIconTitle(title);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutPositionWindow(x, y: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutPositionWindow(x,y);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutReshapeWindow(width, height: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutReshapeWindow(width,height);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutPopWindow;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutPopWindow();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutPushWindow;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutPushWindow();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutIconifyWindow;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutIconifyWindow();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutShowWindow;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutShowWindow();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutHideWindow;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutHideWindow();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutFullScreen;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutFullScreen();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSetCursor(cursor: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSetCursor(cursor);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWarpPointer(x, y: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWarpPointer(x,y);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutEstablishOverlay;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutEstablishOverlay();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutRemoveOverlay;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutRemoveOverlay();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutUseLayer(layer: GLenum);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutUseLayer(layer);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutPostOverlayRedisplay;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutPostOverlayRedisplay();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutPostWindowOverlayRedisplay(win: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutPostWindowOverlayRedisplay(win);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutShowOverlay;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutShowOverlay();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutHideOverlay;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutHideOverlay();
+  switch_to_FPC_fpumode;
+end;
+
+function glutCreateMenu(callback: TGlut1IntCallback): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutCreateMenu := OLD_glutCreateMenu(callback);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutDestroyMenu(menu: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutDestroyMenu(menu);
+  switch_to_FPC_fpumode;
+end;
+
+function glutGetMenu: Integer;
+begin
+  switch_to_glut_fpumode;
+  glutGetMenu := OLD_glutGetMenu();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSetMenu(menu: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSetMenu(menu);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutAddMenuEntry(const caption: PChar; value: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutAddMenuEntry(caption,value);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutAddSubMenu(const caption: PChar; submenu: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutAddSubMenu(caption,submenu);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutChangeToMenuEntry(item: Integer; const caption: PChar; value: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutChangeToMenuEntry(item,caption,value);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutChangeToSubMenu(item: Integer; const caption: PChar; submenu: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutChangeToSubMenu(item,caption,submenu);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutRemoveMenuItem(item: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutRemoveMenuItem(item);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutAttachMenu(button: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutAttachMenu(button);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutDetachMenu(button: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutDetachMenu(button);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutDisplayFunc(f: TGlutVoidCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutDisplayFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutReshapeFunc(f: TGlut2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutReshapeFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutKeyboardFunc(f: TGlut1Char2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutKeyboardFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutMouseFunc(f: TGlut4IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutMouseFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutMotionFunc(f: TGlut2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutMotionFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutPassiveMotionFunc(f: TGlut2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutPassiveMotionFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutEntryFunc(f: TGlut1IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutEntryFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutVisibilityFunc(f: TGlut1IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutVisibilityFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutIdleFunc(f: TGlutVoidCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutIdleFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutTimerFunc(millis: Cardinal; f: TGlut1IntCallback; value: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutTimerFunc(millis,f,value);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutMenuStateFunc(f: TGlut1IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutMenuStateFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSpecialFunc(f: TGlut3IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSpecialFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSpaceballMotionFunc(f: TGlut3IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSpaceballMotionFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSpaceballRotateFunc(f: TGlut3IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSpaceballRotateFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSpaceballButtonFunc(f: TGlut2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSpaceballButtonFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutButtonBoxFunc(f: TGlut2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutButtonBoxFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutDialsFunc(f: TGlut2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutDialsFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutTabletMotionFunc(f: TGlut2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutTabletMotionFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutTabletButtonFunc(f: TGlut4IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutTabletButtonFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutMenuStatusFunc(f: TGlut3IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutMenuStatusFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutOverlayDisplayFunc(f:TGlutVoidCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutOverlayDisplayFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWindowStatusFunc(f: TGlut1IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWindowStatusFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutKeyboardUpFunc(f: TGlut1Char2IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutKeyboardUpFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSpecialUpFunc(f: TGlut3IntCallback);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSpecialUpFunc(f);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutJoystickFunc(f: TGlut1UInt3IntCallback; pollInterval: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutJoystickFunc(f,pollInterval);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSetColor(cell: Integer; red, green, blue: GLfloat);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSetColor(cell,red,green,blue);
+  switch_to_FPC_fpumode;
+end;
+
+function glutGetColor(ndx, component: Integer): GLfloat;
+begin
+  switch_to_glut_fpumode;
+  glutGetColor := OLD_glutGetColor(ndx,component);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutCopyColormap(win: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutCopyColormap(win);
+  switch_to_FPC_fpumode;
+end;
+
+function glutGet(t: GLenum): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutGet := OLD_glutGet(t);
+  switch_to_FPC_fpumode;
+end;
+
+function glutDeviceGet(t: GLenum): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutDeviceGet := OLD_glutDeviceGet(t);
+  switch_to_FPC_fpumode;
+end;
+
+function glutExtensionSupported(const name: PChar): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutExtensionSupported := OLD_glutExtensionSupported(name);
+  switch_to_FPC_fpumode;
+end;
+
+function glutGetModifiers: Integer;
+begin
+  switch_to_glut_fpumode;
+  glutGetModifiers := OLD_glutGetModifiers();
+  switch_to_FPC_fpumode;
+end;
+
+function glutLayerGet(t: GLenum): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutLayerGet := OLD_glutLayerGet(t);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutBitmapCharacter(font : pointer; character: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutBitmapCharacter(font,character);
+  switch_to_FPC_fpumode;
+end;
+
+function glutBitmapWidth(font : pointer; character: Integer): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutBitmapWidth := OLD_glutBitmapWidth(font,character);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutStrokeCharacter(font : pointer; character: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutStrokeCharacter(font,character);
+  switch_to_FPC_fpumode;
+end;
+
+function glutStrokeWidth(font : pointer; character: Integer): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutStrokeWidth := OLD_glutStrokeWidth(font,character);
+  switch_to_FPC_fpumode;
+end;
+
+function glutBitmapLength(font: pointer; const str: PChar): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutBitmapLength := OLD_glutBitmapLength(font,str);
+  switch_to_FPC_fpumode;
+end;
+
+function glutStrokeLength(font: pointer; const str: PChar): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutStrokeLength := OLD_glutStrokeLength(font,str);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireSphere(radius: GLdouble; slices, stacks: GLint);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireSphere(radius,slices,stacks);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidSphere(radius: GLdouble; slices, stacks: GLint);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidSphere(radius,slices,stacks);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireCone(base, height: GLdouble; slices, stacks: GLint);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireCone(base,height,slices,stacks);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidCone(base, height: GLdouble; slices, stacks: GLint);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidCone(base,height,slices,stacks);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireCube(size: GLdouble);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireCube(size);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidCube(size: GLdouble);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidCube(size);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireTorus(innerRadius, outerRadius: GLdouble; sides, rings: GLint);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireTorus(innerRadius,outerRadius,sides,rings);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidTorus(innerRadius, outerRadius: GLdouble; sides, rings: GLint);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidTorus(innerRadius,outerRadius,sides,rings);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireDodecahedron;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireDodecahedron();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidDodecahedron;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidDodecahedron();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireTeapot(size: GLdouble);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireTeapot(size);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidTeapot(size: GLdouble);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidTeapot(size);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireOctahedron;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireOctahedron();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidOctahedron;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidOctahedron();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireTetrahedron;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireTetrahedron();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidTetrahedron;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidTetrahedron();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutWireIcosahedron;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutWireIcosahedron();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSolidIcosahedron;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSolidIcosahedron();
+  switch_to_FPC_fpumode;
+end;
+
+function glutVideoResizeGet(param: GLenum): Integer;
+begin
+  switch_to_glut_fpumode;
+  glutVideoResizeGet := OLD_glutVideoResizeGet(param);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSetupVideoResizing;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSetupVideoResizing();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutStopVideoResizing;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutStopVideoResizing();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutVideoResize(x, y, width, height: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutVideoResize(x,y,width,height);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutVideoPan(x, y, width, height: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutVideoPan(x,y,width,height);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutReportErrors;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutReportErrors();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutIgnoreKeyRepeat(ignore: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutIgnoreKeyRepeat(ignore);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutSetKeyRepeat(repeatMode: Integer);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutSetKeyRepeat(repeatMode);
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutForceJoystickFunc;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutForceJoystickFunc();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutGameModeString(const AString : PChar);
+begin
+  switch_to_glut_fpumode;
+  OLD_glutGameModeString(AString);
+  switch_to_FPC_fpumode;
+end;
+
+function glutEnterGameMode: integer;
+begin
+  switch_to_glut_fpumode;
+  glutEnterGameMode := OLD_glutEnterGameMode();
+  switch_to_FPC_fpumode;
+end;
+
+procedure glutLeaveGameMode;
+begin
+  switch_to_glut_fpumode;
+  OLD_glutLeaveGameMode();
+  switch_to_FPC_fpumode;
+end;
+
+function glutGameModeGet(mode : GLenum): integer;
+begin
+  switch_to_glut_fpumode;
+  glutGameModeGet := OLD_glutGameModeGet(mode);
+  switch_to_FPC_fpumode;
+end;
+
+
+{$ENDIF GLUT_EXCLUSIVE_FPUMODE}
+
+initialization
+
+  {$IFDEF GLUT_EXCLUSIVE_FPUMODE}
+  init_fpumode;
+  {$ENDIF GLUT_EXCLUSIVE_FPUMODE}
+
+  {$IFDEF Windows}
+  LoadGlut('glut32.dll');
+  {$ELSE}
+  {$ifdef darwin}
+  LoadGlut('/System/Library/Frameworks/GLUT.framework/GLUT');
+  {$else}
+  {$IFNDEF MORPHOS}
+  LoadGlut('libglut.so.3');
+  {$ENDIF}
+  {$endif}
+  {$ENDIF}
+
+finalization
+  FreeGlut;
+end.

+ 240 - 0
packages/opengl/src/glx.pp

@@ -0,0 +1,240 @@
+{
+
+  Translation of the Mesa GLX headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLX;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Unix}
+  uses
+    X, XLib, XUtil;
+  {$DEFINE HasGLX}  // Activate GLX stuff
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+{$IFNDEF HasGLX}
+  {$MESSAGE GLX not present on this platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// Note: Requires that the GL library has already been initialized
+function InitGLX: Boolean;
+
+var
+  GLXDumpUnresolvedFunctions,
+  GLXInitialized: Boolean;
+
+
+// =======================================================
+//   GLX consts, types and functions
+// =======================================================
+
+// Tokens for glXChooseVisual and glXGetConfig:
+const
+  GLX_USE_GL                            = 1;
+  GLX_BUFFER_SIZE                       = 2;
+  GLX_LEVEL                             = 3;
+  GLX_RGBA                              = 4;
+  GLX_DOUBLEBUFFER                      = 5;
+  GLX_STEREO                            = 6;
+  GLX_AUX_BUFFERS                       = 7;
+  GLX_RED_SIZE                          = 8;
+  GLX_GREEN_SIZE                        = 9;
+  GLX_BLUE_SIZE                         = 10;
+  GLX_ALPHA_SIZE                        = 11;
+  GLX_DEPTH_SIZE                        = 12;
+  GLX_STENCIL_SIZE                      = 13;
+  GLX_ACCUM_RED_SIZE                    = 14;
+  GLX_ACCUM_GREEN_SIZE                  = 15;
+  GLX_ACCUM_BLUE_SIZE                   = 16;
+  GLX_ACCUM_ALPHA_SIZE                  = 17;
+
+  // GLX_EXT_visual_info extension
+  GLX_X_VISUAL_TYPE_EXT                 = $22;
+  GLX_TRANSPARENT_TYPE_EXT              = $23;
+  GLX_TRANSPARENT_INDEX_VALUE_EXT       = $24;
+  GLX_TRANSPARENT_RED_VALUE_EXT         = $25;
+  GLX_TRANSPARENT_GREEN_VALUE_EXT       = $26;
+  GLX_TRANSPARENT_BLUE_VALUE_EXT        = $27;
+  GLX_TRANSPARENT_ALPHA_VALUE_EXT       = $28;
+
+
+  // Error codes returned by glXGetConfig:
+  GLX_BAD_SCREEN                        = 1;
+  GLX_BAD_ATTRIBUTE                     = 2;
+  GLX_NO_EXTENSION                      = 3;
+  GLX_BAD_VISUAL                        = 4;
+  GLX_BAD_CONTEXT                       = 5;
+  GLX_BAD_VALUE                         = 6;
+  GLX_BAD_ENUM                          = 7;
+
+  // GLX 1.1 and later:
+  GLX_VENDOR                            = 1;
+  GLX_VERSION                           = 2;
+  GLX_EXTENSIONS                        = 3;
+
+  // GLX_visual_info extension
+  GLX_TRUE_COLOR_EXT                    = $8002;
+  GLX_DIRECT_COLOR_EXT                  = $8003;
+  GLX_PSEUDO_COLOR_EXT                  = $8004;
+  GLX_STATIC_COLOR_EXT                  = $8005;
+  GLX_GRAY_SCALE_EXT                    = $8006;
+  GLX_STATIC_GRAY_EXT                   = $8007;
+  GLX_NONE_EXT                          = $8000;
+  GLX_TRANSPARENT_RGB_EXT               = $8008;
+  GLX_TRANSPARENT_INDEX_EXT             = $8009;
+
+type
+  // From XLib:
+  XPixmap = TXID;
+  XFont = TXID;
+  XColormap = TXID;
+
+  GLXContext = Pointer;
+  GLXPixmap = TXID;
+  GLXDrawable = TXID;
+  GLXContextID = TXID;
+  
+  TXPixmap = XPixmap;
+  TXFont = XFont;
+  TXColormap = XColormap;
+
+  TGLXContext = GLXContext;
+  TGLXPixmap = GLXPixmap;
+  TGLXDrawable = GLXDrawable;
+  TGLXContextID = GLXContextID;
+
+var
+  glXChooseVisual: function(dpy: PDisplay; screen: Integer; attribList: PInteger): PXVisualInfo; cdecl;
+  glXCreateContext: function(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; cdecl;
+  glXDestroyContext: procedure(dpy: PDisplay; ctx: GLXContext); cdecl;
+  glXMakeCurrent: function(dpy: PDisplay; drawable: GLXDrawable; ctx: GLXContext): Boolean; cdecl;
+  glXCopyContext: procedure(dpy: PDisplay; src, dst: GLXContext; mask: LongWord); cdecl;
+  glXSwapBuffers: procedure(dpy: PDisplay; drawable: GLXDrawable); cdecl;
+  glXCreateGLXPixmap: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap): GLXPixmap; cdecl;
+  glXDestroyGLXPixmap: procedure(dpy: PDisplay; pixmap: GLXPixmap); cdecl;
+  glXQueryExtension: function(dpy: PDisplay; var errorb, event: Integer): Boolean; cdecl;
+  glXQueryVersion: function(dpy: PDisplay; var maj, min: Integer): Boolean; cdecl;
+  glXIsDirect: function(dpy: PDisplay; ctx: GLXContext): Boolean; cdecl;
+  glXGetConfig: function(dpy: PDisplay; visual: PXVisualInfo; attrib: Integer; var value: Integer): Integer; cdecl;
+  glXGetCurrentContext: function: GLXContext; cdecl;
+  glXGetCurrentDrawable: function: GLXDrawable; cdecl;
+  glXWaitGL: procedure; cdecl;
+  glXWaitX: procedure; cdecl;
+  glXUseXFont: procedure(font: XFont; first, count, list: Integer); cdecl;
+
+  // GLX 1.1 and later
+  glXQueryExtensionsString: function(dpy: PDisplay; screen: Integer): PChar; cdecl;
+  glXQueryServerString: function(dpy: PDisplay; screen, name: Integer): PChar; cdecl;
+  glXGetClientString: function(dpy: PDisplay; name: Integer): PChar; cdecl;
+
+  // Mesa GLX Extensions
+  glXCreateGLXPixmapMESA: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl;
+  glXReleaseBufferMESA: function(dpy: PDisplay; d: GLXDrawable): Boolean; cdecl;
+  glXCopySubBufferMESA: procedure(dpy: PDisplay; drawbale: GLXDrawable; x, y, width, height: Integer); cdecl;
+  glXGetVideoSyncSGI: function(var counter: LongWord): Integer; cdecl;
+  glXWaitVideoSyncSGI: function(divisor, remainder: Integer; var count: LongWord): Integer; cdecl;
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+uses GL, dynlibs;
+
+{$LINKLIB m}
+
+function GetProc(handle: PtrInt; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLXDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLX: Boolean;
+var
+  OurLibGL: TLibHandle;
+begin
+  Result := False;
+
+{$ifndef darwin}
+  OurLibGL := libGl;
+{$else darwin}
+  OurLibGL := LoadLibrary('/usr/X11R6/lib/libGL.dylib');
+{$endif darwin}
+
+  if OurLibGL = 0 then
+    exit;
+
+  glXChooseVisual := GetProc(OurLibGL, 'glXChooseVisual');
+  glXCreateContext := GetProc(OurLibGL, 'glXCreateContext');
+  glXDestroyContext := GetProc(OurLibGL, 'glXDestroyContext');
+  glXMakeCurrent := GetProc(OurLibGL, 'glXMakeCurrent');
+  glXCopyContext := GetProc(OurLibGL, 'glXCopyContext');
+  glXSwapBuffers := GetProc(OurLibGL, 'glXSwapBuffers');
+  glXCreateGLXPixmap := GetProc(OurLibGL, 'glXCreateGLXPixmap');
+  glXDestroyGLXPixmap := GetProc(OurLibGL, 'glXDestroyGLXPixmap');
+  glXQueryExtension := GetProc(OurLibGL, 'glXQueryExtension');
+  glXQueryVersion := GetProc(OurLibGL, 'glXQueryVersion');
+  glXIsDirect := GetProc(OurLibGL, 'glXIsDirect');
+  glXGetConfig := GetProc(OurLibGL, 'glXGetConfig');
+  glXGetCurrentContext := GetProc(OurLibGL, 'glXGetCurrentContext');
+  glXGetCurrentDrawable := GetProc(OurLibGL, 'glXGetCurrentDrawable');
+  glXWaitGL := GetProc(OurLibGL, 'glXWaitGL');
+  glXWaitX := GetProc(OurLibGL, 'glXWaitX');
+  glXUseXFont := GetProc(OurLibGL, 'glXUseXFont');
+  // GLX 1.1 and later
+  glXQueryExtensionsString := GetProc(OurLibGL, 'glXQueryExtensionsString');
+  glXQueryServerString := GetProc(OurLibGL, 'glXQueryServerString');
+  glXGetClientString := GetProc(OurLibGL, 'glXGetClientString');
+  // Mesa GLX Extensions
+  glXCreateGLXPixmapMESA := GetProc(OurLibGL, 'glXCreateGLXPixmapMESA');
+  glXReleaseBufferMESA := GetProc(OurLibGL, 'glXReleaseBufferMESA');
+  glXCopySubBufferMESA := GetProc(OurLibGL, 'glXCopySubBufferMESA');
+  glXGetVideoSyncSGI := GetProc(OurLibGL, 'glXGetVideoSyncSGI');
+  glXWaitVideoSyncSGI := GetProc(OurLibGL, 'glXWaitVideoSyncSGI');
+
+  GLXInitialized := True;
+  Result := True;
+end;
+
+initialization
+  InitGLX;
+end.

+ 846 - 0
packages/opengl/src/tinygl.inc

@@ -0,0 +1,846 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2005 by Karoly Balogh
+
+     TinyGL/OpenGL wrapper include for MorphOS/PowerPC
+
+    Thanks to Michal 'kiero' Wozniak and Mark 'bigfoot' Olsen
+    for their help.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+{ ****************************************************************************************************** }
+{ ** TinyGL syscalls                                                                                  ** }
+{ ****************************************************************************************************** }
+
+{$IFDEF GL_UNIT}
+procedure _GLEnable(gcl: pointer; cap: GLenum);
+syscall sysvbase TinyGLBase 28;
+
+procedure _GLDisable(gcl: pointer; cap: GLenum);
+syscall sysvbase TinyGLBase 34;
+
+procedure _GLShadeModel(gcl: pointer; mode: GLenum);
+syscall sysvbase TinyGLBase 46;
+
+procedure _GLCullFace(gcl: pointer; mode: GLenum);
+syscall sysvbase TinyGLBase 52;
+
+procedure _GLBegin(gcl: pointer; mode: GLenum);
+syscall sysvbase TinyGLBase 64;
+
+procedure _GLEnd(gcl: pointer);
+syscall sysvbase TinyGLBase 70;
+
+procedure _GLVertex3f(gcl: pointer; x, y, z: GLfloat);
+syscall sysvbase TinyGLBase 76;
+
+procedure _GlVertex3fv(gcl: pointer; const v: PGLfloat);
+syscall sysvbase TinyGLBase 88;
+
+procedure _GLColor3f(gcl: pointer; red, green, blue: GLfloat); 
+syscall sysvbase TinyGLBase 100;
+
+procedure _GLColor4f(gcl: pointer; red, green, blue, alpha: GLfloat); 
+syscall sysvbase TinyGLBase 106;
+
+procedure _GLNormal3f(gcl: pointer; nx, ny, nz: GLfloat);
+syscall sysvbase TinyGLBase 148;
+
+procedure _GLTexCoord2f(gcl: pointer; s, t: GLfloat); 
+syscall sysvbase TinyGLBase 160;
+
+procedure _GLMatrixMode(gcl: pointer; mode: GLenum);
+syscall sysvbase TinyGLBase 190;
+
+procedure _GLLoadIdentity(gcl: pointer);
+syscall sysvbase TinyGLBase 202;
+
+procedure _GLPushMatrix(gcl: pointer);
+syscall sysvbase TinyGLBase 214;
+
+procedure _GLPopMatrix(gcl: pointer);
+syscall sysvbase TinyGLBase 220;
+
+procedure _GLRotatef(gcl: pointer; angle, x, y, z: GLfloat); 
+syscall sysvbase TinyGLBase 226;
+
+procedure _GLTranslatef(gcl: pointer; x, y, z: GLfloat); 
+syscall sysvbase TinyGLBase 232;
+
+procedure _GLScalef(gcl: pointer; x, y, z: GLfloat); 
+syscall sysvbase TinyGLBase 238;
+
+procedure _GLViewPort(gcl: pointer; x, y: GLint; width, height: GLsizei);
+syscall sysvbase TinyGLBase 244;
+
+procedure _GLFrustum(gcl: pointer; left, right, bottom, top, zNear, zFar: GLdouble); 
+syscall sysvbase TinyGLBase 250;
+{$ENDIF GL_UNIT}
+
+{$IF DEFINED(GL_UNIT) OR DEFINED(GLU_UNIT)}
+procedure _GLOrtho(gcl: pointer; left, right, bottom, top, zNear, zFar: GLdouble);
+syscall sysvbase TinyGLBase 256;
+{$ENDIF}
+
+{$IFDEF GL_UNIT}
+function  _GLGenLists(gcl: pointer; range: GLsizei): GLuint;
+syscall sysvbase TinyGLBase 262;
+
+procedure _GLNewList(gcl: pointer; list: GLuint; mode: GLenum);
+syscall sysvbase TinyGLBase 274;
+
+procedure _GLEndList(gcl: pointer);
+syscall sysvbase TinyGLBase 280;
+
+procedure _GLCallList(gcl: pointer; list: GLuint);
+syscall sysvbase TinyGLBase 286;
+
+procedure _GLDeleteLists(gcl: pointer; list: GLuint; range: GLsizei);
+syscall sysvbase TinyGLBase 292;
+
+procedure _GLClear(gcl: pointer; mask: GLbitfield);
+syscall sysvbase TinyGLBase 298;
+
+procedure _GLClearColor(gcl: pointer; red, green, blue, alpha: GLclampf);
+syscall sysvbase TinyGLBase 304;
+
+procedure _GLClearDepth(gcl: pointer; depth: GLclampd);
+syscall sysvbase TinyGLBase 310;
+
+procedure _GLGenTextures(gcl: pointer; n: GLsizei; textures: PGLuint);
+syscall sysvbase TinyGLBase 352;
+
+procedure _GLDeleteTextures(gcl: pointer; n: GLsizei; const textures: PGLuint);
+syscall sysvbase TinyGLBase 358;
+
+procedure _GLBindTexture(gcl: pointer; target: GLenum; texture: GLuint);
+syscall sysvbase TinyGLBase 364;
+
+procedure _GLTexImage2D(gcl: pointer; target: GLenum; level, internalformat: GLint; width, height: GLsizei; border: GLint; format, atype: GLenum; const pixels: Pointer);
+syscall sysvbase TinyGLBase 370;
+
+procedure _GLTexParameteri(gcl: pointer; target: GLenum; pname: GLenum; param: GLint);
+syscall sysvbase TinyGLBase 394;
+
+procedure _GLTexParameterf(gcl: pointer; target: GLenum; pname: GLenum; param: GLfloat);
+syscall sysvbase TinyGLBase 400;
+
+procedure _GLTexGeni(gcl: pointer; coord: GLenum; pname: GLenum; param: GLint);
+syscall sysvbase TinyGLBase 418;
+
+procedure _GLMaterialfv(gcl: pointer; face, pname: GLenum; const params: PGLfloat);
+syscall sysvbase TinyGLBase 430;
+
+procedure _GLMaterialf(gcl: pointer; face, pname: GLenum; param: GLfloat);
+syscall sysvbase TinyGLBase 436;
+
+procedure _GLLightfv(gcl: pointer; light, pname: GLenum; const params: PGLfloat);
+syscall sysvbase TinyGLBase 448;
+
+procedure _GLLightf(gcl: pointer; light, pname: GLenum; param: GLfloat);
+syscall sysvbase TinyGLBase 454;
+
+procedure _GLLightModelfv(gcl: pointer; pname: GLenum; const params: PGLfloat);
+syscall sysvbase TinyGLBase 466;
+
+procedure _GLFlush(gcl: pointer);
+syscall sysvbase TinyGLBase 478;
+
+procedure _GLHint(gcl: pointer; target, mode: GLenum);
+syscall sysvbase TinyGLBase 484;
+
+procedure _GLGetFloatv(gcl: pointer; pname: GLenum; params: PGLfloat);
+syscall sysvbase TinyGLBase 496;
+
+procedure _GLEnableClientState(gcl: pointer; aarray: GLenum);
+syscall sysvbase TinyGLBase 508;
+
+procedure _GLDisableClientState(gcl: pointer; aarray: GLenum);
+syscall sysvbase TinyGLBase 514;
+
+procedure _GLVertexPointer(gcl: pointer; size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer);
+syscall sysvbase TinyGLBase 526;
+
+procedure _GLColorPointer(gcl: pointer; size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer);
+syscall sysvbase TinyGLBase 532;
+
+procedure _GLNormalPointer(gcl: pointer; atype: GLenum; stride: GLsizei; const pointer: Pointer);
+syscall sysvbase TinyGLBase 538;
+
+procedure _GLTexCoordPointer(gcl: pointer; size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer);
+syscall sysvbase TinyGLBase 544;
+
+procedure _GLDrawElements(gcl: pointer; mode: GLenum; count: GLsizei; atype: GLenum; const indices: Pointer);
+syscall sysvbase TinyGLBase 562;
+
+procedure _GLBlendFunc(gcl: pointer; sfactor, dfactor: GLenum);
+syscall sysvbase TinyGLBase 586;
+
+procedure _GLDepthMask(gcl: pointer; flag: GLboolean);
+syscall sysvbase TinyGLBase 592;
+
+procedure _GLAlphaFunc(gcl: pointer; func: GLenum; ref: GLclampf);
+syscall sysvbase TinyGLBase 598;
+
+procedure _GLPointSize(gcl: pointer; size: GLfloat);
+syscall sysvbase TinyGLBase 604;
+
+procedure _GLDepthFunc(gcl: pointer; func: GLenum);
+syscall sysvbase TinyGLBase 628;
+
+function _GLInit: Pointer; 
+syscall sysvbase TinyGLBase 640;
+
+procedure _GLClose(gcl: pointer);
+syscall sysvbase TinyGLBase 646;
+{$ENDIF GL_UNIT}
+
+{$IFDEF GLU_UNIT}
+procedure _GLUPerspective(gcl: pointer; fovy, aspect, zNear, zFar: GLdouble);
+syscall sysvbase TinyGLBase 652;
+
+procedure _GLULookAt(gcl: pointer; eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: GLdouble);
+syscall sysvbase TinyGLBase 658;
+{$ENDIF GLU_UNIT}
+
+{$IFDEF GLUT_UNIT}
+procedure _GLUTInit(gcl: pointer; argcp: PLongInt; argv: PPChar);
+syscall sysvbase TinyGLBase 664;
+
+procedure _GLUTInitWindowPosition(gcl: pointer; x, y: Integer);
+syscall sysvbase TinyGLBase 670;
+
+procedure _GLUTInitWindowSize(gcl: pointer; width, height: LongInt);
+syscall sysvbase TinyGLBase 676;
+
+function  _GLUTCreateWindow(gcl: pointer; const title: PChar): LongInt;
+syscall sysvbase TinyGLBase 682;
+
+procedure _GLUTFullScreen(gcl: pointer);
+syscall sysvbase TinyGLBase 688;
+
+procedure _GLUTDestroyWindow(gcl: pointer; win: LongInt);
+syscall sysvbase TinyGLBase 706;
+
+procedure _GLUTSwapBuffers(gcl: pointer);
+syscall sysvbase TinyGLBase 712;
+
+procedure _GLUTMainLoop(gcl: pointer);
+syscall sysvbase TinyGLBase 718;
+
+procedure _GLUTPostRedisplay(gcl: pointer);
+syscall sysvbase TinyGLBase 724;
+
+procedure _GLUTDisplayFunc(gcl: pointer; f: TGlutVoidCallback);
+syscall sysvbase TinyGLBase 730;
+
+procedure _GLUTReshapeFunc(gcl: pointer; f: TGlut2IntCallback);
+syscall sysvbase TinyGLBase 736;
+
+procedure _GLUTIdleFunc(gcl: pointer; f: TGlutVoidCallback);
+syscall sysvbase TinyGLBase 742; 
+
+procedure _GLUTKeyboardFunc(gcl: pointer; f: TGlut1Char2IntCallback);
+syscall sysvbase TinyGLBase 748;
+
+procedure _GLUTMouseFunc(gcl: pointer; f: TGlut4IntCallback);
+syscall sysvbase TinyGLBase 760;
+
+procedure _GLUTMotionFunc(gcl: pointer; f: TGlut2IntCallback);
+syscall sysvbase TinyGLBase 766;
+
+function _GLUTGet(gcl: pointer; t: GLenum): LongInt;
+syscall sysvbase TinyGLBase 802;
+
+procedure _GLUTInitDisplayMode(gcl: pointer; mode: Word);
+syscall sysvbase TinyGLBase 808;
+
+procedure _GLUTSpecialFunc(gcl: pointer; f: TGlut3IntCallback);
+syscall sysvbase TinyGLBase 814;
+
+procedure _GLUTTimerFunc(gcl: pointer; millis: Word; f: TGlut1IntCallback; value: LongInt);
+syscall sysvbase TinyGLBase 820;
+
+procedure _GLUTPassiveMotionFunc(gcl: pointer; f: TGlut2IntCallback);
+syscall sysvbase TinyGLBase 832;
+
+// MorphOS specific GLUT call, returns Intuition window handle
+function _GLUTGetWindowHandle(gcl: pointer): Pointer;
+syscall sysvbase TinyGLBase 856;
+{$ENDIF GLUT_UNIT}
+
+{$IFDEF GL_UNIT}
+function _GLGetString(gcl: pointer; name: GLenum): PChar;
+syscall sysvbase TinyGLBase 862;
+
+procedure _GLCallLists(gcl: pointer; n: GLsizei; atype: GLenum; const lists: Pointer);
+syscall sysvbase TinyGLBase 892;
+
+procedure _GLLineWidth(gcl: pointer; width: GLfloat);
+syscall sysvbase TinyGLBase 910;
+
+procedure _GLRasterPos3f(gcl: pointer; x, y, z: GLfloat);
+syscall sysvbase TinyGLBase 1108;
+{$ENDIF GL_UNIT}
+
+{$IFDEF GLUT_UNIT}
+procedure _GLUTVisibilityFunc(gcl: pointer; f: TGlut1IntCallback);
+syscall sysvbase TinyGLBase 1114;
+{$ENDIF GLUT_UNIT}
+
+{$IFDEF GL_UNIT}
+procedure _GLFogf(gcl: pointer; pname: GLenum; param: GLfloat);
+syscall sysvbase TinyGLBase 1120;
+
+procedure _GLFogfv(gcl: pointer; pname: GLenum; const params: PGLfloat); 
+syscall sysvbase TinyGLBase 1126;
+
+procedure _GLReadPixels(gcl: pointer; x, y: GLint; width, height: GLsizei; format, atype: GLenum; pixels: Pointer);
+syscall sysvbase TinyGLBase 1180;
+
+procedure _GLStencilFunc(gcl: pointer; func: GLenum; ref: GLint; mask: GLuint);
+syscall sysvbase TinyGLBase 1210;
+
+procedure _GLStencilOp(gcl: pointer; fail, zfail, zpass: GLenum);
+syscall sysvbase TinyGLBase 1216;
+
+procedure _GLColorMask(gcl: pointer; red, green, blue, alpha: GLboolean);
+syscall sysvbase TinyGLBase 1282;
+{$ENDIF GL_UNIT}
+
+
+{ ****************************************************************************************************** }
+{ ** GL functions                                                                                     ** }
+{ ****************************************************************************************************** }
+
+{$IFDEF GL_UNIT}
+procedure glAlphaFunc(func: GLenum; ref: GLclampf); inline;
+begin
+  _GLAlphaFunc(tglContext, func, ref);
+end;
+
+procedure glBegin(mode: GLenum); inline;
+begin
+  _GLBegin(tglContext, mode);
+end;
+
+procedure glCallList(list: GLuint); inline;
+begin
+  _GLCallList(tglContext, list);
+end;
+
+procedure glCallLists(n: GLsizei; atype: GLenum; const lists: Pointer); inline;
+begin
+  _GLCallLists(tglContext, n, atype, lists);
+end;
+
+procedure glClear(mask: GLbitfield); inline;
+begin
+  _GLClear(tglContext, mask);
+end;
+
+procedure glClearColor(red, green, blue, alpha: GLclampf); inline;
+begin
+  _GLClearColor(tglContext, red, green, blue, alpha);
+end;
+
+procedure glClearDepth(depth: GLclampd); inline;
+begin
+  _GLClearDepth(tglContext, depth);
+end;
+
+procedure glColorMask(red, green, blue, alpha: GLboolean); inline;
+begin
+  _GLColorMask(tglContext, red, green, blue, alpha);
+end;
+
+procedure glColorPointer(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); inline;
+begin
+  _GLColorPointer(tglContext, size, atype, stride, pointer);
+end;
+
+procedure glCopyTexImage2D(target: GLenum; level: GLint; internalFormat: GLenum; x, y: GLint; width, height: GLsizei; border: GLint); inline;
+begin
+{$WARNING glCopyTexImage2D is dummy.}
+  // DUMMY, FIX ME!!! 
+  // TinyGL doesn't support this yet.
+end;
+
+procedure glCullFace(mode: GLenum); inline;
+begin
+  _GLCullFace(tglContext, mode);
+end;
+
+procedure glDeleteLists(list: GLuint; range: GLsizei); inline;
+begin
+  _GLDeleteLists(tglContext, list, range);
+end;
+
+procedure glEnd; inline;
+begin
+  _GLEnd(tglContext);
+end;
+
+procedure glEndList; inline;
+begin
+  _GLEndList(tglContext);
+end;
+
+procedure glFlush; inline;
+begin
+  _GLFlush(tglContext);
+end;
+
+function  glGenLists(range: GLsizei): GLuint; inline;
+begin
+  glGenLists:=_GLGenLists(tglContext, range);
+end;
+
+procedure glGetFloatv(pname: GLenum; params: PGLfloat); inline;
+begin
+  _GLGetFloatv(tglContext, pname, params);
+end;
+
+function glGetString(name: GLenum): PChar; inline;
+begin
+  glGetString:=_GLGetString(tglContext, name);
+end;
+
+procedure glHint(target, mode: GLenum); inline;
+begin
+  _GLHint(tglContext, target, mode);
+end;
+
+procedure glIndexi(c: GLint); inline;
+begin
+{$WARNING glIndexi is dummy.}
+  // DUMMY, FIX ME!!! 
+end;
+
+procedure glLightModelfv(pname: GLenum; const params: PGLfloat); inline;
+begin
+  _GLLightModelfv(tglContext, pname, params);
+end;
+
+procedure glNewList(list: GLuint; mode: GLenum); inline;
+begin
+  _GLNewList(tglContext, list, mode);
+end;
+
+procedure glVertex2f(x, y: GLfloat); inline;
+begin
+  _GLVertex3f(tglContext, x, y, 0);
+end;
+
+procedure glVertex2i(x, y: GLint); inline;
+begin
+  _GLVertex3f(tglContext, x, y, 0);
+end;
+
+procedure glVertex3f(x, y, z: GLfloat); inline;
+begin
+  _GLVertex3f(tglContext, x, y ,z);
+end; 
+
+procedure glVertex3fv(const v: PGLfloat); inline;
+begin
+  _GLVertex3fv(tglContext, v);
+end;
+
+procedure glLightf(light, pname: GLenum; param: GLfloat); inline;
+begin
+  _GLLightf(tglContext, light, pname, param);
+end;
+
+procedure glLightfv(light, pname: GLenum; const params: PGLfloat); inline;
+begin
+  _GLLightfv(tglContext, light, pname, params);
+end;
+
+procedure glLineWidth(width: GLfloat); inline;
+begin
+  _GLLineWidth(tglContext, width);
+end;
+
+procedure glLoadIdentity; inline;
+begin
+  _GLLoadIdentity(tglContext);
+end;
+
+procedure glMaterialf(face, pname: GLenum; param: GLfloat); inline;
+begin
+  _GLMaterialf(tglContext, face, pname, param);
+end;
+
+procedure glMaterialfv(face, pname: GLenum; const params: PGLfloat); inline;
+begin
+  _GLMaterialfv(tglContext, face, pname, params);
+end;
+
+procedure glMateriali(face, pname: GLenum; param: GLint); inline;
+begin
+  // WTF?! 
+  _GLMaterialf(tglContext, face, pname, param);
+end;
+
+procedure glMaterialiv(face, pname: GLenum; const params: PGLint); inline;
+begin
+  // WTF?!
+  _GLMaterialfv(tglContext, face, pname, PGLfloat(params));
+end;
+
+procedure glMatrixMode(mode: GLenum); inline;
+begin
+  _GLMatrixMode(tglContext, mode);
+end; 
+
+procedure glNormalPointer(atype: GLenum; stride: GLsizei; const pointer: Pointer); inline;
+begin
+  _GLNormalPointer(tglContext, atype, stride, pointer);
+end;
+
+procedure glPointSize(size: GLfloat); inline;
+begin
+  // 604! :)
+  _GLPointSize(tglContext, size);
+end;
+
+procedure glRasterPos3f(x, y, z: GLfloat); inline;
+begin
+  _GLRasterPos3f(tglContext, x, y, z);
+end;
+
+procedure glReadPixels(x, y: GLint; width, height: GLsizei; format, atype: GLenum; pixels: Pointer); inline;
+begin
+  _GLReadPixels(tglContext, x, y, width, height, format, atype, pixels);
+end;
+
+procedure glShadeModel(mode: GLenum); inline;
+begin
+  _GLShadeModel(tglContext, mode);
+end;
+
+procedure glStencilFunc(func: GLenum; ref: GLint; mask: GLuint); inline;
+begin
+  _GLStencilFunc(tglContext, func, ref, mask);
+end;
+
+procedure glStencilOp(fail, zfail, zpass: GLenum); inline;
+begin
+  _GLStencilOp(tglContext, fail, zfail, zpass);
+end;
+
+procedure glTexCoordPointer(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); inline;
+begin
+  _GLTexCoordPointer(tglContext, size, atype, stride, pointer);
+end;
+
+procedure glTexParameterf(target: GLenum; pname: GLenum; param: GLfloat); inline;
+begin
+  _GLTexParameterf(tglContext, target, pname, param);
+end;
+
+procedure glFrustum(left, right, bottom, top, zNear, zFar: GLdouble); inline;
+begin
+  _GLFrustum(tglContext, left, right, bottom, top, zNear, zFar);
+end; 
+
+procedure glTranslatef(x, y, z: GLfloat); inline;
+begin
+  _GLTranslatef(tglContext, x, y, z);
+end; 
+
+procedure glScalef(x, y, z: GLfloat); inline;
+begin
+  _GLScalef(tglContext, x, y, z);
+end; 
+
+procedure glRotatef(angle, x, y, z: GLfloat); inline;
+begin
+  _GLRotatef(tglContext, angle, x, y, z);
+end; 
+
+procedure glColor3f(red, green, blue: GLfloat); inline;
+begin
+  _GLColor3f(tglContext, red, green, blue);
+end; 
+
+procedure glColor4f(red, green, blue, alpha: GLfloat); inline;
+begin
+  _GLColor4f(tglContext, red, green, blue, alpha);
+end; 
+
+procedure glNormal3f(nx, ny, nz: GLfloat); inline;
+begin
+  _GLNormal3f(tglContext, nx, ny, nz);
+end;
+
+procedure glDeleteTextures(n: GLsizei; const textures: PGLuint); inline;
+begin
+  _GLDeleteTextures(tglContext, n, textures);
+end;
+
+procedure glDisable(cap: GLenum); inline;
+begin
+  _GLDisable(tglContext, cap);
+end;
+
+procedure glDisableClientState(aarray: GLenum); inline;
+begin
+  _GLDisableClientState(tglContext, aarray);
+end;
+
+procedure glDrawElements(mode: GLenum; count: GLsizei; atype: GLenum; const indices: Pointer); inline;
+begin
+  _GLDrawElements(tglContext, mode, count, atype, indices);
+end;
+
+procedure glEnable(cap: GLenum); inline;
+begin
+  _GLEnable(tglContext, cap);
+end;
+
+procedure glEnableClientState(aarray: GLenum); inline;
+begin
+  _GLEnableClientState(tglContext, aarray);
+end;
+
+procedure glFogf(pname: GLenum; param: GLfloat); inline;
+begin
+  _GLFogf(tglContext, pname, param);
+end;
+
+procedure glFogfv(pname: GLenum; const params: PGLfloat); inline;
+begin
+  _GLFogfv(tglContext, pname, params);
+end;
+
+procedure glFogi(pname: GLenum; param: GLint); inline;
+begin
+  // WTF!? And it actually works!
+  _GLFogf(tglContext, pname, param);
+end;
+
+procedure glOrtho(left, right, bottom, top, zNear, zFar: GLdouble); inline;
+begin
+  _GLOrtho(tglContext, left, right, bottom, top, zNear, zFar);
+end;
+
+procedure glPopMatrix; inline;
+begin
+  _GLPopMatrix(tglContext);
+end;
+
+procedure glPushMatrix; inline;
+begin
+  _GLPushMatrix(tglContext);
+end;
+
+procedure glTexImage2D(target: GLenum; level, internalformat: GLint; width, height: GLsizei; border: GLint; format, atype: GLenum; const pixels: Pointer); inline;
+begin
+  _GLTexImage2D(tglContext, target, level, internalformat, width, height, border, format, atype, pixels);
+end;
+
+procedure glTexParameteri(target: GLenum; pname: GLenum; param: GLint); inline;
+begin
+  _GLTexParameteri(tglContext, target, pname, param);
+end;
+
+procedure glTexCoord2f(s, t: GLfloat); inline;
+begin
+  _GLTexCoord2f(tglContext, s, t);
+end;
+
+procedure glTexGeni(coord: GLenum; pname: GLenum; param: GLint); inline;
+begin
+  _GLTexGeni(tglContext, coord, pname, param);
+end;
+
+procedure glBindTexture(target: GLenum; texture: GLuint); inline;
+begin
+  _GLBindTexture(tglContext, target, texture);
+end;
+
+procedure glGenTextures(n: GLsizei; textures: PGLuint); inline;
+begin
+  _GLGenTextures(tglContext, n, textures);
+end;
+
+procedure glBlendFunc(sfactor, dfactor: GLenum); inline;
+begin
+  _GLBlendFunc(tglContext, sfactor, dfactor);
+end;
+
+procedure glDepthFunc(func: GLenum); inline;
+begin
+  _GLDepthFunc(tglContext, func);
+end;
+
+procedure glDepthMask(flag: GLboolean); inline;
+begin
+  _GLDepthMask(tglContext, flag);
+end;
+
+procedure glVertexPointer(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); inline;
+begin
+  _GLVertexPointer(tglContext, size, atype, stride, pointer);
+end;
+
+procedure glViewport(x, y: GLint; width, height: GLsizei); inline;
+begin
+  _GLViewport(tglContext, x, x, width, height);
+end;
+{$ENDIF GL_UNIT}
+
+
+{ ****************************************************************************************************** }
+{ ** GLU functions                                                                                    ** }
+{ ****************************************************************************************************** }
+
+{$IFDEF GLU_UNIT}
+procedure gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: GLdouble); inline;
+begin
+  _GLULookAt(tglContext, eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz);
+end;
+
+procedure gluOrtho2D(left,right, bottom, top: GLdouble); inline;
+begin
+  _GLOrtho(tglContext, left, right, bottom, top, -1.0, 1.0)
+end;
+
+procedure gluPerspective(fovy, aspect, zNear, zFar: GLdouble); inline;
+begin
+  _GLUPerspective(tglContext, fovy, aspect, zNear, zFar);
+end;
+{$ENDIF GLU_UNIT}
+
+
+{ ****************************************************************************************************** }
+{ ** GLUT functions                                                                                   ** }
+{ ****************************************************************************************************** }
+
+{$IFDEF GLUT_UNIT}
+procedure GLUTInit(argcp: PLongInt; argv: PPChar); inline;
+begin
+  _GLUTInit(tglContext,argcp,argv);
+end;
+
+procedure GLUTInitDisplayMode(mode: Word); inline;
+begin
+  _GLUTInitDisplayMode(tglContext,mode);
+end;
+
+procedure GLUTInitWindowPosition(x, y: Integer); inline;
+begin
+ _GLUTInitWindowPosition(tglContext, x, y);
+end;
+
+procedure GLUTInitWindowSize(width, height: LongInt); inline;
+begin
+  _GLUTInitWindowSize(tglContext, width, height);
+end;
+
+procedure GLUTSwapBuffers; inline;
+begin
+  _GLUTSwapBuffers(tglContext);
+end;
+
+procedure GLUTPostRedisplay; inline;
+begin
+  _GLUTPostRedisplay(tglContext);
+end;
+
+procedure GLUTReshapeFunc(f: TGlut2IntCallback); inline;
+begin
+  _GLUTReshapeFunc(tglContext, f);
+end;
+
+function GLUTCreateWindow(const title: PChar): LongInt; inline;
+begin
+  GLUTCreateWindow:=_GLUTCreateWindow(tglContext, title);
+end;
+
+procedure GLUTDestroyWindow(win: LongInt); inline;
+begin
+  _GLUTDestroyWindow(tglContext, win);
+end;
+
+procedure GLUTDisplayFunc(f: TGlutVoidCallback); inline;
+begin
+  _GLUTDisplayFunc(tglContext, f);
+end;
+
+procedure GLUTIdleFunc(f: TGlutVoidCallback); inline;
+begin
+  _GLUTIdleFunc(tglContext, f);
+end;
+
+procedure GLUTTimerFunc(millis: Word; f: TGlut1IntCallback; value: LongInt); inline;
+begin
+  _GLUTTimerFunc(tglContext, millis, f, value);
+end;
+
+procedure GLUTKeyboardFunc(f: TGlut1Char2IntCallback); inline;
+begin
+  _GLUTKeyboardFunc(tglContext, f);
+end;
+
+procedure GLUTMouseFunc(f: TGlut4IntCallback); inline;
+begin
+  _GLUTMouseFunc(tglContext, f);
+end;
+
+procedure GLUTSpecialFunc(f: TGlut3IntCallback); inline;
+begin
+  _GLUTSpecialFunc(tglContext, f);
+end;
+
+procedure GLUTMotionFunc(f: TGlut2IntCallback); inline;
+begin
+  _GLUTMotionFunc(tglContext, f);
+end;
+
+procedure GLUTPassiveMotionFunc(f: TGlut2IntCallback); inline;
+begin
+  _GLUTPassiveMotionFunc(tglContext, f);
+end;
+
+function GLUTGetWindowHandle: pointer; inline;
+begin
+  GLUTGetWindowHandle:=_GLUTGetWindowHandle(tglContext);
+end;
+
+procedure GLUTVisibilityFunc(f: TGlut1IntCallback); inline;
+begin
+  _GLUTVisibilityFunc(tglContext, f);
+end;
+
+function  GLUTGet(t: GLenum): LongInt; inline;
+begin
+  GLUTGet:=_GLUTGet(tglContext,t);
+end;
+
+procedure GLUTMainLoop; inline;
+begin
+  _GLUTMainLoop(tglContext);
+end;
+
+procedure GLUTFullScreen; inline;
+begin
+  _GLUTFullScreen(tglContext);
+end;
+
+procedure GLUTSetColor(cell: Integer; red, green, blue: GLfloat); inline;
+begin
+{$WARNING GLUTSetColor is dummy.}
+  // DUMMY, FIX ME!!! 
+end;
+{$ENDIF GLUT_UNIT}

+ 165 - 0
packages/opengl/src/tinyglh.inc

@@ -0,0 +1,165 @@
+{
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2005 by Karoly Balogh
+
+     TinyGL/OpenGL wrapper include header for MorphOS/PowerPC
+
+    Thanks to Michal 'kiero' Wozniak and Mark 'bigfoot' Olsen
+    for their help.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+{ ****************************************************************************************************** }
+{ ** GL functions                                                                                     ** }
+{ ****************************************************************************************************** }
+
+{$IFDEF GL_UNIT}
+procedure glAlphaFunc(func: GLenum; ref: GLclampf); inline;
+
+procedure glBegin(mode: GLenum); inline;
+
+procedure glCallList(list: GLuint); inline;
+procedure glCallLists(n: GLsizei; atype: GLenum; const lists: Pointer); inline;
+procedure glClear(mask: GLbitfield); inline;
+procedure glClearColor(red, green, blue, alpha: GLclampf); inline;
+procedure glClearDepth(depth: GLclampd); inline;
+procedure glColor3f(red, green, blue: GLfloat); inline;
+procedure glColor4f(red, green, blue, alpha: GLfloat); inline;
+procedure glColorMask(red, green, blue, alpha: GLboolean); inline;
+procedure glColorPointer(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); inline;
+procedure glCopyTexImage2D(target: GLenum; level: GLint; internalFormat: GLenum; x, y: GLint; width, height: GLsizei; border: GLint); inline;
+procedure glCullFace(mode: GLenum); inline;
+
+procedure glDeleteLists(list: GLuint; range: GLsizei); inline;
+procedure glDeleteTextures(n: GLsizei; const textures: PGLuint); inline;
+procedure glDepthFunc(func: GLenum); inline;
+procedure glDepthMask(flag: GLboolean); inline;
+procedure glDisable(cap: GLenum); inline;
+procedure glDisableClientState(aarray: GLenum); inline;
+procedure glDrawElements(mode: GLenum; count: GLsizei; atype: GLenum; const indices: Pointer); inline;
+
+procedure glEnable(cap: GLenum); inline;
+procedure glEnableClientState(aarray: GLenum); inline;
+procedure glEnd; inline;
+procedure glEndList; inline;
+
+procedure glFlush; inline;
+procedure glFogf(pname: GLenum; param: GLfloat); inline;
+procedure glFogfv(pname: GLenum; const params: PGLfloat); inline;
+procedure glFogi(pname: GLenum; param: GLint); inline;
+
+function  glGenLists(range: GLsizei): GLuint; inline;
+procedure glGetFloatv(pname: GLenum; params: PGLfloat); inline;
+function  glGetString(name: GLenum): PChar; inline;
+
+procedure glHint(target, mode: GLenum); inline;
+
+procedure glIndexi(c: GLint); inline;
+
+procedure glLightf(light, pname: GLenum; param: GLfloat); inline;
+procedure glLightfv(light, pname: GLenum; const params: PGLfloat); inline;
+procedure glLineWidth(width: GLfloat); inline;
+procedure glLoadIdentity; inline;
+procedure glLightModelfv(pname: GLenum; const params: PGLfloat); inline;
+
+procedure glMaterialf(face, pname: GLenum; param: GLfloat); inline;
+procedure glMaterialfv(face, pname: GLenum; const params: PGLfloat); inline;
+procedure glMateriali(face, pname: GLenum; param: GLint); inline;
+procedure glMaterialiv(face, pname: GLenum; const params: PGLint); inline;
+procedure glMatrixMode(mode: GLenum); inline;
+
+procedure glNewList(list: GLuint; mode: GLenum); inline;
+procedure glNormal3f(nx, ny, nz: GLfloat); inline;
+procedure glNormalPointer(atype: GLenum; stride: GLsizei; const pointer: Pointer); inline;
+
+procedure glVertex2f(x, y: GLfloat); inline;
+procedure glVertex2i(x, y: GLint); inline;
+procedure glVertex3f(x, y, z: GLfloat); inline;
+procedure glVertex3fv(const v: PGLfloat); inline;
+
+procedure glPointSize(size: GLfloat); inline;
+procedure glRasterPos3f(x, y, z: GLfloat); inline;
+procedure glReadPixels(x, y: GLint; width, height: GLsizei; format, atype: GLenum; pixels: Pointer); inline;
+
+procedure glShadeModel(mode: GLenum); inline;
+
+procedure glStencilFunc(func: GLenum; ref: GLint; mask: GLuint); inline;
+procedure glStencilOp(fail, zfail, zpass: GLenum); inline;
+
+procedure glTexCoordPointer(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); inline;
+procedure glTexParameterf(target: GLenum; pname: GLenum; param: GLfloat); inline;
+
+procedure glFrustum(left, right, bottom, top, zNear, zFar: GLdouble); inline;
+procedure glTranslatef(x, y, z: GLfloat); inline;
+procedure glScalef(x, y, z: GLfloat); inline;
+procedure glRotatef(angle, x, y, z: GLfloat); inline;
+
+procedure glOrtho(left, right, bottom, top, zNear, zFar: GLdouble); inline;
+procedure glPopMatrix; inline;
+procedure glPushMatrix; inline;
+
+procedure glTexImage2D(target: GLenum; level, internalformat: GLint; width, height: GLsizei; border: GLint; format, atype: GLenum; const pixels: Pointer); inline;
+procedure glTexParameteri(target: GLenum; pname: GLenum; param: GLint); inline;
+procedure glTexCoord2f(s, t: GLfloat); inline;
+procedure glTexGeni(coord: GLenum; pname: GLenum; param: GLint); inline;
+procedure glBindTexture(target: GLenum; texture: GLuint); inline;
+procedure glGenTextures(n: GLsizei; textures: PGLuint); inline;
+
+procedure glBlendFunc(sfactor, dfactor: GLenum); inline;
+
+procedure glVertexPointer(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); inline;
+
+procedure glViewport(x, y: GLint; width, height: GLsizei); inline;
+{$ENDIF GL_UNIT}
+
+{ ****************************************************************************************************** }
+{ ** GLU functions                                                                                    ** }
+{ ****************************************************************************************************** }
+
+{$IFDEF GLU_UNIT}
+procedure gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: GLdouble); inline;
+procedure gluOrtho2D(left,right, bottom, top: GLdouble); inline;
+procedure gluPerspective(fovy, aspect, zNear, zFar: GLdouble); inline;
+{$ENDIF GLU_UNIT}
+
+{ ****************************************************************************************************** }
+{ ** GLUT functions                                                                                   ** }
+{ ****************************************************************************************************** }
+
+{$IFDEF GLUT_UNIT}
+procedure GLUTInit(argcp: PLongInt; argv: PPChar); inline;
+procedure GLUTInitDisplayMode(mode: Word); inline;
+procedure GLUTInitWindowPosition(x, y: Integer); inline;
+procedure GLUTInitWindowSize(width, height: LongInt); inline;
+
+function  GLUTCreateWindow(const title: PChar): LongInt; inline;
+procedure GLUTDestroyWindow(win: LongInt); inline;
+procedure GLUTDisplayFunc(f: TGlutVoidCallback); inline;
+procedure GLUTIdleFunc(f: TGlutVoidCallback); inline;
+procedure GLUTTimerFunc(millis: Word; f: TGlut1IntCallback; value: LongInt); inline;
+function  GLUTGetWindowHandle: pointer; inline; // MorphOS specific
+procedure GLUTVisibilityFunc(f: TGlut1IntCallback); inline;
+procedure GLUTKeyboardFunc(f: TGlut1Char2IntCallback); inline;
+procedure GLUTMouseFunc(f: TGlut4IntCallback); inline;
+procedure GLUTSpecialFunc(f: TGlut3IntCallback); inline;
+procedure GLUTReshapeFunc(f: TGlut2IntCallback); inline;
+procedure GLUTMotionFunc(f: TGlut2IntCallback); inline;
+procedure GLUTPassiveMotionFunc(f: TGlut2IntCallback); inline;
+
+procedure GLUTSwapBuffers; inline;
+procedure GLUTPostRedisplay; inline;
+
+function  GLUTGet(t: GLenum): LongInt; inline;
+  
+procedure GLUTMainLoop; inline;
+
+procedure GLUTFullScreen; inline;
+procedure GLUTSetColor(cell: Integer; red, green, blue: GLfloat); inline;
+{$ENDIF GLUT_UNIT}