From 305b124646ca6e3f57dc3c320ca1e1c6caaee8d2 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 26 Apr 2024 19:23:34 +0500 Subject: [PATCH] wip --- src/Browser/Avalonia.Browser/BrowserTopLevelImpl.cs | 4 +--- .../Avalonia.Browser/Rendering/BrowserGlSurface.cs | 5 +++-- .../Rendering/BrowserRasterSurface.cs | 5 +++-- .../Avalonia.Browser/Rendering/BrowserSurface.cs | 13 ++++++------- .../Rendering/RenderTargetBrowserSurface.cs | 12 ++++++++++++ 5 files changed, 25 insertions(+), 14 deletions(-) create mode 100644 src/Browser/Avalonia.Browser/Rendering/RenderTargetBrowserSurface.cs diff --git a/src/Browser/Avalonia.Browser/BrowserTopLevelImpl.cs b/src/Browser/Avalonia.Browser/BrowserTopLevelImpl.cs index 9e5742954b..2128cea1f1 100644 --- a/src/Browser/Avalonia.Browser/BrowserTopLevelImpl.cs +++ b/src/Browser/Avalonia.Browser/BrowserTopLevelImpl.cs @@ -61,9 +61,7 @@ namespace Avalonia.Browser _surface.ScalingChanged += OnScalingChanged; Surfaces = new[] { _surface }; - Compositor = _surface.IsWebGl ? - BrowserCompositor.WebGlUiCompositor : - BrowserCompositor.SoftwareUiCompositor; + Compositor = _surface.Compositor; } private void OnScalingChanged() diff --git a/src/Browser/Avalonia.Browser/Rendering/BrowserGlSurface.cs b/src/Browser/Avalonia.Browser/Rendering/BrowserGlSurface.cs index 5cb65bafd8..cd46bc83b7 100644 --- a/src/Browser/Avalonia.Browser/Rendering/BrowserGlSurface.cs +++ b/src/Browser/Avalonia.Browser/Rendering/BrowserGlSurface.cs @@ -3,6 +3,7 @@ using System.Runtime.InteropServices.JavaScript; using Avalonia.Browser.Interop; using Avalonia.Browser.Skia; using Avalonia.Platform; +using Avalonia.Rendering.Composition; using SkiaSharp; namespace Avalonia.Browser.Rendering; @@ -12,8 +13,8 @@ internal sealed class BrowserGlSurface : BrowserSurface private readonly GRGlInterface _glInterface; public BrowserGlSurface(JSObject canvasSurface, GLInfo glInfo, PixelFormat pixelFormat, - BrowserRenderingMode renderingMode) - : base(canvasSurface, renderingMode) + Compositor compositor) + : base(canvasSurface, compositor) { var skiaOptions = AvaloniaLocator.Current.GetService(); _glInterface = GRGlInterface.Create() ?? throw new InvalidOperationException("Unable to create GRGlInterface."); diff --git a/src/Browser/Avalonia.Browser/Rendering/BrowserRasterSurface.cs b/src/Browser/Avalonia.Browser/Rendering/BrowserRasterSurface.cs index 725d6241ac..4a0af3c29b 100644 --- a/src/Browser/Avalonia.Browser/Rendering/BrowserRasterSurface.cs +++ b/src/Browser/Avalonia.Browser/Rendering/BrowserRasterSurface.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices.JavaScript; using Avalonia.Browser.Interop; using Avalonia.Controls.Platform.Surfaces; using Avalonia.Platform; +using Avalonia.Rendering.Composition; namespace Avalonia.Browser.Skia; @@ -16,8 +17,8 @@ internal sealed class BrowserRasterSurface : BrowserSurface, IFramebufferPlatfor private readonly Action _onDisposeAction; private readonly int _bytesPerPixel; - public BrowserRasterSurface(JSObject canvasSurface, PixelFormat pixelFormat, BrowserRenderingMode renderingMode) - : base(canvasSurface, renderingMode) + public BrowserRasterSurface(JSObject canvasSurface, PixelFormat pixelFormat, Compositor compositor) + : base(canvasSurface, compositor) { PixelFormat = pixelFormat; _onDisposeAction = Blit; diff --git a/src/Browser/Avalonia.Browser/Rendering/BrowserSurface.cs b/src/Browser/Avalonia.Browser/Rendering/BrowserSurface.cs index 8f73a67c77..17bbfdc17e 100644 --- a/src/Browser/Avalonia.Browser/Rendering/BrowserSurface.cs +++ b/src/Browser/Avalonia.Browser/Rendering/BrowserSurface.cs @@ -9,25 +9,24 @@ using Avalonia.Browser.Rendering; using Avalonia.Logging; using Avalonia.Platform; using Avalonia.Rendering; +using Avalonia.Rendering.Composition; using Avalonia.Threading; namespace Avalonia.Browser.Skia; internal abstract class BrowserSurface : IDisposable { - private readonly BrowserRenderingMode _renderingMode; - - protected BrowserSurface(JSObject jsSurface, BrowserRenderingMode renderingMode) + protected BrowserSurface(JSObject jsSurface, Compositor compositor) { - _renderingMode = renderingMode; JsSurface = jsSurface; + Compositor = compositor; Scaling = 1; ClientSize = new Size(1, 1); RenderSize = new PixelSize(1, 1); } - public bool IsWebGl => _renderingMode is BrowserRenderingMode.WebGL1 or BrowserRenderingMode.WebGL2; + public Compositor Compositor { get; } public JSObject JsSurface { get; private set; } public double Scaling { get; private set; } @@ -55,8 +54,8 @@ internal abstract class BrowserSurface : IDisposable { var (jsSurface, jsGlInfo) = CanvasHelper.CreateSurface(container, mode); surface = jsGlInfo != null - ? new BrowserGlSurface(jsSurface, jsGlInfo, pixelFormat, mode) - : new BrowserRasterSurface(jsSurface, pixelFormat, mode); + ? new BrowserGlSurface(jsSurface, jsGlInfo, pixelFormat, BrowserCompositor.WebGlUiCompositor) + : new BrowserRasterSurface(jsSurface, pixelFormat, BrowserCompositor.SoftwareUiCompositor); break; } catch (Exception ex) diff --git a/src/Browser/Avalonia.Browser/Rendering/RenderTargetBrowserSurface.cs b/src/Browser/Avalonia.Browser/Rendering/RenderTargetBrowserSurface.cs new file mode 100644 index 0000000000..f7d6110c27 --- /dev/null +++ b/src/Browser/Avalonia.Browser/Rendering/RenderTargetBrowserSurface.cs @@ -0,0 +1,12 @@ +using System.Runtime.InteropServices.JavaScript; +using Avalonia.Browser.Skia; +using Avalonia.Rendering.Composition; + +namespace Avalonia.Browser.Rendering; + +internal class RenderTargetBrowserSurface : BrowserSurface +{ + public RenderTargetBrowserSurface(JSObject jsSurface, Compositor compositor) : base(jsSurface, compositor) + { + } +} \ No newline at end of file