예제 #1
0
        /// <summary>
        /// Application entry point.
        /// </summary>
        /// <param name="args">
        /// The command line invocation arguments.
        /// </param>
        static void Main(string[] args)
        {
            RegistryContext   ctx;
            RegistryProcessor glRegistryProcessor;

            RegistryDocumentation.CreateLog();

            // OpenGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0))
            {
                ctx = new RegistryContext("Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
            }

#if false
            // OpenGL ES
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--gles"); }) >= 0))
            {
                ctx = new RegistryContext("Gles", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
            }
#endif

            // OpenGL for Windows
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0))
            {
                ctx = new RegistryContext("Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
            }

            // OpenGL for Unix
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--xgl"); }) >= 0))
            {
                ctx = new RegistryContext("Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
            }

            // EGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
            {
                ctx = new RegistryContext("Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
            }

            RegistryDocumentation.CloseLog();
        }
예제 #2
0
		/// <summary>
		/// Application entry point.
		/// </summary>
		/// <param name="args">
		/// The command line invocation arguments.
		/// </param>
		static void Main(string[] args)
		{
			RegistryContext ctx;
			RegistryProcessor glRegistryProcessor;

			RegistryDocumentation.CreateLog();

			// OpenGL
			if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return (item == "--gl"); }) >= 0)) {
				ctx = new RegistryContext("Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
				glRegistryProcessor = new RegistryProcessor(ctx.Registry);
				GenerateCommandsAndEnums(glRegistryProcessor, ctx);
				GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
				GenerateVersionsSupportClass(glRegistryProcessor, ctx);
			}

#if false
			// OpenGL ES
			if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return (item == "--gles"); }) >= 0)) {
				ctx = new RegistryContext("Gles", Path.Combine(BasePath, "GLSpecs/gl.xml"));
				glRegistryProcessor = new RegistryProcessor(ctx.Registry);
				GenerateCommandsAndEnums(glRegistryProcessor, ctx);
			}
#endif

			// OpenGL for Windows
			if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return (item == "--wgl"); }) >= 0)) {
				ctx = new RegistryContext("Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
				glRegistryProcessor = new RegistryProcessor(ctx.Registry);
				GenerateCommandsAndEnums(glRegistryProcessor, ctx);
				GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
				GenerateVersionsSupportClass(glRegistryProcessor, ctx);
			}

			// OpenGL for Unix
			if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return (item == "--xgl"); }) >= 0)) {
				ctx = new RegistryContext("Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
				glRegistryProcessor = new RegistryProcessor(ctx.Registry);
				GenerateCommandsAndEnums(glRegistryProcessor, ctx);
				GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
				GenerateVersionsSupportClass(glRegistryProcessor, ctx);
			}

			// EGL
			if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return (item == "--egl"); }) >= 0)) {
				ctx = new RegistryContext("Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
				glRegistryProcessor = new RegistryProcessor(ctx.Registry);
				GenerateCommandsAndEnums(glRegistryProcessor, ctx);
				GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
				GenerateVersionsSupportClass(glRegistryProcessor, ctx);
			}

			RegistryDocumentation.CloseLog();
		}
예제 #3
0
        private static void GenerateVersionsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            string path = String.Format("{0}/{1}.Versions.cs", _OutputBasePath, ctx.Class);

            Console.WriteLine("Generate version support class to {0}.", path);

            using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
                RegistryProcessor.GenerateLicensePreamble(sw);

                sw.WriteLine("namespace {0}", _Namespace);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("public partial class {0}", ctx.Class);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("#region Known Versions Constants");
                sw.WriteLine();

                foreach (Feature featureVersion in ctx.Registry.Features)
                {
                    if (featureVersion.Number == null)
                    {
                        continue;
                    }

                    // Determine version value (support up to 3 version numbers)
                    Match versionMatch = Regex.Match(featureVersion.Number, @"(?<Major>\d+)\.(?<Minor>\d+)(\.(?<Rev>\d+))?");
                    if (versionMatch.Success == false)
                    {
                        continue;
                    }

                    int versionMajor = Int32.Parse(versionMatch.Groups["Major"].Value);
                    int versionMinor = Int32.Parse(versionMatch.Groups["Minor"].Value);
                    int versionRev   = versionMatch.Groups["Rev"].Success ? Int32.Parse(versionMatch.Groups["Rev"].Value) : 0;

                    int versionValue = versionMajor * 100 + versionMinor * 10 + versionRev;

                    // Determine version/api name
                    string versionName = String.Format("Version_{0}", versionValue);
                    string api         = ctx.Class;

                    if (featureVersion.IsEsVersion)
                    {
                        versionName = String.Format("Version_{0}_ES", versionValue);
                        switch (versionMajor)
                        {
                        case 1:
                            api = "Gles1";
                            break;

                        case 2:
                        default:
                            api = "Gles2";
                            break;
                        }
                    }
                    else if (featureVersion.IsScVersion)
                    {
                        versionName = String.Format("Version_{0}_SC", versionValue);
                        api         = "Glsc2";
                    }

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Version for {0} API.", SpecificationStyle.GetKhronosVersionHumanReadable(featureVersion.Name));
                    sw.WriteLine("/// </summary>");
                    if (versionRev != 0)
                    {
                        sw.WriteLine("public static readonly KhronosVersion {0} = new KhronosVersion({1}, {2}, {3}, KhronosVersion.Api{4});", versionName, versionMajor, versionMinor, versionRev, api);
                    }
                    else
                    {
                        sw.WriteLine("public static readonly KhronosVersion {0} = new KhronosVersion({1}, {2}, KhronosVersion.Api{3});", versionName, versionMajor, versionMinor, api);
                    }
                    sw.WriteLine();
                }

                sw.WriteLine("#endregion");
                sw.WriteLine();

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.WriteLine();
                sw.WriteLine("}");
            }
        }
예제 #4
0
        private static void GenerateLimitsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            string path = String.Format("{0}/{1}.Limits.cs", _OutputBasePath, ctx.Class);

            List <Enumerant> limitEnums = new List <Enumerant>();

            foreach (Enumerant enumerant in ctx.Registry.Enumerants)
            {
                // Skip enumeration with aliases
                if (enumerant.EnumAlias != null)
                {
                    continue;
                }

                bool maxLimit = enumerant.Name.StartsWith("GL_MAX_");
                bool minLimit = enumerant.Name.StartsWith("GL_MIN_");

                if (!maxLimit && !minLimit)
                {
                    continue;
                }

                if (CommandFlagsDatabase.IsExcludedLimit(enumerant.Name))
                {
                    continue;
                }

                limitEnums.Add(enumerant);
            }

            foreach (CommandFlagsDatabase.Limit limit in CommandFlagsDatabase.GetLimits())
            {
                if (limitEnums.Exists(delegate(Enumerant item) { return(item.Name == limit.Name); }))
                {
                    continue;
                }

                Enumerant addedEnum = ctx.Registry.GetEnumerant(limit.Name);

                Debug.Assert(addedEnum != null);
                if (addedEnum == null)
                {
                    continue;
                }

                limitEnums.Add(addedEnum);
            }

            Console.WriteLine("Generate API limits to {0}.", path);

            using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
                RegistryProcessor.GenerateLicensePreamble(sw);

                sw.WriteLine("using System;");
                sw.WriteLine();

                sw.WriteLine("namespace {0}", _Namespace);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("public partial class {0}", ctx.Class);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("/// <summary>");
                sw.WriteLine("/// Limits support listing.");
                sw.WriteLine("/// </summary>");
                sw.WriteLine("public sealed partial class Limits");
                sw.WriteLine("{");
                sw.Indent();

                foreach (Enumerant enumerant in limitEnums)
                {
                    // Filter enumerant
                    CommandFlagsDatabase.Limit limit = CommandFlagsDatabase.GetLimit(enumerant.Name);
                    string fieldName   = SpecificationStyle.GetCamelCase(enumerant.ImplementationName);
                    string fieldType   = "int";
                    int    fieldLength = 1;

                    if (limit != null)
                    {
                        fieldType   = limit.Type;
                        fieldLength = limit.Length;
                    }

                    enumerant.GenerateDocumentation(sw, ctx);
                    if (fieldLength > 1)
                    {
                        sw.WriteLine("[Limit({0}, ArrayLength = {1})]", enumerant.ImplementationName, fieldLength);
                        enumerant.GenerateRequirements(sw, ctx);

                        StringBuilder sb = new StringBuilder();
                        sb.AppendFormat("public {0}[] {1} = new {0}[] {{", fieldType, fieldName);
                        for (int i = 0; i < fieldLength; i++)
                        {
                            switch (fieldType)
                            {
                            case "int":
                                sb.Append("0");
                                break;

                            case "float":
                                sb.Append("0.0f");
                                break;
                            }
                            if (i < fieldLength - 1)
                            {
                                sb.Append(", ");
                            }
                        }

                        sb.Append(" };");

                        sw.WriteLine(sb.ToString());
                    }
                    else
                    {
                        sw.WriteLine("[Limit({0})]", enumerant.ImplementationName);
                        enumerant.GenerateRequirements(sw, ctx);
                        sw.WriteLine("public {0} {1};", fieldType, fieldName);
                    }
                    sw.WriteLine();
                }

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.WriteLine();
                sw.WriteLine("}");
            }
        }
예제 #5
0
        private static void GenerateExtensionsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            string path = String.Format("{0}/{1}.Extensions.cs", _OutputBasePath, ctx.Class);

            Console.WriteLine("Generate registry khronosExtensions to {0}.", path);

            SortedList <int, List <IFeature> > khronosExtensions = new SortedList <int, List <IFeature> >();
            SortedList <int, List <IFeature> > vendorExtensions  = new SortedList <int, List <IFeature> >();

            foreach (IFeature feature in ctx.Registry.Extensions)
            {
                SortedList <int, List <IFeature> > extensionDict;
                List <IFeature> extensionFeatures;

                if (Extension.IsArbVendor(feature.Name))
                {
                    extensionDict = khronosExtensions;
                }
                else
                {
                    extensionDict = vendorExtensions;
                }

                int index = ExtensionIndices.GetIndex(feature.Name);

                if (extensionDict.TryGetValue(index, out extensionFeatures) == false)
                {
                    extensionFeatures = new List <IFeature>();
                    extensionDict.Add(index, extensionFeatures);
                }

                extensionFeatures.Add(feature);
            }

            using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
                RegistryProcessor.GenerateLicensePreamble(sw);

                sw.WriteLine("using System;");
                sw.WriteLine();

                sw.WriteLine("namespace {0}", _Namespace);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("public partial class {0}", ctx.Class);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("/// <summary>");
                sw.WriteLine("/// Extension support listing.");
                sw.WriteLine("/// </summary>");
                sw.WriteLine("public partial class Extensions : ExtensionsCollection");
                sw.WriteLine("{");
                sw.Indent();

                foreach (KeyValuePair <int, List <IFeature> > pair in khronosExtensions)
                {
                    IFeature mainFeature        = pair.Value[0];
                    string   extensionFieldName = SpecificationStyle.GetExtensionBindingName(mainFeature.Name);

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Support for extension {0}.", mainFeature.Name);
                    sw.WriteLine("/// </summary>");
                    foreach (IFeature feature in pair.Value)
                    {
                        if (feature.Api != null && feature.Api != ctx.Class.ToLower())
                        {
                            sw.WriteLine("[Extension(\"{0}\", Api = \"{1}\")]", feature.Name, feature.Api);
                        }
                        else
                        {
                            sw.WriteLine("[Extension(\"{0}\")]", feature.Name);
                        }
                    }

                    Extension mainExtension = (Extension)mainFeature;
                    if (String.IsNullOrEmpty(mainExtension.Supported) == false)
                    {
                        sw.WriteLine("[ExtensionSupport(\"{0}\")]", mainExtension.Supported);
                    }

                    sw.WriteLine("public bool {0};", extensionFieldName);
                    sw.WriteLine();
                }

                foreach (KeyValuePair <int, List <IFeature> > pair in vendorExtensions)
                {
                    IFeature mainFeature        = pair.Value[0];
                    string   extensionFieldName = SpecificationStyle.GetExtensionBindingName(mainFeature.Name);

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Support for extension {0}.", mainFeature.Name);
                    sw.WriteLine("/// </summary>");
                    foreach (IFeature feature in pair.Value)
                    {
                        if (feature.Api != null && feature.Api != ctx.Class.ToLower())
                        {
                            sw.WriteLine("[Extension(\"{0}\", Api = \"{1}\")]", feature.Name, feature.Api);
                        }
                        else
                        {
                            sw.WriteLine("[Extension(\"{0}\")]", feature.Name);
                        }
                    }

                    sw.WriteLine("public bool {0};", extensionFieldName);
                    sw.WriteLine();
                }

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.WriteLine();
                sw.WriteLine("}");
            }
        }
예제 #6
0
        private static void GenerateVbCommands(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            Dictionary <string, bool> serializedCommands = new Dictionary <string, bool>();
            Dictionary <string, bool> serializedEnums    = new Dictionary <string, bool>();
            List <Command>            featureVbCommands  = new List <Command>();
            List <Enumerant>          featureVbEnums     = new List <Enumerant>();

            Console.WriteLine("Testing for VB.Net incompatibilities.");

            #region Select VB incompatible commands

            foreach (IFeature feature in ctx.Registry.AllFeatures(ctx))
            {
                foreach (FeatureCommand featureCommand in feature.Requirements)
                {
                    if (featureCommand.Api != null && !ctx.IsSupportedApi(featureCommand.Api))
                    {
                        Console.WriteLine("Skip command: API {1} not supported", featureCommand.Api);
                        continue;
                    }


                    foreach (FeatureCommand.Item featureCommandItem in featureCommand.Commands)
                    {
                        Command command = ctx.Registry.GetCommand(featureCommandItem.Name);

                        Debug.Assert(command != null);
                        if (serializedCommands.ContainsKey(command.Prototype.Name))
                        {
                            continue;
                        }
                        serializedCommands.Add(command.Prototype.Name, true);

                        // Do not generate manually disabled command
                        if ((command.Flags & CommandFlags.Disable) != 0)
                        {
                            continue;
                        }
                        // Do not generate command with aliases
                        if (command.Alias != null)
                        {
                            continue;
                        }

                        // Do not generate methods not conflicting with enumerations having the same name with different case
                        Enumerant enumInConflict = ctx.Registry.GetEnumerantNoCase(command.GetImplementationName(ctx));
                        if (enumInConflict == null)
                        {
                            continue;
                        }

                        // VB.Net command
                        featureVbCommands.Add(command);

                        if (serializedEnums.ContainsKey(enumInConflict.Name))
                        {
                            continue;
                        }
                        serializedEnums.Add(enumInConflict.Name, true);

                        // VB.Net enum
                        featureVbEnums.Add(enumInConflict);
                    }
                }
            }

            #endregion

            string path = Path.Combine(BasePath, String.Format("{0}/{1}.Vb.cs", _OutputBasePath, ctx.Class));

            if (featureVbCommands.Count > 0)
            {
                Console.WriteLine("Generate registry commands to {0}.", path);

                using (SourceStreamWriter sw = new SourceStreamWriter(path, false)) {
                    RegistryProcessor.GenerateLicensePreamble(sw);

                    // Warning CS1734  XML comment on 'method' has a paramref tag for 'param', but there is no parameter by that name
                    // sw.WriteLine("#pragma warning disable 1734");
                    // sw.WriteLine();

                    sw.WriteLine("#pragma warning disable 649, 1572, 1573");
                    sw.WriteLine();

                    sw.WriteLine("using System;");
                    sw.WriteLine("using System.Diagnostics;");
                    sw.WriteLine("using System.Runtime.InteropServices;");
                    sw.WriteLine("using System.Security;");
                    sw.WriteLine("using System.Text;");

                    sw.WriteLine();

                    sw.WriteLine("namespace {0}", _Namespace);
                    sw.WriteLine("{");
                    sw.Indent();

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Class for scoping those methods conflicting with other fields/enums.");
                    sw.WriteLine("/// </summary>");
                    sw.WriteLine("public partial class {0}", ctx.Class);
                    sw.WriteLine("{");
                    sw.Indent();

                    // VB Commands class
                    sw.WriteLine("public static class VB");
                    sw.WriteLine("{");
                    sw.Indent();

                    // VB Function implementations
                    foreach (Command command in featureVbCommands)
                    {
                        command.GenerateImplementations(sw, ctx);
                        sw.WriteLine();
                    }

                    sw.Unindent();
                    sw.WriteLine("}");

                    // VB Commands class
                    sw.WriteLine();
                    sw.WriteLine("public static class VBEnum");
                    sw.WriteLine("{");
                    sw.Indent();

                    // VB Function implementations
                    foreach (Enumerant enumerant in featureVbEnums)
                    {
                        enumerant.GenerateSource(sw, ctx);
                        sw.WriteLine();
                    }

                    sw.Unindent();
                    sw.WriteLine("}");
                    sw.Unindent();

                    sw.Unindent();
                    sw.WriteLine("}");
                    sw.Unindent();

                    sw.WriteLine();
                    sw.WriteLine("}");
                }
            }
            else
            {
                if (File.Exists(path))
                {
                    File.Delete(path);
                }
            }
        }
예제 #7
0
        /// <summary>
        /// Application entry point.
        /// </summary>
        /// <param name="args">
        /// The command line invocation arguments.
        /// </param>
        static void Main(string[] args)
        {
            RegistryContext   ctx;
            RegistryProcessor glRegistryProcessor;
            int index;

            DummyStream = Array.FindIndex(args, delegate(string item) { return(item == "--dummy"); }) >= 0;
            DocDisabled = Array.FindIndex(args, delegate(string item) { return(item == "--nodoc"); }) >= 0;

            #region Assembly processing

            if ((args.Length > 0) && ((index = Array.FindIndex(args, delegate(string item) { return(item == "--assembly"); })) >= 0))
            {
                string assemblyPath      = args[index + 1];
                bool   overwriteAssembly = Array.Exists(args, delegate(string item) { return(item.StartsWith("--assembly-overwrite")); });
                bool   profileOnlyOpts   = Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-")); });

                List <RegistryAssemblyConfiguration> cfgs = new List <RegistryAssemblyConfiguration>();

                if (profileOnlyOpts == false)
                {
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.CoreProfile.xml"));
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.ES2Profile.xml"));
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.SC2Profile.xml"));
                }
                else
                {
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-core")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.CoreProfile.xml"));
                    }
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-es2")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.ES2Profile.xml"));
                    }
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-sc2")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.SC2Profile.xml"));
                    }
                }

                foreach (RegistryAssemblyConfiguration cfg in cfgs)
                {
                    try {
                        RegistryAssembly.CleanAssembly(assemblyPath, cfg, overwriteAssembly);
                    } catch (Exception exception) {
                        Console.WriteLine("Unable to process assembly: {0}.", exception.Message);
                    }
                }

                // Exclusive option
                return;
            }

            #endregion

            #region Log Maps

            if ((args.Length > 0) && (Array.FindIndex(args, delegate(string item) { return(item == "--only-logmaps"); }) >= 0))
            {
                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0))
                {
                    Console.WriteLine("Generating GL log map...");
                    ctx = new RegistryContext("Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGl.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0))
                {
                    Console.WriteLine("Generating WGL log map...");
                    ctx = new RegistryContext("Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapWgl.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0))
                {
                    Console.WriteLine("Generating GLX log map...");
                    ctx = new RegistryContext("Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGlx.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
                {
                    Console.WriteLine("Generating EGL log map...");
                    ctx = new RegistryContext("Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapEgl.xml"));
                }

                // Exclusive option
                return;
            }

            #endregion

            // (Common) Documentation
            RegistryDocumentation <RegistryDocumentationHandler_GL4> gl4Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL4>();
            gl4Documentation.Api = "GL4";
            if (DocDisabled == false)
            {
                gl4Documentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/OpenGL/gl4"));
            }

            RegistryDocumentation <RegistryDocumentationHandler_GL2> gl2Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL2>();
            gl2Documentation.Api = "GL2.1";
            if (DocDisabled == false)
            {
                gl2Documentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/OpenGL/gl2.1"));
            }

            // XML-based specifications

            // OpenGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0))
            {
                // Additional ES documentation
                RegistryDocumentation <RegistryDocumentationHandler_GL4> gles3Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL4>();
                gles3Documentation.Api = "GLES3.2";
                if (DocDisabled == false)
                {
                    gles3Documentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/OpenGL/es3"));
                }

                RegistryDocumentation <RegistryDocumentationHandler_GL2> gles1Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL2>();
                gles1Documentation.Api = "GLES1.1";
                if (DocDisabled == false)
                {
                    gles1Documentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/OpenGL/es1.1"));
                }

                Console.WriteLine("Loading GL specification...");
                ctx = new RegistryContext("Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);
                ctx.RefPages.Add(gles3Documentation);
                ctx.RefPages.Add(gles1Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateLimitsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGl.xml"));
            }

            // OpenGL for Windows
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0))
            {
                ctx = new RegistryContext("Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapWgl.xml"));
            }

            // OpenGL for Unix
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0))
            {
                ctx = new RegistryContext("Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGlx.xml"));
            }

            // EGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
            {
                RegistryDocumentation <RegistryDocumentationHandler_EGL> eglDocumentation = new RegistryDocumentation <RegistryDocumentationHandler_EGL>();
                eglDocumentation.Api = "EGL";
                eglDocumentation.ScanDocumentation(Path.Combine(BasePath, "Refpages/EGL-Registry/sdk/docs/man"));

                ctx = new RegistryContext("Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                ctx.RefPages.Add(eglDocumentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapEgl.xml"));
            }

            // OpenWF

            _OutputBasePath = "OpenWF.Net";
            _Namespace      = "OpenWF";

            // OpenWF(C)
            // Note: you must setup CLI to generate this bindings
            if ((args.Length > 0) && (Array.FindIndex(args, delegate(string item) { return(item == "--wfc"); }) >= 0))
            {
                Header headRegistry = new Header("Wfc");
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfc.h"));

                ctx = new RegistryContext("Wfc", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }

            // OpenWF(D)
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wfd"); }) >= 0))
            {
                Header headRegistry = new Header("Wfd");
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfd.h"));

                ctx = new RegistryContext("Wfd", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }
        }
예제 #8
0
        /// <summary>
        /// Generate all required files for OpenGL C# bindings.
        /// </summary>
        /// <param name="glRegistryProcessor">
        /// The <see cref="RegistryProcessor"/> that actually process the OpenGL specification.
        /// </param>
        /// <param name="ctx">
        /// The <see cref="RegistryContext"/> that actually parses the OpenGL specification.
        /// </param>
        private static void GenerateCommandsAndEnums(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            Dictionary <string, bool> serializedCommands = new Dictionary <string, bool>();
            Dictionary <string, bool> serializedEnums    = new Dictionary <string, bool>();

            glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", _OutputBasePath, ctx.Class)), null);

            #region By features and extensions

            foreach (IFeature feature in ctx.Registry.AllFeatures(ctx))
            {
                List <Command>   featureCommands = new List <Command>();
                List <Enumerant> featureEnums    = new List <Enumerant>();

                #region Select enumerants and commands

                foreach (FeatureCommand featureCommand in feature.Requirements)
                {
                    if (featureCommand.Api != null && !ctx.IsSupportedApi(featureCommand.Api))
                    {
                        Console.WriteLine("Skip command: API {1} not supported", featureCommand.Api);
                        continue;
                    }


                    foreach (FeatureCommand.Item featureCommandItem in featureCommand.Commands)
                    {
                        Command command = ctx.Registry.GetCommand(featureCommandItem.Name);

                        Debug.Assert(command != null);
                        if (serializedCommands.ContainsKey(command.Prototype.Name))
                        {
                            continue;
                        }

                        serializedCommands.Add(command.Prototype.Name, true);

                        // Do not generate manually disabled command
                        if ((command.Flags & CommandFlags.Disable) != 0)
                        {
                            continue;
                        }
                        // Do not generate command with aliases
                        if (command.Alias != null)
                        {
                            continue;
                        }

                        featureCommands.Add(command);
                    }

                    foreach (FeatureCommand.Item featureEnumItem in featureCommand.Enums)
                    {
                        Enumerant enumerant = ctx.Registry.GetEnumerant(featureEnumItem.Name);

                        if (enumerant == null)
                        {
                            continue;
                        }
                        if (serializedEnums.ContainsKey(enumerant.Name))
                        {
                            continue;
                        }

                        serializedEnums.Add(enumerant.Name, true);

                        // Do not generate enumerant if it has an alias
                        if (enumerant.EnumAlias != null)
                        {
                            continue;
                        }

                        featureEnums.Add(enumerant);
                    }
                }

                #endregion

                if ((featureCommands.Count == 0) && (featureEnums.Count == 0))
                {
                    // No commands and no enumerations: remove file if existing
                    string sourceFilePath = GetFeatureFilePath(feature, ctx);

                    if (File.Exists(sourceFilePath))
                    {
                        File.Delete(sourceFilePath);
                    }

                    // Next...
                    continue;
                }

                glRegistryProcessor.GenerateCommands(ctx, GetFeatureFilePath(feature, ctx), delegate(RegistryContext cctx, SourceStreamWriter sw)
                {
                    Console.WriteLine("\tGenerate {0} enumerants...", featureEnums.Count);
                    foreach (Enumerant enumerant in featureEnums)
                    {
                        enumerant.GenerateSource(sw, ctx);
                        sw.WriteLine();
                    }

                    Console.WriteLine("\tGenerate {0} commands...", featureCommands.Count);
                    foreach (Command command in featureCommands)
                    {
                        command.GenerateImplementations(sw, cctx);
                        sw.WriteLine();
                    }

                    if (featureCommands.Count > 0)
                    {
                        GenerateCommandsImports(cctx, sw, featureCommands);
                        sw.WriteLine();
                    }

                    if (featureCommands.Count > 0)
                    {
                        GenerateCommandsDelegates(cctx, sw, featureCommands);
                    }
                });
            }

            #endregion

            #region Orphans

            List <Command>   orphanCommands = new List <Command>();
            List <Enumerant> orphanEnums    = new List <Enumerant>();

            foreach (Command command in ctx.Registry.Commands)
            {
                if (serializedCommands.ContainsKey(command.Prototype.Name))
                {
                    continue;
                }

                // Do not generate manually disabled command
                if ((command.Flags & CommandFlags.Disable) != 0)
                {
                    continue;
                }
                // Do not generate command with aliases
                if (command.Alias != null)
                {
                    continue;
                }

                orphanCommands.Add(command);
            }

            foreach (Enumerant enumerant in ctx.Registry.Enumerants)
            {
                if (serializedEnums.ContainsKey(enumerant.Name))
                {
                    continue;
                }

                orphanEnums.Add(enumerant);
            }

            string orphanFile = Path.Combine(BasePath, String.Format("{0}/{1}.Orphans.cs", _OutputBasePath, ctx.Class));

            if ((orphanCommands.Count != 0) || (orphanEnums.Count != 0))
            {
                glRegistryProcessor.GenerateCommands(ctx, orphanFile, delegate(RegistryContext cctx, SourceStreamWriter sw) {
                    Console.WriteLine("\tGenerate {0} enumerants...", orphanEnums.Count);
                    foreach (Enumerant enumerant in orphanEnums)
                    {
                        enumerant.GenerateSource(sw, ctx);
                        sw.WriteLine();
                    }

                    Console.WriteLine("\tGenerate {0} commands...", orphanCommands.Count);
                    foreach (Command command in orphanCommands)
                    {
                        command.GenerateImplementations(sw, cctx);
                        sw.WriteLine();
                    }
                });
            }
            else
            {
                if (File.Exists(orphanFile))
                {
                    File.Delete(orphanFile);
                }
            }

            #endregion
        }
예제 #9
0
		private static void GenerateVersionsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
		{
			string path = String.Format("OpenGL.NET/{0}.Versions.cs", ctx.Class);

			Console.WriteLine("Generate version support class to {0}.", path);

			using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
				RegistryProcessor.GenerateLicensePreamble(sw);

				sw.WriteLine("namespace OpenGL");
				sw.WriteLine("{");
				sw.Indent();

				sw.WriteLine("public partial class {0}", ctx.Class);
				sw.WriteLine("{");
				sw.Indent();

				sw.WriteLine("#region Known Versions Constants");
				sw.WriteLine();

				foreach (Feature featureVersion in ctx.Registry.Features) {
					if (featureVersion.Number == null)
						continue;

					// Determine version value (support up to 3 version numbers)
					Match versionMatch = Regex.Match(featureVersion.Number, @"(?<Major>\d+)\.(?<Minor>\d+)(\.(?<Rev>\d+))?");
					if (versionMatch.Success == false)
						continue;

					int versionMajor = Int32.Parse(versionMatch.Groups["Major"].Value);
					int versionMinor = Int32.Parse(versionMatch.Groups["Minor"].Value);
					int versionRev = versionMatch.Groups["Rev"].Success ? Int32.Parse(versionMatch.Groups["Rev"].Value) : 0;

					int versionValue = versionMajor * 100 + versionMinor * 10 + versionRev;

					// Determine version name
					string versionName = String.Format("Version_{0}", versionValue);
					if (featureVersion.IsEsVersion)
						versionName = String.Format("Version_{0}ES", versionValue);

					sw.WriteLine("/// <summary>");
					sw.WriteLine("/// Version for {0} API.", SpecificationStyle.GetKhronosVersionHumanReadable(featureVersion.Name));
					sw.WriteLine("/// </summary>");
					sw.WriteLine("public const int {0} = {1};", versionName, versionValue);
					sw.WriteLine();
				}

				sw.WriteLine("#endregion");
				sw.WriteLine();

				sw.Unindent();
				sw.WriteLine("}");
				sw.Unindent();

				sw.WriteLine();
				sw.WriteLine("}");
			}
		}
예제 #10
0
		private static void GenerateExtensionsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
		{
			string path = String.Format("OpenGL.NET/{0}.Extensions.cs", ctx.Class);

			Console.WriteLine("Generate registry khronosExtensions to {0}.", path);

			SortedList<int, List<IFeature>> khronosExtensions = new SortedList<int, List<IFeature>>();
			SortedList<int, List<IFeature>> vendorExtensions = new SortedList<int, List<IFeature>>();

			foreach (IFeature feature in ctx.Registry.Extensions) {
				SortedList<int, List<IFeature>> extensionDict;
				List<IFeature> extensionFeatures;

				if (Extension.IsArbVendor(feature.Name))
					extensionDict = khronosExtensions;
				else
					extensionDict = vendorExtensions;

				int index = ExtensionIndices.GetIndex(feature.Name);

				if (extensionDict.TryGetValue(index, out extensionFeatures) == false) {
					extensionFeatures = new List<IFeature>();
					extensionDict.Add(index, extensionFeatures);
				}

				extensionFeatures.Add(feature);
			}

			using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
				RegistryProcessor.GenerateLicensePreamble(sw);

				sw.WriteLine("using System;");
				sw.WriteLine();

				sw.WriteLine("namespace OpenGL");
				sw.WriteLine("{");
				sw.Indent();

				sw.WriteLine("public partial class {0}", ctx.Class);
				sw.WriteLine("{");
				sw.Indent();

				sw.WriteLine("/// <summary>");
				sw.WriteLine("/// Extension support listing.");
				sw.WriteLine("/// </summary>");
				sw.WriteLine("public partial class Extensions : ExtensionsCollection");
				sw.WriteLine("{");
				sw.Indent();

				foreach (KeyValuePair<int, List<IFeature>> pair in khronosExtensions) {
					IFeature mainFeature = pair.Value[0];
					string extensionFieldName = SpecificationStyle.GetExtensionBindingName(mainFeature.Name);

					sw.WriteLine("/// <summary>");
					sw.WriteLine("/// Support for extension {0}.", mainFeature.Name);
					sw.WriteLine("/// </summary>");
					foreach (IFeature feature in pair.Value)
						sw.WriteLine("[Extension(\"{0}\")]", feature.Name);

					Extension mainExtension = (Extension)mainFeature;
					if (String.IsNullOrEmpty(mainExtension.Supported) == false)
						sw.WriteLine("[ExtensionSupport(\"{0}\")]", mainExtension.Supported);

					sw.WriteLine("public bool {0};", extensionFieldName);
					sw.WriteLine();
				}

				foreach (KeyValuePair<int, List<IFeature>> pair in vendorExtensions) {
					IFeature mainFeature = pair.Value[0];
					string extensionFieldName = SpecificationStyle.GetExtensionBindingName(mainFeature.Name);

					sw.WriteLine("/// <summary>");
					sw.WriteLine("/// Support for extension {0}.", mainFeature.Name);
					sw.WriteLine("/// </summary>");
					foreach (IFeature feature in pair.Value)
						sw.WriteLine("[Extension(\"{0}\")]", feature.Name);

					sw.WriteLine("public bool {0};", extensionFieldName);
					sw.WriteLine();
				}

				sw.Unindent();
				sw.WriteLine("}");
				sw.Unindent();

				sw.Unindent();
				sw.WriteLine("}");
				sw.Unindent();

				sw.WriteLine();
				sw.WriteLine("}");
			}
		}
예제 #11
0
		/// <summary>
		/// Generate all required files for OpenGL C# bindings.
		/// </summary>
		/// <param name="glRegistryProcessor">
		/// The <see cref="RegistryProcessor"/> that actually process the OpenGL specification.
		/// </param>
		/// <param name="ctx">
		/// The <see cref="RegistryContext"/> that actually parses the OpenGL specification.
		/// </param>
		private static void GenerateCommandsAndEnums(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
		{
			Dictionary<string, bool> serializedCommands = new Dictionary<string, bool>();
			Dictionary<string, bool> serializedEnums = new Dictionary<string, bool>();

			glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("OpenGL.NET/{0}.Enums.cs", ctx.Class)), null);
			glRegistryProcessor.GenerateCommandsImports(ctx, Path.Combine(BasePath, String.Format("OpenGL.NET/{0}.Imports.cs", ctx.Class)), null);
			glRegistryProcessor.GenerateCommandsDelegates(ctx, Path.Combine(BasePath, String.Format("OpenGL.NET/{0}.Delegates.cs", ctx.Class)), delegate(Command command) {
				return (command.Alias == null);
			});

			#region By features and extensions

			foreach (IFeature feature in ctx.Registry.AllFeatures(ctx)) {
				List<Command> featureCommands = new List<Command>();
				List<Enumerant> featureEnums = new List<Enumerant>();

				#region Select enumerants and commands

				foreach (FeatureCommand featureCommand in feature.Requirements) {
					if (featureCommand.Api != null && !Regex.IsMatch(ctx.Class.ToLower(), featureCommand.Api))
						continue;

					foreach (FeatureCommand.Item featureCommandItem in featureCommand.Commands) {
						Command command = ctx.Registry.GetCommand(featureCommandItem.Name);

						Debug.Assert(command != null);
						if (serializedCommands.ContainsKey(command.Prototype.Name))
							continue;

						serializedCommands.Add(command.Prototype.Name, true);

						// Do not generate manually disabled command
						if ((command.Flags & CommandFlags.Disable) != 0)
							continue;
						// Do not generate command with aliases
						if (command.Alias != null)
							continue;
							
						featureCommands.Add(command);
					}

					foreach (FeatureCommand.Item featureEnumItem in featureCommand.Enums) {
						Enumerant enumerant = ctx.Registry.GetEnumerant(featureEnumItem.Name);

						if (enumerant == null)
							continue;
						if (serializedEnums.ContainsKey(enumerant.Name))
							continue;

						serializedEnums.Add(enumerant.Name, true);

						// Do not generate enumerant if it has an alias
						if (enumerant.EnumAlias != null)
							continue;

						featureEnums.Add(enumerant);
					}
				}

				#endregion

				if ((featureCommands.Count == 0) && (featureEnums.Count == 0)) {
					// No commands and no enumerations: remove file if existing
					string sourceFilePath = GetFeatureFilePath(feature, ctx);

					if (File.Exists(sourceFilePath))
						File.Delete(sourceFilePath);

					// Next...
					continue;
				}

				glRegistryProcessor.GenerateCommands(ctx, GetFeatureFilePath(feature, ctx), delegate(RegistryContext cctx, SourceStreamWriter sw)
				{
					Console.WriteLine("\tGenerate {0} enumerants...", featureEnums.Count);
					foreach (Enumerant enumerant in featureEnums) {
						enumerant.GenerateSource(sw, ctx);
						sw.WriteLine();
					}

					Console.WriteLine("\tGenerate {0} commands...", featureCommands.Count);
					foreach (Command command in featureCommands) {
						command.GenerateImplementations(sw, cctx);
						sw.WriteLine();
					}
				});
			}

			#endregion

			#region Orphans

			List<Command> orphanCommands = new List<Command>();
			List<Enumerant> orphanEnums = new List<Enumerant>();

			foreach (Command command in ctx.Registry.Commands) {
				if (serializedCommands.ContainsKey(command.Prototype.Name))
					continue;

				// Do not generate manually disabled command
				if ((command.Flags & CommandFlags.Disable) != 0)
					continue;
				// Do not generate command with aliases
				if (command.Alias != null)
					continue;

				orphanCommands.Add(command);
			}

			foreach (Enumerant enumerant in ctx.Registry.Enumerants) {
				if (serializedEnums.ContainsKey(enumerant.Name))
					continue;

				orphanEnums.Add(enumerant);
			}

			string orphanFile = Path.Combine(BasePath, String.Format("OpenGL.NET/{0}.Orphans.cs", ctx.Class));

			if ((orphanCommands.Count != 0) || (orphanEnums.Count != 0)) {
				glRegistryProcessor.GenerateCommands(ctx, orphanFile, delegate(RegistryContext cctx, SourceStreamWriter sw) {
					Console.WriteLine("\tGenerate {0} enumerants...", orphanEnums.Count);
					foreach (Enumerant enumerant in orphanEnums) {
						enumerant.GenerateSource(sw, ctx);
						sw.WriteLine();
					}

					Console.WriteLine("\tGenerate {0} commands...", orphanCommands.Count);
					foreach (Command command in orphanCommands) {
						command.GenerateImplementations(sw, cctx);
						sw.WriteLine();
					}
				});
			} else {
				if (File.Exists(orphanFile))
					File.Delete(orphanFile);
			}

			#endregion
		}
예제 #12
0
        /// <summary>
        /// Application entry point.
        /// </summary>
        /// <param name="args">
        /// The command line invocation arguments.
        /// </param>
        static void Main(string[] args)
        {
            RegistryContext   ctx;
            RegistryProcessor glRegistryProcessor;
            int index;

            DummyStream = Array.FindIndex(args, delegate(string item) { return(item == "--dummy"); }) >= 0;
            DocDisabled = Array.FindIndex(args, delegate(string item) { return(item == "--nodoc"); }) >= 0;

            #region Assembly processing

            if ((args.Length > 0) && ((index = Array.FindIndex(args, delegate(string item) { return(item == "--assembly"); })) >= 0))
            {
                string assemblyPath      = args[index + 1];
                bool   overwriteAssembly = Array.Exists(args, delegate(string item) { return(item.StartsWith("--assembly-overwrite")); });
                bool   profileOnlyOpts   = Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-")); });

                List <RegistryAssemblyConfiguration> cfgs = new List <RegistryAssemblyConfiguration>();

                if (profileOnlyOpts == false)
                {
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.CoreProfile.xml"));
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.ES2Profile.xml"));
                    cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.SC2Profile.xml"));
                }
                else
                {
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-core")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.CoreProfile.xml"));
                    }
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-es2")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.ES2Profile.xml"));
                    }
                    if (Array.Exists(args, delegate(string item) { return(item.StartsWith("--profile-sc2")); }))
                    {
                        cfgs.Add(RegistryAssemblyConfiguration.Load("BindingsGen.Profiles.SC2Profile.xml"));
                    }
                }

                foreach (RegistryAssemblyConfiguration cfg in cfgs)
                {
                    try {
                        RegistryAssembly.CleanAssembly(assemblyPath, cfg, overwriteAssembly);
                    } catch (Exception exception) {
                        Console.WriteLine("Unable to process assembly: {0}.", exception.ToString());
                    }
                }

                // Exclusive option
                return;
            }

            #endregion

            #region Log Maps

            if ((args.Length > 0) && (Array.FindIndex(args, delegate(string item) { return(item == "--only-logmaps"); }) >= 0))
            {
                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0))
                {
                    Console.WriteLine("Generating GL log map...");
                    ctx = new RegistryContext("Gl", "Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGl.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0))
                {
                    Console.WriteLine("Generating WGL log map...");
                    ctx = new RegistryContext("Wgl", "Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapWgl.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0))
                {
                    Console.WriteLine("Generating GLX log map...");
                    ctx = new RegistryContext("Glx", "Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGlx.xml"));
                }

                if ((args.Length == 1) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
                {
                    Console.WriteLine("Generating EGL log map...");
                    ctx = new RegistryContext("Egl", "Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                    glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                    glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapEgl.xml"));
                }

                // Exclusive option
                return;
            }

            #endregion

            bool genGL = (args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0);
            bool genWGL = (args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0);
            bool genGLX = (args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0);
            bool genEGL = (args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0);

            // (Common) Documentation
            RegistryDocumentation <RegistryDocumentationHandler_GL4> gl4Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL4>();
            RegistryDocumentation <RegistryDocumentationHandler_GL2> gl2Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL2>();

            if (genGL || genWGL || genGLX)
            {
                gl4Documentation.Api = "GL4";
                if (DocDisabled == false)
                {
                    gl4Documentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/OpenGL/gl4"));
                }

                gl2Documentation.Api = "GL2.1";
                if (DocDisabled == false)
                {
                    gl2Documentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/OpenGL/gl2.1"));
                }
            }

            // XML-based specifications

            // OpenGL
            if (genGL)
            {
                bool genGL_Features = true, genGL_Commands = false, genGL_Extensions = false, genGL_Limits = false;

                foreach (string arg in Array.FindAll(args, delegate(string item) { return(item.StartsWith("--gl-")); }))
                {
                    switch (arg.Substring(5, arg.Length - 5))
                    {
                    case "commands":
                        genGL_Commands = true;
                        break;

                    case "extensions":
                        genGL_Extensions = true;
                        break;

                    case "limits":
                        genGL_Limits = true;
                        break;
                    }
                    genGL_Features = false;
                }

                // Additional ES documentation
                RegistryDocumentation <RegistryDocumentationHandler_GL4> gles3Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL4>();
                gles3Documentation.Api = "GLES3.2";
                if (DocDisabled == false)
                {
                    gles3Documentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/OpenGL/es3"));
                }

                RegistryDocumentation <RegistryDocumentationHandler_GL2> gles1Documentation = new RegistryDocumentation <RegistryDocumentationHandler_GL2>();
                gles1Documentation.Api = "GLES1.1";
                if (DocDisabled == false)
                {
                    gles1Documentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/OpenGL/es1.1"));
                }

                Console.WriteLine("Loading GL specification...");
                ctx = new RegistryContext("Gl", "Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);
                ctx.RefPages.Add(gles3Documentation);
                ctx.RefPages.Add(gles1Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                if (genGL_Features || genGL_Commands)
                {
                    glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                }
                if (genGL_Features || genGL_Extensions)
                {
                    glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                }
                if (genGL_Features || genGL_Limits)
                {
                    glRegistryProcessor.GenerateLimitsSupportClass(ctx);
                }
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGl.xml"));
            }

            // OpenGL for Windows
            if (genWGL)
            {
                ctx = new RegistryContext("Wgl", "Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapWgl.xml"));
            }

            // OpenGL for Unix
            if (genGLX)
            {
                ctx = new RegistryContext("Glx", "Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                ctx.RefPages.Add(gl4Documentation);
                ctx.RefPages.Add(gl2Documentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapGlx.xml"));
            }

            // EGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
            {
                RegistryDocumentation <RegistryDocumentationHandler_EGL> eglDocumentation = new RegistryDocumentation <RegistryDocumentationHandler_EGL>();
                eglDocumentation.Api = "EGL";
                eglDocumentation.ScanDocumentation(Path.Combine(BasePath, "RefPages/EGL-Registry/sdk/docs/man"));

                ctx = new RegistryContext("Egl", "Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                ctx.RefPages.Add(eglDocumentation);

                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
                glRegistryProcessor.GenerateLogMap(ctx, Path.Combine(BasePath, "OpenGL.Net/KhronosLogMapEgl.xml"));
            }

            // OpenWF

            OutputBasePath = "OpenWF.Net";

            // OpenWF(C)
            // Note: you must setup CLI to generate this bindings
            if ((args.Length > 0) && (Array.FindIndex(args, delegate(string item) { return(item == "--wfc"); }) >= 0))
            {
                Header headRegistry = new Header("Wfc");
                headRegistry.CommandExportRegex         = "WF(D|C)_APIENTRY ";
                headRegistry.CommandCallConventionRegex = "WF(D|C)_API_CALL ";
                headRegistry.CommandExitRegex           = " WF(D|C)_APIEXIT";
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfc.h"), new KhronosVersion(1, 0, KhronosVersion.ApiWfc));

                ctx = new RegistryContext("Wfc", "Wfc", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
            }

            // OpenWF(D)
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wfd"); }) >= 0))
            {
                Header headRegistry = new Header("Wfd");
                headRegistry.CommandExportRegex         = "WF(D|C)_APIENTRY ";
                headRegistry.CommandCallConventionRegex = "WF(D|C)_API_CALL ";
                headRegistry.CommandExitRegex           = " WF(D|C)_APIEXIT";
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfd.h"), new KhronosVersion(1, 0, KhronosVersion.ApiWfd));

                ctx = new RegistryContext("Wfd", "Wfd", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                glRegistryProcessor.GenerateVersionsSupportClass(ctx);
                glRegistryProcessor.GenerateVbCommands(ctx);
            }

            // OpenVX

            OutputBasePath = "OpenVX.Net";

            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--vx"); }) >= 0))
            {
                Header vxRegistry = new Header("VX");
                vxRegistry.CommandExportRegex         = "VX_API_ENTRY ";
                vxRegistry.CommandCallConventionRegex = "VX_API_CALL ";
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_api.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_types.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_kernels.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_nodes.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_vendors.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_import.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));

                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_icd.h"), "VX_KHR_icd");
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_ix.h"), "VX_KHR_ix");
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_nn.h"), "VX_KHR_nn");
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_tiling.h"), "VX_KHR_tiling");
                vxRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vx_khr_xml.h"), "VX_KHR_xml");

                ctx = new RegistryContext("VX", "VX", vxRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenVX");
                glRegistryProcessor.GenerateStronglyTypedEnums(ctx, Path.Combine(BasePath, String.Format("{0}/{1}.Enums.cs", OutputBasePath, ctx.Class)));
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
                //glRegistryProcessor.GenerateExtensionsSupportClass(ctx);
                //glRegistryProcessor.GenerateVersionsSupportClass(ctx);

                Header vxuRegistry = new Header("VXU");
                vxuRegistry.CommandExportRegex         = "VX_API_ENTRY ";
                vxuRegistry.CommandCallConventionRegex = "VX_API_CALL ";
                vxuRegistry.AppendHeader(Path.Combine(BasePath, "VXSpecs/1.2/vxu.h"), new KhronosVersion(1, 2, KhronosVersion.ApiVx));

                ctx = new RegistryContext("VXU", "VX", vxuRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenVX");
                glRegistryProcessor.GenerateCommandsAndEnums(ctx);
            }
        }
예제 #13
0
        /// <summary>
        /// Application entry point.
        /// </summary>
        /// <param name="args">
        /// The command line invocation arguments.
        /// </param>
        static void Main(string[] args)
        {
            RegistryContext   ctx;
            RegistryProcessor glRegistryProcessor;

            RegistryDocumentation.CreateLog();

            // XML-based speicfications

            // OpenGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--gl"); }) >= 0))
            {
                ctx = new RegistryContext("Gl", Path.Combine(BasePath, "GLSpecs/gl.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }

            // OpenGL for Windows
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wgl"); }) >= 0))
            {
                ctx = new RegistryContext("Wgl", Path.Combine(BasePath, "GLSpecs/wgl.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }

            // OpenGL for Unix
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--glx"); }) >= 0))
            {
                ctx = new RegistryContext("Glx", Path.Combine(BasePath, "GLSpecs/glx.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }

            // EGL
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--egl"); }) >= 0))
            {
                ctx = new RegistryContext("Egl", Path.Combine(BasePath, "GLSpecs/egl.xml"));
                glRegistryProcessor = new RegistryProcessor(ctx.Registry);
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }

            // OpenWF

            _OutputBasePath = "OpenWF.Net";
            _Namespace      = "OpenWF";

            // OpenWF(C)
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wfc"); }) >= 0))
            {
                Header headRegistry = new Header("Wfc");
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfc.h"));

                ctx = new RegistryContext("Wfc", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }

            // OpenWF(D)
            if ((args.Length == 0) || (Array.FindIndex(args, delegate(string item) { return(item == "--wfd"); }) >= 0))
            {
                Header headRegistry = new Header("Wfd");
                headRegistry.AppendHeader(Path.Combine(BasePath, "GLSpecs/WF/wfd.h"));

                ctx = new RegistryContext("Wfd", headRegistry);
                glRegistryProcessor = new RegistryProcessor(ctx.Registry, "OpenWF");
                GenerateCommandsAndEnums(glRegistryProcessor, ctx);
                GenerateExtensionsSupportClass(glRegistryProcessor, ctx);
                GenerateVersionsSupportClass(glRegistryProcessor, ctx);
                GenerateVbCommands(glRegistryProcessor, ctx);
            }

            RegistryDocumentation.CloseLog();
        }
예제 #14
0
        private static void GenerateVersionsSupportClass(RegistryProcessor glRegistryProcessor, RegistryContext ctx)
        {
            string path = String.Format("OpenGL.NET/{0}.Versions.cs", ctx.Class);

            Console.WriteLine("Generate version support class to {0}.", path);

            using (SourceStreamWriter sw = new SourceStreamWriter(Path.Combine(BasePath, path), false)) {
                RegistryProcessor.GenerateLicensePreamble(sw);

                sw.WriteLine("namespace OpenGL");
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("public partial class {0}", ctx.Class);
                sw.WriteLine("{");
                sw.Indent();

                sw.WriteLine("#region Known Versions Constants");
                sw.WriteLine();

                foreach (Feature featureVersion in ctx.Registry.Features)
                {
                    if (featureVersion.Number == null)
                    {
                        continue;
                    }

                    // Determine version value (support up to 3 version numbers)
                    Match versionMatch = Regex.Match(featureVersion.Number, @"(?<Major>\d+)\.(?<Minor>\d+)(\.(?<Rev>\d+))?");
                    if (versionMatch.Success == false)
                    {
                        continue;
                    }

                    int versionMajor = Int32.Parse(versionMatch.Groups["Major"].Value);
                    int versionMinor = Int32.Parse(versionMatch.Groups["Minor"].Value);
                    int versionRev   = versionMatch.Groups["Rev"].Success ? Int32.Parse(versionMatch.Groups["Rev"].Value) : 0;

                    int versionValue = versionMajor * 100 + versionMinor * 10 + versionRev;

                    // Determine version name
                    string versionName = String.Format("Version_{0}", versionValue);
                    if (featureVersion.IsEsVersion)
                    {
                        versionName = String.Format("Version_{0}ES", versionValue);
                    }

                    sw.WriteLine("/// <summary>");
                    sw.WriteLine("/// Version for {0} API.", SpecificationStyle.GetKhronosVersionHumanReadable(featureVersion.Name));
                    sw.WriteLine("/// </summary>");
                    sw.WriteLine("public const int {0} = {1};", versionName, versionValue);
                    sw.WriteLine();
                }

                sw.WriteLine("#endregion");
                sw.WriteLine();

                sw.Unindent();
                sw.WriteLine("}");
                sw.Unindent();

                sw.WriteLine();
                sw.WriteLine("}");
            }
        }