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("}"); } } }
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); } }