From 107c23d970191d14dab7da9ef0b236094985cd43 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Fri, 5 Feb 2016 22:32:22 +1000 Subject: [PATCH 01/20] Update config.guess from upstream --- config/config.guess | 56 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/config/config.guess b/config/config.guess index dbfb978..3d2c450 100755 --- a/config/config.guess +++ b/config/config.guess @@ -1,8 +1,8 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2015 Free Software Foundation, Inc. +# Copyright 1992-2016 Free Software Foundation, Inc. -timestamp='2015-01-01' +timestamp='2016-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ timestamp='2015-01-01' # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . @@ -50,7 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2015 Free Software Foundation, Inc. +Copyright 1992-2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in - arm*|i386|m68k|ns32k|sh3*|sparc|vax) + arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ @@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in os=netbsd ;; esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need @@ -207,13 +221,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" + echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` @@ -223,6 +237,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/LibertyBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; @@ -235,6 +253,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) @@ -933,6 +954,9 @@ EOF crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -945,6 +969,9 @@ EOF ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; @@ -1021,7 +1048,7 @@ EOF echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} @@ -1100,7 +1127,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1370,6 +1397,9 @@ EOF x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; esac cat >&2 < Date: Fri, 5 Feb 2016 22:34:16 +1000 Subject: [PATCH 02/20] GNU make MSYS2 toolchain configuration added --- config/Makefile.msys | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 config/Makefile.msys diff --git a/config/Makefile.msys b/config/Makefile.msys new file mode 100644 index 0000000..7be7344 --- /dev/null +++ b/config/Makefile.msys @@ -0,0 +1,16 @@ +NAME = glew32 +# use gcc for linking, with ld it does not work +CC := gcc +LD := gcc +LN := +LDFLAGS.GL = -lopengl32 -lgdi32 -luser32 -lkernel32 +LDFLAGS.EXTRA = +LIBDIR = $(GLEW_DEST)/bin +WARN = -Wall -W +POPT = -O2 +BIN.SUFFIX = .exe +LIB.SONAME = lib$(NAME).dll +LIB.DEVLNK = lib$(NAME).dll.a # for mingw this is the dll import lib +LIB.SHARED = $(NAME).dll +LIB.STATIC = lib$(NAME).a # the static lib will be broken +LDFLAGS.SO = -shared -Wl,-soname,$(LIB.SONAME) -Wl,--out-implib,lib/$(LIB.DEVLNK) From c45763d790b7d826b37a531f68d0263e17a5edef Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 6 Feb 2016 06:46:18 +1000 Subject: [PATCH 03/20] Add make toolchains for msys, msys-win32 and msys-win64 --- Makefile | 7 ++++--- README.md | 29 +++++++++++++++++++++++++++++ config/Makefile.msys | 1 + config/Makefile.msys-win32 | 5 +++++ config/Makefile.msys-win64 | 5 +++++ 5 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 config/Makefile.msys-win32 create mode 100644 config/Makefile.msys-win64 diff --git a/Makefile b/Makefile index 7f97342..8280f87 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,7 @@ GLEW_DEST ?= /usr BINDIR ?= $(GLEW_DEST)/bin LIBDIR ?= $(GLEW_DEST)/lib INCDIR ?= $(GLEW_DEST)/include/GL +PKGDIR ?= $(GLEW_DEST)/lib/pkgconfig ifneq ($(GLEW_NO_GLU), -DGLEW_NO_GLU) LIBGLU = glu @@ -229,9 +230,9 @@ install.include: $(INSTALL) -m 0644 include/GL/glxew.h "$(DESTDIR)$(INCDIR)/" install.pkgconfig: glew.pc - $(INSTALL) -d -m 0755 "$(DESTDIR)$(LIBDIR)" - $(INSTALL) -d -m 0755 "$(DESTDIR)$(LIBDIR)/pkgconfig" - $(INSTALL) -m 0644 glew.pc "$(DESTDIR)$(LIBDIR)/pkgconfig/" + $(INSTALL) -d -m 0755 "$(DESTDIR)$(PKGDIR)" + $(INSTALL) -d -m 0755 "$(DESTDIR)$(PKGDIR)" + $(INSTALL) -m 0644 glew.pc "$(DESTDIR)$(PKGDIR)/" uninstall: $(RM) "$(DESTDIR)$(INCDIR)/wglew.h" diff --git a/README.md b/README.md index 6f4659c..a85faa9 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,37 @@ RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel g ### Windows +#### Visual Studio + Use the provided Visual Studio project file in build/vc12/ +Projects for vc6 and vc10 are also provided + +#### MSYS/Mingw + +Available from [Mingw](http://www.mingw.org/) + +Requirements: bash, make, gcc + + $ mingw32-make + $ mingw32-make install + $ mingw32-make install.all + +Alternative toolchain: `SYSTEM=mingw-win32` + +#### MSYS2/Mingw-w64 + +Available from [Msys2](http://msys2.github.io/) and/or [Mingw-w64](http://mingw-w64.org/) + +Requirements: bash, make, gcc + + $ pacman -S gcc make mingw-w64-i686-gcc mingw-w64-x86_64-gcc + $ make + $ make install + $ make install.all + +Alternative toolchain: `SYSTEM=msys, SYSTEM=msys-win32, SYSTEM=msys-win64` + ## glewinfo `glewinfo` is a command-line tool useful for inspecting the capabilities of an diff --git a/config/Makefile.msys b/config/Makefile.msys index 7be7344..dfee9c7 100644 --- a/config/Makefile.msys +++ b/config/Makefile.msys @@ -3,6 +3,7 @@ NAME = glew32 CC := gcc LD := gcc LN := +CFLAGS.EXTRA += -D_WIN32 LDFLAGS.GL = -lopengl32 -lgdi32 -luser32 -lkernel32 LDFLAGS.EXTRA = LIBDIR = $(GLEW_DEST)/bin diff --git a/config/Makefile.msys-win32 b/config/Makefile.msys-win32 new file mode 100644 index 0000000..160d3eb --- /dev/null +++ b/config/Makefile.msys-win32 @@ -0,0 +1,5 @@ +include config/Makefile.msys + +POPT := -march=i686 -mtune=generic -O2 +CFLAGS.EXTRA += -m32 +LDFLAGS.EXTRA += -m32 diff --git a/config/Makefile.msys-win64 b/config/Makefile.msys-win64 new file mode 100644 index 0000000..c1c785a --- /dev/null +++ b/config/Makefile.msys-win64 @@ -0,0 +1,5 @@ +include config/Makefile.msys + +POPT := -mtune=generic -O2 +CFLAGS.EXTRA += -m64 +LDFLAGS.EXTRA += -m64 From 69b73ea446a6da0db2701ad021ff6c3b7a21e6db Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 6 Feb 2016 12:19:47 +1000 Subject: [PATCH 04/20] Allow customisation of GLEW_GET_VAR, GLEW_GET_FUN --- auto/src/glew_tail.h | 5 +++++ auto/src/glxew_tail.h | 5 +++++ auto/src/wglew_tail.h | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/auto/src/glew_tail.h b/auto/src/glew_tail.h index 6ee9912..ce7ff3c 100644 --- a/auto/src/glew_tail.h +++ b/auto/src/glew_tail.h @@ -29,8 +29,13 @@ GLEWAPI GLenum GLEWAPIENTRY glewInit (void); GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); #define glewIsExtensionSupported(x) glewIsSupported(x) +#ifndef GLEW_GET_VAR #define GLEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef GLEW_GET_FUN #define GLEW_GET_FUN(x) x +#endif GLEWAPI GLboolean glewExperimental; GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); diff --git a/auto/src/glxew_tail.h b/auto/src/glxew_tail.h index 4026fa7..05ff1b1 100644 --- a/auto/src/glxew_tail.h +++ b/auto/src/glxew_tail.h @@ -3,8 +3,13 @@ GLEWAPI GLenum GLEWAPIENTRY glxewInit (); GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); +#ifndef GLXEW_GET_VAR #define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef GLXEW_GET_FUN #define GLXEW_GET_FUN(x) x +#endif GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); diff --git a/auto/src/wglew_tail.h b/auto/src/wglew_tail.h index 3810662..8971158 100644 --- a/auto/src/wglew_tail.h +++ b/auto/src/wglew_tail.h @@ -3,8 +3,13 @@ GLEWAPI GLenum GLEWAPIENTRY wglewInit (); GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); +#ifndef WGLEW_GET_VAR #define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#endif + +#ifndef WGLEW_GET_FUN #define WGLEW_GET_FUN(x) x +#endif GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); From fe41bc3bdd28ea99699a69777df130043e648707 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 6 Feb 2016 12:23:56 +1000 Subject: [PATCH 05/20] Remove more #ifdef for GLEW_MX --- auto/Makefile | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/auto/Makefile b/auto/Makefile index 4caf481..fb2663c 100644 --- a/auto/Makefile +++ b/auto/Makefile @@ -135,13 +135,9 @@ $(I.DEST)/glew.h: $(EXT)/.dummy cat $(SRC)/glew_head.h >> $@ $(BIN)/make_header.pl GLAPIENTRY GL $(GL_CORE_SPEC) >> $@ $(BIN)/make_header.pl GLAPIENTRY GL $(GL_EXT_SPEC) >> $@ - echo -e "/* ------------------------------------------------------------------------- */\n\n#if defined(GLEW_MX) && defined(_WIN32)\n#define GLEW_FUN_EXPORT\n#else\n#define GLEW_FUN_EXPORT GLEWAPI\n#endif /* GLEW_MX */\n" >> $@ - echo -e "#if defined(GLEW_MX)\n#define GLEW_VAR_EXPORT\n#else\n#define GLEW_VAR_EXPORT GLEWAPI\n#endif /* GLEW_MX */\n" >> $@ - echo -e "#if defined(GLEW_MX) && defined(_WIN32)\nstruct GLEWContextStruct\n{\n#endif /* GLEW_MX */" >> $@ + echo -e "/* ------------------------------------------------------------------------- */\n\n" >> $@ $(BIN)/make_struct_fun.pl GLEW_FUN_EXPORT $(GL_CORE_SPEC) $(GL_EXT_SPEC) >> $@ - echo -e "\n#if defined(GLEW_MX) && !defined(_WIN32)\nstruct GLEWContextStruct\n{\n#endif /* GLEW_MX */\n" >> $@ $(BIN)/make_struct_var.pl GLEW_VAR_EXPORT $(GL_CORE_SPEC) $(GL_EXT_SPEC) >> $@ - echo -e "\n#ifdef GLEW_MX\n}; /* GLEWContextStruct */\n#endif /* GLEW_MX */\n" >> $@ perl -e "s/GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2;/GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1;\nGLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2;/" -pi $@ cat $(SRC)/glew_tail.h >> $@ perl -e "s/GLEW_VERSION_STRING/$(GLEW_VERSION)/g" -pi $@ @@ -159,10 +155,8 @@ $(I.DEST)/wglew.h: $(EXT)/.dummy cat $(SRC)/wglew_head.h >> $@ $(BIN)/make_header.pl WINAPI WGL $(WGL_EXT_SPEC) >> $@ cat $(SRC)/wglew_mid.h >> $@ - echo -e "\n#ifdef GLEW_MX\nstruct WGLEWContextStruct\n{\n#endif /* GLEW_MX */" >> $@ $(BIN)/make_struct_fun.pl WGLEW_FUN_EXPORT $(WGL_EXT_SPEC) >> $@ $(BIN)/make_struct_var.pl WGLEW_VAR_EXPORT $(WGL_EXT_SPEC) >> $@ - echo -e "\n#ifdef GLEW_MX\n}; /* WGLEWContextStruct */\n#endif /* GLEW_MX */\n" >> $@ cat $(SRC)/wglew_tail.h >> $@ $(I.DEST)/glxew.h: $(EXT)/.dummy @@ -177,9 +171,7 @@ $(I.DEST)/glxew.h: $(EXT)/.dummy $(BIN)/make_header.pl "" GLX $(GLX_EXT_SPEC) >> $@ cat $(SRC)/glxew_mid.h >> $@ $(BIN)/make_struct_fun.pl GLXEW_FUN_EXPORT $(GLX_CORE_SPEC) $(GLX_EXT_SPEC) >> $@ - echo -e "\n#if defined(GLEW_MX)\nstruct GLXEWContextStruct\n{\n#endif /* GLEW_MX */\n" >> $@ $(BIN)/make_struct_var.pl GLXEW_VAR_EXPORT $(GLX_CORE_SPEC) $(GLX_EXT_SPEC) >> $@ - echo -e "\n#ifdef GLEW_MX\n}; /* GLXEWContextStruct */\n#endif /* GLEW_MX */\n" >> $@ perl -e "s/GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2;/GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0;\nGLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1;\nGLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2;/" -pi $@ cat $(SRC)/glxew_tail.h >> $@ @@ -189,21 +181,15 @@ $(S.DEST)/glew.c: $(EXT)/.dummy @echo "--------------------------------------------------------------------" cp -f $(SRC)/glew_license.h $@ cat $(SRC)/glew_head.c >> $@ - echo -e "\n#if !defined(_WIN32) || !defined(GLEW_MX)" >> $@ $(BIN)/make_def_fun.pl GL $(GL_CORE_SPEC) >> $@ $(BIN)/make_def_fun.pl GL $(GL_EXT_SPEC) >> $@ - echo -e "\n#endif /* !WIN32 || !GLEW_MX */" >> $@ - echo -e "\n#if !defined(GLEW_MX)" >> $@; echo -e "\nGLboolean __GLEW_VERSION_1_1 = GL_FALSE;" >> $@ $(BIN)/make_def_var.pl GL $(GL_CORE_SPEC) >> $@ $(BIN)/make_def_var.pl GL $(GL_EXT_SPEC) >> $@ - echo -e "\n#endif /* !GLEW_MX */\n" >> $@; echo -e "\nstatic const char * _glewExtensionLookup[] = {" >> $@; $(BIN)/make_index.pl $(GL_CORE_SPEC) $(GL_EXT_SPEC) >> $@ echo -e " NULL\n};\n" >> $@; - echo -e "\n#if !defined(GLEW_MX)" >> $@; $(BIN)/make_enable_index.pl $(GL_CORE_SPEC) $(GL_EXT_SPEC) >> $@ - echo -e "\n#endif /* !GLEW_MX */\n" >> $@; $(BIN)/make_initd.pl GL $(GL_CORE_SPEC) >> $@ $(BIN)/make_initd.pl GL $(GL_EXT_SPEC) >> $@ echo -e "" >> $@; @@ -215,10 +201,8 @@ $(S.DEST)/glew.c: $(EXT)/.dummy $(BIN)/make_list2.pl $(GL_EXT_SPEC) >> $@ echo -e "\n return GLEW_OK;\n}\n" >> $@ echo -e "\n#if defined(_WIN32) && ! defined(GLEW_OSMESA)" >> $@ - echo -e "\n#if !defined(GLEW_MX)" >> $@ $(BIN)/make_def_fun.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_def_var.pl WGL $(WGL_EXT_SPEC) >> $@ - echo -e "\n#endif /* !GLEW_MX */\n" >> $@; $(BIN)/make_init.pl WGL $(WGL_EXT_SPEC) >> $@ cat $(SRC)/glew_init_wgl.c >> $@ $(BIN)/make_list.pl $(WGL_EXT_SPEC) >> $@ @@ -226,12 +210,10 @@ $(S.DEST)/glew.c: $(EXT)/.dummy echo -e "\n#elif !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))" >> $@ $(BIN)/make_def_fun.pl GLX $(GLX_CORE_SPEC) >> $@ $(BIN)/make_def_fun.pl GLX $(GLX_EXT_SPEC) >> $@ - echo -e "\n#if !defined(GLEW_MX)" >> $@; echo -e "\nGLboolean __GLXEW_VERSION_1_0 = GL_FALSE;" >> $@ echo -e "GLboolean __GLXEW_VERSION_1_1 = GL_FALSE;" >> $@ $(BIN)/make_def_var.pl GLX $(GLX_CORE_SPEC) >> $@ $(BIN)/make_def_var.pl GLX $(GLX_EXT_SPEC) >> $@ - echo -e "\n#endif /* !GLEW_MX */\n" >> $@; $(BIN)/make_init.pl GLX $(GLX_CORE_SPEC) >> $@ $(BIN)/make_init.pl GLX $(GLX_EXT_SPEC) >> $@ cat $(SRC)/glew_init_glx.c >> $@ From 4ee89ccb393fb09774c71340eff5922f25f3e89b Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 6 Feb 2016 12:35:05 +1000 Subject: [PATCH 06/20] Build fix for GLEW_VAR_EXPORT, GLEW_FUN_EXPORT --- auto/src/glew_head.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/auto/src/glew_head.h b/auto/src/glew_head.h index c5592e1..c19cefb 100644 --- a/auto/src/glew_head.h +++ b/auto/src/glew_head.h @@ -184,6 +184,9 @@ typedef _W64 int ptrdiff_t; #define GLEWAPIENTRY #endif +#define GLEW_VAR_EXPORT GLEWAPI +#define GLEW_FUN_EXPORT GLEWAPI + #ifdef __cplusplus extern "C" { #endif From f4abb657b36307a3cbb18951a65877dd08b07d5d Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sun, 6 Dec 2015 12:58:46 +1000 Subject: [PATCH 07/20] GLEW_EGL mode for loading functions via eglGetProcAddress --- auto/Makefile | 6 ++- auto/src/glew_head.c | 11 ++++-- auto/src/glew_init_tail.c | 2 +- auto/src/glew_str_glx.c | 2 +- auto/src/glew_str_wgl.c | 2 +- auto/src/glewinfo_glx.c | 2 +- auto/src/glewinfo_head.c | 7 +++- auto/src/glewinfo_tail.c | 82 +++++++++++++++++++++++++++++---------- auto/src/glewinfo_wgl.c | 2 +- 9 files changed, 84 insertions(+), 32 deletions(-) diff --git a/auto/Makefile b/auto/Makefile index fb2663c..5862050 100644 --- a/auto/Makefile +++ b/auto/Makefile @@ -200,14 +200,14 @@ $(S.DEST)/glew.c: $(EXT)/.dummy $(BIN)/make_list.pl $(GL_EXT_SPEC) >> $@ $(BIN)/make_list2.pl $(GL_EXT_SPEC) >> $@ echo -e "\n return GLEW_OK;\n}\n" >> $@ - echo -e "\n#if defined(_WIN32) && ! defined(GLEW_OSMESA)" >> $@ + echo -e "\n#if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA)" >> $@ $(BIN)/make_def_fun.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_def_var.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_init.pl WGL $(WGL_EXT_SPEC) >> $@ cat $(SRC)/glew_init_wgl.c >> $@ $(BIN)/make_list.pl $(WGL_EXT_SPEC) >> $@ echo -e "\n return GLEW_OK;\n}" >> $@; - echo -e "\n#elif !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))" >> $@ + echo -e "\n#elif !defined(GLEW_EGL) && !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))" >> $@ $(BIN)/make_def_fun.pl GLX $(GLX_CORE_SPEC) >> $@ $(BIN)/make_def_fun.pl GLX $(GLX_EXT_SPEC) >> $@ echo -e "\nGLboolean __GLXEW_VERSION_1_0 = GL_FALSE;" >> $@ @@ -245,12 +245,14 @@ $(S.DEST)/glewinfo.c: $(EXT)/.dummy cat $(SRC)/glewinfo_head.c >> $@ $(BIN)/make_info.pl $(GL_CORE_SPEC) >> $@ $(BIN)/make_info.pl $(GL_EXT_SPEC) >> $@ + echo -e "#if !defined(GLEW_EGL)\n" >> $@ echo -e "#ifdef _WIN32\n" >> $@ $(BIN)/make_info.pl $(WGL_EXT_SPEC) >> $@ echo -e "#else /* _UNIX */\n" >> $@ $(BIN)/make_info.pl $(GLX_CORE_SPEC) >> $@ $(BIN)/make_info.pl $(GLX_EXT_SPEC) >> $@ echo -e "#endif /* _WIN32 */\n" >> $@ + echo -e "#endif /* !defined(GLEW_EGL) */\n" >> $@ cat $(SRC)/glewinfo_gl.c >> $@ $(BIN)/make_info_list.pl $(GL_CORE_SPEC) >> $@ diff --git a/auto/src/glew_head.c b/auto/src/glew_head.c index 99947de..0d052be 100644 --- a/auto/src/glew_head.c +++ b/auto/src/glew_head.c @@ -1,6 +1,7 @@ #include -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +#elif defined(GLEW_OSMESA) # define GLAPI extern # include #elif defined(_WIN32) @@ -13,7 +14,9 @@ #include /* For bsearch */ #include /* For memset */ -#if defined(GLEW_REGAL) +#if defined(GLEW_EGL) +extern void * eglGetProcAddress (const char *procname); +#elif defined(GLEW_REGAL) /* In GLEW_REGAL mode we call direcly into the linked libRegal.so glGetProcAddressREGAL for looking up @@ -113,7 +116,9 @@ void* NSGLGetProcAddress (const GLubyte *name) /* * Define glewGetProcAddress. */ -#if defined(GLEW_REGAL) +#if defined(GLEW_EGL) +# define glewGetProcAddress(name) eglGetProcAddress((const char *)name) +#elif defined(GLEW_REGAL) # define glewGetProcAddress(name) regalGetProcAddress((const GLchar *)name) #elif defined(GLEW_OSMESA) # define glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name) diff --git a/auto/src/glew_init_tail.c b/auto/src/glew_init_tail.c index 17735dc..cc1c4ad 100644 --- a/auto/src/glew_init_tail.c +++ b/auto/src/glew_init_tail.c @@ -37,7 +37,7 @@ GLenum GLEWAPIENTRY glewInit (void) GLenum r; r = glewContextInit(); if ( r != 0 ) return r; -#if defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) +#if defined(GLEW_EGL) || defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) return r; #elif defined(_WIN32) return wglewInit(); diff --git a/auto/src/glew_str_glx.c b/auto/src/glew_str_glx.c index af4f8c6..885db43 100644 --- a/auto/src/glew_str_glx.c +++ b/auto/src/glew_str_glx.c @@ -4,7 +4,7 @@ return ret; } -#elif !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) +#elif !defined(GLEW_EGL) && !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) GLboolean glxewIsSupported (const char* name) { diff --git a/auto/src/glew_str_wgl.c b/auto/src/glew_str_wgl.c index b204386..db67b51 100644 --- a/auto/src/glew_str_wgl.c +++ b/auto/src/glew_str_wgl.c @@ -4,7 +4,7 @@ return ret; } -#if defined(_WIN32) && !defined(GLEW_OSMESA) +#if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA) GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) { diff --git a/auto/src/glewinfo_glx.c b/auto/src/glewinfo_glx.c index ead3051..e60b549 100644 --- a/auto/src/glewinfo_glx.c +++ b/auto/src/glewinfo_glx.c @@ -1,6 +1,6 @@ } -#elif !defined(GLEW_OSMESA) /* _UNIX */ +#elif !defined(GLEW_EGL) && !defined(GLEW_OSMESA) /* _UNIX */ static void glxewInfo () { diff --git a/auto/src/glewinfo_head.c b/auto/src/glewinfo_head.c index 6a8347b..ff743f0 100644 --- a/auto/src/glewinfo_head.c +++ b/auto/src/glewinfo_head.c @@ -2,7 +2,9 @@ #include #include #include -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +#include +#elif defined(GLEW_OSMESA) #define GLAPI extern #include #elif defined(_WIN32) @@ -25,7 +27,8 @@ static FILE* f; struct createParams { -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +#elif defined(GLEW_OSMESA) #elif defined(_WIN32) int pixelformat; #elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) diff --git a/auto/src/glewinfo_tail.c b/auto/src/glewinfo_tail.c index e69f96d..e4075c0 100644 --- a/auto/src/glewinfo_tail.c +++ b/auto/src/glewinfo_tail.c @@ -7,9 +7,10 @@ int main (int argc, char** argv) { GLuint err; - struct createParams params = + struct createParams params = { -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +#elif defined(GLEW_OSMESA) #elif defined(_WIN32) -1, /* pixelformat */ #elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) @@ -25,17 +26,18 @@ int main (int argc, char** argv) if (glewParseArgs(argc-1, argv+1, ¶ms)) { fprintf(stderr, "Usage: glewinfo " -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +#elif defined(GLEW_OSMESA) #elif defined(_WIN32) - "[-pf ] " + "[-pf ] " #elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) - "[-display ] " - "[-visual ] " + "[-display ] " + "[-visual ] " #endif - "[-version ] " - "[-profile core|compatibility] " - "[-flag debug|forward]" - "\n"); + "[-version ] " + "[-profile core|compatibility] " + "[-flag debug|forward]" + "\n"); return 1; } @@ -68,18 +70,20 @@ int main (int argc, char** argv) fprintf(f, " GLEW Extension Info\n"); fprintf(f, "---------------------------\n\n"); fprintf(f, "GLEW version %s\n", glewGetString(GLEW_VERSION)); -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +#elif defined(GLEW_OSMESA) #elif defined(_WIN32) fprintf(f, "Reporting capabilities of pixelformat %d\n", params.pixelformat); #elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) - fprintf(f, "Reporting capabilities of display %s, visual 0x%x\n", + fprintf(f, "Reporting capabilities of display %s, visual 0x%x\n", params.display == NULL ? getenv("DISPLAY") : params.display, params.visual); #endif - fprintf(f, "Running on a %s from %s\n", - glGetString(GL_RENDERER), glGetString(GL_VENDOR)); + fprintf(f, "Running on a %s from %s\n", + glGetString(GL_RENDERER), glGetString(GL_VENDOR)); fprintf(f, "OpenGL version %s is supported\n", glGetString(GL_VERSION)); glewInfo(); -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +#elif defined(GLEW_OSMESA) #elif defined(_WIN32) wglewInfo(); #else @@ -118,7 +122,8 @@ GLboolean glewParseArgs (int argc, char** argv, struct createParams *params) else return GL_TRUE; ++p; } -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +#elif defined(GLEW_OSMESA) #elif defined(_WIN32) else if (!strcmp(argv[p], "-pf") || !strcmp(argv[p], "-pixelformat")) { @@ -145,7 +150,44 @@ GLboolean glewParseArgs (int argc, char** argv, struct createParams *params) /* ------------------------------------------------------------------------ */ -#if defined(GLEW_OSMESA) +#if defined(GLEW_EGL) +EGLDisplay display; +EGLContext ctx; + +/* See: http://stackoverflow.com/questions/12662227/opengl-es2-0-offscreen-context-for-fbo-rendering */ + +GLboolean glewCreateContext (struct createParams *params) +{ + EGLSurface surface; + EGLint majorVersion, minorVersion; + const EGLint attr[] = { + EGL_BUFFER_SIZE, 32, + EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER, + EGL_CONFORMANT, EGL_OPENGL_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, + EGL_NONE + }; + EGLConfig config; + EGLint numConfig; + display = eglGetDisplay((EGLNativeDisplayType) 0); + if (!eglInitialize(display, &majorVersion, &minorVersion)) + return GL_TRUE; + eglBindAPI(EGL_OPENGL_API); + if (!eglChooseConfig(display, attr, &config, 1, &numConfig) || (numConfig != 1)) + return GL_TRUE; + surface = eglCreateWindowSurface(display, config, (EGLNativeWindowType) NULL, NULL); + ctx = eglCreateContext(display, config, NULL, NULL); + if (NULL == ctx) return GL_TRUE; + eglMakeCurrent(display, surface, surface, ctx); + return GL_FALSE; +} + +void glewDestroyContext () +{ + if (NULL != ctx) eglDestroyContext(display, ctx); +} + +#elif defined(GLEW_OSMESA) OSMesaContext ctx; static const GLint osmFormat = GL_UNSIGNED_BYTE; @@ -190,7 +232,7 @@ GLboolean glewCreateContext (struct createParams* params) wc.lpszClassName = "GLEW"; if (0 == RegisterClass(&wc)) return GL_TRUE; /* create window */ - wnd = CreateWindow("GLEW", "GLEW", 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + wnd = CreateWindow("GLEW", "GLEW", 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, GetModuleHandle(NULL), NULL); if (NULL == wnd) return GL_TRUE; /* get the device context */ @@ -378,8 +420,8 @@ GLboolean glewCreateContext (struct createParams *params) cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone); swa.border_pixel = 0; swa.colormap = cmap; - wnd = XCreateWindow(dpy, RootWindow(dpy, vi->screen), - 0, 0, 1, 1, 0, vi->depth, InputOutput, vi->visual, + wnd = XCreateWindow(dpy, RootWindow(dpy, vi->screen), + 0, 0, 1, 1, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap, &swa); /* make context current */ if (!glXMakeCurrent(dpy, wnd, ctx)) return GL_TRUE; diff --git a/auto/src/glewinfo_wgl.c b/auto/src/glewinfo_wgl.c index c80264e..9405667 100644 --- a/auto/src/glewinfo_wgl.c +++ b/auto/src/glewinfo_wgl.c @@ -2,7 +2,7 @@ /* ------------------------------------------------------------------------ */ -#if defined(_WIN32) && !defined(GLEW_OSMESA) +#if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA) static void wglewInfo () { From 5a6171078bd1f131c32c4f6943509e9dbd64bb61 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Wed, 16 Dec 2015 20:46:17 +1000 Subject: [PATCH 08/20] GLEW EGL support touch-ups --- auto/src/glew_head.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auto/src/glew_head.c b/auto/src/glew_head.c index 0d052be..a3f932e 100644 --- a/auto/src/glew_head.c +++ b/auto/src/glew_head.c @@ -15,7 +15,7 @@ #include /* For memset */ #if defined(GLEW_EGL) -extern void * eglGetProcAddress (const char *procname); +extern void (*eglGetProcAddress (const char *procname))(); #elif defined(GLEW_REGAL) /* In GLEW_REGAL mode we call direcly into the linked From 43a92992302d9fee10d288f2e92d162407ded957 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Wed, 20 Jan 2016 21:55:08 +1000 Subject: [PATCH 09/20] Initial EGL core and extension support with Python egl.xml spec parser --- .gitattributes | 1 + auto/Makefile | 47 ++++++++++++-- auto/bin/make_list.pl | 2 +- auto/bin/parse_xml.py | 128 ++++++++++++++++++++++++++++++++++++++ auto/khronos/readme.pdf | Bin 0 -> 130102 bytes auto/src/eglew_head.h | 74 ++++++++++++++++++++++ auto/src/eglew_mid.h | 4 ++ auto/src/eglew_tail.h | 15 +++++ auto/src/glew_head.c | 17 +++-- auto/src/glew_init_egl.c | 31 +++++++++ auto/src/glew_init_tail.c | 4 +- auto/src/glew_str_egl.c | 17 +++++ auto/src/glew_str_glx.c | 2 +- auto/src/glewinfo_egl.c | 6 ++ auto/src/glewinfo_glx.c | 2 +- auto/src/glewinfo_head.c | 4 +- auto/src/glewinfo_tail.c | 20 +++--- config/Makefile.linux-egl | 4 ++ src/visualinfo.c | 28 ++++++++- 19 files changed, 377 insertions(+), 29 deletions(-) create mode 100755 auto/bin/parse_xml.py create mode 100644 auto/khronos/readme.pdf create mode 100644 auto/src/eglew_head.h create mode 100644 auto/src/eglew_mid.h create mode 100644 auto/src/eglew_tail.h create mode 100644 auto/src/glew_init_egl.c create mode 100644 auto/src/glew_str_egl.c create mode 100644 auto/src/glewinfo_egl.c create mode 100644 config/Makefile.linux-egl diff --git a/.gitattributes b/.gitattributes index b49408f..100a05f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,6 @@ * text eol=lf *.png binary +*.pdf binary build/*/* text eol=crlf CMakeLists.txt text eol=lf build/cmake/* text eol=lf diff --git a/auto/Makefile b/auto/Makefile index 5862050..fc9a646 100644 --- a/auto/Makefile +++ b/auto/Makefile @@ -41,16 +41,19 @@ BLACKLIST = blacklist GL_CORE_SPEC := $(CORE)/GL_VERSION* GLX_CORE_SPEC := $(CORE)/GLX_VERSION* +EGL_CORE_SPEC := $(CORE)/EGL_VERSION* ifeq (custom,$(MAKECMDGOALS)) #GL_CORE_SPEC := $(shell grep GL_VERSION custom.txt | perl -pi -e "s=^=$(CORE)/=g;") GL_EXT_SPEC := $(shell grep "^[ \t]*GL_" custom.txt | grep -v GL_VERSION | perl -pi -e "s=^=$(EXT)/=g;") WGL_EXT_SPEC := $(shell grep "^[ \t]*WGL_" custom.txt | perl -pi -e "s=^=$(EXT)/=g;") #GLX_CORE_SPEC := $(shell grep GLX_VERSION custom.txt | perl -pi -e "s=^=$(CORE)/=g;") GLX_EXT_SPEC := $(shell grep "^[ \t]*GLX_" custom.txt | grep -v GLX_VERSION | perl -pi -e "s=^=$(EXT)/=g;") +EGL_EXT_SPEC := $(shell grep "^[ \t]*EGL_" custom.txt | grep -v EGL_VERSION | perl -pi -e "s=^=$(EXT)/=g;") else GL_EXT_SPEC := $(EXT)/GL_* WGL_EXT_SPEC := $(EXT)/WGL_* GLX_EXT_SPEC := $(EXT)/GLX_* +EGL_EXT_SPEC := $(EXT)/EGL_* endif PARSE_SPEC = parse_spec.pl @@ -65,7 +68,8 @@ B.DEST = $(TOP)/build I.TARGETS = \ $(I.DEST)/glew.h \ $(I.DEST)/wglew.h \ - $(I.DEST)/glxew.h + $(I.DEST)/glxew.h \ + $(I.DEST)/eglew.h ifeq (yes,$(GLEW_SPLIT_SOURCE)) S.TARGETS = \ @@ -175,6 +179,21 @@ $(I.DEST)/glxew.h: $(EXT)/.dummy perl -e "s/GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2;/GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0;\nGLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1;\nGLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2;/" -pi $@ cat $(SRC)/glxew_tail.h >> $@ +$(I.DEST)/eglew.h: $(EXT)/.dummy + @echo "--------------------------------------------------------------------" + @echo "Creating eglew.h" + @echo "--------------------------------------------------------------------" + cp -f $(SRC)/glew_license.h $@ + cat $(SRC)/mesa_license.h >> $@ + cat $(SRC)/khronos_license.h >> $@ + cat $(SRC)/eglew_head.h >> $@ + $(BIN)/make_header.pl "" EGL $(EGL_CORE_SPEC) >> $@ + $(BIN)/make_header.pl "" EGL $(EGL_EXT_SPEC) >> $@ + cat $(SRC)/eglew_mid.h >> $@ + $(BIN)/make_struct_fun.pl EGLEW_FUN_EXPORT $(EGL_CORE_SPEC) $(EGL_EXT_SPEC) >> $@ + $(BIN)/make_struct_var.pl EGLEW_VAR_EXPORT $(EGL_CORE_SPEC) $(EGL_EXT_SPEC) >> $@ + cat $(SRC)/eglew_tail.h >> $@ + $(S.DEST)/glew.c: $(EXT)/.dummy @echo "--------------------------------------------------------------------" @echo "Creating glew.c" @@ -200,14 +219,26 @@ $(S.DEST)/glew.c: $(EXT)/.dummy $(BIN)/make_list.pl $(GL_EXT_SPEC) >> $@ $(BIN)/make_list2.pl $(GL_EXT_SPEC) >> $@ echo -e "\n return GLEW_OK;\n}\n" >> $@ - echo -e "\n#if defined(_WIN32) && !defined(GLEW_EGL) && !defined(GLEW_OSMESA)" >> $@ + echo -e "\n#if defined(GLEW_OSMESA)" >> $@ + echo -e "\n#elif defined(GLEW_EGL)" >> $@ + $(BIN)/make_def_fun.pl EGL $(EGL_CORE_SPEC) >> $@ + $(BIN)/make_def_fun.pl EGL $(EGL_EXT_SPEC) >> $@ + $(BIN)/make_def_var.pl EGL $(EGL_CORE_SPEC) >> $@ + $(BIN)/make_def_var.pl EGL $(EGL_EXT_SPEC) >> $@ + $(BIN)/make_init.pl EGL $(EGL_CORE_SPEC) >> $@ + $(BIN)/make_init.pl EGL $(EGL_EXT_SPEC) >> $@ + cat $(SRC)/glew_init_egl.c >> $@ + $(BIN)/make_list.pl $(EGL_CORE_SPEC) >> $@ + $(BIN)/make_list.pl $(EGL_EXT_SPEC) >> $@ + echo -e "\n return GLEW_OK;\n}" >> $@ + echo -e "\n#elif defined(_WIN32)" >> $@ $(BIN)/make_def_fun.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_def_var.pl WGL $(WGL_EXT_SPEC) >> $@ $(BIN)/make_init.pl WGL $(WGL_EXT_SPEC) >> $@ cat $(SRC)/glew_init_wgl.c >> $@ $(BIN)/make_list.pl $(WGL_EXT_SPEC) >> $@ echo -e "\n return GLEW_OK;\n}" >> $@; - echo -e "\n#elif !defined(GLEW_EGL) && !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))" >> $@ + echo -e "\n#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))" >> $@ $(BIN)/make_def_fun.pl GLX $(GLX_CORE_SPEC) >> $@ $(BIN)/make_def_fun.pl GLX $(GLX_EXT_SPEC) >> $@ echo -e "\nGLboolean __GLXEW_VERSION_1_0 = GL_FALSE;" >> $@ @@ -228,6 +259,8 @@ $(S.DEST)/glew.c: $(EXT)/.dummy $(BIN)/make_str.pl $(WGL_EXT_SPEC) >> $@ cat $(SRC)/glew_str_glx.c >> $@ $(BIN)/make_str.pl $(GLX_CORE_SPEC) $(GLX_EXT_SPEC) >> $@ + cat $(SRC)/glew_str_egl.c >> $@ + $(BIN)/make_str.pl $(EGL_CORE_SPEC) $(EGL_EXT_SPEC) >> $@ cat $(SRC)/glew_str_tail.c >> $@ perl -e "s/GLEW_VERSION_STRING/$(GLEW_VERSION)/g" -pi $@ perl -e "s/GLEW_VERSION_MAJOR_STRING/$(GLEW_MAJOR)/g" -pi $@ @@ -245,14 +278,13 @@ $(S.DEST)/glewinfo.c: $(EXT)/.dummy cat $(SRC)/glewinfo_head.c >> $@ $(BIN)/make_info.pl $(GL_CORE_SPEC) >> $@ $(BIN)/make_info.pl $(GL_EXT_SPEC) >> $@ - echo -e "#if !defined(GLEW_EGL)\n" >> $@ - echo -e "#ifdef _WIN32\n" >> $@ + echo -e "#if defined(GLEW_EGL)\n" >> $@ + echo -e "#elif _WIN32\n" >> $@ $(BIN)/make_info.pl $(WGL_EXT_SPEC) >> $@ echo -e "#else /* _UNIX */\n" >> $@ $(BIN)/make_info.pl $(GLX_CORE_SPEC) >> $@ $(BIN)/make_info.pl $(GLX_EXT_SPEC) >> $@ echo -e "#endif /* _WIN32 */\n" >> $@ - echo -e "#endif /* !defined(GLEW_EGL) */\n" >> $@ cat $(SRC)/glewinfo_gl.c >> $@ $(BIN)/make_info_list.pl $(GL_CORE_SPEC) >> $@ @@ -262,6 +294,9 @@ $(S.DEST)/glewinfo.c: $(EXT)/.dummy cat $(SRC)/glewinfo_glx.c >> $@ $(BIN)/make_info_list.pl $(GLX_CORE_SPEC) >> $@ $(BIN)/make_info_list.pl $(GLX_EXT_SPEC) >> $@ + cat $(SRC)/glewinfo_egl.c >> $@ + $(BIN)/make_info_list.pl $(EGL_CORE_SPEC) >> $@ + $(BIN)/make_info_list.pl $(EGL_EXT_SPEC) >> $@ cat $(SRC)/glewinfo_tail.c >> $@ perl -e 's/"glColorSubTable"/"glBlendEquation", glBlendEquation == NULL);\n glewInfoFunc("glColorSubTable"/g' -pi $@ rm -f $@.bak diff --git a/auto/bin/make_list.pl b/auto/bin/make_list.pl index 3d0ddce..ef1d81e 100755 --- a/auto/bin/make_list.pl +++ b/auto/bin/make_list.pl @@ -38,7 +38,7 @@ if (@ARGV) $extvar =~ s/GL(X*)_/GL$1EW_/; my $extpre = $extname; - $extpre =~ s/^(W?)GL(X?).*$/\l$1gl\l$2ew/; + $extpre =~ s/^(W?E?)GL(X?).*$/\l$1gl\l$2ew/; #my $pextvar = prefix_varname($extvar); diff --git a/auto/bin/parse_xml.py b/auto/bin/parse_xml.py new file mode 100755 index 0000000..9270040 --- /dev/null +++ b/auto/bin/parse_xml.py @@ -0,0 +1,128 @@ +#!/usr/bin/python + +import re +import sys +from xml.dom.minidom import parse, Node + +def findChildren(node, path): + result = [] + if len(path)==1: + for i in node.childNodes: + if i.nodeType==Node.ELEMENT_NODE: + if i.tagName==path[0]: + result.append(i) + else: + for i in node.childNodes: + if i.nodeType==Node.ELEMENT_NODE: + if i.tagName==path[0]: + result.extend(findChildren(i, path[1:])) + return result + +def findData(node, path): + return [ i.firstChild.data for i in findChildren(node, path) ] + +def findParams(node): + n = findData(node, ['name'])[0] + t = '' + for i in node.childNodes: + if i.nodeType==Node.TEXT_NODE: + t += i.data + if i.nodeType==Node.ELEMENT_NODE and i.tagName=='ptype': + t += i.firstChild.data + return ( t, n) + +def findEnums(dom): + ret = {} + for i in findChildren(dom, [ 'registry', 'enums', 'enum' ]): + n = i.getAttribute('name') + v = i.getAttribute('value') + ret[n] = v + return ret + +def findCommands(dom): + ret = {} + for i in findChildren(dom, [ 'registry', 'commands', 'command' ]): + r,n = findParams(findChildren(i, ['proto'])[0]) + p = [ findParams(j) for j in findChildren(i, ['param'])] + ret[n] = (r, p) + return ret + +def findFeatures(dom): + ret = {} + for i in findChildren(dom, [ 'registry', 'feature' ]): + n = i.getAttribute('name') + e = [] + c = [] + for j in findChildren(i, [ 'require', 'enum' ]): + e.append(j.getAttribute("name")) + for j in findChildren(i, [ 'require', 'command' ]): + c.append(j.getAttribute("name")) + ret[n] = (e,c) + return ret + +def findExtensions(dom): + ret = {} + for i in findChildren(dom, [ 'registry', 'extensions', 'extension' ]): + n = i.getAttribute('name') + e = [] + c = [] + for j in findChildren(i, [ 'require', 'enum' ]): + e.append(j.getAttribute("name")) + for j in findChildren(i, [ 'require', 'command' ]): + c.append(j.getAttribute("name")) + ret[n] = (e,c) + return ret + +def findApi(dom, name): + enums = findEnums(dom) + commands = findCommands(dom) + features = findFeatures(dom) + extensions = findExtensions(dom) + return (enums, commands, features, extensions) + +def writeExtension(f, name, extension, enums, commands): + f.write('%s\n'%name) + f.write('%s\n'%'https://www.khronos.org/registry/egl/specs/eglspec.1.5.pdf') + if name.find('_VERSION_')==-1: + f.write('%s\n'%name) + else: + f.write('\n') + f.write('\n') + enums = [ (j, enums[j]) for j in extension[0] ] + for e in sorted(enums, key=lambda i: i[1]): + f.write('\t%s %s\n'%(e[0], e[1])) + commands = [ (j, commands[j]) for j in extension[1] ] + for c in sorted(commands): + f.write('\t%s %s (%s)\n'%(c[1][0], c[0], ', '.join( [ '%s %s'%(j[0], j[1]) for j in c[1][1] ] ))) + +if __name__ == '__main__': + + from optparse import OptionParser + import os + + parser = OptionParser('usage: %prog [options] [XML specs...]') + parser.add_option("--core", dest="core", help="location for core outputs", default='') + parser.add_option("--extensions", dest="extensions", help="location for extensions outputs", default='') + + (options, args) = parser.parse_args() + + for i in args: + + dom = parse(i) + api = findApi(dom, 'egl') + + print 'Found {} enums, {} commands, {} features and {} extensions.'.format( + len(api[0]), len(api[1]), len(api[2]), len(api[3])) + + if len(options.core): + for i in api[2].keys(): + f = open('%s/%s'%(options.core, i), 'w') + writeExtension(f, i, api[2][i], api[0], api[1]) + f.close() + + if len(options.extensions): + for i in api[3].keys(): + f = open('%s/%s'%(options.extensions, i), 'w') + writeExtension(f, i, api[3][i], api[0], api[1]) + f.close() + diff --git a/auto/khronos/readme.pdf b/auto/khronos/readme.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7debab58baa670f485bf7101d93e9485a72183d3 GIT binary patch literal 130102 zcma&OW2`VsyEeFgariCP;tn+Tg2*%_Na^72ADIXjvd*g(2( zrliW*ZHdB<+$+iIvNmbqFN>ZN)*hr-C;>eEi@W0 z`h(M^arNcAn&Q`zieO-f#8#Jy?qFk$2%0O>n8 z8EX^A8mFKXuOvhhWF1TZ){VPQBHIQqLf4c|KTR`opwvfak64PqN~jkX8nbvnFp5V* zwP$a6 zT-SxD_JBIAD<6j)#f2OD+b zM`4*9ZD4{p4%cRe9AgNKp2Q%j0JX3>$afVLITw70b_d#`k5}b?hmQJQ2mKi4iwki6 zBh9AcR1`ScACraE*;{tib!jECc6U)oae7lpS@)M@XLpvC*@t?oQ`5R@W2$M&qb>Ww z=h^OE`6NoEqxhvEpKio)rTIDTslXJ?^1Rku3!=;JsgnkkjIed@Gd~$0^siO|T_om% ziNe`q=IzDGxg-yt&LO5JA>e{@G-B|hql^Np+#piViRp@nSod0jsx}g_r)vF zh3}7g^^=-Xy#z97An?{t>jw~@jL@JhdN|E-wgt=@ry8} z=k^j|UKK+4NX+fU12|Uc(DV@c=RdXroe*`j>jWd@T3H}9SoxDVPQJ4^nWYHrQV@1!LEyrXjx&S-`*=Sf0tTB0y-pg5R#A{N|38rdi&iJV=SmiO-;y&t0f5k&`mK^h7Fc z>#oSp5p#Smh>DsWODinlnHxJR&M-^XomZ|2XLVXqz4J!2-x`c@mfdjJdDqS-XYnx{$c>y}t;S5|U>cJ;-%3p3fpLEyKg%b?k z$1ej{R*wN^VMO7G{e^2%!c2S`apDMm=_T`25xm0SohNw(R& zp1&~`yo7|h)s{*-F}`^{kE1mL0yPdL2r}x-rH~Xd-8X6`2V{CD@7@+>B1WX}r@*5O z!Y+qnIwdU+KyF*qEFPzNY44=ppt{I$ON387Tb0;e-QYsn{XjsA1f_gx8P8HBu~&{pX>d zb)XX=M1XSG-v}%`{z#*b(Lo($r*7EZ zrW@ycI9G~{TX}k*`qU?jt50((a8$_?gg>fU)PE>hJay2lnqtDE~ft$}EO@9623%u%FiXnln}|}e9%EL_2a8oknEEREg;qLmvGcJ z5H=w3f_O$|C1n;sZ=z)ru4-^H+Rx`Gv{z@GxhU$!m;{9F)yAGGJX$hIz&8Hl3X)RB zkK|>j8V-+npA3^5v%0A?4)g|HDgLY46{#w)Hnr`F^*I|Kf!Pzpb)C% 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%0D{0>S8_aFF;#x>0a5ySV{ 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 + +#include +#include + +typedef int32_t EGLint; + +typedef unsigned int EGLBoolean; +typedef void *EGLDisplay; +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); + +typedef unsigned int EGLenum; +typedef void *EGLClientBuffer; + +typedef void *EGLSync; +typedef intptr_t EGLAttrib; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef void *EGLImage; + +typedef void *EGLSyncKHR; +typedef intptr_t EGLAttribKHR; +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +typedef void *EGLImageKHR; +typedef void *EGLStreamKHR; +typedef khronos_uint64_t EGLuint64KHR; +typedef int EGLNativeFileDescriptorKHR; +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +typedef void *EGLDeviceEXT; +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +typedef void *EGLSyncNV; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +typedef khronos_utime_nanoseconds_t EGLuint64NV; + +struct EGLClientPixmapHI; + +EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); + +#ifdef __cplusplus +extern "C" { +#endif + diff --git a/auto/src/eglew_mid.h b/auto/src/eglew_mid.h new file mode 100644 index 0000000..f94a149 --- /dev/null +++ b/auto/src/eglew_mid.h @@ -0,0 +1,4 @@ +/* ------------------------------------------------------------------------- */ + +#define EGLEW_FUN_EXPORT GLEW_FUN_EXPORT +#define EGLEW_VAR_EXPORT GLEW_VAR_EXPORT diff --git a/auto/src/eglew_tail.h b/auto/src/eglew_tail.h new file mode 100644 index 0000000..2533373 --- /dev/null +++ b/auto/src/eglew_tail.h @@ -0,0 +1,15 @@ +/* ------------------------------------------------------------------------ */ + +GLEWAPI GLenum GLEWAPIENTRY eglewInit (); +GLEWAPI GLboolean GLEWAPIENTRY eglewIsSupported (const char *name); + +#define EGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define EGLEW_GET_FUN(x) x + +GLEWAPI GLboolean GLEWAPIENTRY eglewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* __eglew_h__ */ diff --git a/auto/src/glew_head.c b/auto/src/glew_head.c index a3f932e..aa4d628 100644 --- a/auto/src/glew_head.c +++ b/auto/src/glew_head.c @@ -1,9 +1,10 @@ #include -#if defined(GLEW_EGL) -#elif defined(GLEW_OSMESA) +#if defined(GLEW_OSMESA) # define GLAPI extern # include +#elif defined(GLEW_EGL) +# include #elif defined(_WIN32) # include #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) @@ -15,7 +16,6 @@ #include /* For memset */ #if defined(GLEW_EGL) -extern void (*eglGetProcAddress (const char *procname))(); #elif defined(GLEW_REGAL) /* In GLEW_REGAL mode we call direcly into the linked @@ -116,12 +116,12 @@ void* NSGLGetProcAddress (const GLubyte *name) /* * Define glewGetProcAddress. */ -#if defined(GLEW_EGL) -# define glewGetProcAddress(name) eglGetProcAddress((const char *)name) -#elif defined(GLEW_REGAL) +#if defined(GLEW_REGAL) # define glewGetProcAddress(name) regalGetProcAddress((const GLchar *)name) #elif defined(GLEW_OSMESA) # define glewGetProcAddress(name) OSMesaGetProcAddress((const char *)name) +#elif defined(GLEW_EGL) +# define glewGetProcAddress(name) eglGetProcAddress((const char *)name) #elif defined(_WIN32) # define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) @@ -153,6 +153,11 @@ void* NSGLGetProcAddress (const GLubyte *name) # define GLXEW_GET_VAR(x) (x) #endif /* GLXEW_GET_VAR */ +#ifdef EGLEW_GET_VAR +# undef EGLEW_GET_VAR +# define EGLEW_GET_VAR(x) (x) +#endif /* EGLEW_GET_VAR */ + /* * GLEW, just like OpenGL or GLU, does not rely on the standard C library. * These functions implement the functionality required in this file. diff --git a/auto/src/glew_init_egl.c b/auto/src/glew_init_egl.c new file mode 100644 index 0000000..e2e481a --- /dev/null +++ b/auto/src/glew_init_egl.c @@ -0,0 +1,31 @@ +/* ------------------------------------------------------------------------ */ + +GLboolean eglewGetExtension (const char* name) +{ + const GLubyte* start; + const GLubyte* end; + +/* TODO */ +/* return _glewSearchExtension(name, start, end); */ + return GL_FALSE; +} + +GLenum eglewInit () +{ + int major, minor; + const GLubyte* extStart; + const GLubyte* extEnd; + + /* initialize flags */ + EGLEW_VERSION_1_0 = GL_TRUE; + EGLEW_VERSION_1_1 = GL_TRUE; + EGLEW_VERSION_1_2 = GL_TRUE; + EGLEW_VERSION_1_3 = GL_TRUE; + EGLEW_VERSION_1_4 = GL_TRUE; + EGLEW_VERSION_1_5 = GL_TRUE; + + /* query EGL version */ + + /* query EGL extension string */ + + /* initialize extensions */ diff --git a/auto/src/glew_init_tail.c b/auto/src/glew_init_tail.c index cc1c4ad..9fd4c29 100644 --- a/auto/src/glew_init_tail.c +++ b/auto/src/glew_init_tail.c @@ -37,7 +37,9 @@ GLenum GLEWAPIENTRY glewInit (void) GLenum r; r = glewContextInit(); if ( r != 0 ) return r; -#if defined(GLEW_EGL) || defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) +#if defined(GLEW_EGL) + return eglewInit(); +#elif defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) return r; #elif defined(_WIN32) return wglewInit(); diff --git a/auto/src/glew_str_egl.c b/auto/src/glew_str_egl.c new file mode 100644 index 0000000..f0c52f9 --- /dev/null +++ b/auto/src/glew_str_egl.c @@ -0,0 +1,17 @@ + } + ret = (len == 0); + } + return ret; +} + +#elif defined(GLEW_EGL) + +GLboolean eglewIsSupported (const char* name) +{ + const GLubyte* pos = (const GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if(_glewStrSame1(&pos, &len, (const GLubyte*)"EGL_", 4)) + { diff --git a/auto/src/glew_str_glx.c b/auto/src/glew_str_glx.c index 885db43..af4f8c6 100644 --- a/auto/src/glew_str_glx.c +++ b/auto/src/glew_str_glx.c @@ -4,7 +4,7 @@ return ret; } -#elif !defined(GLEW_EGL) && !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) +#elif !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) GLboolean glxewIsSupported (const char* name) { diff --git a/auto/src/glewinfo_egl.c b/auto/src/glewinfo_egl.c new file mode 100644 index 0000000..877e722 --- /dev/null +++ b/auto/src/glewinfo_egl.c @@ -0,0 +1,6 @@ +} + +#elif defined(GLEW_EGL) + +static void eglewInfo () +{ diff --git a/auto/src/glewinfo_glx.c b/auto/src/glewinfo_glx.c index e60b549..ead3051 100644 --- a/auto/src/glewinfo_glx.c +++ b/auto/src/glewinfo_glx.c @@ -1,6 +1,6 @@ } -#elif !defined(GLEW_EGL) && !defined(GLEW_OSMESA) /* _UNIX */ +#elif !defined(GLEW_OSMESA) /* _UNIX */ static void glxewInfo () { diff --git a/auto/src/glewinfo_head.c b/auto/src/glewinfo_head.c index ff743f0..6391a72 100644 --- a/auto/src/glewinfo_head.c +++ b/auto/src/glewinfo_head.c @@ -27,8 +27,8 @@ static FILE* f; struct createParams { -#if defined(GLEW_EGL) -#elif defined(GLEW_OSMESA) +#if defined(GLEW_OSMESA) +#elif defined(GLEW_EGL) #elif defined(_WIN32) int pixelformat; #elif !defined(__APPLE__) && !defined(__HAIKU__) || defined(GLEW_APPLE_GLX) diff --git a/auto/src/glewinfo_tail.c b/auto/src/glewinfo_tail.c index e4075c0..84a84c5 100644 --- a/auto/src/glewinfo_tail.c +++ b/auto/src/glewinfo_tail.c @@ -9,8 +9,8 @@ int main (int argc, char** argv) GLuint err; struct createParams params = { -#if defined(GLEW_EGL) -#elif defined(GLEW_OSMESA) +#if defined(GLEW_OSMESA) +#elif defined(GLEW_EGL) #elif defined(_WIN32) -1, /* pixelformat */ #elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) @@ -26,8 +26,8 @@ int main (int argc, char** argv) if (glewParseArgs(argc-1, argv+1, ¶ms)) { fprintf(stderr, "Usage: glewinfo " -#if defined(GLEW_EGL) -#elif defined(GLEW_OSMESA) +#if defined(GLEW_OSMESA) +#elif defined(GLEW_EGL) #elif defined(_WIN32) "[-pf ] " #elif !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) @@ -70,8 +70,8 @@ int main (int argc, char** argv) fprintf(f, " GLEW Extension Info\n"); fprintf(f, "---------------------------\n\n"); fprintf(f, "GLEW version %s\n", glewGetString(GLEW_VERSION)); -#if defined(GLEW_EGL) -#elif defined(GLEW_OSMESA) +#if defined(GLEW_OSMESA) +#elif defined(GLEW_EGL) #elif defined(_WIN32) fprintf(f, "Reporting capabilities of pixelformat %d\n", params.pixelformat); #elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX) @@ -82,8 +82,8 @@ int main (int argc, char** argv) glGetString(GL_RENDERER), glGetString(GL_VENDOR)); fprintf(f, "OpenGL version %s is supported\n", glGetString(GL_VERSION)); glewInfo(); -#if defined(GLEW_EGL) -#elif defined(GLEW_OSMESA) +#if defined(GLEW_OSMESA) +#elif defined(GLEW_EGL) #elif defined(_WIN32) wglewInfo(); #else @@ -122,8 +122,8 @@ GLboolean glewParseArgs (int argc, char** argv, struct createParams *params) else return GL_TRUE; ++p; } -#if defined(GLEW_EGL) -#elif defined(GLEW_OSMESA) +#if defined(GLEW_OSMESA) +#elif defined(GLEW_EGL) #elif defined(_WIN32) else if (!strcmp(argv[p], "-pf") || !strcmp(argv[p], "-pixelformat")) { diff --git a/config/Makefile.linux-egl b/config/Makefile.linux-egl new file mode 100644 index 0000000..bcdc3cb --- /dev/null +++ b/config/Makefile.linux-egl @@ -0,0 +1,4 @@ +include config/Makefile.linux + +LDFLAGS.GL = -lEGL -lGL +CFLAGS.EXTRA += -DGLEW_EGL diff --git a/src/visualinfo.c b/src/visualinfo.c index c24bbaf..d089207 100644 --- a/src/visualinfo.c +++ b/src/visualinfo.c @@ -37,6 +37,8 @@ #if defined(GLEW_OSMESA) #define GLAPI extern #include +#elif defined(GLEW_EGL) +#include #elif defined(_WIN32) #include #elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) @@ -62,6 +64,8 @@ typedef struct GLContextStruct { #if defined(GLEW_OSMESA) OSMesaContext ctx; +#elif defined(GLEW_EGL) + EGLContext ctx; #elif defined(_WIN32) HWND wnd; HDC dc; @@ -186,6 +190,7 @@ main (int argc, char** argv) /* ---------------------------------------------------------------------- */ /* extensions string */ #if defined(GLEW_OSMESA) +#elif defined(GLEW_EGL) #elif defined(_WIN32) /* WGL extensions */ if (WGLEW_ARB_extensions_string || WGLEW_EXT_extensions_string) @@ -264,7 +269,7 @@ void PrintExtensions (const char* s) /* ---------------------------------------------------------------------- */ -#if defined(GLEW_OSMESA) +#if defined(GLEW_OSMESA) || defined(GLEW_EGL) void VisualInfo (GLContext* ctx) @@ -1048,6 +1053,27 @@ void DestroyContext (GLContext* ctx) if (NULL == ctx) return; if (NULL != ctx->ctx) OSMesaDestroyContext(ctx->ctx); } +/* ------------------------------------------------------------------------ */ + +#elif defined(GLEW_EGL) +void InitContext (GLContext* ctx) +{ + ctx->ctx = NULL; +} + +GLboolean CreateContext (GLContext* ctx) +{ + return GL_FALSE; +} + +void DestroyContext (GLContext* ctx) +{ + if (NULL == ctx) return; + return; +} + +/* ------------------------------------------------------------------------ */ + #elif defined(_WIN32) void InitContext (GLContext* ctx) From c3ea366c9d1d519a9e9c441894b62937e20c03be Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 23 Jan 2016 16:32:24 +1000 Subject: [PATCH 10/20] Add SYSTEM=Linux-clang-egl config --- config/Makefile.linux-clang-egl | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 config/Makefile.linux-clang-egl diff --git a/config/Makefile.linux-clang-egl b/config/Makefile.linux-clang-egl new file mode 100644 index 0000000..ca06419 --- /dev/null +++ b/config/Makefile.linux-clang-egl @@ -0,0 +1,4 @@ +include config/Makefile.linux-clang + +LDFLAGS.GL = -lEGL -lGL +CFLAGS.EXTRA += -DGLEW_EGL From 97bba61a10d847e82e4dd5511f27c4a18c779448 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 23 Jan 2016 16:37:59 +1000 Subject: [PATCH 11/20] Add GLEW_EGL builds to Travis --- .travis.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 769a9ab..021066d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,14 @@ script: - make -C auto clobber - make extensions - make dist-src -- make clean; SYSTEM=linux make -- make clean; SYSTEM=linux-osmesa make -- pushd build/cmake; git clean -xdf .; cmake -G 'Unix Makefiles' . ; make; popd -- pushd build/cmake; git clean -xdf .; cmake -G 'Unix Makefiles' -DGLEW_OSMESA=1 .; make; popd +- make clean; SYSTEM=linux make +- make clean; SYSTEM=linux-osmesa make +- make clean; SYSTEM=linux-egl make +- make clean; SYSTEM=linux-clang make +- make clean; SYSTEM=linux-clang-egl make +- pushd build/cmake; git clean -xdf .; cmake -G 'Unix Makefiles' . ; make; popd +- pushd build/cmake; git clean -xdf .; cmake -G 'Unix Makefiles' -DGLEW_OSMESA=1 . ; make; popd +- pushd build/cmake; git clean -xdf .; cmake -G 'Unix Makefiles' -DGLEW_EGL=1 . ; make; popd addons: apt: packages: @@ -16,6 +20,7 @@ addons: - cmake - dos2unix - libosmesa6-dev + - libegl1-mesa-dev artifacts: bucket: glew s3_region: "us-east-1" From 20908a2182c88960b377e58d359336aeca36281b Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 23 Jan 2016 16:48:19 +1000 Subject: [PATCH 12/20] Integrate the XML -> EGL specs step --- auto/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/auto/Makefile b/auto/Makefile index fc9a646..145a33c 100644 --- a/auto/Makefile +++ b/auto/Makefile @@ -118,6 +118,7 @@ $(EXT)/.dummy: $(REGISTRY)/.dummy @echo "--------------------------------------------------------------------" rm -rf $(EXT) $(BIN)/update_ext.sh $(EXT) $(REGISTRY) $(BLACKLIST) + $(BIN)/parse_xml.py registry/xml/egl.xml --core core/gl --extensions extensions/gl $(BIN)/$(FILTER) $(EXT) ifeq ($(patsubst Darwin%,Darwin,$(SYSTEM)), Darwin) find $(CORE) -maxdepth 1 -type f | grep -v VERSION | grep -v "~" | \ From 84b733d9bbe7a466092fd655fa3566633247223b Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 23 Jan 2016 21:32:55 +1000 Subject: [PATCH 13/20] EGL refinements and fixes --- auto/Makefile | 2 ++ auto/bin/make_str.pl | 6 +++--- auto/src/eglew_head.h | 2 ++ auto/src/glew_init_egl.c | 39 +++++++++++++++++++++++++++------------ auto/src/glew_str_glx.c | 2 +- auto/src/glewinfo_glx.c | 2 +- auto/src/glewinfo_head.c | 2 +- 7 files changed, 37 insertions(+), 18 deletions(-) diff --git a/auto/Makefile b/auto/Makefile index 145a33c..d6b35e7 100644 --- a/auto/Makefile +++ b/auto/Makefile @@ -280,6 +280,8 @@ $(S.DEST)/glewinfo.c: $(EXT)/.dummy $(BIN)/make_info.pl $(GL_CORE_SPEC) >> $@ $(BIN)/make_info.pl $(GL_EXT_SPEC) >> $@ echo -e "#if defined(GLEW_EGL)\n" >> $@ + $(BIN)/make_info.pl $(EGL_CORE_SPEC) >> $@ + $(BIN)/make_info.pl $(EGL_EXT_SPEC) >> $@ echo -e "#elif _WIN32\n" >> $@ $(BIN)/make_info.pl $(WGL_EXT_SPEC) >> $@ echo -e "#else /* _UNIX */\n" >> $@ diff --git a/auto/bin/make_str.pl b/auto/bin/make_str.pl index 5b83ef8..6673a80 100755 --- a/auto/bin/make_str.pl +++ b/auto/bin/make_str.pl @@ -24,11 +24,11 @@ if (@ARGV) { my ($extname, $exturl, $extstring, $reuse, $types, $tokens, $functions, $exacts) = parse_ext($ext); my $exttype = $extname; - $exttype =~ s/(W*?)GL(X*?)_(.*?_)(.*)/$3/; + $exttype =~ s/(W?E?)GL(X?)_(.*?_)(.*)/$3/; my $extrem = $extname; - $extrem =~ s/(W*?)GL(X*?)_(.*?_)(.*)/$4/; + $extrem =~ s/(W?E?)GL(X?)_(.*?_)(.*)/$4/; my $extvar = $extname; - $extvar =~ s/(W*)GL(X*)_/$1GL$2EW_/; + $extvar =~ s/(W?E?)GL(X?)_/$1GL$2EW_/; if(!($exttype =~ $curexttype)) { if(length($curexttype) > 0) diff --git a/auto/src/eglew_head.h b/auto/src/eglew_head.h index f0ec663..bb95b1a 100644 --- a/auto/src/eglew_head.h +++ b/auto/src/eglew_head.h @@ -66,6 +66,8 @@ typedef khronos_utime_nanoseconds_t EGLuint64NV; struct EGLClientPixmapHI; +#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) + EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); #ifdef __cplusplus diff --git a/auto/src/glew_init_egl.c b/auto/src/glew_init_egl.c index e2e481a..44453c3 100644 --- a/auto/src/glew_init_egl.c +++ b/auto/src/glew_init_egl.c @@ -5,27 +5,42 @@ GLboolean eglewGetExtension (const char* name) const GLubyte* start; const GLubyte* end; -/* TODO */ -/* return _glewSearchExtension(name, start, end); */ - return GL_FALSE; + start = (const GLubyte*) eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), EGL_EXTENSIONS); + if (0 == start) return GL_FALSE; + end = start + _glewStrLen(start); + return _glewSearchExtension(name, start, end); } GLenum eglewInit () { - int major, minor; + GLuint dot; + GLint major, minor; + const GLubyte* version; const GLubyte* extStart; const GLubyte* extEnd; - /* initialize flags */ - EGLEW_VERSION_1_0 = GL_TRUE; - EGLEW_VERSION_1_1 = GL_TRUE; - EGLEW_VERSION_1_2 = GL_TRUE; - EGLEW_VERSION_1_3 = GL_TRUE; - EGLEW_VERSION_1_4 = GL_TRUE; - EGLEW_VERSION_1_5 = GL_TRUE; + /* query EGK version */ + major = 0; + minor = 0; + version = (const GLubyte*) eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), EGL_VERSION); + dot = _glewStrCLen(version, '.'); + if (dot != 0) + { + major = version[dot-1]-'0'; + minor = version[dot+1]-'0'; + } - /* query EGL version */ + EGLEW_VERSION_1_5 = ( major > 1 ) || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_4 = EGLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_3 = EGLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_2 = EGLEW_VERSION_1_3 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_1 = EGLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_0 = EGLEW_VERSION_1_1 == GL_TRUE || ( major == 1 && minor >= 0 ) ? GL_TRUE : GL_FALSE; /* query EGL extension string */ + extStart = (const GLubyte*) eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), EGL_EXTENSIONS); + if (extStart == 0) + extStart = (const GLubyte *)""; + extEnd = extStart + _glewStrLen(extStart); /* initialize extensions */ diff --git a/auto/src/glew_str_glx.c b/auto/src/glew_str_glx.c index af4f8c6..893d741 100644 --- a/auto/src/glew_str_glx.c +++ b/auto/src/glew_str_glx.c @@ -4,7 +4,7 @@ return ret; } -#elif !defined(GLEW_OSMESA) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) +#elif !defined(GLEW_OSMESA) && !defined(GLEW_EGL) && !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) GLboolean glxewIsSupported (const char* name) { diff --git a/auto/src/glewinfo_glx.c b/auto/src/glewinfo_glx.c index ead3051..e60b549 100644 --- a/auto/src/glewinfo_glx.c +++ b/auto/src/glewinfo_glx.c @@ -1,6 +1,6 @@ } -#elif !defined(GLEW_OSMESA) /* _UNIX */ +#elif !defined(GLEW_EGL) && !defined(GLEW_OSMESA) /* _UNIX */ static void glxewInfo () { diff --git a/auto/src/glewinfo_head.c b/auto/src/glewinfo_head.c index 6391a72..02089f6 100644 --- a/auto/src/glewinfo_head.c +++ b/auto/src/glewinfo_head.c @@ -3,7 +3,7 @@ #include #include #if defined(GLEW_EGL) -#include +#include #elif defined(GLEW_OSMESA) #define GLAPI extern #include From a755351991d50e4fa5bf729f1c491fe77357a284 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sun, 24 Jan 2016 21:55:33 +1000 Subject: [PATCH 14/20] EGL fix: eglewInit and glewinfo need to manually load some EGL functions --- auto/src/glew_init_egl.c | 12 ++++++++++-- auto/src/glewinfo_tail.c | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/auto/src/glew_init_egl.c b/auto/src/glew_init_egl.c index 44453c3..0be72e3 100644 --- a/auto/src/glew_init_egl.c +++ b/auto/src/glew_init_egl.c @@ -18,11 +18,19 @@ GLenum eglewInit () const GLubyte* version; const GLubyte* extStart; const GLubyte* extEnd; + PFNEGLGETDISPLAYPROC getDisplay = NULL; + PFNEGLQUERYSTRINGPROC queryString = NULL; + + /* Load necessary entry points */ + getDisplay = (PFNEGLGETDISPLAYPROC) glewGetProcAddress("eglGetDisplay"); + queryString = (PFNEGLQUERYSTRINGPROC) glewGetProcAddress("eglQueryString"); + if (!getDisplay || !queryString) + return 1; /* query EGK version */ major = 0; minor = 0; - version = (const GLubyte*) eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), EGL_VERSION); + version = (const GLubyte*) queryString(getDisplay(EGL_DEFAULT_DISPLAY), EGL_VERSION); dot = _glewStrCLen(version, '.'); if (dot != 0) { @@ -38,7 +46,7 @@ GLenum eglewInit () EGLEW_VERSION_1_0 = EGLEW_VERSION_1_1 == GL_TRUE || ( major == 1 && minor >= 0 ) ? GL_TRUE : GL_FALSE; /* query EGL extension string */ - extStart = (const GLubyte*) eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), EGL_EXTENSIONS); + extStart = (const GLubyte*) queryString(getDisplay(EGL_DEFAULT_DISPLAY), EGL_EXTENSIONS); if (extStart == 0) extStart = (const GLubyte *)""; extEnd = extStart + _glewStrLen(extStart); diff --git a/auto/src/glewinfo_tail.c b/auto/src/glewinfo_tail.c index 84a84c5..2fca394 100644 --- a/auto/src/glewinfo_tail.c +++ b/auto/src/glewinfo_tail.c @@ -84,6 +84,7 @@ int main (int argc, char** argv) glewInfo(); #if defined(GLEW_OSMESA) #elif defined(GLEW_EGL) + eglewInfo(); #elif defined(_WIN32) wglewInfo(); #else @@ -135,7 +136,7 @@ GLboolean glewParseArgs (int argc, char** argv, struct createParams *params) { if (++p >= argc) return GL_TRUE; params->display = argv[p++]; - } + } else if (!strcmp(argv[p], "-visual")) { if (++p >= argc) return GL_TRUE; @@ -169,16 +170,36 @@ GLboolean glewCreateContext (struct createParams *params) }; EGLConfig config; EGLint numConfig; - display = eglGetDisplay((EGLNativeDisplayType) 0); - if (!eglInitialize(display, &majorVersion, &minorVersion)) + + PFNEGLGETDISPLAYPROC getDisplay = NULL; + PFNEGLINITIALIZEPROC initialize = NULL; + PFNEGLBINDAPIPROC bindAPI = NULL; + PFNEGLCHOOSECONFIGPROC chooseConfig = NULL; + PFNEGLCREATEWINDOWSURFACEPROC createWindowSurface = NULL; + PFNEGLCREATECONTEXTPROC createContext = NULL; + PFNEGLMAKECURRENTPROC makeCurrent = NULL; + + /* Load necessary entry points */ + getDisplay = (PFNEGLGETDISPLAYPROC) eglGetProcAddress("eglGetDisplay"); + initialize = (PFNEGLINITIALIZEPROC) eglGetProcAddress("eglInitialize"); + bindAPI = (PFNEGLBINDAPIPROC) eglGetProcAddress("eglBindAPI"); + chooseConfig = (PFNEGLCHOOSECONFIGPROC) eglGetProcAddress("eglChooseConfig"); + createWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) eglGetProcAddress("eglCreateWindowSurface"); + createContext = (PFNEGLCREATECONTEXTPROC) eglGetProcAddress("eglCreateContext"); + makeCurrent = (PFNEGLMAKECURRENTPROC) eglGetProcAddress("eglMakeCurrent"); + if (!getDisplay || !initialize || !bindAPI || !chooseConfig || !createWindowSurface || !createContext || !makeCurrent) + return GL_TRUE; + + display = getDisplay((EGLNativeDisplayType) 0); + if (!initialize(display, &majorVersion, &minorVersion)) return GL_TRUE; - eglBindAPI(EGL_OPENGL_API); - if (!eglChooseConfig(display, attr, &config, 1, &numConfig) || (numConfig != 1)) + bindAPI(EGL_OPENGL_API); + if (!chooseConfig(display, attr, &config, 1, &numConfig) || (numConfig != 1)) return GL_TRUE; - surface = eglCreateWindowSurface(display, config, (EGLNativeWindowType) NULL, NULL); - ctx = eglCreateContext(display, config, NULL, NULL); + surface = createWindowSurface(display, config, (EGLNativeWindowType) NULL, NULL); + ctx = createContext(display, config, NULL, NULL); if (NULL == ctx) return GL_TRUE; - eglMakeCurrent(display, surface, surface, ctx); + makeCurrent(display, surface, surface, ctx); return GL_FALSE; } From 15881f04210e3f91f0b4701d402a479921844c3b Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Mon, 25 Jan 2016 22:29:48 +1000 Subject: [PATCH 15/20] EGL fixup for void parameter lists, additional defines --- auto/bin/parse_xml.py | 5 ++++- auto/src/eglew_head.h | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/auto/bin/parse_xml.py b/auto/bin/parse_xml.py index 9270040..a9c1b4b 100755 --- a/auto/bin/parse_xml.py +++ b/auto/bin/parse_xml.py @@ -93,7 +93,10 @@ def writeExtension(f, name, extension, enums, commands): f.write('\t%s %s\n'%(e[0], e[1])) commands = [ (j, commands[j]) for j in extension[1] ] for c in sorted(commands): - f.write('\t%s %s (%s)\n'%(c[1][0], c[0], ', '.join( [ '%s %s'%(j[0], j[1]) for j in c[1][1] ] ))) + params = ', '.join( [ '%s %s'%(j[0], j[1]) for j in c[1][1] ] ) + if len(params)==0: + params = ' void ' + f.write('\t%s %s (%s)\n'%(c[1][0], c[0], params)) if __name__ == '__main__': diff --git a/auto/src/eglew_head.h b/auto/src/eglew_head.h index bb95b1a..adbeb71 100644 --- a/auto/src/eglew_head.h +++ b/auto/src/eglew_head.h @@ -66,6 +66,16 @@ typedef khronos_utime_nanoseconds_t EGLuint64NV; struct EGLClientPixmapHI; +#define EGL_DONT_CARE ((EGLint)-1) + +#define EGL_NO_CONTEXT ((EGLContext)0) +#define EGL_NO_DISPLAY ((EGLDisplay)0) +#define EGL_NO_IMAGE ((EGLImage)0) +#define EGL_NO_SURFACE ((EGLSurface)0) +#define EGL_NO_SYNC ((EGLSync)0) + +#define EGL_UNKNOWN ((EGLint)-1) + #define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); From 4d9010864e8de66032638d5b89b170331a6d4c29 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Tue, 26 Jan 2016 22:53:39 +1000 Subject: [PATCH 16/20] eglewInit takes EGLDisplay parameter, will do eglIntialize internally, for now --- auto/src/eglew_head.h | 11 ++-- auto/src/eglew_tail.h | 2 +- auto/src/glew_init_egl.c | 31 ++++------ auto/src/glew_init_tail.c | 6 +- auto/src/glewinfo_tail.c | 125 ++++++++++++++++++++++++++++---------- 5 files changed, 117 insertions(+), 58 deletions(-) diff --git a/auto/src/eglew_head.h b/auto/src/eglew_head.h index adbeb71..58488ae 100644 --- a/auto/src/eglew_head.h +++ b/auto/src/eglew_head.h @@ -27,6 +27,12 @@ #include #include +#include + +#ifdef __cplusplus +extern "C" { +#endif + typedef int32_t EGLint; typedef unsigned int EGLBoolean; @@ -79,8 +85,3 @@ struct EGLClientPixmapHI; #define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0) EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); - -#ifdef __cplusplus -extern "C" { -#endif - diff --git a/auto/src/eglew_tail.h b/auto/src/eglew_tail.h index 2533373..a91a76e 100644 --- a/auto/src/eglew_tail.h +++ b/auto/src/eglew_tail.h @@ -1,6 +1,6 @@ /* ------------------------------------------------------------------------ */ -GLEWAPI GLenum GLEWAPIENTRY eglewInit (); +GLEWAPI GLenum GLEWAPIENTRY eglewInit (EGLDisplay display); GLEWAPI GLboolean GLEWAPIENTRY eglewIsSupported (const char *name); #define EGLEW_GET_VAR(x) (*(const GLboolean*)&x) diff --git a/auto/src/glew_init_egl.c b/auto/src/glew_init_egl.c index 0be72e3..26bd4ae 100644 --- a/auto/src/glew_init_egl.c +++ b/auto/src/glew_init_egl.c @@ -1,7 +1,7 @@ -/* ------------------------------------------------------------------------ */ + /* ------------------------------------------------------------------------ */ GLboolean eglewGetExtension (const char* name) -{ +{ const GLubyte* start; const GLubyte* end; @@ -11,34 +11,25 @@ GLboolean eglewGetExtension (const char* name) return _glewSearchExtension(name, start, end); } -GLenum eglewInit () +GLenum eglewInit (EGLDisplay display) { - GLuint dot; - GLint major, minor; - const GLubyte* version; + EGLint major, minor; const GLubyte* extStart; const GLubyte* extEnd; - PFNEGLGETDISPLAYPROC getDisplay = NULL; + PFNEGLINITIALIZEPROC initialize = NULL; PFNEGLQUERYSTRINGPROC queryString = NULL; /* Load necessary entry points */ - getDisplay = (PFNEGLGETDISPLAYPROC) glewGetProcAddress("eglGetDisplay"); + initialize = (PFNEGLINITIALIZEPROC) glewGetProcAddress("eglInitialize"); queryString = (PFNEGLQUERYSTRINGPROC) glewGetProcAddress("eglQueryString"); - if (!getDisplay || !queryString) + if (!initialize || !queryString) return 1; /* query EGK version */ - major = 0; - minor = 0; - version = (const GLubyte*) queryString(getDisplay(EGL_DEFAULT_DISPLAY), EGL_VERSION); - dot = _glewStrCLen(version, '.'); - if (dot != 0) - { - major = version[dot-1]-'0'; - minor = version[dot+1]-'0'; - } + if (initialize(display, &major, &minor) != EGL_TRUE) + return 1; - EGLEW_VERSION_1_5 = ( major > 1 ) || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; + EGLEW_VERSION_1_5 = ( major > 1 ) || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; EGLEW_VERSION_1_4 = EGLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; EGLEW_VERSION_1_3 = EGLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; EGLEW_VERSION_1_2 = EGLEW_VERSION_1_3 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; @@ -46,7 +37,7 @@ GLenum eglewInit () EGLEW_VERSION_1_0 = EGLEW_VERSION_1_1 == GL_TRUE || ( major == 1 && minor >= 0 ) ? GL_TRUE : GL_FALSE; /* query EGL extension string */ - extStart = (const GLubyte*) queryString(getDisplay(EGL_DEFAULT_DISPLAY), EGL_EXTENSIONS); + extStart = (const GLubyte*) queryString(display, EGL_EXTENSIONS); if (extStart == 0) extStart = (const GLubyte *)""; extEnd = extStart + _glewStrLen(extStart); diff --git a/auto/src/glew_init_tail.c b/auto/src/glew_init_tail.c index 9fd4c29..2ef3d5b 100644 --- a/auto/src/glew_init_tail.c +++ b/auto/src/glew_init_tail.c @@ -35,10 +35,14 @@ GLboolean glewExperimental = GL_FALSE; GLenum GLEWAPIENTRY glewInit (void) { GLenum r; +#if defined(GLEW_EGL) + PFNEGLGETCURRENTDISPLAYPROC getCurrentDisplay = NULL; +#endif r = glewContextInit(); if ( r != 0 ) return r; #if defined(GLEW_EGL) - return eglewInit(); + getCurrentDisplay = (PFNEGLGETCURRENTDISPLAYPROC) glewGetProcAddress("eglGetCurrentDisplay"); + return eglewInit(getCurrentDisplay()); #elif defined(GLEW_OSMESA) || defined(__ANDROID__) || defined(__native_client__) || defined(__HAIKU__) return r; #elif defined(_WIN32) diff --git a/auto/src/glewinfo_tail.c b/auto/src/glewinfo_tail.c index 2fca394..ec895f8 100644 --- a/auto/src/glewinfo_tail.c +++ b/auto/src/glewinfo_tail.c @@ -159,47 +159,110 @@ EGLContext ctx; GLboolean glewCreateContext (struct createParams *params) { + EGLDeviceEXT devices[1]; + EGLint numDevices; EGLSurface surface; EGLint majorVersion, minorVersion; - const EGLint attr[] = { - EGL_BUFFER_SIZE, 32, - EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER, - EGL_CONFORMANT, EGL_OPENGL_BIT, - EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, - EGL_NONE + static const EGLint configAttribs[] = { + EGL_RED_SIZE, 1, + EGL_GREEN_SIZE, 1, + EGL_BLUE_SIZE, 1, + EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, + EGL_NONE }; + static const EGLint contextAttribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + static const EGLint pBufferAttribs[] = { + EGL_WIDTH, 128, + EGL_HEIGHT, 128, + EGL_NONE + }; EGLConfig config; EGLint numConfig; + EGLint error; - PFNEGLGETDISPLAYPROC getDisplay = NULL; - PFNEGLINITIALIZEPROC initialize = NULL; - PFNEGLBINDAPIPROC bindAPI = NULL; - PFNEGLCHOOSECONFIGPROC chooseConfig = NULL; - PFNEGLCREATEWINDOWSURFACEPROC createWindowSurface = NULL; - PFNEGLCREATECONTEXTPROC createContext = NULL; - PFNEGLMAKECURRENTPROC makeCurrent = NULL; + PFNEGLQUERYDEVICESEXTPROC queryDevices = NULL; + PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay = NULL; + PFNEGLGETERRORPROC getError = NULL; + PFNEGLGETDISPLAYPROC getDisplay = NULL; + PFNEGLINITIALIZEPROC initialize = NULL; + PFNEGLBINDAPIPROC bindAPI = NULL; + PFNEGLCHOOSECONFIGPROC chooseConfig = NULL; + PFNEGLCREATEWINDOWSURFACEPROC createWindowSurface = NULL; + PFNEGLCREATECONTEXTPROC createContext = NULL; + PFNEGLMAKECURRENTPROC makeCurrent = NULL; + PFNEGLCREATEPBUFFERSURFACEPROC createPbufferSurface = NULL; /* Load necessary entry points */ - getDisplay = (PFNEGLGETDISPLAYPROC) eglGetProcAddress("eglGetDisplay"); - initialize = (PFNEGLINITIALIZEPROC) eglGetProcAddress("eglInitialize"); - bindAPI = (PFNEGLBINDAPIPROC) eglGetProcAddress("eglBindAPI"); - chooseConfig = (PFNEGLCHOOSECONFIGPROC) eglGetProcAddress("eglChooseConfig"); - createWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) eglGetProcAddress("eglCreateWindowSurface"); - createContext = (PFNEGLCREATECONTEXTPROC) eglGetProcAddress("eglCreateContext"); - makeCurrent = (PFNEGLMAKECURRENTPROC) eglGetProcAddress("eglMakeCurrent"); - if (!getDisplay || !initialize || !bindAPI || !chooseConfig || !createWindowSurface || !createContext || !makeCurrent) + queryDevices = (PFNEGLQUERYDEVICESEXTPROC) eglGetProcAddress("eglQueryDevicesEXT"); + getPlatformDisplay = (PFNEGLGETPLATFORMDISPLAYEXTPROC) eglGetProcAddress("eglGetPlatformDisplayEXT"); + getError = (PFNEGLGETERRORPROC) eglGetProcAddress("eglGetError"); + getDisplay = (PFNEGLGETDISPLAYPROC) eglGetProcAddress("eglGetDisplay"); + initialize = (PFNEGLINITIALIZEPROC) eglGetProcAddress("eglInitialize"); + bindAPI = (PFNEGLBINDAPIPROC) eglGetProcAddress("eglBindAPI"); + chooseConfig = (PFNEGLCHOOSECONFIGPROC) eglGetProcAddress("eglChooseConfig"); + createWindowSurface = (PFNEGLCREATEWINDOWSURFACEPROC) eglGetProcAddress("eglCreateWindowSurface"); + createPbufferSurface = (PFNEGLCREATEPBUFFERSURFACEPROC) eglGetProcAddress("eglCreatePbufferSurface"); + createContext = (PFNEGLCREATECONTEXTPROC) eglGetProcAddress("eglCreateContext"); + makeCurrent = (PFNEGLMAKECURRENTPROC) eglGetProcAddress("eglMakeCurrent"); + if (!getError || !getDisplay || !initialize || !bindAPI || !chooseConfig || !createWindowSurface || !createContext || !makeCurrent) return GL_TRUE; - display = getDisplay((EGLNativeDisplayType) 0); - if (!initialize(display, &majorVersion, &minorVersion)) - return GL_TRUE; - bindAPI(EGL_OPENGL_API); - if (!chooseConfig(display, attr, &config, 1, &numConfig) || (numConfig != 1)) - return GL_TRUE; - surface = createWindowSurface(display, config, (EGLNativeWindowType) NULL, NULL); - ctx = createContext(display, config, NULL, NULL); - if (NULL == ctx) return GL_TRUE; - makeCurrent(display, surface, surface, ctx); + display = EGL_NO_DISPLAY; + if (queryDevices && getPlatformDisplay) + { + queryDevices(1, devices, &numDevices); + if (numDevices==1) + { + display = getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT, devices[0], 0); + } + } + if (display==EGL_NO_DISPLAY) + { + display = getDisplay(EGL_DEFAULT_DISPLAY); + } + if (display == EGL_NO_DISPLAY) + return GL_TRUE; + + eglewInit(display); + + if (bindAPI(EGL_OPENGL_API) != EGL_TRUE) + return GL_TRUE; + + if (chooseConfig(display, configAttribs, &config, 1, &numConfig) != EGL_TRUE || (numConfig != 1)) + return GL_TRUE; + + ctx = createContext(display, config, EGL_NO_CONTEXT, contextAttribs); + if (NULL == ctx) + return GL_TRUE; + + surface = EGL_NO_SURFACE; + /* Create a p-buffer surface if possible */ + if (createPbufferSurface) + { + surface = createPbufferSurface(display, config, pBufferAttribs); + } + /* Create a generic surface without a native window, if necessary */ + if (surface==EGL_NO_SURFACE) + { + surface = createWindowSurface(display, config, (EGLNativeWindowType) NULL, NULL); + } + if (surface == EGL_NO_SURFACE) + return GL_TRUE; + + if (makeCurrent(display, surface, surface, ctx) != EGL_TRUE) + return GL_TRUE; + + error = getError(); + if (error!=EGL_SUCCESS) + { + printf("eglGetError: %d\n", error); + return GL_TRUE; + } + return GL_FALSE; } From 23438663d6e2d3afd49727fd33466dd7b5e60257 Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Wed, 27 Jan 2016 22:15:49 +1000 Subject: [PATCH 17/20] For EGL purpose avoid using linked glGetString, load it via eglGetProcAddress instead. --- auto/src/glew_init_egl.c | 2 +- auto/src/glew_init_gl.c | 17 ++++++++++++++--- auto/src/glewinfo_tail.c | 22 ++++++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/auto/src/glew_init_egl.c b/auto/src/glew_init_egl.c index 26bd4ae..784285f 100644 --- a/auto/src/glew_init_egl.c +++ b/auto/src/glew_init_egl.c @@ -5,7 +5,7 @@ GLboolean eglewGetExtension (const char* name) const GLubyte* start; const GLubyte* end; - start = (const GLubyte*) eglQueryString(eglGetDisplay(EGL_DEFAULT_DISPLAY), EGL_EXTENSIONS); + start = (const GLubyte*) eglQueryString(eglGetCurrentDisplay(), EGL_EXTENSIONS); if (0 == start) return GL_FALSE; end = start + _glewStrLen(start); return _glewSearchExtension(name, start, end); diff --git a/auto/src/glew_init_gl.c b/auto/src/glew_init_gl.c index 6fd86ce..38bb7c1 100644 --- a/auto/src/glew_init_gl.c +++ b/auto/src/glew_init_gl.c @@ -71,14 +71,22 @@ GLboolean GLEWAPIENTRY glewGetExtension (const char* name) /* ------------------------------------------------------------------------- */ +typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGPROC) (GLenum name); +typedef void (GLAPIENTRY * PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params); + static GLenum GLEWAPIENTRY glewContextInit () { + PFNGLGETSTRINGPROC getString; const GLubyte* s; GLuint dot; GLint major, minor; /* query opengl version */ - s = glGetString(GL_VERSION); + getString = (PFNGLGETSTRINGPROC) glewGetProcAddress((const GLubyte*)"glGetString"); + if (!getString) + return GLEW_ERROR_NO_GL_VERSION; + + s = getString(GL_VERSION); dot = _glewStrCLen(s, '.'); if (dot == 0) return GLEW_ERROR_NO_GL_VERSION; @@ -123,11 +131,14 @@ static GLenum GLEWAPIENTRY glewContextInit () { GLint n = 0; GLint i; + PFNGLGETINTEGERVPROC getIntegerv; PFNGLGETSTRINGIPROC getStringi; const char *ext; GLboolean *enable; - glGetIntegerv(GL_NUM_EXTENSIONS, &n); + getIntegerv = (PFNGLGETINTEGERVPROC) glewGetProcAddress((const GLubyte*)"glGetIntegerv"); + if (getIntegerv) + getIntegerv(GL_NUM_EXTENSIONS, &n); /* glGetStringi is OpenGL 3.0 */ getStringi = (PFNGLGETSTRINGIPROC) glewGetProcAddress((const GLubyte*)"glGetStringi"); @@ -156,7 +167,7 @@ static GLenum GLEWAPIENTRY glewContextInit () char ext[128]; GLboolean *enable; - extensions = (const char *) glGetString(GL_EXTENSIONS); + extensions = (const char *) getString(GL_EXTENSIONS); if (extensions) { diff --git a/auto/src/glewinfo_tail.c b/auto/src/glewinfo_tail.c index ec895f8..1975286 100644 --- a/auto/src/glewinfo_tail.c +++ b/auto/src/glewinfo_tail.c @@ -23,6 +23,11 @@ int main (int argc, char** argv) 0 /* flags */ }; +#if defined(GLEW_EGL) + typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGPROC) (GLenum name); + PFNGLGETSTRINGPROC getString; +#endif + if (glewParseArgs(argc-1, argv+1, ¶ms)) { fprintf(stderr, "Usage: glewinfo " @@ -55,6 +60,17 @@ int main (int argc, char** argv) glewDestroyContext(); return 1; } + +#if defined(GLEW_EGL) + getString = (PFNGLGETSTRINGPROC) eglGetProcAddress("glGetString"); + if (!getString) + { + fprintf(stderr, "Error: eglGetProcAddress failed to fetch glGetString\n"); + glewDestroyContext(); + return 1; + } +#endif + #if defined(_WIN32) #if defined(_MSC_VER) && (_MSC_VER >= 1400) if (fopen_s(&f, "glewinfo.txt", "w") != 0) @@ -78,9 +94,15 @@ int main (int argc, char** argv) fprintf(f, "Reporting capabilities of display %s, visual 0x%x\n", params.display == NULL ? getenv("DISPLAY") : params.display, params.visual); #endif +#if defined(GLEW_EGL) + fprintf(f, "Running on a %s from %s\n", + getString(GL_RENDERER), getString(GL_VENDOR)); + fprintf(f, "OpenGL version %s is supported\n", getString(GL_VERSION)); +#else fprintf(f, "Running on a %s from %s\n", glGetString(GL_RENDERER), glGetString(GL_VENDOR)); fprintf(f, "OpenGL version %s is supported\n", glGetString(GL_VERSION)); +#endif glewInfo(); #if defined(GLEW_OSMESA) #elif defined(GLEW_EGL) From a288050b5769264ac21993840c84d50bb7a5d06c Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Wed, 27 Jan 2016 22:46:59 +1000 Subject: [PATCH 18/20] EGL glewinfo now working for both Nvidia and Mesa implementations --- auto/src/glewinfo_tail.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/auto/src/glewinfo_tail.c b/auto/src/glewinfo_tail.c index 1975286..30f25fd 100644 --- a/auto/src/glewinfo_tail.c +++ b/auto/src/glewinfo_tail.c @@ -185,11 +185,11 @@ GLboolean glewCreateContext (struct createParams *params) EGLint numDevices; EGLSurface surface; EGLint majorVersion, minorVersion; - static const EGLint configAttribs[] = { + EGLint configAttribs[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_RED_SIZE, 1, EGL_GREEN_SIZE, 1, EGL_BLUE_SIZE, 1, - EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_NONE }; @@ -204,7 +204,7 @@ GLboolean glewCreateContext (struct createParams *params) }; EGLConfig config; EGLint numConfig; - EGLint error; + EGLBoolean pBuffer; PFNEGLQUERYDEVICESEXTPROC queryDevices = NULL; PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay = NULL; @@ -233,17 +233,22 @@ GLboolean glewCreateContext (struct createParams *params) if (!getError || !getDisplay || !initialize || !bindAPI || !chooseConfig || !createWindowSurface || !createContext || !makeCurrent) return GL_TRUE; + pBuffer = 0; display = EGL_NO_DISPLAY; if (queryDevices && getPlatformDisplay) { queryDevices(1, devices, &numDevices); if (numDevices==1) { + /* Nvidia EGL doesn't need X11 for p-buffer surface */ display = getPlatformDisplay(EGL_PLATFORM_DEVICE_EXT, devices[0], 0); + configAttribs[1] = EGL_PBUFFER_BIT; + pBuffer = 1; } } if (display==EGL_NO_DISPLAY) { + /* Fall-back to X11 surface, works on Mesa */ display = getDisplay(EGL_DEFAULT_DISPLAY); } if (display == EGL_NO_DISPLAY) @@ -257,13 +262,13 @@ GLboolean glewCreateContext (struct createParams *params) if (chooseConfig(display, configAttribs, &config, 1, &numConfig) != EGL_TRUE || (numConfig != 1)) return GL_TRUE; - ctx = createContext(display, config, EGL_NO_CONTEXT, contextAttribs); + ctx = createContext(display, config, EGL_NO_CONTEXT, pBuffer ? contextAttribs : NULL); if (NULL == ctx) return GL_TRUE; surface = EGL_NO_SURFACE; /* Create a p-buffer surface if possible */ - if (createPbufferSurface) + if (pBuffer && createPbufferSurface) { surface = createPbufferSurface(display, config, pBufferAttribs); } @@ -272,19 +277,14 @@ GLboolean glewCreateContext (struct createParams *params) { surface = createWindowSurface(display, config, (EGLNativeWindowType) NULL, NULL); } +#if 0 if (surface == EGL_NO_SURFACE) return GL_TRUE; +#endif if (makeCurrent(display, surface, surface, ctx) != EGL_TRUE) return GL_TRUE; - error = getError(); - if (error!=EGL_SUCCESS) - { - printf("eglGetError: %d\n", error); - return GL_TRUE; - } - return GL_FALSE; } From a7ea1dc3a3ddbc0daebf207a8145be5ba0f5424d Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 6 Feb 2016 12:53:49 +1000 Subject: [PATCH 19/20] Documentation refresh --- doc/advanced.html | 14 +- doc/basic.html | 14 +- doc/build.html | 14 +- doc/credits.html | 41 ++---- doc/glew.html | 364 +++++++++++++++++++++++----------------------- doc/glxew.html | 14 +- doc/index.html | 18 ++- doc/install.html | 14 +- doc/log.html | 16 +- doc/wglew.html | 14 +- 10 files changed, 272 insertions(+), 251 deletions(-) diff --git a/doc/advanced.html b/doc/advanced.html index ffd1242..f4dc9ec 100644 --- a/doc/advanced.html +++ b/doc/advanced.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. Building Installation Source Generation -Credits & Copyright Change Log - +
GitHub -Project Page -Bug Tracker +Issues +Pull Requests +Authors +Licensing +
+SourceForge Page
@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + diff --git a/doc/basic.html b/doc/basic.html index 038a155..0480ef7 100644 --- a/doc/basic.html +++ b/doc/basic.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. - - + - - + + + + + +
Last Update: 08-10-15
Last Update: 01-31-16
OpenGL Logo
GitHub Logo
+ Travis Logo
SourceForge Logo
Building
Installation
Source Generation
Credits & Copyright
Change Log

GitHub
Project Page
Bug Tracker
Issues
Pull Requests
Authors
Licensing

SourceForge Page

@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + diff --git a/doc/build.html b/doc/build.html index ba0d681..7f15d62 100644 --- a/doc/build.html +++ b/doc/build.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. - - + - - + + + + + +
Last Update: 08-10-15
Last Update: 01-31-16
OpenGL Logo
GitHub Logo
+ Travis Logo
SourceForge Logo
Building
Installation
Source Generation
Credits & Copyright
Change Log

GitHub
Project Page
Bug Tracker
Issues
Pull Requests
Authors
Licensing

SourceForge Page

@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + diff --git a/doc/credits.html b/doc/credits.html index 259ace5..a2846a9 100644 --- a/doc/credits.html +++ b/doc/credits.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. - - + - - + + + + + +
Last Update: 08-10-15
Last Update: 01-31-16
OpenGL Logo
GitHub Logo
+ Travis Logo
SourceForge Logo
Building
Installation
Source Generation
Credits & Copyright
Change Log

GitHub
Project Page
Bug Tracker
Issues
Pull Requests
Authors
Licensing

SourceForge Page

@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + @@ -92,31 +96,8 @@ THE POSSIBILITY OF SUCH DAMAGE. -

Credits

- -

-GLEW was developed by Milan -Ikits and Marcelo -Magallon. They also perform occasional maintainance to make sure -that GLEW stays in mint condition. Aaron Lefohn, Joe Kniss, and Chris -Wyman were the first users and also assisted with the design and -debugging process. The acronym GLEW originates from Aaron Lefohn. -Pasi Kärkkäinen identified and fixed several problems with -GLX and SDL. Nate Robins created the wglinfo utility, to -which modifications were made by Michael Wimmer. -

- -

Copyright

- -

-GLEW is originally derived from the EXTGL project by Lev Povalahev. -The source code is licensed under the Modified BSD -License, the Mesa 3-D License (MIT -License), and the Khronos License (MIT -License). The automatic code generation scripts are released under -the GNU GPL. -

+

+Author, copyright and licensing information on github.

Last Update: 08-10-15
Last Update: 01-31-16
OpenGL Logo
GitHub Logo
+ Travis Logo
SourceForge Logo
diff --git a/doc/glew.html b/doc/glew.html index 3b82eae..65f8c6c 100644 --- a/doc/glew.html +++ b/doc/glew.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. Building Installation Source Generation -Credits & Copyright Change Log - +
GitHub -Project Page -Bug Tracker +Issues +Pull Requests +Authors +Licensing +
+SourceForge Page
@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + @@ -507,194 +511,196 @@ THE POSSIBILITY OF SUCH DAMAGE. + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - + + + - - + + - - + + - - - - - - - + + + + + + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - + - - - - - - - + + + + + + + - - - + + +
Last Update: 08-10-15
Last Update: 01-31-16
OpenGL Logo
GitHub Logo
+ Travis Logo
SourceForge Logo

394 NVX_conditional_render
395 NVX_gpu_memory_info
396 NVX_linked_gpu_multicast

396 NV_bindless_multi_draw_indirect
397 NV_bindless_multi_draw_indirect_count
398 NV_bindless_texture
399 NV_blend_equation_advanced
400 NV_blend_equation_advanced_coherent
401 NV_blend_square
402 NV_compute_program5
403 NV_conditional_render
404 NV_conservative_raster
405 NV_conservative_raster_dilate
406 NV_copy_depth_to_color
407 NV_copy_image
408 NV_deep_texture3D
409 NV_depth_buffer_float
410 NV_depth_clamp
411 NV_depth_range_unclamped
412 NV_draw_texture
413 NV_evaluators
414 NV_explicit_multisample
415 NV_fence
416 NV_fill_rectangle
417 NV_float_buffer
418 NV_fog_distance
419 NV_fragment_coverage_to_color
420 NV_fragment_program
421 NV_fragment_program2
422 NV_fragment_program4
423 NV_fragment_program_option
424 NV_fragment_shader_interlock
425 NV_framebuffer_mixed_samples
426 NV_framebuffer_multisample_coverage
427 NV_geometry_program4
428 NV_geometry_shader4
429 NV_geometry_shader_passthrough
430 NV_gpu_program4
431 NV_gpu_program5
432 NV_gpu_program5_mem_extended
433 NV_gpu_program_fp64
434 NV_gpu_shader5
435 NV_half_float
436 NV_internalformat_sample_query
437 NV_light_max_exponent
438 NV_multisample_coverage
439 NV_multisample_filter_hint
440 NV_occlusion_query
441 NV_packed_depth_stencil
442 NV_parameter_buffer_object
443 NV_parameter_buffer_object2
444 NV_path_rendering
445 NV_path_rendering_shared_edge
446 NV_pixel_data_range
447 NV_point_sprite
448 NV_present_video
449 NV_primitive_restart
450 NV_register_combiners
451 NV_register_combiners2
452 NV_sample_locations
453 NV_sample_mask_override_coverage
454 NV_shader_atomic_counters
455 NV_shader_atomic_float
456 NV_shader_atomic_fp16_vector
457 NV_shader_atomic_int64
458 NV_shader_buffer_load
459 NV_shader_storage_buffer_object
460 NV_shader_thread_group
461 NV_shader_thread_shuffle
462 NV_tessellation_program5
463 NV_texgen_emboss
464 NV_texgen_reflection
465 NV_texture_barrier
466 NV_texture_compression_vtc
467 NV_texture_env_combine4
468 NV_texture_expand_normal
469 NV_texture_multisample
470 NV_texture_rectangle
471 NV_texture_shader
472 NV_texture_shader2
473 NV_texture_shader3
474 NV_transform_feedback
475 NV_transform_feedback2
476 NV_uniform_buffer_unified_memory
477 NV_vdpau_interop
478 NV_vertex_array_range
479 NV_vertex_array_range2
480 NV_vertex_attrib_integer_64bit
481 NV_vertex_buffer_unified_memory
482 NV_vertex_program
483 NV_vertex_program1_1
484 NV_vertex_program2
485 NV_vertex_program2_option
486 NV_vertex_program3
487 NV_vertex_program4
488 NV_video_capture
489 NV_viewport_array2
397 NV_bindless_multi_draw_indirect
398 NV_bindless_multi_draw_indirect_count
399 NV_bindless_texture
400 NV_blend_equation_advanced
401 NV_blend_equation_advanced_coherent
402 NV_blend_square
403 NV_command_list
404 NV_compute_program5
405 NV_conditional_render
406 NV_conservative_raster
407 NV_conservative_raster_dilate
408 NV_copy_depth_to_color
409 NV_copy_image
410 NV_deep_texture3D
411 NV_depth_buffer_float
412 NV_depth_clamp
413 NV_depth_range_unclamped
414 NV_draw_texture
415 NV_evaluators
416 NV_explicit_multisample
417 NV_fence
418 NV_fill_rectangle
419 NV_float_buffer
420 NV_fog_distance
421 NV_fragment_coverage_to_color
422 NV_fragment_program
423 NV_fragment_program2
424 NV_fragment_program4
425 NV_fragment_program_option
426 NV_fragment_shader_interlock
427 NV_framebuffer_mixed_samples
428 NV_framebuffer_multisample_coverage
429 NV_geometry_program4
430 NV_geometry_shader4
431 NV_geometry_shader_passthrough
432 NV_gpu_program4
433 NV_gpu_program5
434 NV_gpu_program5_mem_extended
435 NV_gpu_program_fp64
436 NV_gpu_shader5
437 NV_half_float
438 NV_internalformat_sample_query
439 NV_light_max_exponent
440 NV_multisample_coverage
441 NV_multisample_filter_hint
442 NV_occlusion_query
443 NV_packed_depth_stencil
444 NV_parameter_buffer_object
445 NV_parameter_buffer_object2
446 NV_path_rendering
447 NV_path_rendering_shared_edge
448 NV_pixel_data_range
449 NV_point_sprite
450 NV_present_video
451 NV_primitive_restart
452 NV_register_combiners
453 NV_register_combiners2
454 NV_sample_locations
455 NV_sample_mask_override_coverage
456 NV_shader_atomic_counters
457 NV_shader_atomic_float
458 NV_shader_atomic_fp16_vector
459 NV_shader_atomic_int64
460 NV_shader_buffer_load
461 NV_shader_storage_buffer_object
462 NV_shader_thread_group
463 NV_shader_thread_shuffle
464 NV_tessellation_program5
465 NV_texgen_emboss
466 NV_texgen_reflection
467 NV_texture_barrier
468 NV_texture_compression_vtc
469 NV_texture_env_combine4
470 NV_texture_expand_normal
471 NV_texture_multisample
472 NV_texture_rectangle
473 NV_texture_shader
474 NV_texture_shader2
475 NV_texture_shader3
476 NV_transform_feedback
477 NV_transform_feedback2
478 NV_uniform_buffer_unified_memory
479 NV_vdpau_interop
480 NV_vertex_array_range
481 NV_vertex_array_range2
482 NV_vertex_attrib_integer_64bit
483 NV_vertex_buffer_unified_memory
484 NV_vertex_program
485 NV_vertex_program1_1
486 NV_vertex_program2
487 NV_vertex_program2_option
488 NV_vertex_program3
489 NV_vertex_program4
490 NV_video_capture
491 NV_viewport_array2

490 OES_byte_coordinates
491 OES_compressed_paletted_texture
492 OES_read_format
493 OES_single_precision
492 OES_byte_coordinates
493 OES_compressed_paletted_texture
494 OES_read_format
495 OES_single_precision

494 OML_interlace
495 OML_resample
496 OML_subsample
496 OML_interlace
497 OML_resample
498 OML_subsample

497 OVR_multiview
498 OVR_multiview2
499 OVR_multiview
500 OVR_multiview2

499 PGI_misc_hints
500 PGI_vertex_hints
501 PGI_misc_hints
502 PGI_vertex_hints

501 REGAL_ES1_0_compatibility
502 REGAL_ES1_1_compatibility
503 REGAL_enable
504 REGAL_error_string
505 REGAL_extension_query
506 REGAL_log
507 REGAL_proc_address
503 REGAL_ES1_0_compatibility
504 REGAL_ES1_1_compatibility
505 REGAL_enable
506 REGAL_error_string
507 REGAL_extension_query
508 REGAL_log
509 REGAL_proc_address

508 REND_screen_coordinates
510 REND_screen_coordinates

509 S3_s3tc
511 S3_s3tc

510 SGIS_color_range
511 SGIS_detail_texture
512 SGIS_fog_function
513 SGIS_generate_mipmap
514 SGIS_multisample
515 SGIS_pixel_texture
516 SGIS_point_line_texgen
517 SGIS_sharpen_texture
518 SGIS_texture4D
519 SGIS_texture_border_clamp
520 SGIS_texture_edge_clamp
521 SGIS_texture_filter4
522 SGIS_texture_lod
523 SGIS_texture_select
512 SGIS_color_range
513 SGIS_detail_texture
514 SGIS_fog_function
515 SGIS_generate_mipmap
516 SGIS_multisample
517 SGIS_pixel_texture
518 SGIS_point_line_texgen
519 SGIS_sharpen_texture
520 SGIS_texture4D
521 SGIS_texture_border_clamp
522 SGIS_texture_edge_clamp
523 SGIS_texture_filter4
524 SGIS_texture_lod
525 SGIS_texture_select

524 SGIX_async
525 SGIX_async_histogram
526 SGIX_async_pixel
527 SGIX_blend_alpha_minmax
528 SGIX_clipmap
529 SGIX_convolution_accuracy
530 SGIX_depth_texture
531 SGIX_flush_raster
532 SGIX_fog_offset
533 SGIX_fog_texture
534 SGIX_fragment_specular_lighting
535 SGIX_framezoom
536 SGIX_interlace
537 SGIX_ir_instrument1
538 SGIX_list_priority
539 SGIX_pixel_texture
540 SGIX_pixel_texture_bits
541 SGIX_reference_plane
542 SGIX_resample
543 SGIX_shadow
544 SGIX_shadow_ambient
545 SGIX_sprite
546 SGIX_tag_sample_buffer
547 SGIX_texture_add_env
548 SGIX_texture_coordinate_clamp
549 SGIX_texture_lod_bias
550 SGIX_texture_multi_buffer
551 SGIX_texture_range
552 SGIX_texture_scale_bias
553 SGIX_vertex_preclip
554 SGIX_vertex_preclip_hint
555 SGIX_ycrcb
526 SGIX_async
527 SGIX_async_histogram
528 SGIX_async_pixel
529 SGIX_blend_alpha_minmax
530 SGIX_clipmap
531 SGIX_convolution_accuracy
532 SGIX_depth_texture
533 SGIX_flush_raster
534 SGIX_fog_offset
535 SGIX_fog_texture
536 SGIX_fragment_specular_lighting
537 SGIX_framezoom
538 SGIX_interlace
539 SGIX_ir_instrument1
540 SGIX_list_priority
541 SGIX_pixel_texture
542 SGIX_pixel_texture_bits
543 SGIX_reference_plane
544 SGIX_resample
545 SGIX_shadow
546 SGIX_shadow_ambient
547 SGIX_sprite
548 SGIX_tag_sample_buffer
549 SGIX_texture_add_env
550 SGIX_texture_coordinate_clamp
551 SGIX_texture_lod_bias
552 SGIX_texture_multi_buffer
553 SGIX_texture_range
554 SGIX_texture_scale_bias
555 SGIX_vertex_preclip
556 SGIX_vertex_preclip_hint
557 SGIX_ycrcb

556 SGI_color_matrix
557 SGI_color_table
558 SGI_texture_color_table
558 SGI_color_matrix
559 SGI_color_table
560 SGI_texture_color_table

559 SUNX_constant_data
561 SUNX_constant_data

560 SUN_convolution_border_modes
561 SUN_global_alpha
562 SUN_mesh_array
563 SUN_read_video_pixels
564 SUN_slice_accum
565 SUN_triangle_list
566 SUN_vertex
562 SUN_convolution_border_modes
563 SUN_global_alpha
564 SUN_mesh_array
565 SUN_read_video_pixels
566 SUN_slice_accum
567 SUN_triangle_list
568 SUN_vertex

567 WIN_phong_shading
568 WIN_specular_fog
569 WIN_swap_hint
569 WIN_phong_shading
570 WIN_specular_fog
571 WIN_swap_hint
diff --git a/doc/glxew.html b/doc/glxew.html index 576ddd3..08fa857 100644 --- a/doc/glxew.html +++ b/doc/glxew.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. Building Installation Source Generation -Credits & Copyright Change Log - +
GitHub -Project Page -Bug Tracker +Issues +Pull Requests +Authors +Licensing +
+SourceForge Page
@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + diff --git a/doc/index.html b/doc/index.html index b9b3605..b2a612b 100644 --- a/doc/index.html +++ b/doc/index.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. - - + - - + + + + + +
Last Update: 08-10-15
Last Update: 01-31-16
OpenGL Logo
GitHub Logo
+ Travis Logo
SourceForge Logo
Building
Installation
Source Generation
Credits & Copyright
Change Log

GitHub
Project Page
Bug Tracker
Issues
Pull Requests
Authors
Licensing

SourceForge Page

@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + @@ -154,8 +158,8 @@ An up-to-date copy is also available using gitUnsupported snapshots are also available:

Supported Extensions

diff --git a/doc/install.html b/doc/install.html index 4d00db8..e9427bc 100644 --- a/doc/install.html +++ b/doc/install.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. - - + - - + + + + + +
Last Update: 08-10-15
Last Update: 01-31-16
OpenGL Logo
GitHub Logo
+ Travis Logo
SourceForge Logo
Building
Installation
Source Generation
Credits & Copyright
Change Log

GitHub
Project Page
Bug Tracker
Issues
Pull Requests
Authors
Licensing

SourceForge Page

@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + diff --git a/doc/log.html b/doc/log.html index efa0a9f..41c6e27 100644 --- a/doc/log.html +++ b/doc/log.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE. - - + - - + + + + + +
Last Update: 08-10-15
Last Update: 01-31-16
OpenGL Logo
GitHub Logo
+ Travis Logo
SourceForge Logo
Building
Installation
Source Generation
Credits & Copyright
Change Log

GitHub
Project Page
Bug Tracker
Issues
Pull Requests
Authors
Licensing

SourceForge Page

@@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + @@ -103,6 +107,8 @@ THE POSSIBILITY OF SUCH DAMAGE.
  • glxewInit, wglewInit
  • glewinfo adds support for -version, -profile core|compatibility and -flag debug|forward parameters
  • Improved cmake build support + +
    • New extensions:
        diff --git a/doc/wglew.html b/doc/wglew.html index 903cb36..1dd5863 100644 --- a/doc/wglew.html +++ b/doc/wglew.html @@ -57,12 +57,15 @@ THE POSSIBILITY OF SUCH DAMAGE.
  • - - + - - + + + + + +
    Last Update: 08-10-15
    Last Update: 01-31-16
    OpenGL Logo
    GitHub Logo
    + Travis Logo
    SourceForge Logo
    Building
    Installation
    Source Generation
    Credits & Copyright
    Change Log

    GitHub
    Project Page
    Bug Tracker
    Issues
    Pull Requests
    Authors
    Licensing

    SourceForge Page

    @@ -72,10 +75,11 @@ THE POSSIBILITY OF SUCH DAMAGE. - + From 281e38de7d9ffd963c58062646bc06cca3cdea9f Mon Sep 17 00:00:00 2001 From: Nigel Stewart Date: Sat, 6 Feb 2016 13:12:27 +1000 Subject: [PATCH 20/20] PYTHON make variable for using python2, optionally --- auto/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/auto/Makefile b/auto/Makefile index d6b35e7..ff9dd36 100644 --- a/auto/Makefile +++ b/auto/Makefile @@ -10,6 +10,7 @@ include ../config/version #GLEW_SPLIT_SOURCE = yes SHELL = bash +PYTHON ?= python ### Use git repository for GL extension specifications @@ -118,7 +119,7 @@ $(EXT)/.dummy: $(REGISTRY)/.dummy @echo "--------------------------------------------------------------------" rm -rf $(EXT) $(BIN)/update_ext.sh $(EXT) $(REGISTRY) $(BLACKLIST) - $(BIN)/parse_xml.py registry/xml/egl.xml --core core/gl --extensions extensions/gl + $(PYTHON) $(BIN)/parse_xml.py registry/xml/egl.xml --core core/gl --extensions extensions/gl $(BIN)/$(FILTER) $(EXT) ifeq ($(patsubst Darwin%,Darwin,$(SYSTEM)), Darwin) find $(CORE) -maxdepth 1 -type f | grep -v VERSION | grep -v "~" | \
    Last Update: 08-10-15
    Last Update: 01-31-16
    OpenGL Logo
    GitHub Logo
    + Travis Logo
    SourceForge Logo