diff options
| author | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2021-12-07 18:40:40 +0100 |
|---|---|---|
| committer | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2021-12-07 18:40:40 +0100 |
| commit | e35fe3571a0576a7f60d67d59f4d797712fda393 (patch) | |
| tree | 33f298acd46c0e74c028312bab1e1350fb1655f8 | |
| parent | 3fb884d726910719a351d3e617c757459fb7c772 (diff) | |
also set sType for struct pointer proxies, samples
| -rw-r--r-- | vk.generator/Program.cs | 36 | ||||
| -rw-r--r-- | vk.rewrite/Program.cs | 15 |
2 files changed, 45 insertions, 6 deletions
diff --git a/vk.generator/Program.cs b/vk.generator/Program.cs index f233098..f71cbe5 100644 --- a/vk.generator/Program.cs +++ b/vk.generator/Program.cs @@ -722,7 +722,16 @@ 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 (td != null && td.category == TypeCategories.@struct) { + StructDef sd = td as StructDef; + MemberDef mdSType = sd.members.Where (mb => mb.Name == "sType").FirstOrDefault (); + EnumerantValue evSType = mdSType == null ? null : + mdSType.defaultValue == null ? null : + structTypeEnum.AllValues.FirstOrDefault(st=>st.Name == mdSType.defaultValue); + csStructName = evSType == null ? null : $"{structTypeEnum.CSName}.{evSType.CSName}"; + } string ptrType = isIEnumerable ? baseType.Replace('.','_') + "CollectionPtr" : baseType.Replace('.','_') + "Ptr"; tw.WriteLine ($"public class {ptrType} {{"); @@ -736,6 +745,26 @@ namespace vk.generator { tw.WriteLine ($"internal IntPtr handle => instance.PinPointer();"); tw.WriteLine ($"internal int Count => instance.Count();"); tw.WriteLine ($"internal {ptrType} (IEnumerable<{baseType}> str) {{"); + tw.Indent++; + if (csStructName != null) { + tw.WriteLine ($"if (str != null) {{"); + tw.Indent++; + tw.WriteLine ($"{baseType}[] tmp = str.ToArray();"); + tw.WriteLine ($"for (int i=0; i<tmp.Length; i++)"); + tw.Indent++; + tw.WriteLine ($"tmp[i].sType = {csStructName};"); + tw.Indent--; + tw.WriteLine ($"instance = tmp;"); + tw.Indent--; + tw.WriteLine (@"} else"); + tw.Indent++; + tw.WriteLine ($"instance = str;"); + tw.Indent--; + tw.Indent--; + } else { + tw.WriteLine ($"instance = str;"); + tw.Indent--; + } } else { tw.WriteLine ($"internal {baseType} instance;"); if (isEnum) { @@ -744,9 +773,12 @@ namespace vk.generator { } else tw.WriteLine ($"internal IntPtr handle => instance.PinPointer();"); tw.WriteLine ($"internal {ptrType} ({baseType} str) {{"); + tw.Indent++; + if (csStructName != null) + tw.WriteLine ($"str.sType = {csStructName};"); + tw.WriteLine ($"instance = str;"); } - tw.Indent++; - tw.WriteLine ($"instance = str;"); + tw.Indent--; tw.WriteLine (@"}"); if (isIEnumerable) { diff --git a/vk.rewrite/Program.cs b/vk.rewrite/Program.cs index 90e330f..2601f48 100644 --- a/vk.rewrite/Program.cs +++ b/vk.rewrite/Program.cs @@ -84,8 +84,10 @@ namespace Vk.Rewrite { EmitLoadArgument (il, i, method.Parameters); TypeReference parameterType = method.Parameters[i].ParameterType; - TypeDefinition td = parameterType as TypeDefinition; - PropertyDefinition fd = td?.Properties.FirstOrDefault (f=>f.Name == "sType"); + TypeDefinition td = parameterType.IsByReference ? + parameterType.GetElementType() as TypeDefinition : + parameterType as TypeDefinition; + PropertyDefinition pdSType = td?.Properties.FirstOrDefault (f=>f.Name == "sType"); CustomAttribute ca = td == null ? null : td.CustomAttributes.FirstOrDefault (ca => ca.AttributeType == trefStructureType); int structType = 0; @@ -101,7 +103,7 @@ namespace Vk.Rewrite if (ca != null) { il.Emit(OpCodes.Ldloca, variable); il.Emit(OpCodes.Ldc_I4, structType); - il.Emit(OpCodes.Call, fd.SetMethod); + il.Emit(OpCodes.Call, pdSType.SetMethod); } il.Emit(OpCodes.Ldloca, variable); variable = new VariableDefinition(new PinnedType(new ByReferenceType(parameterType))); @@ -113,6 +115,11 @@ namespace Vk.Rewrite VariableDefinition byRefVariable = new VariableDefinition(new PinnedType(parameterType)); method.Body.Variables.Add(byRefVariable); il.Emit(OpCodes.Stloc, byRefVariable); + if (pdSType != null) { + il.Emit(OpCodes.Ldloc, byRefVariable); + il.Emit(OpCodes.Ldc_I4, structType); + il.Emit(OpCodes.Call, pdSType.SetMethod); + } il.Emit(OpCodes.Ldloc, byRefVariable); il.Emit(OpCodes.Conv_I); } else if (ca != null) { @@ -121,7 +128,7 @@ namespace Vk.Rewrite il.Emit(OpCodes.Stloc, variable); il.Emit(OpCodes.Ldloca, variable); il.Emit(OpCodes.Ldc_I4, structType); - il.Emit(OpCodes.Call, fd.SetMethod); + il.Emit(OpCodes.Call, pdSType.SetMethod); } } |