Skip to content

Commit

Permalink
Merge pull request #5949 from unoplatform/dev/jela/color-specialized
Browse files Browse the repository at this point in the history
perf: [Wasm] Improve text set color
  • Loading branch information
jeromelaban authored May 7, 2021
2 parents 8234b6a + 07c794b commit 31d0192
Show file tree
Hide file tree
Showing 12 changed files with 305 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class TSBindingsGenerator : ISourceGenerator

private static INamedTypeSymbol _stringSymbol;
private static INamedTypeSymbol _intSymbol;
private static INamedTypeSymbol _uintSymbol;
private static INamedTypeSymbol _floatSymbol;
private static INamedTypeSymbol _doubleSymbol;
private static INamedTypeSymbol _byteSymbol;
Expand Down Expand Up @@ -54,6 +55,7 @@ public void Execute(GeneratorExecutionContext context)
{
_stringSymbol = context.Compilation.GetTypeByMetadataName("System.String");
_intSymbol = context.Compilation.GetTypeByMetadataName("System.Int32");
_uintSymbol = context.Compilation.GetTypeByMetadataName("System.UInt32") ?? throw new Exception($"System.UInt32");
_floatSymbol = context.Compilation.GetTypeByMetadataName("System.Single");
_doubleSymbol = context.Compilation.GetTypeByMetadataName("System.Double");
_byteSymbol = context.Compilation.GetTypeByMetadataName("System.Byte");
Expand Down Expand Up @@ -108,7 +110,7 @@ from type in GetNamespaceTypes(module)

if (messageType.Name.EndsWith("Params"))
{
GenerateUmarshaler(messageType, sb, packValue);
GenerateUnmarshaler(messageType, sb, packValue);
}

if (messageType.Name.EndsWith("Return"))
Expand Down Expand Up @@ -263,7 +265,7 @@ private void GenerateMarshaler(INamedTypeSymbol parametersType, IndentedStringBu
}
}

private void GenerateUmarshaler(INamedTypeSymbol parametersType, IndentedStringBuilder sb, int packValue)
private void GenerateUnmarshaler(INamedTypeSymbol parametersType, IndentedStringBuilder sb, int packValue)
{
using (sb.BlockInvariant($"public static unmarshal(pData:number) : {parametersType.Name}"))
{
Expand Down Expand Up @@ -344,7 +346,14 @@ private void GenerateUmarshaler(INamedTypeSymbol parametersType, IndentedStringB
}
else
{
sb.AppendLineInvariant($"ret.{field.Name} = {GetTSType(field.Type)}(Module.getValue(pData + {fieldOffset}, \"{GetEMField(field.Type)}\"));");
if (CanUseEMHeapProperty(field.Type))
{
sb.AppendLineInvariant($"ret.{field.Name} = Module.{GetEMHeapProperty(field.Type)}[(pData + {fieldOffset}) >> {GetEMTypeShift(field)}];");
}
else
{
sb.AppendLineInvariant($"ret.{field.Name} = {GetTSType(field.Type)}(Module.getValue(pData + {fieldOffset}, \"{GetEMField(field.Type)}\"));");
}
}
}
}
Expand All @@ -362,11 +371,15 @@ private void GenerateUmarshaler(INamedTypeSymbol parametersType, IndentedStringB
}
}

private bool CanUseEMHeapProperty(ITypeSymbol type)
=> SymbolEqualityComparer.Default.Equals(type, _uintSymbol);

private int GetNativeFieldSize(IFieldSymbol field)
{
if(
if (
SymbolEqualityComparer.Default.Equals(field.Type, _stringSymbol)
|| SymbolEqualityComparer.Default.Equals(field.Type, _intSymbol)
|| SymbolEqualityComparer.Default.Equals(field.Type, _uintSymbol)
|| SymbolEqualityComparer.Default.Equals(field.Type, _intPtrSymbol)
|| SymbolEqualityComparer.Default.Equals(field.Type, _floatSymbol)
|| SymbolEqualityComparer.Default.Equals(field.Type, _boolSymbol)
Expand All @@ -375,7 +388,7 @@ private int GetNativeFieldSize(IFieldSymbol field)
{
return 4;
}
else if(SymbolEqualityComparer.Default.Equals(field.Type, _doubleSymbol))
else if (SymbolEqualityComparer.Default.Equals(field.Type, _doubleSymbol))
{
return 8;
}
Expand All @@ -385,6 +398,52 @@ private int GetNativeFieldSize(IFieldSymbol field)
}
}

private int GetEMTypeShift(IFieldSymbol field)
{
var fieldType = field.Type;

if (
SymbolEqualityComparer.Default.Equals(fieldType, _stringSymbol)
|| SymbolEqualityComparer.Default.Equals(fieldType, _intPtrSymbol)
|| fieldType is IArrayTypeSymbol
)
{
return 2;
}
else if (
SymbolEqualityComparer.Default.Equals(fieldType, _intSymbol)
|| SymbolEqualityComparer.Default.Equals(fieldType, _uintSymbol)
|| SymbolEqualityComparer.Default.Equals(fieldType, _boolSymbol)
)
{
return 2;
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _longSymbol))
{
return 3;
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _shortSymbol))
{
return 1;
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _byteSymbol))
{
return 0;
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _floatSymbol))
{
return 2;
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _doubleSymbol))
{
return 3;
}
else
{
throw new NotSupportedException($"Unsupported EM type conversion [{fieldType}]");
}
}

private static string GetEMField(ITypeSymbol fieldType)
{
if (
Expand All @@ -397,6 +456,7 @@ private static string GetEMField(ITypeSymbol fieldType)
}
else if (
SymbolEqualityComparer.Default.Equals(fieldType, _intSymbol)
|| SymbolEqualityComparer.Default.Equals(fieldType, _uintSymbol)
|| SymbolEqualityComparer.Default.Equals(fieldType, _boolSymbol)
)
{
Expand Down Expand Up @@ -428,6 +488,49 @@ private static string GetEMField(ITypeSymbol fieldType)
}
}

private object GetEMHeapProperty(ITypeSymbol fieldType)
{
if (
SymbolEqualityComparer.Default.Equals(fieldType, _stringSymbol)
|| SymbolEqualityComparer.Default.Equals(fieldType, _intPtrSymbol)
|| fieldType is IArrayTypeSymbol
|| SymbolEqualityComparer.Default.Equals(fieldType, _intSymbol)
|| SymbolEqualityComparer.Default.Equals(fieldType, _boolSymbol)
)
{
return "HEAP32";
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _uintSymbol))
{
return "HEAPU32";
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _longSymbol))
{
// Might overflow
return "HEAP32";
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _shortSymbol))
{
return "HEAP16";
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _byteSymbol))
{
return "HEAP8";
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _floatSymbol))
{
return "HEAPF32";
}
else if (SymbolEqualityComparer.Default.Equals(fieldType, _doubleSymbol))
{
return "HEAPF64";
}
else
{
throw new NotSupportedException($"Unsupported EM type conversion [{fieldType}]");
}
}

private static string GetTSType(ITypeSymbol type)
{
if (type == null)
Expand All @@ -445,6 +548,7 @@ private static string GetTSType(ITypeSymbol type)
}
else if (
SymbolEqualityComparer.Default.Equals(type, _intSymbol)
|| SymbolEqualityComparer.Default.Equals(type, _uintSymbol)
|| SymbolEqualityComparer.Default.Equals(type, _floatSymbol)
|| SymbolEqualityComparer.Default.Equals(type, _doubleSymbol)
|| SymbolEqualityComparer.Default.Equals(type, _byteSymbol)
Expand Down Expand Up @@ -481,6 +585,7 @@ private static string GetTSFieldType(ITypeSymbol type)
}
else if (
SymbolEqualityComparer.Default.Equals(type, _intSymbol)
|| SymbolEqualityComparer.Default.Equals(type, _uintSymbol)
|| SymbolEqualityComparer.Default.Equals(type, _floatSymbol)
|| SymbolEqualityComparer.Default.Equals(type, _doubleSymbol)
|| SymbolEqualityComparer.Default.Equals(type, _byteSymbol)
Expand Down
1 change: 0 additions & 1 deletion src/Uno.UI/UI/Xaml/Controls/TextBlock/TextBlock.wasm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
using Uno.Extensions;
using Uno.Foundation;
using System.Linq;
using Uno.UI.UI.Xaml.Documents;
using Microsoft.Extensions.Logging;
using Windows.UI.Text;
using Windows.UI.Xaml.Media;
Expand Down
1 change: 0 additions & 1 deletion src/Uno.UI/UI/Xaml/Controls/TextBox/TextBox.wasm.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using Uno.Extensions;
using Uno.UI.UI.Xaml.Documents;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;

Expand Down
1 change: 0 additions & 1 deletion src/Uno.UI/UI/Xaml/Controls/TextBox/TextBoxView.wasm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
using Uno.Logging;
using Windows.Foundation;
using System.Globalization;
using Uno.UI.UI.Xaml.Documents;
using Uno.Disposables;

namespace Windows.UI.Xaml.Controls
Expand Down
1 change: 0 additions & 1 deletion src/Uno.UI/UI/Xaml/Documents/Run.wasm.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Web;
using Uno.UI.UI.Xaml.Documents;

namespace Windows.UI.Xaml.Documents
{
Expand Down
4 changes: 1 addition & 3 deletions src/Uno.UI/UI/Xaml/Documents/TextElement.wasm.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using Uno.UI.UI.Xaml.Documents;

namespace Windows.UI.Xaml.Documents
namespace Windows.UI.Xaml.Documents
{
partial class TextElement
{
Expand Down
Loading

0 comments on commit 31d0192

Please sign in to comment.