コード例 #1
0
        static void GenerateImplementation(VkInterfaceCollection implementation, IVkEntityInspector inspector)
        {
            if (!Directory.Exists("Handles"))
            {
                Directory.CreateDirectory("Handles");
            }

            foreach (var container in implementation.Interfaces)
            {
                VkHandleInfo found;
                if (inspector.Handles.TryGetValue(container.Name, out found))
                {
                    container.Handle = found;
                }

                using (var interfaceFile = new StreamWriter(Path.Combine("Handles", container.Name + ".cs"), false))
                {
                    interfaceFile.WriteLine("using Magnesium;");
                    interfaceFile.WriteLine("using System;");
                    interfaceFile.WriteLine("namespace Magnesium.Vulkan");
                    interfaceFile.WriteLine("{");
                    string tabbedField = "\t";

                    interfaceFile.WriteLine(tabbedField + "public class {0} : {1}", container.Name, container.InterfaceName);
                    interfaceFile.WriteLine(tabbedField + "{");

                    var methodTabs = tabbedField + "\t";

                    if (container.Handle != null)
                    {
                        // create internal field
                        interfaceFile.WriteLine(string.Format("{0}internal {1} Handle = {2};", methodTabs, container.Handle.csType, container.Handle.csType == "IntPtr" ? "IntPtr.Zero" : "0L"));

                        // create constructor
                        interfaceFile.WriteLine(string.Format("{0}internal {1}({2} handle)", methodTabs, container.Name, container.Handle.csType));
                        interfaceFile.WriteLine(methodTabs + "{");
                        interfaceFile.WriteLine(methodTabs + "\tHandle = handle;");
                        interfaceFile.WriteLine(methodTabs + "}");
                        interfaceFile.WriteLine("");
                    }

                    foreach (var method in container.Methods)
                    {
                        interfaceFile.WriteLine(methodTabs + method.GetImplementation());
                        interfaceFile.WriteLine(methodTabs + "{");
                        interfaceFile.WriteLine(methodTabs + "}");
                        interfaceFile.WriteLine("");
                    }
                    interfaceFile.WriteLine(tabbedField + "}");
                    interfaceFile.WriteLine("}");
                }
            }
        }
コード例 #2
0
        public static void Main(string[] args)
        {
            //NativeVk();
            try
            {
                const string DLLNAME = "Vulkan-1.dll";

                var doc = XDocument.Load("TestData/vk.xml", LoadOptions.PreserveWhitespace);

                var inspector = new VkEntityInspector();
                inspector.Inspect(doc.Root);

                var parser = new VkCommandParser(inspector);

                //parser.Handles.Add("Instance", new HandleInfo { name = "Instance", type = "VK_DEFINE_HANDLE" });

                var lookup = new Dictionary <string, VkCommandInfo>();
                foreach (var child in doc.Root.Descendants("command"))
                {
                    VkCommandInfo command;
                    if (parser.Parse(child, out command))
                    {
                        lookup.Add(command.Name, command);
                    }
                }

                int noOfUnsafe            = 0;
                int totalNativeInterfaces = 0;

                var implementation = new VkInterfaceCollection();
                GenerateInterops(DLLNAME, lookup, ref noOfUnsafe, ref totalNativeInterfaces);
                GenerateImplementation(implementation, inspector);
                GenerateVkEnums(inspector);
                GenerateVkStructs(inspector);

                Console.WriteLine("totalNativeInterfaces :" + totalNativeInterfaces);
                Console.WriteLine("noOfUnsafe :" + noOfUnsafe);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }