Skip to content

Commit 4892f01

Browse files
authored
Merge pull request #158 from microsoft/alzollin/wcrapis
Added support for WCR APIs
2 parents b005eb5 + c308125 commit 4892f01

File tree

151 files changed

+5211
-889
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

151 files changed

+5211
-889
lines changed

AIDevGallery.SourceGenerator/Models/ApiDefinition.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ internal class ApiDefinition
88
public required string Id { get; init; }
99
public required string Name { get; init; }
1010
public required string Icon { get; init; }
11+
public required string IconGlyph { get; init; }
12+
public required string Description { get; init; }
1113
public required string ReadmeUrl { get; init; }
1214
public required string License { get; init; }
15+
public required string SampleIdToShowInDocs { get; init; }
1316
}

AIDevGallery.SourceGenerator/Models/HardwareAccelerator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ internal enum HardwareAccelerator
1010
{
1111
CPU,
1212
DML,
13-
QNN
13+
QNN,
14+
WCRAPI
1415
}

AIDevGallery.SourceGenerator/ModelsSourceGenerator.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ internal class ModelSourceGenerator : IIncrementalGenerator
2424
public void Initialize(IncrementalGeneratorInitializationContext context)
2525
{
2626
IncrementalValuesProvider<AdditionalText> modelJsons = context.AdditionalTextsProvider.Where(
27-
static file => file.Path.EndsWith(".json") &&
28-
Path.GetFileName(Path.GetDirectoryName(file.Path)).Equals("ModelsDefinitions", StringComparison.OrdinalIgnoreCase));
27+
static file => file.Path.EndsWith(".json") && file.Path.Contains(@"\Samples\Definitions\"));
2928

3029
var pathsAndContents = modelJsons.Select((text, cancellationToken) =>
3130
(text.Path, Content: text.GetText(cancellationToken)!.ToString(), CancellationToken: cancellationToken))
@@ -322,8 +321,11 @@ private void GenerateApiDefinitionDetails(StringBuilder sourceBuilder, Dictionar
322321
Id = "{{apiDefinition.Id}}",
323322
Name = "{{apiDefinition.Name}}",
324323
Icon = "{{apiDefinition.Icon}}",
324+
IconGlyph = "{{apiDefinition.IconGlyph}}",
325+
Description = "{{apiDefinition.Description}}",
325326
ReadmeUrl = "{{apiDefinition.ReadmeUrl}}",
326327
License = "{{apiDefinition.License}}",
328+
{{(!string.IsNullOrWhiteSpace(apiDefinition.SampleIdToShowInDocs) ? $"SampleIdToShowInDocs = \"{apiDefinition.SampleIdToShowInDocs}\"" : string.Empty)}}
327329
}
328330
},
329331
"""");

AIDevGallery.SourceGenerator/SamplesSourceGenerator.cs

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private void ExecuteSharedCodeEnumGeneration(SourceProductionContext context, Im
5252
{
5353
var filePath = type!.Locations[0].SourceTree?.FilePath;
5454

55-
if (filePath != null)
55+
if (filePath != null && !filePath.Contains(@"\obj\"))
5656
{
5757
if (!filePaths.Contains(filePath))
5858
{
@@ -66,7 +66,15 @@ private void ExecuteSharedCodeEnumGeneration(SourceProductionContext context, Im
6666
foreach (var filePath in filePaths)
6767
{
6868
var fileName = Path.GetFileNameWithoutExtension(filePath);
69-
if (File.Exists(Path.ChangeExtension(filePath, ".xaml")))
69+
var extension = Path.GetExtension(filePath);
70+
var filePathWithoutExtension = filePath.Substring(0, filePath.Length - extension.Length);
71+
if (fileName.EndsWith(".xaml", StringComparison.InvariantCultureIgnoreCase) && File.Exists(filePathWithoutExtension))
72+
{
73+
fileName = Path.GetFileNameWithoutExtension(filePathWithoutExtension);
74+
sourceBuilder.AppendLine($" {fileName}Cs,");
75+
sourceBuilder.AppendLine($" {fileName}Xaml,");
76+
}
77+
else if (File.Exists(Path.ChangeExtension(filePath, ".xaml")))
7078
{
7179
sourceBuilder.AppendLine($" {fileName}Cs,");
7280
sourceBuilder.AppendLine($" {fileName}Xaml,");
@@ -89,14 +97,22 @@ private void ExecuteSharedCodeEnumGeneration(SourceProductionContext context, Im
8997
{
9098
var fileName = Path.GetFileNameWithoutExtension(filePath);
9199
var filePathXaml = Path.ChangeExtension(filePath, ".xaml");
92-
if (File.Exists(filePathXaml))
100+
var extension = Path.GetExtension(filePath);
101+
var filePathWithoutExtension = filePath.Substring(0, filePath.Length - extension.Length);
102+
if (fileName.EndsWith(".xaml", StringComparison.InvariantCultureIgnoreCase) && File.Exists(filePathWithoutExtension))
93103
{
94-
sourceBuilder.AppendLine($" SharedCodeEnum.{Path.GetFileNameWithoutExtension(filePath)}Xaml => \"{Path.GetFileName(filePathXaml)}\",");
95-
sourceBuilder.AppendLine($" SharedCodeEnum.{Path.GetFileNameWithoutExtension(filePath)}Cs => \"{Path.GetFileName(filePath)}\",");
104+
fileName = Path.GetFileNameWithoutExtension(fileName);
105+
sourceBuilder.AppendLine($" SharedCodeEnum.{fileName}Cs => \"{fileName}.xaml.cs\",");
106+
sourceBuilder.AppendLine($" SharedCodeEnum.{fileName}Xaml => \"{fileName}.xaml\",");
107+
}
108+
else if (File.Exists(filePathXaml))
109+
{
110+
sourceBuilder.AppendLine($" SharedCodeEnum.{fileName}Xaml => \"{Path.GetFileName(filePathXaml)}\",");
111+
sourceBuilder.AppendLine($" SharedCodeEnum.{fileName}Cs => \"{Path.GetFileName(filePath)}\",");
96112
}
97113
else
98114
{
99-
sourceBuilder.AppendLine($" SharedCodeEnum.{Path.GetFileNameWithoutExtension(filePath)} => \"{Path.GetFileName(filePath)}\",");
115+
sourceBuilder.AppendLine($" SharedCodeEnum.{fileName} => \"{Path.GetFileName(filePath)}\",");
100116
}
101117
}
102118

@@ -111,6 +127,16 @@ private void ExecuteSharedCodeEnumGeneration(SourceProductionContext context, Im
111127
{
112128
var fileName = Path.GetFileNameWithoutExtension(filePath);
113129
var filePathXaml = Path.ChangeExtension(filePath, ".xaml");
130+
var extension = Path.GetExtension(filePath);
131+
var filePathWithoutExtension = filePath.Substring(0, filePath.Length - extension.Length);
132+
133+
// handle .xaml.cs files
134+
if (File.Exists(filePathWithoutExtension))
135+
{
136+
filePathXaml = filePathWithoutExtension;
137+
fileName = Path.GetFileNameWithoutExtension(fileName);
138+
}
139+
114140
if (File.Exists(filePathXaml))
115141
{
116142
var fileContentXaml = XamlSourceCleanUp(File.ReadAllText(filePathXaml));

AIDevGallery.UnitTests/ProjectGeneratorUnitTests.cs

Lines changed: 60 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using System.Collections.Generic;
1717
using System.ComponentModel;
1818
using System.Diagnostics;
19+
using System.Globalization;
1920
using System.IO;
2021
using System.Linq;
2122
using System.Threading;
@@ -62,7 +63,9 @@ private class SampleUIData : INotifyPropertyChanged
6263
{
6364
private Brush? statusColor;
6465

66+
public required string SampleName { get; init; }
6567
public required Sample Sample { get; init; }
68+
public required Dictionary<ModelType, (string CachedModelDirectoryPath, string ModelUrl, HardwareAccelerator HardwareAccelerator)> CachedModelsToGenerator { get; init; }
6669
public Brush? StatusColor
6770
{
6871
get => statusColor;
@@ -93,11 +96,7 @@ public async Task GenerateForAllSamples()
9396

9497
UITestMethodAttribute.DispatcherQueue?.TryEnqueue(() =>
9598
{
96-
source = SampleDetails.Samples.Select(s => new SampleUIData
97-
{
98-
Sample = s,
99-
StatusColor = new SolidColorBrush(Colors.LightGray)
100-
}).ToList();
99+
source = SampleDetails.Samples.SelectMany(s => GetAllForSample(s)).ToList();
101100

102101
green = new SolidColorBrush(Colors.Green);
103102
red = new SolidColorBrush(Colors.Red);
@@ -119,49 +118,89 @@ public async Task GenerateForAllSamples()
119118

120119
// write test count
121120
TestContext.WriteLine($"Running {source.Count} tests");
122-
121+
int currentId = 0;
123122
await Parallel.ForEachAsync(source, new ParallelOptions { MaxDegreeOfParallelism = 4 }, async (item, ct) =>
124123
{
125124
listView.DispatcherQueue.TryEnqueue(() =>
126125
{
127126
item.StatusColor = yellow;
128127
});
129128

130-
var success = await GenerateForSample(item.Sample, ct);
129+
Interlocked.Increment(ref currentId);
131130

132-
TestContext.WriteLine($"Built {item.Sample.Name} with status {success}");
133-
Debug.WriteLine($"Built {item.Sample.Name} with status {success}");
131+
var success = await GenerateForSample(currentId, item, ct);
132+
133+
TestContext.WriteLine($"Built {item.SampleName} with status {success}");
134+
Debug.WriteLine($"Built {item.SampleName} with status {success}");
134135

135136
listView.DispatcherQueue.TryEnqueue(() =>
136137
{
137138
item.StatusColor = success ? green : red;
138139
});
139-
successDict.Add(item.Sample.Name, success);
140+
successDict.Add(item.SampleName, success);
140141
});
141142

142143
successDict.Should().AllSatisfy(kvp => kvp.Value.Should().BeTrue($"{kvp.Key} should build successfully"));
143144
}
144145

145-
private async Task<bool> GenerateForSample(Sample sample, CancellationToken cancellationToken)
146+
private static IEnumerable<SampleUIData> GetAllForSample(Sample s)
146147
{
147-
var modelsDetails = ModelDetailsHelper.GetModelDetails(sample);
148+
var modelsDetails = ModelDetailsHelper.GetModelDetails(s);
149+
150+
if (modelsDetails[0].ContainsKey(ModelType.LanguageModels) &&
151+
modelsDetails[0].ContainsKey(ModelType.PhiSilica))
152+
{
153+
yield return new SampleUIData
154+
{
155+
Sample = s,
156+
SampleName = $"{s.Name} GenAI",
157+
CachedModelsToGenerator = GetModelsToGenerator(s, modelsDetails, modelsDetails[0].First(md => md.Key == ModelType.LanguageModels)),
158+
StatusColor = new SolidColorBrush(Colors.LightGray)
159+
};
148160

149-
ModelDetails modelDetails1 = modelsDetails[0].Values.First().First();
150-
Dictionary<ModelType, (string CachedModelDirectoryPath, string ModelUrl, HardwareAccelerator HardwareAccelerator)> cachedModelsToGenerator = new()
161+
yield return new SampleUIData
162+
{
163+
Sample = s,
164+
SampleName = $"{s.Name} PhiSilica",
165+
CachedModelsToGenerator = GetModelsToGenerator(s, modelsDetails, modelsDetails[0].First(md => md.Key == ModelType.PhiSilica)),
166+
StatusColor = new SolidColorBrush(Colors.LightGray)
167+
};
168+
}
169+
else
151170
{
152-
[sample.Model1Types.First()] = ("FakePath", modelsDetails[0].Values.First().First().Url, modelDetails1.HardwareAccelerators.First())
153-
};
171+
yield return new SampleUIData
172+
{
173+
Sample = s,
174+
SampleName = s.Name,
175+
CachedModelsToGenerator = GetModelsToGenerator(s, modelsDetails, modelsDetails[0].First()),
176+
StatusColor = new SolidColorBrush(Colors.LightGray)
177+
};
178+
}
154179

155-
if (sample.Model2Types != null && modelsDetails.Count > 1)
180+
static Dictionary<ModelType, (string CachedModelDirectoryPath, string ModelUrl, HardwareAccelerator HardwareAccelerator)> GetModelsToGenerator(Sample s, List<Dictionary<ModelType, List<ModelDetails>>> modelsDetails, KeyValuePair<ModelType, List<ModelDetails>> keyValuePair)
156181
{
157-
ModelDetails modelDetails2 = modelsDetails[1].Values.First().First();
158-
cachedModelsToGenerator[sample.Model2Types.First()] = ("FakePath", modelDetails2.Url, modelDetails2.HardwareAccelerators.First());
182+
Dictionary<ModelType, (string CachedModelDirectoryPath, string ModelUrl, HardwareAccelerator HardwareAccelerator)> cachedModelsToGenerator = new();
183+
184+
ModelDetails modelDetails1 = keyValuePair.Value.First();
185+
cachedModelsToGenerator[keyValuePair.Key] = (modelDetails1.Url, modelDetails1.Url, modelDetails1.HardwareAccelerators.First());
186+
187+
if (s.Model2Types != null && modelsDetails.Count > 1)
188+
{
189+
ModelDetails modelDetails2 = modelsDetails[1].Values.First().First();
190+
cachedModelsToGenerator[s.Model2Types.First()] = (modelDetails2.Url, modelDetails2.Url, modelDetails2.HardwareAccelerators.First());
191+
}
192+
193+
return cachedModelsToGenerator;
159194
}
195+
}
160196

161-
var projectPath = await generator.GenerateAsync(sample, cachedModelsToGenerator, false, TmpPathProjectGenerator, cancellationToken);
197+
private async Task<bool> GenerateForSample(int id, SampleUIData sampleUIData, CancellationToken cancellationToken)
198+
{
199+
var outputPath = Path.Join(TmpPathProjectGenerator, id.ToString(CultureInfo.InvariantCulture));
200+
var projectPath = await generator.GenerateAsync(sampleUIData.Sample, sampleUIData.CachedModelsToGenerator, false, outputPath, cancellationToken);
162201

163202
var safeProjectName = Path.GetFileName(projectPath);
164-
string logFileName = $"build_{safeProjectName}.log";
203+
string logFileName = $"build_{id}_{sampleUIData.SampleName.Replace(' ', '_')}.log";
165204

166205
var arch = DeviceUtils.IsArm64() ? "arm64" : "x64";
167206

AIDevGallery.UnitTests/UnitTestApp.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<DataTemplate x:Key="SampleItemTemplate">
1515
<Grid>
1616
<Border Background="{Binding StatusColor}">
17-
<TextBlock Text="{Binding Sample.Name}" FontSize="16"/>
17+
<TextBlock Text="{Binding SampleName}" FontSize="16"/>
1818
</Border>
1919
</Grid>
2020
</DataTemplate>

AIDevGallery/AIDevGallery.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,4 +322,6 @@
322322
<UserProperties />
323323
</VisualStudio>
324324
</ProjectExtensions>
325+
326+
<Import Project="$(MSBuildThisFileDirectory)\WinAppSDKSelfContainedFix.targets" Condition="'$(WindowsAppSDKSelfContained)'=='true'" />
325327
</Project>

AIDevGallery/App.xaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,25 @@
33
x:Class="AIDevGallery.App"
44
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
55
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
6-
xmlns:local="using:AIDevGallery">
6+
xmlns:local="using:AIDevGallery"
7+
xmlns:models="using:AIDevGallery.Models">
78
<Application.Resources>
89
<ResourceDictionary>
910
<ResourceDictionary.MergedDictionaries>
1011
<XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" />
1112
<ResourceDictionary Source="/Styles/Button.xaml" />
13+
<ResourceDictionary Source="/Styles/Colors.xaml" />
1214
<ResourceDictionary Source="/Styles/ComboBox.xaml" />
1315
<ResourceDictionary Source="/Styles/Card.xaml" />
1416
<ResourceDictionary Source="/Styles/NavigationView.xaml" />
1517
<ResourceDictionary Source="/Styles/SelectorBar.xaml" />
1618
<ResourceDictionary Source="/Controls/CopyButton.xaml" />
19+
<ResourceDictionary Source="/Controls/Shimmer.xaml" />
1720
<ResourceDictionary Source="/Controls/OpacityMask.xaml" />
1821
<ResourceDictionary Source="/Controls/HomePage/Header/HeaderTile/HeaderTile.xaml" />
19-
<ResourceDictionary Source="/Samples/SharedCode/SemanticComboBox.xaml" />
20-
<ResourceDictionary Source="/Samples/SharedCode/SmartPasteForm.xaml" />
21-
<ResourceDictionary Source="/Samples/SharedCode/SmartTextBox.xaml" />
22+
<ResourceDictionary Source="/Samples/SharedCode/Controls/SemanticComboBox.xaml" />
23+
<ResourceDictionary Source="/Samples/SharedCode/Controls/SmartPasteForm.xaml" />
24+
<ResourceDictionary Source="/Samples/SharedCode/Controls/SmartTextBox.xaml" />
2225
</ResourceDictionary.MergedDictionaries>
2326
<!-- Other app resources here -->
2427

AIDevGallery/Assets/Enhance.png

59.1 KB
Loading

0 commit comments

Comments
 (0)