/// <summary>Generates the C# file containing the Vulkan structures.</summary> /// <param name="structureInfos">The structures to generate.</param> /// <param name="constantInfos">The constants to use when resolving array lengths for fields.</param> /// <param name="file">The structures file.</param> private static void GenerateStructuresFile(List <StructureInfo> structureInfos, List <ConstantInfo> constantInfos, string file) { using (var streamWriter = File.CreateText(file)) { var csWriter = new CsWriter(streamWriter); csWriter.WriteHeader(); csWriter.WriteLine(); csWriter.WriteUsing("System"); csWriter.WriteUsing("System.Runtime.InteropServices"); csWriter.WriteLine(); csWriter.WriteLine($"namespace Vulkan"); csWriter.WriteScope(() => { foreach (var structureInfo in structureInfos.Where(structureInfo => structureInfo.Fields.Count > 0)) { WriteStructure(csWriter, structureInfo, constantInfos); } }); } }
/// <summary>Generates the C# file containing the Vulkan enums.</summary> /// <param name="handleInfos">The handles to generate.</param> /// <param name="file">The handles file.</param> private static void GenerateHandlesFile(List <HandleInfo> handleInfos, string file) { using (var streamWriter = File.CreateText(file)) { var csWriter = new CsWriter(streamWriter); csWriter.WriteHeader(); csWriter.WriteLine(); csWriter.WriteUsing("System"); csWriter.WriteLine(); csWriter.WriteLine($"namespace Vulkan"); csWriter.WriteScope(() => { foreach (var handleInfo in handleInfos) { WriteHandle(csWriter, handleInfo); } }); } }
/********* ** Private Methods *********/ /// <summary>Generates the C# file containing the Vulkan constants and commands.</summary> /// <param name="constantInfos">The constants to generate.</param> /// <param name="commandInfos">The commands to generate.</param> /// <param name="file">The VK file.</param> private static void GenerateVKFile(List <ConstantInfo> constantInfos, List <CommandInfo> commandInfos, string file) { using (var streamWriter = File.CreateText(file)) { var csWriter = new CsWriter(streamWriter); csWriter.WriteHeader(); csWriter.WriteLine(); csWriter.WriteUsing("System"); csWriter.WriteUsing("System.Runtime.InteropServices"); csWriter.WriteLine(); csWriter.WriteLine($"namespace Vulkan"); csWriter.WriteScope(() => { csWriter.WriteLine($"public static class VK"); csWriter.WriteScope(() => { // create constants foreach (var constantInfo in constantInfos) { WriteConstant(csWriter, constantInfo); } // create delegates foreach (var commandInfo in commandInfos) { WriteDelegates(csWriter, commandInfo); } // create fields csWriter.WriteLine("private static readonly OSVulkanLibraryBase VulkanLibrary;"); foreach (var commandInfo in commandInfos) { WriteFields(csWriter, commandInfo); } // create class initialiser to retrieve the function pointers csWriter.WriteLine("static VK()"); csWriter.WriteScope(() => { csWriter.WriteLine("VulkanLibrary = OSVulkanLibraryBase.CreateOSVulkanLibrary();"); csWriter.WriteLine("InitialiseRequiredMethods();"); }); // create methods void PopulateDelegateOverloads(CsWriter csWriter, CommandInfo commandInfo) { var overloads = Utilities.GenerateAllOverloads(commandInfo); for (int i = 0; i < overloads.Count; i++) { csWriter.WriteLine($"{commandInfo.DisplayName}_{i} = Marshal.GetDelegateForFunctionPointer<{commandInfo.DelegateDisplayName}_{i}>({commandInfo.PointerDisplayName});"); } } var requiredMethods = new[] { "vkCreateInstance", "vkEnumerateInstanceExtensionProperties", "vkEnumerateInstanceLayerProperties", "vkGetInstanceProcAddr" }; csWriter.WriteLine("private static void InitialiseRequiredMethods()"); csWriter.WriteScope(() => { foreach (var commandInfo in commandInfos.Where(commandInfo => requiredMethods.Contains(commandInfo.Name))) { csWriter.WriteLine($"{commandInfo.PointerDisplayName} = VulkanLibrary.GetFunctionPointer(\"{commandInfo.Name}\");"); PopulateDelegateOverloads(csWriter, commandInfo); } }); csWriter.WriteLine("public static void InitialiseInstanceMethods(VkInstance instance)"); csWriter.WriteScope(() => { foreach (var commandInfo in commandInfos.Where(commandInfo => !requiredMethods.Contains(commandInfo.Name))) { if (commandInfo.Alias != null) // aliases don't have delegates { continue; } csWriter.WriteLine($"{commandInfo.PointerDisplayName} = GetInstancePrecedureAddress(instance, \"{commandInfo.Name}\");"); csWriter.WriteLine($"if ({commandInfo.PointerDisplayName} != IntPtr.Zero)"); csWriter.WriteScope(() => PopulateDelegateOverloads(csWriter, commandInfo)); } }); foreach (var commandInfo in commandInfos) { WriteMethods(csWriter, commandInfo, commandInfos); } }); }); } }