opengl32: Use opengl xml registry files.

This commit is contained in:
Rico Schüller 2013-11-01 18:18:26 +01:00 committed by Alexandre Julliard
parent 8a23fbf56f
commit 2fa9b7ebb5
7 changed files with 4098 additions and 1760 deletions

View File

@ -1,5 +1,6 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
use strict; use strict;
use XML::Simple;
# This script is called thus : # This script is called thus :
# #
@ -7,10 +8,8 @@ use strict;
# #
# - It needs files from the OpenGL extension registry: # - It needs files from the OpenGL extension registry:
# #
# http://www.opengl.org/registry/api/gl.spec # https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/gl.xml
# http://www.opengl.org/registry/api/gl.tm # https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/wgl.xml
# http://www.opengl.org/registry/api/wgl.tm
# http://www.opengl.org/registry/api/wglext.spec
# #
# If they are not found in the current directory the script will # If they are not found in the current directory the script will
# attempt to download them from there. # attempt to download them from there.
@ -78,34 +77,12 @@ my $gen_traces = 1;
# #
# List of categories to put in the 'opengl_norm.c' file # List of categories to put in the 'opengl_norm.c' file
# #
my %cat_1_0 = ( "display-list" => 1, my %cat_1_0 = ( "GL_VERSION_1_0" => 1 );
"drawing" => 1, my %cat_1_1 = ( %cat_1_0, "GL_VERSION_1_1" => 1 );
"drawing-control" => 1, my %cat_1_2 = ( %cat_1_1, "GL_VERSION_1_2" => 1 );
"feedback" => 1, my %cat_1_3 = ( %cat_1_2, "GL_VERSION_1_3" => 1 );
"framebuf" => 1, my %cat_1_4 = ( %cat_1_3, "GL_VERSION_1_4" => 1 );
"misc" => 1, my %cat_1_5 = ( %cat_1_4, "GL_VERSION_1_5" => 1 );
"modeling" => 1,
"pixel-op" => 1,
"pixel-rw" => 1,
"state-req" => 1,
"xform" => 1,
"VERSION_1_0" => 1,
"VERSION_1_0_DEPRECATED" => 1 );
my %cat_1_1 = ( %cat_1_0,
"VERSION_1_1" => 1,
"VERSION_1_1_DEPRECATED" => 1 );
my %cat_1_2 = ( %cat_1_1,
"VERSION_1_2" => 1,
"VERSION_1_2_DEPRECATED" => 1 );
my %cat_1_3 = ( %cat_1_2,
"VERSION_1_3" => 1,
"VERSION_1_3_DEPRECATED" => 1 );
my %cat_1_4 = ( %cat_1_3,
"VERSION_1_4" => 1,
"VERSION_1_4_DEPRECATED" => 1 );
my %cat_1_5 = ( %cat_1_4,
"VERSION_1_5" => 1,
"VERSION_1_5_DEPRECATED" => 1 );
my %norm_categories = (); my %norm_categories = ();
@ -119,13 +96,16 @@ my %debug_conv =
"GLbyte" => "%d", "GLbyte" => "%d",
"GLclampd" => "%f", "GLclampd" => "%f",
"GLclampf" => "%f", "GLclampf" => "%f",
"GLclampx" => "%d",
"GLdouble" => "%f", "GLdouble" => "%f",
"GLenum" => "%d", "GLenum" => "%d",
"GLfloat" => "%f", "GLfloat" => "%f",
"GLfixed" => "%d",
"GLint" => "%d", "GLint" => "%d",
"GLshort" => "%d", "GLshort" => "%d",
"GLsizei" => "%d", "GLsizei" => "%d",
"GLstring" => "%s", "GLstring" => "%s",
"GLsync" => "%p",
"GLubyte" => "%d", "GLubyte" => "%d",
"GLuint" => "%d", "GLuint" => "%d",
"GLushort" => "%d", "GLushort" => "%d",
@ -136,11 +116,15 @@ my %debug_conv =
"GLsizeiptr" => "%ld", "GLsizeiptr" => "%ld",
"GLhandleARB" => "%d", "GLhandleARB" => "%d",
"GLcharARB" => "%c", "GLcharARB" => "%c",
"GLuint64" => "%s,wine_dbgstr_longlong(%s)",
"GLuint64EXT" => "%s,wine_dbgstr_longlong(%s)",
"GLint64EXT" => "%s,wine_dbgstr_longlong(%s)",
"GLvoid" => "(void)", "GLvoid" => "(void)",
"_GLfuncptr" => "%p", "_GLfuncptr" => "%p",
"GLDEBUGPROC" => "%p", "GLDEBUGPROC" => "%p",
"GLDEBUGPROCARB" => "%p", "GLDEBUGPROCARB" => "%p",
"GLDEBUGPROCAMD" => "%p", "GLDEBUGPROCAMD" => "%p",
"GLDEBUGPROCKHR" => "%p",
"GLvdpauSurfaceNV" => "%ld", "GLvdpauSurfaceNV" => "%ld",
"int" => "%d", "int" => "%d",
"unsigned int" => "%u", "unsigned int" => "%u",
@ -168,11 +152,14 @@ my %arg_conv =
"GLchar" => [ "long", "char" ], "GLchar" => [ "long", "char" ],
"GLclampd" => [ "double", "double" ], "GLclampd" => [ "double", "double" ],
"GLclampf" => [ "float", "float" ], "GLclampf" => [ "float", "float" ],
"GLclampx" => [ "long", "int" ],
"GLdouble" => [ "double", "double" ], "GLdouble" => [ "double", "double" ],
"GLenum" => [ "long", "unsigned int" ], "GLenum" => [ "long", "unsigned int" ],
"GLfloat" => [ "float", "float" ], "GLfloat" => [ "float", "float" ],
"GLfixed" => [ "long", "int" ],
"GLint" => [ "long", "int" ], "GLint" => [ "long", "int" ],
"GLint64" => [ "int64", "INT64" ], "GLint64" => [ "int64", "INT64" ],
"GLint64EXT" => [ "int64", "INT64" ],
"GLintptr" => [ "long", "INT_PTR" ], "GLintptr" => [ "long", "INT_PTR" ],
"GLshort" => [ "long", "short" ], "GLshort" => [ "long", "short" ],
"GLsizei" => [ "long", "int" ], "GLsizei" => [ "long", "int" ],
@ -182,6 +169,7 @@ my %arg_conv =
"GLubyte" => [ "long", "unsigned char" ], "GLubyte" => [ "long", "unsigned char" ],
"GLuint" => [ "long", "unsigned int" ], "GLuint" => [ "long", "unsigned int" ],
"GLuint64" => [ "int64", "UINT64" ], "GLuint64" => [ "int64", "UINT64" ],
"GLuint64EXT" => [ "int64", "UINT64" ],
"GLushort" => [ "long", "unsigned short" ], "GLushort" => [ "long", "unsigned short" ],
"GLvoid" => [ "void", "void" ], "GLvoid" => [ "void", "void" ],
"GLcharARB" => [ "long", "char" ], "GLcharARB" => [ "long", "char" ],
@ -205,6 +193,7 @@ sub ConvertType($)
"GLDEBUGPROC" => "void *", "GLDEBUGPROC" => "void *",
"GLDEBUGPROCARB" => "void *", "GLDEBUGPROCARB" => "void *",
"GLDEBUGPROCAMD" => "void *", "GLDEBUGPROCAMD" => "void *",
"GLDEBUGPROCKHR" => "void *",
"HPBUFFERARB" => "struct wgl_pbuffer *", "HPBUFFERARB" => "struct wgl_pbuffer *",
"HPBUFFEREXT" => "struct wgl_pbuffer *", "HPBUFFEREXT" => "struct wgl_pbuffer *",
); );
@ -248,7 +237,7 @@ sub GenerateThunk($$$$)
return "" if $name eq "glDebugEntry"; return "" if $name eq "glDebugEntry";
return "" if $name eq "glGetString"; return "" if $name eq "glGetString";
return "" if $func_ref->[2] && $func_ref->[2] =~ /WGL_/; return "" if $func_ref->[2] && $func_ref->[2]->[0] =~ /WGL_/;
# If for opengl_norm.c, generate a nice heading otherwise Patrik won't be happy :-) # If for opengl_norm.c, generate a nice heading otherwise Patrik won't be happy :-)
# Patrik says: Well I would be even happier if a (OPENGL32.@) was added as well. Done. :-) # Patrik says: Well I would be even happier if a (OPENGL32.@) was added as well. Done. :-)
@ -400,46 +389,13 @@ if ($version eq "1.0") {
# #
# Fetch the registry files # Fetch the registry files
# #
-f "gl.spec" || system "wget http://www.opengl.org/registry/api/gl.spec" || die "cannot download gl.spec"; -f "gl.xml" || system "wget https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/gl.xml" || die "cannot download gl.xml";
-f "gl.tm" || system "wget http://www.opengl.org/registry/api/gl.tm" || die "cannot download gl.tm"; -f "wgl.xml" || system "wget https://cvs.khronos.org/svn/repos/ogl/trunk/doc/registry/public/api/wgl.xml" || die "cannot download wgl.xml";
-f "wgl.tm" || system "wget http://www.opengl.org/registry/api/wgl.tm" || die "cannot download wgl.tm";
-f "wglext.spec" || system "wget http://www.opengl.org/registry/api/wglext.spec" || die "cannot download wglext.spec";
-f "enum.spec" || system "wget http://www.opengl.org/registry/api/enum.spec" || die "cannot download enum.spec";
-f "enumext.spec" || system "wget http://www.opengl.org/registry/api/enumext.spec" || die "cannot download enumext.spec";
# #
# First, create a mapping between the pseudo types used in the spec file # Then, create the list of all OpenGL functions using the registry
# and OpenGL types using the 'gl.tm' file. # files. This will create two hash-tables, one with all the function
#
my %pseudo_to_opengl = ();
sub load_types($)
{
my $file = shift;
open TYPES, "<$file" or die "Could not open $file";
while (my $line = <TYPES>) {
if ($line !~ /\w*\#/) {
my ($pseudo, $opengl) = ($line =~ /(\w*),\*,\*,\s*(.*),\*,\*/);
$pseudo_to_opengl{$pseudo} = $opengl;
}
}
close TYPES;
}
load_types( "wgl.tm" );
load_types( "gl.tm" );
# This is to override the 'void' -> '*' bogus conversion
$pseudo_to_opengl{"void"} = "void";
$pseudo_to_opengl{"sync"} = "GLvoid*";
$pseudo_to_opengl{"Int64"} = "INT64";
$pseudo_to_opengl{"UInt64"} = "UINT64";
$pseudo_to_opengl{"Int64EXT"} = "INT64";
$pseudo_to_opengl{"UInt64EXT"} = "UINT64";
#
# Then, create the list of all OpenGL functions using the 'gl.spec'
# file. This will create two hash-tables, one with all the function
# whose category matches the one listed in '@norm_categories', the other # whose category matches the one listed in '@norm_categories', the other
# with all other functions. # with all other functions.
# #
@ -485,124 +441,124 @@ my %norm_functions = ( "glDebugEntry" => [ "GLint", [[ "GLint", "unknown1" ],
my %ext_functions = my %ext_functions =
( (
"glDeleteBufferRegion" => [ "void", [ [ "GLenum", "region" ] ], "GL_KTX_buffer_region" ], "glDeleteBufferRegion" => [ "void", [ [ "GLenum", "region" ] ], [ "GL_KTX_buffer_region" ] ],
"glReadBufferRegion" => [ "void", [ [ "GLenum", "region" ], "glReadBufferRegion" => [ "void", [ [ "GLenum", "region" ],
[ "GLint", "x" ], [ "GLint", "x" ],
[ "GLint", "y" ], [ "GLint", "y" ],
[ "GLsizei", "width" ], [ "GLsizei", "width" ],
[ "GLsizei", "height" ] ], "GL_KTX_buffer_region" ], [ "GLsizei", "height" ] ], [ "GL_KTX_buffer_region" ] ],
"glDrawBufferRegion" => [ "void", [ [ "GLenum", "region" ], "glDrawBufferRegion" => [ "void", [ [ "GLenum", "region" ],
[ "GLint", "x" ], [ "GLint", "x" ],
[ "GLint", "y" ], [ "GLint", "y" ],
[ "GLsizei", "width" ], [ "GLsizei", "width" ],
[ "GLsizei", "height" ], [ "GLsizei", "height" ],
[ "GLint", "xDest" ], [ "GLint", "xDest" ],
[ "GLint", "yDest" ] ], "GL_KTX_buffer_region" ], [ "GLint", "yDest" ] ], [ "GL_KTX_buffer_region" ] ],
"glBufferRegionEnabled" => [ "GLuint", [ ], "GL_KTX_buffer_region" ], "glBufferRegionEnabled" => [ "GLuint", [ ], [ "GL_KTX_buffer_region" ] ],
"glNewBufferRegion" => [ "GLuint", [ [ "GLenum", "type" ] ], "GL_KTX_buffer_region" ], "glNewBufferRegion" => [ "GLuint", [ [ "GLenum", "type" ] ], [ "GL_KTX_buffer_region" ] ],
"glMTexCoord2fSGIS" => [ "void", [ [ "GLenum", "target" ], "glMTexCoord2fSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat", "s" ], [ "GLfloat", "s" ],
[ "GLfloat", "t" ] ], "GL_SGIS_multitexture" ], [ "GLfloat", "t" ] ], [ "GL_SGIS_multitexture" ] ],
"glMTexCoord2fvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMTexCoord2fvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLfloat *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord1dSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord1dSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLdouble", "s" ] ], "GL_SGIS_multitexture" ], [ "GLdouble", "s" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord1dvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord1dvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLdouble *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLdouble *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord1fSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord1fSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat", "s" ] ], "GL_SGIS_multitexture" ], [ "GLfloat", "s" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord1fvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord1fvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "const GLfloat *", "v" ] ], "GL_SGIS_multitexture" ], [ "const GLfloat *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord1iSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord1iSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint", "s" ] ], "GL_SGIS_multitexture" ], [ "GLint", "s" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord1ivSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord1ivSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLint *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord1sSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord1sSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLshort", "s" ] ], "GL_SGIS_multitexture" ], [ "GLshort", "s" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord1svSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord1svSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLshort *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLshort *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord2dSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord2dSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLdouble", "s"], [ "GLdouble", "s"],
[ "GLdouble", "t" ] ], "GL_SGIS_multitexture" ], [ "GLdouble", "t" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord2dvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord2dvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLdouble *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLdouble *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord2fSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord2fSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat", "s" ], [ "GLfloat", "s" ],
[ "GLfloat", "t" ] ], "GL_SGIS_multitexture" ], [ "GLfloat", "t" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord2fvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord2fvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLfloat *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord2iSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord2iSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint", "s" ], [ "GLint", "s" ],
[ "GLint", "t" ] ], "GL_SGIS_multitexture" ], [ "GLint", "t" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord2ivSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord2ivSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLint *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord2sSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord2sSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLshort", "s" ], [ "GLshort", "s" ],
[ "GLshort", "t" ] ], "GL_SGIS_multitexture" ], [ "GLshort", "t" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord2svSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord2svSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLshort *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLshort *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord3dSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord3dSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLdouble", "s" ], [ "GLdouble", "s" ],
[ "GLdouble", "t" ], [ "GLdouble", "t" ],
[ "GLdouble", "r" ] ], "GL_SGIS_multitexture" ], [ "GLdouble", "r" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord3dvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord3dvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLdouble *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLdouble *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord3fSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord3fSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat", "s" ], [ "GLfloat", "s" ],
[ "GLfloat", "t" ], [ "GLfloat", "t" ],
[ "GLfloat", "r" ] ], "GL_SGIS_multitexture" ], [ "GLfloat", "r" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord3fvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord3fvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLfloat *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord3iSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord3iSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint", "s" ], [ "GLint", "s" ],
[ "GLint", "t" ], [ "GLint", "t" ],
[ "GLint", "r" ] ], "GL_SGIS_multitexture" ], [ "GLint", "r" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord3ivSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord3ivSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLint *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord3sSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord3sSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLshort", "s" ], [ "GLshort", "s" ],
[ "GLshort", "t" ], [ "GLshort", "t" ],
[ "GLshort", "r" ] ], "GL_SGIS_multitexture" ], [ "GLshort", "r" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord3svSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord3svSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLshort *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLshort *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord4dSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord4dSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLdouble", "s" ], [ "GLdouble", "s" ],
[ "GLdouble", "t" ], [ "GLdouble", "t" ],
[ "GLdouble", "r" ], [ "GLdouble", "r" ],
[ "GLdouble", "q" ] ], "GL_SGIS_multitexture" ], [ "GLdouble", "q" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord4dvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord4dvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLdouble *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLdouble *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord4fSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord4fSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat", "s" ], [ "GLfloat", "s" ],
[ "GLfloat", "t" ], [ "GLfloat", "t" ],
[ "GLfloat", "r" ], [ "GLfloat", "r" ],
[ "GLfloat", "q" ] ], "GL_SGIS_multitexture" ], [ "GLfloat", "q" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord4fvSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord4fvSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLfloat *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLfloat *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord4iSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord4iSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint", "s" ], [ "GLint", "s" ],
[ "GLint", "t" ], [ "GLint", "t" ],
[ "GLint", "r" ], [ "GLint", "r" ],
[ "GLint", "q" ] ], "GL_SGIS_multitexture" ], [ "GLint", "q" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord4ivSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord4ivSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLint *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord4sSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord4sSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLshort", "s" ], [ "GLshort", "s" ],
[ "GLshort", "t" ], [ "GLshort", "t" ],
[ "GLshort", "r" ], [ "GLshort", "r" ],
[ "GLshort", "q" ] ], "GL_SGIS_multitexture" ], [ "GLshort", "q" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoord4svSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoord4svSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLshort *", "v" ] ], "GL_SGIS_multitexture" ], [ "GLshort *", "v" ] ], [ "GL_SGIS_multitexture" ] ],
"glMultiTexCoordPointerSGIS" => [ "void", [ [ "GLenum", "target" ], "glMultiTexCoordPointerSGIS" => [ "void", [ [ "GLenum", "target" ],
[ "GLint", "size" ], [ "GLint", "size" ],
[ "GLenum", "type" ], [ "GLenum", "type" ],
[ "GLsizei", "stride" ], [ "GLsizei", "stride" ],
[ "GLvoid *", "pointer" ] ], "GL_SGIS_multitexture" ], [ "GLvoid *", "pointer" ] ], [ "GL_SGIS_multitexture" ] ],
"glSelectTextureSGIS" => [ "void", [ [ "GLenum", "target" ] ], "GL_SGIS_multitexture" ], "glSelectTextureSGIS" => [ "void", [ [ "GLenum", "target" ] ], [ "GL_SGIS_multitexture" ] ],
"glSelectTextureCoordSetSGIS" => [ "void", [ [ "GLenum", "target" ] ], "GL_SGIS_multitexture" ], "glSelectTextureCoordSetSGIS" => [ "void", [ [ "GLenum", "target" ] ], [ "GL_SGIS_multitexture" ] ],
"glDeleteObjectBufferATI" => [ "void", [ [ "GLuint", "buffer" ] ], "GL_ATI_vertex_array_object" ], "glDeleteObjectBufferATI" => [ "void", [ [ "GLuint", "buffer" ] ], [ "GL_ATI_vertex_array_object" ] ],
"wglSetPixelFormatWINE" => [ "BOOL", [ [ "HDC", "hdc" ], "wglSetPixelFormatWINE" => [ "BOOL", [ [ "HDC", "hdc" ],
[ "int", "format" ] ], "WGL_WINE_pixel_format_passthrough" ], [ "int", "format" ] ], [ "WGL_WINE_pixel_format_passthrough" ] ],
); );
@ -643,132 +599,124 @@ my %supported_wgl_extensions =
"WGL_WINE_pixel_format_passthrough" => 1, "WGL_WINE_pixel_format_passthrough" => 1,
); );
sub parse_registry_file($)
{
my $file = shift;
my @arg_names;
my %arg_types;
open REGISTRY, "<$file" or die "cannot open $file";
while (my $line = <REGISTRY>) {
next unless ($line =~ /^\w*\(.*\)/);
# Get the function name (NOTE: the 'gl' prefix needs to be added later)
my ($funcname, $args) = ($line =~ /^(\w*)\((.*)\)/);
# and the argument names
@arg_names = split /\s*,\s*/, $args;
# After get :
# - the return type
# - category (the extension the function is part of)
# - the argument types
# - the category the function belongs
%arg_types = ();
my $category = "";
my $ret_type = "";
while (1) {
$line = <REGISTRY>;
unless (defined($line)) {
last;
} elsif ($line =~ /^\s*$/) {
if (($category eq "") || ($ret_type eq "")) {
die "Missing 'category' line in function $funcname.\n";
}
last;
} elsif ($line =~ /\t*return\t+(\w*)/) {
($ret_type) = ($line =~ /\t*return\s*(\w*)/);
$ret_type = $pseudo_to_opengl{$ret_type};
unless (defined($ret_type)) {
die "Unsupported return type in function $funcname\n";
}
} elsif ($line =~ /^\t*category/) {
($category) = ($line =~ /^\t*category\s*([\w-]*)/);
} elsif ($line =~ /^\t*param/) {
my ($name, $base_type, $dir, $ext) = ($line =~ /\t*param\s*(\w*)\s*(\w*) (in|out)\s+(.*)/);
my $ptr = 0;
unless (defined($name)) {
chomp $line;
die "Broken spec file line $line in function $funcname\n";
}
if ($ext =~ /array/) {
# This is a pointer
$ptr = 1;
} elsif ($ext =~ /reference/) {
# This is a pointer
$ptr = 1;
} elsif ($ext =~ /value/) {
# And this a 'normal' value
$ptr = 0;
} else {
chomp $line;
die "Unsupported type : $line in function $funcname\n";
}
# Get the 'real' type and append a '*' in case of a pointer
my $type = $pseudo_to_opengl{$base_type};
unless (defined($type)) {
chomp $line;
die "Unsupported return type in function $funcname for type $base_type (line $line)\n";
}
if ($ptr) {
$type .= "*";
$type = "const $type" if $dir eq "in";
}
$arg_types{$name} = $type;
}
}
# Now, build the argument reference
my $arg_ref = [ ];
for (my $i = 0; $i < @arg_names; $i++) {
unless (defined($arg_types{$arg_names[$i]})) {
print "@arg_names\n";
foreach (sort keys %arg_types) {
print "$_ => $arg_types{$_}\n";
}
die "Undefined type for $arg_names[$i] in function $funcname\n";
}
push @$arg_ref, [ $arg_types{$arg_names[$i]}, $arg_names[$i] ];
}
# Now, put in one or the other hash table
if ($norm_categories{$category}) {
$norm_functions{"gl$funcname"} = [ $ret_type, $arg_ref ];
} elsif ($file =~ /^wgl/) {
if (defined $supported_wgl_extensions{"WGL_$category"}) {
$ext_functions{"wgl$funcname"} = [ $ret_type, $arg_ref, "WGL_$category" ];
}
} else {
$ext_functions{"gl$funcname"} = [ $ret_type, $arg_ref, "GL_$category" ];
}
}
close REGISTRY;
}
sub parse_enum_file($$)
{
my ($file, $enums) = @_;
open FILE, "<$file" or die "cannot open $file";
while (<FILE>)
{
chomp;
next if /^#/;
if (/^\t([0-9A-Z_]+)\s*=\s*(((0x[0-9A-Fa-f]+)|([0-9]+))([uUlL]+)?)/)
{
${$enums}{"GL_$1"} = $2;
next;
}
}
close FILE;
}
parse_registry_file( "gl.spec" );
parse_registry_file( "wglext.spec" );
my %enums = (); my %enums = ();
parse_enum_file( "enum.spec", \%enums );
parse_enum_file( "enumext.spec", \%enums ); sub parse_variable($)
{
my $p = shift;
my $ptype = '';
my $pname = '';
my $pnamebefore = '';
my $pnameafter = '';
while (my ($k, $v) = each($p)){
if ($k eq 'ptype') {
$ptype = ${$v}[0];
} elsif ($k eq 'name') {
$pname = ${$v}[0];
} elsif ($k eq 'content') {
if (ref($v) eq 'ARRAY') {
my @n = @{$v};
$pnamebefore = $n[0];
$pnameafter = $n[1] if (@n > 0);
} else {
$pnameafter = $v;
}
}
}
$ptype = $pnamebefore . $ptype . $pnameafter;
$ptype =~ s/ \*/\*/g;
$ptype =~ s/ $//g;
return [ $ptype, $pname ];
}
sub parse_file($$)
{
my ($file, $generate_enums) = @_;
my $xml = new XML::Simple;
my $data = $xml->XMLin($file, ForceArray => 1);
my %functions;
# save all functions
for my $command ( @{${$data->{commands}}[0]->{'command'}} ) {
my $name = '';
my $ret = '';
my $params = [];
my @alias = '';
while (my ($k, $v) = each($command)){
if ($k eq 'param') {
push(@$params, parse_variable($_)) for (@{$v});
} elsif ($k eq 'proto') {
($ret, $name) = @{parse_variable(${$v}[0])};
}
}
$functions{$name} = [ $ret, $params ];
}
# save all enums (only GL)
if ($generate_enums) {
for my $enum ( @{$data->{'enums'}} ) {
if (ref($enum->{'enum'}) eq "HASH") {
while (my ($k, $v) = each($enum->{'enum'})){
$enums{$k} = $v->{'value'};
}
}
}
}
# generate norm functions
while (my ($k, $v) = each($data->{feature})) {
if ($norm_categories{$k}) {
for my $req (@{$v->{require}}) {
for(keys %{$req->{command}}) {
$norm_functions{$_} = $functions{$_};
}
}
}
}
# generate extension functions from norm functions, if they are newer than the category
while (my ($k, $v) = each($data->{feature})) {
if (!$norm_categories{$k} && $v->{api} =~ /^gl(\||$)/)
{
for my $req (@{$v->{require}}) {
for (keys %{$req->{command}}) {
if (!$norm_functions{$_}) {
$ext_functions{$_} = [ $functions{$_}[0], $functions{$_}[1], [ $k ] ];
}
}
}
}
}
# generate extension functions
while (my ($k, $v) = each(${$data->{extensions}}[0]->{extension})) {
if ($v->{supported} =~ /^gl(\||$)/) {
for my $req (@{$v->{require}}) {
if (!defined $req->{api} || $req->{api} =~ /^gl(\||$)/) {
for (keys %{$req->{command}}) {
if (!$ext_functions{$_} && !$norm_functions{$_}) {
$ext_functions{$_} = [$functions{$_}[0], $functions{$_}[1], [ $k ]];
}
elsif ($ext_functions{$_}) {
push @{$ext_functions{$_}->[2]}, $k;
}
}
}
}
}
elsif ($v->{supported} =~ /^wgl$/) {
for (keys %{${$v->{require}}[0]->{command}}) {
if (defined $supported_wgl_extensions{$k}) {
$ext_functions{$_} = [ $functions{$_}[0], $functions{$_}[1], [ $k ] ];
}
}
}
}
}
parse_file( "gl.xml", 1 );
parse_file( "wgl.xml", 0 );
# #
# Get the current wgl_driver.h version # Get the current wgl_driver.h version
@ -873,7 +821,7 @@ close HEADER;
# #
# Now, generate the output files. First, the spec file. # Now, generate the output files. First, the spec file.
# #
open(SPEC, ">$spec_file"); open(SPEC, ">$spec_file") or die "cannot create $spec_file";
foreach (sort keys %norm_functions) { foreach (sort keys %norm_functions) {
my $args=" "; my $args=" ";
@ -922,7 +870,7 @@ close(SPEC);
# #
# After the spec file, the opengl_norm.c file # After the spec file, the opengl_norm.c file
# #
open(NORM, ">$norm_file"); open(NORM, ">$norm_file") or die "cannot create $norm_file";
print NORM " print NORM "
/* Auto-generated file... Do not edit ! */ /* Auto-generated file... Do not edit ! */
@ -965,7 +913,7 @@ close(NORM);
# #
# Finally, more complex, the opengl_ext.c file # Finally, more complex, the opengl_ext.c file
# #
open(EXT, ">$ext_file"); open(EXT, ">$ext_file") or die "cannot create $ext_file";
print EXT " print EXT "
/* Auto-generated file... Do not edit ! */ /* Auto-generated file... Do not edit ! */
@ -997,7 +945,7 @@ print EXT "\nconst OpenGL_extension extension_registry[$count] = {\n";
my $i = 0; my $i = 0;
foreach (sort keys %ext_functions) { foreach (sort keys %ext_functions) {
my $func_ref = $ext_functions{$_}; my $func_ref = $ext_functions{$_};
print EXT " { \"$_\", \"$func_ref->[2]\", $_ }"; printf EXT " { \"%s\", \"%s\", %s }", $_, join(" ", sort @{$func_ref->[2]}), $_;
if ($i != $count-1) { if ($i != $count-1) {
print EXT ","; print EXT ",";
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2151,12 +2151,12 @@ static BOOL macdrv_wglDestroyPbufferARB(struct wgl_pbuffer *pbuffer)
* *
* WGL_ARB_extensions_string: wglGetExtensionsStringARB * WGL_ARB_extensions_string: wglGetExtensionsStringARB
*/ */
static const GLubyte *macdrv_wglGetExtensionsStringARB(HDC hdc) static const char *macdrv_wglGetExtensionsStringARB(HDC hdc)
{ {
/* FIXME: Since we're given an HDC, this should be device-specific. I.e. /* FIXME: Since we're given an HDC, this should be device-specific. I.e.
this can be specific to the CGL renderer like we're supposed to do. */ this can be specific to the CGL renderer like we're supposed to do. */
TRACE("returning \"%s\"\n", gl_info.wglExtensions); TRACE("returning \"%s\"\n", gl_info.wglExtensions);
return (const GLubyte*)gl_info.wglExtensions; return gl_info.wglExtensions;
} }
@ -2165,10 +2165,10 @@ static const GLubyte *macdrv_wglGetExtensionsStringARB(HDC hdc)
* *
* WGL_EXT_extensions_string: wglGetExtensionsStringEXT * WGL_EXT_extensions_string: wglGetExtensionsStringEXT
*/ */
static const GLubyte *macdrv_wglGetExtensionsStringEXT(void) static const char *macdrv_wglGetExtensionsStringEXT(void)
{ {
TRACE("returning \"%s\"\n", gl_info.wglExtensions); TRACE("returning \"%s\"\n", gl_info.wglExtensions);
return (const GLubyte*)gl_info.wglExtensions; return gl_info.wglExtensions;
} }

View File

@ -2047,10 +2047,10 @@ static struct wgl_context *X11DRV_wglCreateContextAttribsARB( HDC hdc, struct wg
* *
* WGL_ARB_extensions_string: wglGetExtensionsStringARB * WGL_ARB_extensions_string: wglGetExtensionsStringARB
*/ */
static const GLubyte *X11DRV_wglGetExtensionsStringARB(HDC hdc) static const char *X11DRV_wglGetExtensionsStringARB(HDC hdc)
{ {
TRACE("() returning \"%s\"\n", WineGLInfo.wglExtensions); TRACE("() returning \"%s\"\n", WineGLInfo.wglExtensions);
return (const GLubyte *)WineGLInfo.wglExtensions; return WineGLInfo.wglExtensions;
} }
/** /**
@ -2896,10 +2896,10 @@ static BOOL X11DRV_wglReleaseTexImageARB( struct wgl_pbuffer *object, int iBuffe
* *
* WGL_EXT_extensions_string: wglGetExtensionsStringEXT * WGL_EXT_extensions_string: wglGetExtensionsStringEXT
*/ */
static const GLubyte *X11DRV_wglGetExtensionsStringEXT(void) static const char *X11DRV_wglGetExtensionsStringEXT(void)
{ {
TRACE("() returning \"%s\"\n", WineGLInfo.wglExtensions); TRACE("() returning \"%s\"\n", WineGLInfo.wglExtensions);
return (const GLubyte *)WineGLInfo.wglExtensions; return WineGLInfo.wglExtensions;
} }
/** /**

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff