aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon.Generators
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Horizon.Generators')
-rw-r--r--src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs b/src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs
index 4c8d441b..d1be8298 100644
--- a/src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs
+++ b/src/Ryujinx.Horizon.Generators/Hipc/HipcGenerator.cs
@@ -17,6 +17,8 @@ namespace Ryujinx.Horizon.Generators.Hipc
private const string ResponseVariableName = "response";
private const string OutRawDataVariableName = "outRawData";
+ private const string TypeSystemBuffersReadOnlySequence = "System.Buffers.ReadOnlySequence";
+ private const string TypeSystemMemory = "System.Memory";
private const string TypeSystemReadOnlySpan = "System.ReadOnlySpan";
private const string TypeSystemSpan = "System.Span";
private const string TypeStructLayoutAttribute = "System.Runtime.InteropServices.StructLayoutAttribute";
@@ -329,7 +331,15 @@ namespace Ryujinx.Horizon.Generators.Hipc
value = $"{InObjectsVariableName}[{inObjectIndex++}]";
break;
case CommandArgType.Buffer:
- if (IsReadOnlySpan(compilation, parameter))
+ if (IsMemory(compilation, parameter))
+ {
+ value = $"CommandSerialization.GetWritableRegion(processor.GetBufferRange({index}))";
+ }
+ else if (IsReadOnlySequence(compilation, parameter))
+ {
+ value = $"CommandSerialization.GetReadOnlySequence(processor.GetBufferRange({index}))";
+ }
+ else if (IsReadOnlySpan(compilation, parameter))
{
string spanGenericTypeName = GetCanonicalTypeNameOfGenericArgument(compilation, parameter.Type, 0);
value = GenerateSpanCast(spanGenericTypeName, $"CommandSerialization.GetReadOnlySpan(processor.GetBufferRange({index}))");
@@ -346,7 +356,13 @@ namespace Ryujinx.Horizon.Generators.Hipc
break;
}
- if (IsSpan(compilation, parameter))
+ if (IsMemory(compilation, parameter))
+ {
+ generator.AppendLine($"using var {argName} = {value};");
+
+ argName = $"{argName}.Memory";
+ }
+ else if (IsSpan(compilation, parameter))
{
generator.AppendLine($"using var {argName} = {value};");
@@ -637,7 +653,9 @@ namespace Ryujinx.Horizon.Generators.Hipc
private static bool IsValidTypeForBuffer(Compilation compilation, ParameterSyntax parameter)
{
- return IsReadOnlySpan(compilation, parameter) ||
+ return IsMemory(compilation, parameter) ||
+ IsReadOnlySequence(compilation, parameter) ||
+ IsReadOnlySpan(compilation, parameter) ||
IsSpan(compilation, parameter) ||
IsUnmanagedType(compilation, parameter.Type);
}
@@ -649,6 +667,16 @@ namespace Ryujinx.Horizon.Generators.Hipc
return typeInfo.Type.IsUnmanagedType;
}
+ private static bool IsMemory(Compilation compilation, ParameterSyntax parameter)
+ {
+ return GetCanonicalTypeName(compilation, parameter.Type) == TypeSystemMemory;
+ }
+
+ private static bool IsReadOnlySequence(Compilation compilation, ParameterSyntax parameter)
+ {
+ return GetCanonicalTypeName(compilation, parameter.Type) == TypeSystemBuffersReadOnlySequence;
+ }
+
private static bool IsReadOnlySpan(Compilation compilation, ParameterSyntax parameter)
{
return GetCanonicalTypeName(compilation, parameter.Type) == TypeSystemReadOnlySpan;