#!/usr/bin/perl -w
use strict;
use XML::Simple;

# This script is called thus :
#
#   make_opengl [opengl_version]
#
#     - It needs files from the OpenGL extension registry:
#
#       https://raw.github.com/KhronosGroup/OpenGL-Registry/master/xml/gl.xml
#       https://raw.github.com/KhronosGroup/OpenGL-Registry/master/xml/wgl.xml
#
#       If they are not found in the current directory the script will
#       attempt to download them from there.
#
#     - opengl_version is the OpenGL version emulated by the library
#       (can be 1.0 to 1.5). The default is 1.1.
#
# This script generates the three following files :
#
#     - opengl32.spec : the spec file giving all the exported functions
#       of the OpenGL32.DLL library. These functions are the one an
#       application can directly link to (and are all the functions
#       defined in the OpenGL core for the version defined by
#       'opengl_version').
#
#     - opengl_norm.c : this file contains the thunks for all OpenGL
#       functions that are defined in 'opengl32.spec'. The corresponding
#       functions NEED to be defined in Linux's libGL or the library
#       won't be able to be linked in.
#
#     - opengl_ext.c : in this file are stored thunks for ALL possible
#       OpenGL extensions (at least, all the extensions that are defined
#       in the OpenGL extension registry). Contrary to 'opengl_norm.c',
#       you do not need to have these extensions in your libGL to have
#       OpenGL work (as they are resolved at run-time using
#       glXGetProcAddressARB).
#
#     - include/wine/wgl_driver.h: definitions for the tables of OpenGL functions.
#
#
# Copyright 2000 Lionel Ulmer
# Copyright 2012 Alexandre Julliard
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
#

#
# Files to generate
#
my $spec_file = "opengl32.spec";
my $norm_file = "opengl_norm.c";
my $ext_file  = "opengl_ext.c";
my $wgl_driver_file = "../../include/wine/wgl_driver.h";
my $wgl_file = "../../include/wine/wgl.h";

# Set to 0 for removing the ENTER / LEAVE GL calls
my $gen_thread_safe = 0;
# Prefix used for the local variables
my $ext_prefix = "func_";
# If set to 1, generate TRACEs for each OpenGL function
my $gen_traces = 1;

#
# List of categories to put in the 'opengl_norm.c' file
#
my %cat_1_0 = ( "GL_VERSION_1_0" => 1 );
my %cat_1_1 = ( %cat_1_0, "GL_VERSION_1_1" => 1 );
my %cat_1_2 = ( %cat_1_1, "GL_VERSION_1_2" => 1 );
my %cat_1_3 = ( %cat_1_2, "GL_VERSION_1_3" => 1 );
my %cat_1_4 = ( %cat_1_3, "GL_VERSION_1_4" => 1 );
my %cat_1_5 = ( %cat_1_4, "GL_VERSION_1_5" => 1 );

my %norm_categories = ();

#
# This hash table gives the conversion between OpenGL types and what
# is used by the TRACE printfs
#
my %debug_conv =
    ("GLbitfield" => "%d",
     "GLboolean" => "%d",
     "GLbyte" => "%d",
     "GLclampd" => "%f",
     "GLclampf" => "%f",
     "GLclampx" => "%d",
     "GLdouble" => "%f",
     "GLenum" => "%d",
     "GLfloat" => "%f",
     "GLfixed" => "%d",
     "GLint" => "%d",
     "GLshort" => "%d",
     "GLsizei" => "%d",
     "GLstring" => "%s",
     "GLsync" => "%p",
     "GLubyte" => "%d",
     "GLuint" => "%d",
     "GLushort" => "%d",
     "GLhalfNV" => "%d",
     "GLintptrARB" => "%ld",
     "GLsizeiptrARB" => "%ld",
     "GLintptr" => "%ld",
     "GLsizeiptr" => "%ld",
     "GLhandleARB" => "%d",
     "GLcharARB" => "%c",
     "GLuint64" => "%s,wine_dbgstr_longlong(%s)",
     "GLint64" => "%s,wine_dbgstr_longlong(%s)",
     "GLuint64EXT" => "%s,wine_dbgstr_longlong(%s)",
     "GLint64EXT" => "%s,wine_dbgstr_longlong(%s)",
     "GLvoid" => "(void)",
     "_GLfuncptr" => "%p",
     "GLDEBUGPROC" => "%p",
     "GLDEBUGPROCARB" => "%p",
     "GLDEBUGPROCAMD" => "%p",
     "GLDEBUGPROCKHR" => "%p",
     "GLeglClientBufferEXT" => "%p",
     "GLvdpauSurfaceNV" => "%ld",
     "GLVULKANPROCNV" => "%p",
     "int" => "%d",
     "unsigned int" => "%u",
     "UINT" => "%u",
     "DWORD" => "%u",
     "BOOL" => "%u",
     "INT64" => "%s,wine_dbgstr_longlong(%s)",
     "UINT64" => "%s,wine_dbgstr_longlong(%s)",
     "LPVOID" => "%p",
     "HANDLE" => "%p",
     "HDC" => "%p",
     "HGLRC" => "%p",
     "HPBUFFERARB" => "%p",
     "HPBUFFEREXT" => "%p",
    );

#
# This hash table gives the conversion between OpenGL types and what
# is used in the .spec and header files.
#
my %arg_conv =
    ("GLbitfield" =>       [ "long", "unsigned int" ],
     "GLboolean" =>        [ "long", "unsigned char" ],
     "GLbyte" =>           [ "long", "signed char" ],
     "GLchar" =>           [ "long", "char" ],
     "GLclampd" =>         [ "double", "double" ],
     "GLclampf" =>         [ "float", "float" ],
     "GLclampx" =>         [ "long", "int" ],
     "GLdouble" =>         [ "double", "double" ],
     "GLenum" =>           [ "long", "unsigned int" ],
     "GLfloat" =>          [ "float", "float" ],
     "GLfixed" =>          [ "long", "int" ],
     "GLint" =>            [ "long", "int" ],
     "GLint64" =>          [ "int64", "INT64" ],
     "GLint64EXT" =>       [ "int64", "INT64" ],
     "GLintptr" =>         [ "long", "INT_PTR" ],
     "GLshort" =>          [ "long", "short" ],
     "GLsizei" =>          [ "long", "int" ],
     "GLsizeiptr" =>       [ "long", "INT_PTR" ],
     "GLstring" =>         [ "str", "const unsigned char *" ],
     "GLsync" =>           [ "ptr", "struct __GLsync *" ],
     "GLubyte" =>          [ "long", "unsigned char" ],
     "GLuint" =>           [ "long", "unsigned int" ],
     "GLuint64" =>         [ "int64", "UINT64" ],
     "GLuint64EXT" =>      [ "int64", "UINT64" ],
     "GLushort" =>         [ "long", "unsigned short" ],
     "GLvoid" =>           [ "void", "void" ],
     "GLcharARB" =>        [ "long", "char" ],
     "GLhandleARB" =>      [ "long", "unsigned int" ],
     "GLintptrARB" =>      [ "long", "INT_PTR" ],
     "GLsizeiptrARB" =>    [ "long", "INT_PTR" ],
     "GLhalfNV" =>         [ "long", "unsigned short" ],
     "GLvdpauSurfaceNV" => [ "long", "INT_PTR" ],
     "HDC" =>              [ "long" ],
     "HGLRC" =>            [ "long" ],
     "HENHMETAFILE" =>     [ "long" ],
     "LPGLYPHMETRICSFLOAT" => [ "ptr" ],
     "LPCSTR" =>           [ "str" ],
     "int" =>              [ "long" ],
     "INT" =>              [ "long" ],
     "BOOL" =>             [ "long" ],
     "DWORD" =>            [ "long" ],
     "FLOAT" =>            [ "float" ],
     "UINT" =>             [ "long" ],
    );

#
# Used to convert some types
#
sub ConvertType($)
{
    my ($type) = @_;

    my %hash = (
              "struct _cl_context" => "void",
              "struct _cl_event" => "void",
              "HGLRC" => "struct wgl_context *",
              "GLDEBUGPROC" => "void *",
              "GLDEBUGPROCARB" => "void *",
              "GLDEBUGPROCAMD" => "void *",
              "GLDEBUGPROCKHR" => "void *",
              "GLeglClientBufferEXT" => "void *",
              "GLVULKANPROCNV" => "void *",
              "HPBUFFERARB" => "struct wgl_pbuffer *",
              "HPBUFFEREXT" => "struct wgl_pbuffer *",
        );

    foreach my $org (reverse sort keys %hash) {
        if ($type =~ /^(.*)$org(.*)$/) {
            return "$1$hash{$org}$2";
        }
    }
    return $type;
}

#
# Used to convert some variable names
#
sub ConvertVarName($)
{
    my ($type) = @_;

    my %hash = ( "near" => "nearParam",
                 "far"  => "farParam" );

    foreach my $org (keys %hash) {
        if ($type =~ /^(.*)$org(.*)$/) {
            return "$1$hash{$org}$2";
        }
    }
    return $type;
}

#
# This functions generates the thunk for a given function.
#
sub GenerateThunk($$$)
{
    my ($name, $func_ref, $prefix) = @_;
    my $ret = "";
    my $call_arg = "";
    my $trace_call_arg = "";
    my $trace_arg = "";

    return "" if $name eq "glDebugEntry";
    return "" if $name eq "glGetIntegerv";
    return "" if $name eq "glGetString";
    return "" if $func_ref->[2] && $func_ref->[2]->[0] =~ /WGL_/;

    $ret .= ConvertType($func_ref->[0]) . " WINAPI $name( ";
    for (my $i = 0; $i < @{$func_ref->[1]}; $i++) {
        my $type = $func_ref->[1]->[$i]->[0];
        my $name = ConvertVarName($func_ref->[1]->[$i]->[1]);
        my ($base_type, $type_specifier, $name_specifier) = ($type, $type, $name);
        if ($type =~ /(.*) (.*)/) {
            $base_type = $2;
        } elsif ($type =~ /(.*)(\[.*)/) {
            $base_type = $1;
            $type_specifier = $1;
            $name_specifier = $name . $2
        }
        $ret .= ConvertType($type_specifier) . " $name_specifier";
        $call_arg .= $name;
        if ($type =~ /\*/ || $type =~ /\[/) {
            $trace_arg .= "%p";
            $trace_call_arg .= $name;
        } elsif (defined $debug_conv{$base_type}) {
            if ($debug_conv{$base_type} =~ /(.*),(.*)/) {
                $trace_arg .= $1;
                $trace_call_arg .= sprintf $2, $name;
            } else {
                $trace_arg .= $debug_conv{$base_type};
                $trace_call_arg .= $name;
            }
        }
        else { printf "Unknown type %s\n", $type; }
        if ($i+1 < @{$func_ref->[1]}) {
            $ret .= ", ";
            $call_arg .= ", ";
            $trace_call_arg .= ", ";
            $trace_arg .= ", ";
        } else {
            $ret .= " ";
            $call_arg .= " ";
            $trace_call_arg .= " ";
        }
    }
    $ret .= 'void ' if (!@{$func_ref->[1]});
    return "$ret) DECLSPEC_HIDDEN;\n" if $name eq "glGetStringi";
    $ret .= ") {\n";
    $ret .= "  const struct opengl_funcs *funcs = NtCurrentTeb()->glTable;\n";
    if ($func_ref->[0] ne "void" && $gen_thread_safe) {
        $ret .= "  " . ConvertType($func_ref->[0]) . " ret_value;\n";
    }
    if ($gen_traces) {
        $ret .= "  TRACE(\"($trace_arg)\\n\"";
        if ($trace_arg ne "") {
            $ret .= ", $trace_call_arg";
        }
        $ret .= ");\n";
    }
    if ($gen_thread_safe) {
        $ret .= "  ENTER_GL();\n";
        $ret .= "  ";
        if ($func_ref->[0] ne "void") {
            $ret .= "ret_value = ";
        }
        $ret .= "funcs->$prefix.p_$name( $call_arg);\n";
        $ret .= "  LEAVE_GL();\n";
        if ($func_ref->[0] ne "void") {
            $ret .= "  return ret_value;\n"
        }
    }
    else {
        $ret .= "  ";
        if ($func_ref->[0] ne "void") {
            $ret .= "return ";
        }
        $ret .= "funcs->$prefix.p_$name( $call_arg);\n";
    }
    $ret .= "}\n";

    # Return this string....
    return $ret;
}

sub generate_null_func($$)
{
    my ($name, $func_ref) = @_;
    my $ret;

    return "" if $name eq "glDebugEntry";

    $ret = "static " . ConvertType($func_ref->[0]) . " null_$name( ";
    for (my $i = 0; $i < @{$func_ref->[1]}; $i++) {
        my $type = $func_ref->[1]->[$i]->[0];
        my $name = ConvertVarName($func_ref->[1]->[$i]->[1]);
        my $base_type;
        if ($type =~ /(.*)(\[.*)/) {
            $base_type = $1;
            $name .= $2;
        } else {
            $base_type = $type;
        }
        $ret .= ConvertType($base_type) . " $name";
        $ret .= "," if ($i+1 < @{$func_ref->[1]});
        $ret .= " ";
    }
    $ret .= 'void ' if (!@{$func_ref->[1]});
    $ret .= ") {";
    if ($name eq "glGetError")
    {
        $ret .= " return GL_INVALID_OPERATION;";
    }
    elsif ($func_ref->[0] ne "void")
    {
        $ret .= " return 0;";
    }
    $ret .= " }\n";
    return $ret;
}

sub generate_spec_entry($$)
{
    my ($name, $func) = @_;
    my $args=" ";
    foreach my $arg (@{$func->[1]})
    {
        my $type = $arg->[0];
        if ($type =~ /\*/) {
            $args .= "ptr ";
        } elsif (defined($arg_conv{$type})) {
            $args .= "$@$arg_conv{$type}[0] ";
        } else {
            die "No conversion for func $name type $type\n";
        }
    }
    $args = substr($args,1,-1);
    return "@ stdcall $_($args)";
}

sub get_func_proto($$$)
{
    my ($format, $name, $func) = @_;
    die "unknown func $name" unless defined $func->[0];
    my $ret = sprintf "%-10s", ConvertType($func->[0]);
    $ret .= " " . sprintf($format,$name) . "(";
    for (my $i = 0; $i < @{$func->[1]}; $i++)
    {
        $ret .= ConvertType($func->[1]->[$i]->[0]);
        $ret .= "," if ($i+1 < @{$func->[1]});
    }
    $ret .= "void" unless @{$func->[1]};
    $ret .= ")";
    return $ret;
}

#
# Extract and checks the number of arguments
#
if (@ARGV > 1) {
    my $name0=$0;
    $name0=~s%^.*/%%;
    die "Usage: $name0 [version]\n";
}
my $version = $ARGV[0] || "1.1";
if ($version eq "1.0") {
    %norm_categories = %cat_1_0;
} elsif ($version eq "1.1") {
    %norm_categories = %cat_1_1;
} elsif ($version eq "1.2") {
    %norm_categories = %cat_1_2;
} elsif ($version eq "1.3") {
    %norm_categories = %cat_1_3;
} elsif ($version eq "1.4") {
    %norm_categories = %cat_1_4;
} elsif ($version eq "1.5") {
    %norm_categories = %cat_1_5;
} else {
    die "Incorrect OpenGL version.\n";
}

#
# Fetch the registry files
#
-f "gl.xml" || system "wget https://raw.github.com/KhronosGroup/OpenGL-Registry/master/xml/gl.xml" || die "cannot download gl.xml";
-f "wgl.xml" || system "wget https://raw.github.com/KhronosGroup/OpenGL-Registry/master/xml/wgl.xml" || die "cannot download wgl.xml";


#
# Then, create the list of all OpenGL functions using the registry
# files. This will create two hash-tables, one with all the function
# whose category matches the one listed in '@norm_categories', the other
# with all other functions.
#
# An element of the hash table is a reference to an array with these
# elements :
#
#  - function name
#
#  - return type
#
#  - reference to an array giving the list of arguments (an empty array
#    for a 'void' function).
#
# The list of arguments is itself an array of reference to arrays. Each
# of these arrays represents the argument type and the argument name.
#
# An example :
#
# void glBitmap( GLsizei width, GLsizei height,
#                GLfloat xorig, GLfloat yorig,
#                GLfloat xmove, GLfloat ymove,
#                const GLubyte *bitmap );
#
# Would give something like that :
#
# [ "glBitmap",
#   "void",
#   [ [ "GLsizei", "width" ],
#     [ "GLsizei", "height" ],
#     [ "GLfloat", "xorig" ],
#     [ "GLfloat", "yorig" ],
#     [ "GLfloat", "xmove" ],
#     [ "GLfloat", "ymove" ],
#     [ "GLubyte *", "bitmap"] ] ];
#
my %norm_functions;
my %ext_functions;
my %wgl_functions;

my %supported_wgl_functions =
    (
     "wglCopyContext" => 1,
     "wglCreateContext" => 1,
     "wglDeleteContext" => 1,
     "wglDescribePixelFormat" => 1,
     "wglGetPixelFormat" => 1,
     "wglGetProcAddress" => 1,
     "wglMakeCurrent" => 1,
     "wglSetPixelFormat" => 1,
     "wglShareLists" => 1,
     "wglSwapBuffers" => 1,
    );

my %remapped_wgl_functions =
    (
     "ChoosePixelFormat" => "wglChoosePixelFormat",
     "DescribePixelFormat" => "wglDescribePixelFormat",
     "GetPixelFormat" => "wglGetPixelFormat",
     "GetEnhMetaFilePixelFormat" => 0,
     "SetPixelFormat" => "wglSetPixelFormat",
     "SwapBuffers" => "wglSwapBuffers",
     "wglUseFontBitmaps" => 0,
     "wglUseFontOutlines" => 0,
    );

my %supported_wgl_extensions =
   (
    "WGL_ARB_create_context" => 1,
    "WGL_ARB_extensions_string" => 1,
    "WGL_ARB_make_current_read" => 1,
    "WGL_ARB_pbuffer" => 1,
    "WGL_ARB_pixel_format" => 1,
    "WGL_ARB_render_texture" => 1,
    "WGL_EXT_extensions_string" => 1,
    "WGL_EXT_swap_control" => 1,
    "WGL_NV_vertex_array_range" => 1,
    "WGL_WINE_pixel_format_passthrough" => 1,
    "WGL_WINE_query_renderer" => 1,
   );

my %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);
            } elsif ($v eq 'const ') {
                $pnamebefore = $v;
            } 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 $cmds (@{$data->{commands}}) {
      for my $command ( @{$cmds->{'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
    my %features = %{$data->{feature}};
    foreach (sort keys %features) {
        my ($k, $v) = %features{$_};
        if (!$norm_categories{$k} && $v->{api} =~ /^gl(\||$)/)
        {
            for my $req (@{$v->{require}}) {
                for (keys %{$req->{command}}) {
                    if (!$ext_functions{$_} && !$norm_functions{$_}) {
                        $ext_functions{$_} = [ $functions{$_}[0], $functions{$_}[1], [ $k ] ];
                    }
                }
            }
        }
        elsif ($v->{api} eq "wgl")
        {
            for my $req (@{$v->{require}}) {
                for (keys %{$req->{command}}) {
                    if (defined $remapped_wgl_functions{$_}) {
                        $wgl_functions{$remapped_wgl_functions{$_}} = $functions{$_} if $remapped_wgl_functions{$_};
                    }
                    else {
                        $wgl_functions{$_} = $functions{$_};
                    }
                }
            }
        }
    }

    # 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 );
parse_file( "winegl.xml", 1 );

#
# Get the current wgl_driver.h version
#
my $wgl_version = 0;
open HEADER, "<$wgl_driver_file" or die "cannot open $wgl_driver_file";
while (<HEADER>)
{
    next unless /^#define WINE_WGL_DRIVER_VERSION (\d+)/;
    $wgl_version = $1;
    last;
}
close HEADER;

#
# Generate the wgl_driver.h file
#
open HEADER, ">$wgl_driver_file" or die "cannot create $wgl_driver_file";
print HEADER "/* Automatically generated from http://www.opengl.org/registry files; DO NOT EDIT! */\n\n";
print HEADER "#ifndef __WINE_WGL_DRIVER_H\n";
print HEADER "#define __WINE_WGL_DRIVER_H\n\n";
print HEADER "#ifndef WINE_GLAPI\n";
print HEADER "#define WINE_GLAPI\n";
print HEADER "#endif\n\n";

printf HEADER "#define WINE_WGL_DRIVER_VERSION %u\n\n", $wgl_version + 1;

print HEADER "struct wgl_context;\n";
print HEADER "struct wgl_pbuffer;\n\n";

print HEADER "struct opengl_funcs\n{\n";
print HEADER "    struct\n    {\n";
foreach (sort keys %wgl_functions)
{
    next unless defined $supported_wgl_functions{$_};
    printf HEADER "        %s;\n", get_func_proto("(WINE_GLAPI *p_%s)", $_, $wgl_functions{$_});
}
print HEADER "    } wgl;\n\n";

print HEADER "    struct\n    {\n";
foreach (sort keys %norm_functions)
{
    next if $_ eq "glDebugEntry";
    printf HEADER "        %s;\n", get_func_proto("(WINE_GLAPI *p_%s)", $_, $norm_functions{$_});
}
print HEADER "    } gl;\n\n";

print HEADER "    struct\n    {\n";
foreach (sort keys %ext_functions)
{
    printf HEADER "        %s;\n", get_func_proto("(WINE_GLAPI *p_%s)", $_, $ext_functions{$_});
}
print HEADER "    } ext;\n";
print HEADER "};\n\n";

print HEADER "#define ALL_WGL_FUNCS";
foreach (sort keys %norm_functions)
{
    next if $_ eq "glDebugEntry";
    printf HEADER " \\\n    USE_GL_FUNC(\%s)", $_;
}
print HEADER "\n\n";

print HEADER "extern struct opengl_funcs * CDECL __wine_get_wgl_driver( HDC hdc, UINT version );\n";
print HEADER "extern BOOL CDECL __wine_set_pixel_format( HWND hwnd, int format );\n\n";
print HEADER "#endif /* __WINE_WGL_DRIVER_H */\n";
close HEADER;

#
# Generate the wgl.h file
#
open HEADER, ">$wgl_file" or die "cannot create $wgl_file";
print HEADER "/* Automatically generated from http://www.opengl.org/registry files; DO NOT EDIT! */\n\n";
print HEADER "#ifndef __WINE_WGL_H\n";
print HEADER "#define __WINE_WGL_H\n\n";

print HEADER "#ifndef GLAPIENTRY\n";
print HEADER "#define GLAPIENTRY __stdcall\n";
print HEADER "#endif\n\n";

foreach (sort keys %arg_conv)
{
    next unless $arg_conv{$_}[1];
    printf HEADER "typedef %-22s %s;\n", $arg_conv{$_}[1], $_;
}
print HEADER "\n";

my $maxlen = 1;
foreach (keys %enums) { $maxlen = length($_) if length($_) > $maxlen; }
foreach (sort keys %enums)
{
    printf HEADER "#define %-*s %s\n", $maxlen, $_, $enums{$_};
}
print HEADER "\n";

foreach (sort keys %norm_functions)
{
    printf HEADER "%s;\n", get_func_proto("GLAPIENTRY %s", $_, $norm_functions{$_});
}

print HEADER "\n#endif /* __WINE_WGL_H */\n";
close HEADER;

#
# Now, generate the output files. First, the spec file.
#
open(SPEC, ">$spec_file") or die "cannot create $spec_file";

foreach (sort keys %norm_functions) {
    printf SPEC "%s\n", generate_spec_entry( $_, $norm_functions{$_} );
}
foreach (sort keys %wgl_functions) {
    printf SPEC "%s\n", generate_spec_entry( $_, $wgl_functions{$_} );
}

close(SPEC);

#
# After the spec file, the opengl_norm.c file
#
open(NORM, ">$norm_file") or die "cannot create $norm_file";
print NORM "
/* Auto-generated file... Do not edit ! */

#include \"config.h\"
#include <stdarg.h>
#include \"winternl.h\"
#include \"wingdi.h\"
#include \"wine/wgl.h\"
#include \"wine/wgl_driver.h\"
#include \"wine/debug.h\"

WINE_DEFAULT_DEBUG_CHANNEL(opengl);
";

foreach (sort keys %norm_functions) {
    my $string = GenerateThunk($_, $norm_functions{$_}, "gl");
    print NORM "\n$string" if $string;
}

foreach (sort keys %wgl_functions) {
    next unless defined $supported_wgl_functions{$_};
    print NORM generate_null_func($_, $wgl_functions{$_});
}
foreach (sort keys %norm_functions) {
    print NORM generate_null_func($_, $norm_functions{$_});
}
foreach (sort keys %ext_functions) {
    print NORM generate_null_func($_, $ext_functions{$_});
}

print NORM "\nstruct opengl_funcs null_opengl_funcs =\n{\n    {\n";
foreach (sort keys %wgl_functions)
{
    next unless defined $supported_wgl_functions{$_};
    print NORM "        null_$_,\n";
}
print NORM "    },\n    {\n";
foreach (sort keys %norm_functions) { print NORM "        null_$_,\n" unless $_ eq "glDebugEntry"; }
print NORM "    },\n    {\n";
foreach (sort keys %ext_functions) { print NORM "        null_$_,\n"; }
print NORM "    }\n};\n";

close(NORM);

#
# Finally, more complex, the opengl_ext.c file
#
open(EXT, ">$ext_file") or die "cannot create $ext_file";
print EXT "
/* Auto-generated file... Do not edit ! */

#include \"config.h\"
#include <stdarg.h>
#include \"opengl_ext.h\"
#include \"winternl.h\"
#include \"wingdi.h\"
#include \"wine/wgl.h\"
#define WGL_WGLEXT_PROTOTYPES
#include \"wine/wglext.h\"
#include \"wine/wgl_driver.h\"
#include \"wine/debug.h\"

WINE_DEFAULT_DEBUG_CHANNEL(opengl);

";

# The thunks themselves....
my $count = keys %ext_functions;
print EXT "const int extension_registry_size = $count;\n";
foreach (sort keys %ext_functions) {
    my $string = GenerateThunk($_, $ext_functions{$_}, "ext");
    if ($string =~ /DECLSPEC_HIDDEN/) {
        print EXT "\n$string";
    } else {
        print EXT "\nstatic $string" if $string;
    }
}

# Then the table giving the string <-> function correspondence */
print EXT "\nconst OpenGL_extension extension_registry[$count] = {\n";
my $i = 0;
foreach (sort keys %ext_functions) {
    my $func_ref = $ext_functions{$_};
    printf EXT "  { \"%s\", \"%s\", %s }", $_, join(" ", sort @{$func_ref->[2]}), $_;
    if ($i != $count-1) {
        print EXT ",";
    }
    $i++;
    print EXT "\n";
}
print EXT "};\n";

close(EXT);
