From 35323bd205c9680ad1fdb5dcc072872746747f6f Mon Sep 17 00:00:00 2001 From: Jean-Philippe Bruyère Date: Tue, 7 Dec 2021 20:03:49 +0100 Subject: auto set sType by cmd and proxies set as a compile option --- .vscode/launch.json | 6 +++--- Directory.Build.props | 12 ++++++++++++ samples/Directory.Build.props | 7 +++++++ samples/create_instance/Program.cs | 17 +++++++++++------ vk.generator/Program.cs | 17 +++++++++++++---- vk.generator/vk.generator.csproj | 3 +++ vk.rewrite/Program.cs | 29 +++++++++++++++++------------ vk.rewrite/vk.rewrite.csproj | 3 +++ vulkan/vulkan.csproj | 4 ++++ 9 files changed, 73 insertions(+), 25 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 1e002fb..9c772af 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -31,7 +31,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build create_instance", - "program": "${workspaceFolder}/samples/create_instance/bin/Debug/netcoreapp3.1/create_instance", + "program": "${workspaceFolder}/build/Debug/netcoreapp3.1/create_instance", "args": [], "cwd": "${workspaceFolder}", "console": "externalTerminal", @@ -42,7 +42,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build select_physical_dev", - "program": "${workspaceFolder}/samples/select_physical_dev/bin/Debug/netcoreapp3.1/select_physical_dev", + "program": "${workspaceFolder}/build/Debug/netcoreapp3.1/select_physical_dev", "args": [], "cwd": "${workspaceFolder}", "console": "externalTerminal", @@ -53,7 +53,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build create_device", - "program": "${workspaceFolder}/samples/create_device/bin/Debug/netcoreapp3.1/create_device", + "program": "${workspaceFolder}/build/Debug/netcoreapp3.1/create_device", "args": [], "cwd": "${workspaceFolder}", "console": "externalTerminal", diff --git a/Directory.Build.props b/Directory.Build.props index 8df5522..a53c9d5 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -13,6 +13,18 @@ true + + true diff --git a/samples/Directory.Build.props b/samples/Directory.Build.props index 1e82540..136cee2 100644 --- a/samples/Directory.Build.props +++ b/samples/Directory.Build.props @@ -7,9 +7,16 @@ Jean-Philippe Bruyère + + $(MSBuildThisFileDirectory)..\ + $(SolutionDir)build\$(Configuration)\ + + $(DefineConstants);AUTO_SET_STYPE + + diff --git a/samples/create_instance/Program.cs b/samples/create_instance/Program.cs index 474ae72..234afc3 100644 --- a/samples/create_instance/Program.cs +++ b/samples/create_instance/Program.cs @@ -1,10 +1,6 @@ using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Text; using Vulkan; using static Vulkan.Vk; -using Version = Vulkan.Version; namespace tests { @@ -14,13 +10,22 @@ namespace tests static void Main(string[] args) { VkInstance instance; - +#if AUTO_SET_STYPE + Console.WriteLine ("AUTO_SET_STYPE: ON"); using (VkApplicationInfo ai = new VkApplicationInfo()) { using (VkInstanceCreateInfo ci = new VkInstanceCreateInfo {pApplicationInfo = ai}){ Console.WriteLine (vkCreateInstance (ci, IntPtr.Zero, out instance)); } } - +#else + Console.WriteLine ("AUTO_SET_STYPE: OFF"); + using (VkApplicationInfo ai = VkApplicationInfo.New) { + VkInstanceCreateInfo ci = VkInstanceCreateInfo.New; + ci.pApplicationInfo = ai; + Console.WriteLine (vkCreateInstance (ci, IntPtr.Zero, out instance)); + ci.Dispose(); + } +#endif vkDestroyInstance (instance, IntPtr.Zero); } } diff --git a/vk.generator/Program.cs b/vk.generator/Program.cs index c44a6ad..0a6da2f 100644 --- a/vk.generator/Program.cs +++ b/vk.generator/Program.cs @@ -740,8 +740,9 @@ namespace vk.generator { baseType = baseType.Substring (0, baseType.Length - 1); } TypeDef td = types.FirstOrDefault (t=>t.Name == resolveAlias (baseType)); - string csStructName = null; bool isEnum = td != null && td.IsEnum; +#if AUTO_SET_STYPE + string csStructName = null; if (td != null && td.category == TypeCategories.@struct) { StructDef sd = td as StructDef; MemberDef mdSType = sd.members.Where (mb => mb.Name == "sType").FirstOrDefault (); @@ -750,7 +751,7 @@ namespace vk.generator { structTypeEnum.AllValues.FirstOrDefault(st=>st.Name == mdSType.defaultValue); csStructName = evSType == null ? null : $"{structTypeEnum.CSName}.{evSType.CSName}"; } - +#endif string ptrType = isIEnumerable ? baseType.Replace('.','_') + "CollectionPtr" : baseType.Replace('.','_') + "Ptr"; tw.WriteLine ($"public class {ptrType} {{"); tw.Indent++; @@ -764,6 +765,7 @@ namespace vk.generator { tw.WriteLine ($"internal int Count => instance.Count();"); tw.WriteLine ($"internal {ptrType} (IEnumerable<{baseType}> str) {{"); tw.Indent++; +#if AUTO_SET_STYPE if (csStructName != null) { tw.WriteLine ($"if (str != null) {{"); tw.Indent++; @@ -783,6 +785,10 @@ namespace vk.generator { tw.WriteLine ($"instance = str;"); tw.Indent--; } +#else + tw.WriteLine ($"instance = str;"); + tw.Indent--; +#endif } else { tw.WriteLine ($"internal {baseType} instance;"); if (isEnum) { @@ -792,8 +798,10 @@ namespace vk.generator { tw.WriteLine ($"internal IntPtr handle => instance.PinPointer();"); tw.WriteLine ($"internal {ptrType} ({baseType} str) {{"); tw.Indent++; +#if AUTO_SET_STYPE if (csStructName != null) tw.WriteLine ($"str.sType = {csStructName};"); +#endif tw.WriteLine ($"instance = str;"); } @@ -897,9 +905,10 @@ namespace vk.generator { mdSType.defaultValue == null ? null : structTypeEnum.AllValues.FirstOrDefault(st=>st.Name == mdSType.defaultValue); string csStructName = evSType == null ? null : $"{structTypeEnum.CSName}.{evSType.CSName}"; - if (csStructName!=null) { +#if AUTO_SET_STYPE + if (csStructName!=null) tw.WriteLine ($"[StructureType ({evSType.value})]"); - } +#endif getStructurePtrProxies (sd, out IEnumerable ptrProxies, out IEnumerable utf8StringPointers); diff --git a/vk.generator/vk.generator.csproj b/vk.generator/vk.generator.csproj index 531eb2c..343cbe4 100644 --- a/vk.generator/vk.generator.csproj +++ b/vk.generator/vk.generator.csproj @@ -6,5 +6,8 @@ true $(DefineConstants);LOG_VK_NET_GEN;DEBUG_STRUCT_SIZES + + $(DefineConstants);AUTO_SET_STYPE + diff --git a/vk.rewrite/Program.cs b/vk.rewrite/Program.cs index 2601f48..dcd7103 100644 --- a/vk.rewrite/Program.cs +++ b/vk.rewrite/Program.cs @@ -19,12 +19,11 @@ namespace Vk.Rewrite static TypeReference trefCalliRewrite; static TypeReference trefPin; +#if AUTO_SET_STYPE static TypeReference trefStructureType; - +#endif public static int Main(string[] args) { - - if ((args.Length < 1) == true || args[0] == null) { Console.WriteLine ("Error: argument 1 must be the path of VK.dll."); return -1; @@ -60,13 +59,11 @@ namespace Vk.Rewrite trefCalliRewrite = mainModule.GetType (mainVkNamespace+".Generator.CalliRewriteAttribute"); trefPin = mainModule.GetType (mainVkNamespace+".Generator.PinAttribute"); +#if AUTO_SET_STYPE trefStructureType = mainModule.GetType (mainVkNamespace+".StructureTypeAttribute"); - - foreach (TypeDefinition type in mainModule.Types) - { - - foreach (MethodDefinition method in type.Methods) - { +#endif + foreach (TypeDefinition type in mainModule.Types) { + foreach (MethodDefinition method in type.Methods) { if (method.CustomAttributes.Any(ca => ca.AttributeType == trefCalliRewrite)) RewriteMethod (method); } @@ -87,42 +84,49 @@ namespace Vk.Rewrite TypeDefinition td = parameterType.IsByReference ? parameterType.GetElementType() as TypeDefinition : parameterType as TypeDefinition; +#if AUTO_SET_STYPE PropertyDefinition pdSType = td?.Properties.FirstOrDefault (f=>f.Name == "sType"); - CustomAttribute ca = td == null ? null : td.CustomAttributes.FirstOrDefault (ca => ca.AttributeType == trefStructureType); int structType = 0; if (ca != null) { PropertyDefinition pd = (ca.AttributeType as TypeDefinition).Properties[0]; structType = (int)ca.ConstructorArguments[0].Value; } +#endif if (method.Parameters[i].CustomAttributes.Any(ca => ca.AttributeType == trefPin)) { VariableDefinition variable = new VariableDefinition(parameterType); method.Body.Variables.Add(variable); il.Emit(OpCodes.Stloc, variable); +#if AUTO_SET_STYPE if (ca != null) { il.Emit(OpCodes.Ldloca, variable); il.Emit(OpCodes.Ldc_I4, structType); il.Emit(OpCodes.Call, pdSType.SetMethod); } +#endif il.Emit(OpCodes.Ldloca, variable); variable = new VariableDefinition(new PinnedType(new ByReferenceType(parameterType))); method.Body.Variables.Add(variable); il.Emit(OpCodes.Stloc, variable); il.Emit(OpCodes.Ldloc, variable); il.Emit(OpCodes.Conv_I); - } else if (parameterType.IsByReference) { + } else if (parameterType.IsByReference) { VariableDefinition byRefVariable = new VariableDefinition(new PinnedType(parameterType)); method.Body.Variables.Add(byRefVariable); il.Emit(OpCodes.Stloc, byRefVariable); +#if AUTO_SET_STYPE if (pdSType != null) { il.Emit(OpCodes.Ldloc, byRefVariable); il.Emit(OpCodes.Ldc_I4, structType); il.Emit(OpCodes.Call, pdSType.SetMethod); } +#endif il.Emit(OpCodes.Ldloc, byRefVariable); il.Emit(OpCodes.Conv_I); - } else if (ca != null) { + } +#if AUTO_SET_STYPE + else if (ca != null) { VariableDefinition variable = new VariableDefinition(parameterType); method.Body.Variables.Add(variable); il.Emit(OpCodes.Stloc, variable); @@ -130,6 +134,7 @@ namespace Vk.Rewrite il.Emit(OpCodes.Ldc_I4, structType); il.Emit(OpCodes.Call, pdSType.SetMethod); } +#endif } FieldDefinition field = method.DeclaringType.Fields.SingleOrDefault(fd => fd.Name == method.Name + "_ptr"); diff --git a/vk.rewrite/vk.rewrite.csproj b/vk.rewrite/vk.rewrite.csproj index 8808b12..dd8f410 100644 --- a/vk.rewrite/vk.rewrite.csproj +++ b/vk.rewrite/vk.rewrite.csproj @@ -8,5 +8,8 @@ + + $(DefineConstants);AUTO_SET_STYPE + diff --git a/vulkan/vulkan.csproj b/vulkan/vulkan.csproj index 545cd0e..b60d202 100644 --- a/vulkan/vulkan.csproj +++ b/vulkan/vulkan.csproj @@ -30,6 +30,10 @@ $(NoWarn);1591;0419 + + $(DefineConstants);AUTO_SET_STYPE + + -- cgit v1.3.1-4-g156e