From dbed82f6fd16025720f033d51eec7421a59f5fee Mon Sep 17 00:00:00 2001 From: "Alex.Spicer" Date: Fri, 10 Oct 2025 09:04:13 +0100 Subject: [PATCH] Added "PerformGlSwapOnCpu" to provide fix for certain PC's --- samples/ControlCatalog.NetCore/Program.cs | 4 ++++ .../Gpu/OpenGl/GlSkiaExternalObjectsFeature.cs | 9 ++++++--- src/Skia/Avalonia.Skia/SkiaOptions.cs | 6 ++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index 036dd13f7a2..fbba5790027 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -147,6 +147,10 @@ public static AppBuilder BuildAvaloniaApp() { UseRegionDirtyRectClipping = true }) + .With(new SkiaOptions() + { + PerformGlSwapOnCpu = true + }) .UseSkia() .WithInterFont() .AfterSetup(builder => diff --git a/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaExternalObjectsFeature.cs b/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaExternalObjectsFeature.cs index 48d83f38eaa..41bad263cd4 100644 --- a/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaExternalObjectsFeature.cs +++ b/src/Skia/Avalonia.Skia/Gpu/OpenGl/GlSkiaExternalObjectsFeature.cs @@ -132,17 +132,19 @@ IBitmapImpl TakeSnapshot() var textureId = _image?.TextureId ?? _sharedTexture!.TextureId; var topLeft = _image?.Properties.TopLeftOrigin ?? false; var textureType = _image?.TextureType ?? GlConsts.GL_TEXTURE_2D; - - + var skiaOptions = AvaloniaLocator.Current.GetService(); + + IBitmapImpl rv; using (var surf = TryCreateSurface(textureType, textureId, internalFormat, width, height, topLeft)) { if (surf == null) throw new OpenGlException("Unable to consume provided texture"); var snapshot = surf.Snapshot(); + var raster = skiaOptions?.PerformGlSwapOnCpu == true ? snapshot.ToRasterImage() : null; var context = _gpu.GlContext; - rv = new ImmutableBitmap(snapshot, () => + rv = new ImmutableBitmap(raster ?? snapshot, () => { IDisposable? restoreContext = null; try @@ -156,6 +158,7 @@ IBitmapImpl TakeSnapshot() using (restoreContext) { + raster?.Dispose(); snapshot.Dispose(); } }); diff --git a/src/Skia/Avalonia.Skia/SkiaOptions.cs b/src/Skia/Avalonia.Skia/SkiaOptions.cs index 84ad547d6c5..8110d0e844f 100644 --- a/src/Skia/Avalonia.Skia/SkiaOptions.cs +++ b/src/Skia/Avalonia.Skia/SkiaOptions.cs @@ -24,5 +24,11 @@ public class SkiaOptions /// Enabling this might have performance implications. /// public bool UseOpacitySaveLayer { get; set; } = false; + + /// + /// Perform the GL buffer swap on the CPU instead of the GPU. This can help with some rendering issues on certain PCs. + /// Note that this may have a performance hit. The default value is false. + /// + public bool PerformGlSwapOnCpu { get; set; } = false; } }