aboutsummaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2021-12-07 18:40:40 +0100
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2021-12-07 18:40:40 +0100
commite35fe3571a0576a7f60d67d59f4d797712fda393 (patch)
tree33f298acd46c0e74c028312bab1e1350fb1655f8
parent3fb884d726910719a351d3e617c757459fb7c772 (diff)
also set sType for struct pointer proxies, samples
-rw-r--r--vk.generator/Program.cs36
-rw-r--r--vk.rewrite/Program.cs15
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);
}
}