From 1ad9fc27140c4edd92992f4427500f70d89b9c63 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Sat, 4 Nov 2023 01:03:08 +0800 Subject: [PATCH 1/3] fix: the graphics card path in Raspberry Pi. --- demo/Semi.Avalonia.Demo.Drm/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/Semi.Avalonia.Demo.Drm/Program.cs b/demo/Semi.Avalonia.Demo.Drm/Program.cs index 45d2f66..219df12 100644 --- a/demo/Semi.Avalonia.Demo.Drm/Program.cs +++ b/demo/Semi.Avalonia.Demo.Drm/Program.cs @@ -29,7 +29,7 @@ namespace Semi.Avalonia.Demo.Drm if (args.Contains("--drm")) { SilenceConsole(); - builder.StartLinuxDrm(args: args, card: "/dev/dri/card0", scaling: 1); + builder.StartLinuxDrm(args: args, card: "/dev/dri/card1", scaling: 1); } else { From cbea8156ad98f8c8024f951d29a76a29342b9534 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Sat, 4 Nov 2023 01:07:43 +0800 Subject: [PATCH 2/3] feat: StartLinuxDrm in Raspberry Pi. --- demo/Semi.Avalonia.Demo.Drm/Program.cs | 78 ++++++++++++-------------- 1 file changed, 36 insertions(+), 42 deletions(-) diff --git a/demo/Semi.Avalonia.Demo.Drm/Program.cs b/demo/Semi.Avalonia.Demo.Drm/Program.cs index 219df12..c690e85 100644 --- a/demo/Semi.Avalonia.Demo.Drm/Program.cs +++ b/demo/Semi.Avalonia.Demo.Drm/Program.cs @@ -1,59 +1,53 @@ -using Avalonia; -using Avalonia.Dialogs; -using Avalonia.Media; -using System; +using System; +using System.Globalization; using System.Linq; using System.Threading; +using Avalonia; -namespace Semi.Avalonia.Demo.Drm +namespace Semi.Avalonia.Demo.Drm; + +class Program { - internal class Program + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static int Main(string[] args) { - // Initialization code. Don't use any Avalonia, third-party APIs or any - // SynchronizationContext-reliant code before AppMain is called: things aren't initialized - // yet and stuff might break. - [STAThread] - public static void Main(string[] args) + var builder = BuildAvaloniaApp(); + + double GetScaling() { - var builder = BuildAvaloniaApp(); - builder.With(new FontManagerOptions - { - FontFallbacks = new[] - { - new FontFallback - { - FontFamily = new FontFamily("Microsoft YaHei") - } - } - }); - if (args.Contains("--drm")) - { - SilenceConsole(); - builder.StartLinuxDrm(args: args, card: "/dev/dri/card1", scaling: 1); - } - else - { - builder.StartWithClassicDesktopLifetime(args); - } + var idx = Array.IndexOf(args, "--scaling"); + if (idx != 0 && args.Length > idx + 1 && + double.TryParse(args[idx + 1], NumberStyles.Any, CultureInfo.InvariantCulture, out var scaling)) + return scaling; + return 1; } - // Avalonia configuration, don't remove; also used by visual designer. - public static AppBuilder BuildAvaloniaApp() - => AppBuilder.Configure() - .UseManagedSystemDialogs() - .UsePlatformDetect() - .With(new Win32PlatformOptions()) - .LogToTrace(); - - private static void SilenceConsole() + if (args.Contains("--drm")) { - new Thread(() => + SilenceConsole(); + return builder.StartLinuxDrm(args: args, card: "/dev/dri/card1", scaling: GetScaling()); + } + + return builder.StartWithClassicDesktopLifetime(args); + } + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UsePlatformDetect() + .LogToTrace(); + + private static void SilenceConsole() + { + new Thread(() => { Console.CursorVisible = false; while (true) Console.ReadKey(true); }) { IsBackground = true }.Start(); - } } } \ No newline at end of file From 750f295c0f692d212787eed8f40bd8b2412048e0 Mon Sep 17 00:00:00 2001 From: Zhang Dian <54255897+zdpcdt@users.noreply.github.com> Date: Sat, 4 Nov 2023 01:16:36 +0800 Subject: [PATCH 3/3] feat: update usage doc. --- demo/Semi.Avalonia.Demo.Drm/使用方法.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/demo/Semi.Avalonia.Demo.Drm/使用方法.md b/demo/Semi.Avalonia.Demo.Drm/使用方法.md index 0ae6395..870b6a2 100644 --- a/demo/Semi.Avalonia.Demo.Drm/使用方法.md +++ b/demo/Semi.Avalonia.Demo.Drm/使用方法.md @@ -54,3 +54,24 @@ sudo kmscube 解决方法: >sudo chmod +x ./Semi.Avalonia.Demo.Drm + +4. 报错内容 +>Unhandled exception. System.ComponentModel.Win32Exception (95): drmModeGetResources failed +at Avalonia.LinuxFramebuffer.Output.DrmResources..ctor(Int32 fd, Boolean connectorsForceProbe) in /_/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmBindings.cs:line 91 +at Avalonia.LinuxFramebuffer.Output.DrmCard.GetResources(Boolean connectorsForceProbe) in /_/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmBindings.cs:line 171 +at Avalonia.LinuxFramebuffer.Output.DrmOutput..ctor(String path, Boolean connectorsForceProbe, DrmOutputOptions options) in /_/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs:line 60 +at LinuxFramebufferPlatformExtensions.StartLinuxDrm(AppBuilder builder, String[] args, String card, Double scaling, IInputBackend inputBackend) in /_/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs:line 166 +at Semi.Avalonia.Demo.Drm.Program.Main(String[] args) + +解决方法: +>`program.cs`的显卡路径错误,可能不是`dev/dri/card1`,看在`dev/dri`目录下有无其他的显卡如`card0`。 + +5. 报错内容 +>Unhandled exception. System.ComponentModel.Win32Exception (2): Couldn't open /dev/dri/card1 +at Avalonia.LinuxFramebuffer.Output.DrmCard..ctor(String ) in /_/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmBindings.cs:line 167 +at Avalonia.LinuxFramebuffer.Output.DrmOutput..ctor(String , Boolean , DrmOutputOptions ) in /_/src/Linux/Avalonia.LinuxFramebuffer/Output/DrmOutput.cs:line 58 +at LinuxFramebufferPlatformExtensions.StartLinuxDrm(AppBuilder, String[], String , Double , IInputBackend ) in /_/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs:line 166 +at Semi.Avalonia.Demo.Drm.Program.Main(String[]) + +解决办法: +>找不到显卡路径`dev/dri/card1`,可能是显卡挂载到别的文件夹下了,待解决。 \ No newline at end of file