This commit is contained in:
Edward Rudd 2015-06-10 09:35:00 +00:00
commit b59d32b0ef
21 changed files with 255 additions and 84 deletions

View File

@ -140,6 +140,7 @@ $(I.DEST)/glew.h: $(EXT)/.dummy
echo -e "#if defined(GLEW_MX) && defined(_WIN32)\nstruct GLEWContextStruct\n{\n#endif /* GLEW_MX */" >> $@ echo -e "#if defined(GLEW_MX) && defined(_WIN32)\nstruct GLEWContextStruct\n{\n#endif /* GLEW_MX */" >> $@
$(BIN)/make_struct_fun.pl GLEW_FUN_EXPORT $(GL_CORE_SPEC) $(GL_EXT_SPEC) >> $@ $(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" >> $@ echo -e "\n#if defined(GLEW_MX) && !defined(_WIN32)\nstruct GLEWContextStruct\n{\n#endif /* GLEW_MX */\n" >> $@
echo -e "\n#if defined(GLEW_MX)\nGLEWHashList *GLEW_GL_EXTENSIONS;\n#endif /* GLEW_MX */\n" >> $@
$(BIN)/make_struct_var.pl GLEW_VAR_EXPORT $(GL_CORE_SPEC) $(GL_EXT_SPEC) >> $@ $(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" >> $@ 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 $@ 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 $@
@ -161,6 +162,7 @@ $(I.DEST)/wglew.h: $(EXT)/.dummy
cat $(SRC)/wglew_mid.h >> $@ cat $(SRC)/wglew_mid.h >> $@
echo -e "\n#ifdef GLEW_MX\nstruct WGLEWContextStruct\n{\n#endif /* GLEW_MX */" >> $@ 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_fun.pl WGLEW_FUN_EXPORT $(WGL_EXT_SPEC) >> $@
echo -e "\n#if defined(GLEW_MX)\nGLEWHashList *GLEW_WGL_EXTENSIONS;\n#endif /* GLEW_MX */\n" >> $@
$(BIN)/make_struct_var.pl WGLEW_VAR_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" >> $@ echo -e "\n#ifdef GLEW_MX\n}; /* WGLEWContextStruct */\n#endif /* GLEW_MX */\n" >> $@
cat $(SRC)/wglew_tail.h >> $@ cat $(SRC)/wglew_tail.h >> $@
@ -178,6 +180,7 @@ $(I.DEST)/glxew.h: $(EXT)/.dummy
cat $(SRC)/glxew_mid.h >> $@ cat $(SRC)/glxew_mid.h >> $@
$(BIN)/make_struct_fun.pl GLXEW_FUN_EXPORT $(GLX_CORE_SPEC) $(GLX_EXT_SPEC) >> $@ $(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" >> $@ echo -e "\n#if defined(GLEW_MX)\nstruct GLXEWContextStruct\n{\n#endif /* GLEW_MX */\n" >> $@
echo -e "\n#if defined(GLEW_MX)\nGLEWHashList *GLEW_GLX_EXTENSIONS;\n#endif /* GLEW_MX */\n" >> $@
$(BIN)/make_struct_var.pl GLXEW_VAR_EXPORT $(GLX_CORE_SPEC) $(GLX_EXT_SPEC) >> $@ $(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" >> $@ 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 $@ 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 $@

View File

@ -12,6 +12,7 @@ my %regex = (
function => qr/^(.+) ([a-z][a-z0-9_]*) \((.+)\)$/i, function => qr/^(.+) ([a-z][a-z0-9_]*) \((.+)\)$/i,
token => qr/^([A-Z][A-Z0-9_x]*)\s+((?:0x)?[0-9A-Fa-f]+|[A-Z][A-Z0-9_]*)$/, token => qr/^([A-Z][A-Z0-9_x]*)\s+((?:0x)?[0-9A-Fa-f]+|[A-Z][A-Z0-9_]*)$/,
type => qr/^typedef\s+(.+)$/, type => qr/^typedef\s+(.+)$/,
loadexts => qr/^LOAD (.*)$/,
exact => qr/.*;$/, exact => qr/.*;$/,
); );
@ -71,6 +72,7 @@ sub parse_ext($)
my %tokens = (); my %tokens = ();
my @types = (); my @types = ();
my @exacts = (); my @exacts = ();
my @loadexts = ();
my $extname = ""; # Full extension name GL_FOO_extension my $extname = ""; # Full extension name GL_FOO_extension
my $exturl = ""; # Info URL my $exturl = ""; # Info URL
my $extstring = ""; # Relevant extension string my $extstring = ""; # Relevant extension string
@ -104,7 +106,11 @@ sub parse_ext($)
chomp; chomp;
if (s/^\s+//) if (s/^\s+//)
{ {
if (/$regex{exact}/) if (/$regex{loadexts}/)
{
push @loadexts, $1;
}
elsif (/$regex{exact}/)
{ {
push @exacts, $_; push @exacts, $_;
} }
@ -132,7 +138,7 @@ sub parse_ext($)
close EXT; close EXT;
return ($extname, $exturl, $extstring, \@types, \%tokens, \%functions, \@exacts); return ($extname, $exturl, $extstring, \@types, \%tokens, \%functions, \@exacts, \@loadexts);
} }
sub output_tokens($$) sub output_tokens($$)
@ -207,3 +213,14 @@ sub output_exacts($$)
} }
} }
sub output_loadexts($$)
{
my ($tbl, $fnc) = @_;
if (scalar @{$tbl})
{
local $, = "\n";
print "\n";
print map { &{$fnc}($_) } sort @{$tbl};
print "\n";
}
}

View File

@ -29,7 +29,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
output_decls($functions, \&make_pfn_decl); output_decls($functions, \&make_pfn_decl);
} }
} }

View File

@ -23,7 +23,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
my $extvar = $extname; my $extvar = $extname;
$extvar =~ s/GL(X*)_/GL$1EW_/; $extvar =~ s/GL(X*)_/GL$1EW_/;
print "GLboolean " . prefix_varname($extvar) . " = GL_FALSE;\n"; print "GLboolean " . prefix_varname($extvar) . " = GL_FALSE;\n";

View File

@ -52,7 +52,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
make_separator($extname); make_separator($extname);
print "#ifndef $extname\n#define $extname 1\n"; print "#ifndef $extname\n#define $extname 1\n";

View File

@ -26,7 +26,7 @@ if (@ARGV)
print "<table border=\"0\" width=\"100%\" cellpadding=\"1\" cellspacing=\"0\" align=\"center\">\n"; print "<table border=\"0\" width=\"100%\" cellpadding=\"1\" cellspacing=\"0\" align=\"center\">\n";
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
$cur_group = $extname; $cur_group = $extname;
$cur_group =~ s/^(?:W?)GL(?:X?)_([A-Z0-9]+?)_.*$/$1/; $cur_group =~ s/^(?:W?)GL(?:X?)_([A-Z0-9]+?)_.*$/$1/;
$extname =~ s/^(?:W?)GL(?:X?)_(.*)$/$1/; $extname =~ s/^(?:W?)GL(?:X?)_(.*)$/$1/;

View File

@ -32,7 +32,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
my $extvar = $extname; my $extvar = $extname;
$extvar =~ s/GL(X*)_/GL$1EW_/; $extvar =~ s/GL(X*)_/GL$1EW_/;
my $extpre = $extname; my $extpre = $extname;

View File

@ -38,7 +38,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
print "#ifdef $extname\n"; print "#ifdef $extname\n";
print " _glewInfo_$extname();\n"; print " _glewInfo_$extname();\n";

View File

@ -21,6 +21,15 @@ sub make_pfn_def_init($%)
return " r = ((" . $_[0] . " = (PFN" . (uc $_[0]) . "PROC)glewGetProcAddress((const GLubyte*)\"" . $_[0] . "\")) == NULL) || r;"; return " r = ((" . $_[0] . " = (PFN" . (uc $_[0]) . "PROC)glewGetProcAddress((const GLubyte*)\"" . $_[0] . "\")) == NULL) || r;";
} }
sub make_loadexts_forward($%)
{
return "static GLboolean _glewInit_" . $_[0] . "(GLEW_CONTEXT_ARG_DEF_INIT);";
}
sub make_loadexts_call($%)
{
return " r = _glewInit_" . $_[0] . "(GLEW_CONTEXT_ARG_VAR_INIT) || r;";
}
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
my @extlist = (); my @extlist = ();
@ -34,7 +43,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) =
parse_ext($ext); parse_ext($ext);
#make_separator($extname); #make_separator($extname);
@ -42,11 +51,14 @@ if (@ARGV)
my $extvar = $extname; my $extvar = $extname;
my $extvardef = $extname; my $extvardef = $extname;
$extvar =~ s/GL(X*)_/GL$1EW_/; $extvar =~ s/GL(X*)_/GL$1EW_/;
if (keys %$functions) if (keys %$functions or keys @$loadexts)
{ {
output_loadexts($loadexts, \&make_loadexts_forward);
print "static GLboolean _glewInit_$extname (" . $type . print "static GLboolean _glewInit_$extname (" . $type .
"EW_CONTEXT_ARG_DEF_INIT)\n{\n GLboolean r = GL_FALSE;\n"; "EW_CONTEXT_ARG_DEF_INIT)\n{\n GLboolean r = GL_FALSE;\n";
output_decls($functions, \&make_pfn_def_init); output_decls($functions, \&make_pfn_def_init);
output_loadexts($loadexts, \&make_loadexts_call);
print "\n return r;\n}\n\n"; print "\n return r;\n}\n\n";
} }
#print "\nGLboolean " . prefix_varname($extvar) . " = GL_FALSE;\n\n"; #print "\nGLboolean " . prefix_varname($extvar) . " = GL_FALSE;\n\n";

View File

@ -32,7 +32,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
my $extvar = $extname; my $extvar = $extname;
$extvar =~ s/GL(X*)_/GL$1EW_/; $extvar =~ s/GL(X*)_/GL$1EW_/;
@ -46,10 +46,10 @@ if (@ARGV)
if (length($extstring)) if (length($extstring))
{ {
print " " . $extvar . " = _glewSearchExtension(\"$extstring\", extStart, extEnd);\n"; print " " . $extvar . " = _glewHashListExists(ext_hashlist, (const GLubyte *)\"$extstring\");\n";
} }
if (keys %$functions) if (keys %$functions or keys @$loadexts)
{ {
if ($extname =~ /WGL_.*/) if ($extname =~ /WGL_.*/)
{ {

View File

@ -22,7 +22,7 @@ if (@ARGV)
my $curexttype = ""; my $curexttype = "";
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
my $exttype = $extname; my $exttype = $extname;
$exttype =~ s/(W*?)GL(X*?)_(.*?_)(.*)/$3/; $exttype =~ s/(W*?)GL(X*?)_(.*?_)(.*)/$3/;
my $extrem = $extname; my $extrem = $extname;

View File

@ -30,7 +30,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
output_decls($functions, \&make_pfn_decl); output_decls($functions, \&make_pfn_decl);
} }
} }

View File

@ -23,7 +23,7 @@ if (@ARGV)
foreach my $ext (sort @extlist) foreach my $ext (sort @extlist)
{ {
my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts) = parse_ext($ext); my ($extname, $exturl, $extstring, $types, $tokens, $functions, $exacts, $loadexts) = parse_ext($ext);
my $extvar = $extname; my $extvar = $extname;
$extvar =~ s/GL(X*)_/GL$1EW_/; $extvar =~ s/GL(X*)_/GL$1EW_/;
print $export . " GLboolean " . prefix_varname($extvar) . ";\n"; print $export . " GLboolean " . prefix_varname($extvar) . ";\n";

View File

@ -161,3 +161,7 @@ https://www.opengl.org/registry/doc/glspec30.20080923.pdf
void glClearBufferfv (GLenum buffer, GLint drawBuffer, const GLfloat* value) void glClearBufferfv (GLenum buffer, GLint drawBuffer, const GLfloat* value)
void glClearBufferfi (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil) void glClearBufferfi (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil)
const GLubyte* glGetStringi (GLenum name, GLuint index) const GLubyte* glGetStringi (GLenum name, GLuint index)
LOAD GL_ARB_framebuffer_object
LOAD GL_ARB_map_buffer_range
LOAD GL_ARB_uniform_buffer_object
LOAD GL_ARB_vertex_array_object

View File

@ -39,3 +39,4 @@ https://www.opengl.org/registry/doc/glspec31.20090528.pdf
void glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount) void glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount)
void glTexBuffer (GLenum target, GLenum internalFormat, GLuint buffer) void glTexBuffer (GLenum target, GLenum internalFormat, GLuint buffer)
void glPrimitiveRestartIndex (GLuint buffer) void glPrimitiveRestartIndex (GLuint buffer)
LOAD GL_ARB_copy_buffer

View File

@ -26,3 +26,7 @@ https://www.opengl.org/registry/doc/glspec32.compatibility.20091207.pdf
void glGetInteger64i_v (GLenum pname, GLuint index, GLint64 * data) void glGetInteger64i_v (GLenum pname, GLuint index, GLint64 * data)
void glGetBufferParameteri64v (GLenum target, GLenum value, GLint64 * data) void glGetBufferParameteri64v (GLenum target, GLenum value, GLint64 * data)
void glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level) void glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level)
LOAD GL_ARB_draw_elements_base_vertex
LOAD GL_ARB_provoking_vertex
LOAD GL_ARB_sync
LOAD GL_ARB_texture_multisample

View File

@ -7,6 +7,7 @@
#endif #endif
#include <stddef.h> /* For size_t */ #include <stddef.h> /* For size_t */
#include <stdlib.h> /* For free and calloc */
/* /*
* Define glewGetContext and related helper macros. * Define glewGetContext and related helper macros.
@ -56,7 +57,6 @@ static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL;
#elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX) #elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX)
#include <dlfcn.h> #include <dlfcn.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
void* dlGetProcAddress (const GLubyte* name) void* dlGetProcAddress (const GLubyte* name)
{ {
@ -77,7 +77,6 @@ void* dlGetProcAddress (const GLubyte* name)
#endif /* __sgi || __sun || GLEW_APPLE_GLX */ #endif /* __sgi || __sun || GLEW_APPLE_GLX */
#if defined(__APPLE__) #if defined(__APPLE__)
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <AvailabilityMacros.h> #include <AvailabilityMacros.h>
@ -264,22 +263,150 @@ static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b,
return GL_FALSE; return GL_FALSE;
} }
/* struct GLEWHashListStruct
* Search for name in the extensions string. Use of strstr()
* is not sufficient because extension names can be prefixes of
* other extension names. Could use strtok() but the constant
* string returned by glGetString might be in read-only memory.
*/
static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end)
{ {
const GLubyte* p; const GLubyte **list;
GLuint len = _glewStrLen((const GLubyte*)name); GLuint size;
p = start; };
while (p < end)
#if !defined(GLEW_MX)
GLEWHashList *GLEW_GL_EXTENSIONS;
#if defined(_WIN32)
GLEWHashList *GLEW_WGL_EXTENSIONS;
#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
GLEWHashList *GLEW_GLX_EXTENSIONS;
#endif
#endif // !defined(GLEW_MX)
/* A simple open addressing hashset for extensions */
static GLuint hash_string(const GLubyte * key)
{
GLuint hash = 0;
GLuint i = 0;
GLuint len = _glewStrCLen(key, ' ');
for (; i < len; ++i)
{ {
GLuint n = _glewStrCLen(p, ' '); hash += key[i];
if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; hash += (hash << 10);
p += n+1; hash ^= (hash >> 6);
} }
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return hash;
}
static void _glewHashListFree(GLEWHashList *list)
{
if (list->list != NULL) {
free(list->list);
list->list = NULL;
list->size = 0;
}
}
static void _glewHashListAlloc(GLEWHashList *list, GLuint nelts)
{
GLuint size = nelts * 3 / 2;
_glewHashListFree(list);
list->list = calloc(size, sizeof(const GLubyte*));
list->size = size;
}
static void _glewHashListInsert(GLEWHashList *list, const GLubyte *name)
{
GLuint hash = hash_string(name);
if (list->list == NULL) return;
while(list->list[hash % list->size] != NULL)
hash++;
list->list[hash % list->size] = name;
}
static GLboolean _glewHashListExists(GLEWHashList *list, const GLubyte *name)
{
GLuint hash;
GLuint len;
if (list->list == NULL) return GL_FALSE;
hash = hash_string((const GLubyte*)name);
len = _glewStrLen((const GLubyte*)name);
/*
* As the hashset is bigger than the number of extensions
* this will eventually break.
*/
while(1)
{
GLuint index = hash % list->size;
GLuint n;
if (list->list[index] == NULL)
break;
n = _glewStrCLen(list->list[index], ' ');
if (len == n && _glewStrSame(list->list[index], (const GLubyte*)name, n)) return GL_TRUE;
++hash;
}
return GL_FALSE; return GL_FALSE;
} }
static GLboolean _glewBuildGL3ExtensionList(GLEWHashList *list)
{
GLint n, i;
glGetIntegerv(GL_NUM_EXTENSIONS, &n);
glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi");
_glewHashListAlloc(list, n);
for (i = 0; i < n; ++i)
{
const GLubyte* extension = glGetStringi(GL_EXTENSIONS, i);
_glewHashListInsert(list, extension);
}
return GL_TRUE;
}
/*
* initialize the extension list hash from a extension string list
*/
static GLboolean _glewBuildHashListFromString(const GLubyte* extensions, GLEWHashList *list)
{
const GLubyte* extStart;
const GLubyte* extEnd;
const GLubyte* p;
GLuint extCount = 0;
extStart = extensions;
if (extStart == 0)
extStart = (const GLubyte*)"";
extEnd = extStart + _glewStrLen(extStart);
// first scan to determine number of extensions
p = extStart;
while (p < extEnd)
{
GLuint n = _glewStrCLen(p, ' ');
p += n + 1;
++extCount;
}
_glewHashListAlloc(list, extCount);
// Second scan to populate the hash set
p = extStart;
while (p < extEnd)
{
GLuint n = _glewStrCLen(p, ' ');
_glewHashListInsert(list, p);
p += n+1;
}
return GL_TRUE;
}

View File

@ -188,6 +188,8 @@ typedef _W64 int ptrdiff_t;
extern "C" { extern "C" {
#endif #endif
typedef struct GLEWHashListStruct GLEWHashList;
/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ /* ----------------------------- GL_VERSION_1_1 ---------------------------- */
#ifndef GL_VERSION_1_1 #ifndef GL_VERSION_1_1

View File

@ -2,13 +2,10 @@
GLboolean GLEWAPIENTRY glewGetExtension (const char* name) GLboolean GLEWAPIENTRY glewGetExtension (const char* name)
{ {
const GLubyte* start; #if GLEW_MX
const GLubyte* end; GLEWContext *ctx = glewGetContext();
start = (const GLubyte*)glGetString(GL_EXTENSIONS); #endif
if (start == 0) return _glewHashListExists(GLEW_GET_VAR(GLEW_GL_EXTENSIONS), (const GLubyte*)name);
return GL_FALSE;
end = start + _glewStrLen(start);
return _glewSearchExtension(name, start, end);
} }
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
@ -21,8 +18,8 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
const GLubyte* s; const GLubyte* s;
GLuint dot; GLuint dot;
GLint major, minor; GLint major, minor;
const GLubyte* extStart; GLEWHashList *ext_hashlist;
const GLubyte* extEnd;
/* query opengl version */ /* query opengl version */
s = glGetString(GL_VERSION); s = glGetString(GL_VERSION);
dot = _glewStrCLen(s, '.'); dot = _glewStrCLen(s, '.');
@ -65,9 +62,18 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
} }
/* query opengl extensions string */ /* query opengl extensions string */
extStart = glGetString(GL_EXTENSIONS); GLEW_GET_VAR(GLEW_GL_EXTENSIONS) = calloc(1, sizeof(GLEWHashList));
if (extStart == 0)
extStart = (const GLubyte*)""; ext_hashlist = GLEW_GET_VAR(GLEW_GL_EXTENSIONS);
extEnd = extStart + _glewStrLen(extStart);
if (major >= 3)
{
_glewBuildGL3ExtensionList(ext_hashlist);
}
else
{
const GLubyte* extensions = glGetString(GL_EXTENSIONS);
_glewBuildHashListFromString(extensions, ext_hashlist);
}
/* initialize extensions */ /* initialize extensions */

View File

@ -2,21 +2,17 @@
GLboolean glxewGetExtension (const char* name) GLboolean glxewGetExtension (const char* name)
{ {
const GLubyte* start; #if GLEW_MX
const GLubyte* end; GLXEWContext *ctx = glxewGetContext();
#endif
if (glXGetCurrentDisplay == NULL) return GL_FALSE; return _glewHashListExists(GLXEW_GET_VAR(GLEW_GLX_EXTENSIONS), name);
start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);
if (0 == start) return GL_FALSE;
end = start + _glewStrLen(start);
return _glewSearchExtension(name, start, end);
} }
GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
{ {
int major, minor; int major, minor;
const GLubyte* extStart; const GLubyte* extensions;
const GLubyte* extEnd; GLEWHashList *ext_hashlist;
/* initialize core GLX 1.2 */ /* initialize core GLX 1.2 */
if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY; if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY;
/* initialize flags */ /* initialize flags */
@ -44,10 +40,11 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
} }
} }
/* query GLX extension string */ /* query GLX extension string */
extStart = 0; GLXEW_GET_VAR(GLEW_GLX_EXTENSIONS) = calloc(1, sizeof(GLEWHashList));
if (glXGetCurrentDisplay != NULL)
extStart = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); ext_hashlist = GLXEW_GET_VAR(GLEW_GLX_EXTENSIONS);
if (extStart == 0)
extStart = (const GLubyte *)""; extensions = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);
extEnd = extStart + _glewStrLen(extStart); _glewBuildHashListFromString(extensions, ext_hashlist);
/* initialize extensions */ /* initialize extensions */

View File

@ -5,37 +5,35 @@ static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL;
GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) GLboolean GLEWAPIENTRY wglewGetExtension (const char* name)
{ {
const GLubyte* start; #if GLEW_MX
const GLubyte* end; WGLEWContext *ctx = wglewGetContext();
if (_wglewGetExtensionsStringARB == NULL) #endif
if (_wglewGetExtensionsStringEXT == NULL) return _glewHashListExists(WGLEW_GET_VAR(GLEW_WGL_EXTENSIONS), name);
return GL_FALSE;
else
start = (const GLubyte*)_wglewGetExtensionsStringEXT();
else
start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC());
if (start == 0)
return GL_FALSE;
end = start + _glewStrLen(start);
return _glewSearchExtension(name, start, end);
} }
GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
{ {
GLboolean crippled; GLboolean crippled;
const GLubyte* extStart; const GLubyte* extensions;
const GLubyte* extEnd; GLEWHashList *ext_hashlist;
/* find wgl extension string query functions */ /* find wgl extension string query functions */
_wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB");
_wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT");
/* query wgl extension string */ /* query wgl extension string */
if (_wglewGetExtensionsStringARB == NULL) if (_wglewGetExtensionsStringARB == NULL)
if (_wglewGetExtensionsStringEXT == NULL) if (_wglewGetExtensionsStringEXT == NULL)
extStart = (const GLubyte*)""; extensions = (const GLubyte*)"";
else else
extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); extensions = (const GLubyte*)_wglewGetExtensionsStringEXT();
else else
extStart = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); extensions = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC());
extEnd = extStart + _glewStrLen(extStart);
WGLEW_GET_VAR(GLEW_WGL_EXTENSIONS) = calloc(1, sizeof(GLEWHashList));
ext_hashlist = WGLEW_GET_VAR(GLEW_WGL_EXTENSIONS);
_glewBuildHashListFromString(extensions, ext_hashlist);
/* initialize extensions */ /* initialize extensions */
crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL;