Browse Source

Fix SkiaSharp 3.118+ Metal interop (#19598)

pull/19615/head
Julien Lebosquain 5 months ago
committed by GitHub
parent
commit
c3e1f01573
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 24
      src/Skia/Avalonia.Skia/Gpu/Metal/SkiaMetalApi.cs

24
src/Skia/Avalonia.Skia/Gpu/Metal/SkiaMetalApi.cs

@ -14,7 +14,9 @@ internal unsafe class SkiaMetalApi
{ {
delegate* unmanaged[Stdcall] <IntPtr, IntPtr, IntPtr, IntPtr> _gr_direct_context_make_metal_with_options; delegate* unmanaged[Stdcall] <IntPtr, IntPtr, IntPtr, IntPtr> _gr_direct_context_make_metal_with_options;
private delegate* unmanaged[Stdcall]<int, int, int, GRMtlTextureInfoNative*, IntPtr> private delegate* unmanaged[Stdcall]<int, int, int, GRMtlTextureInfoNative*, IntPtr>
_gr_backendrendertarget_new_metal; _gr_backendrendertarget_new_metal_legacy; // Before SkiaSharp 3.118
private delegate* unmanaged[Stdcall]<int, int, GRMtlTextureInfoNative*, IntPtr>
_gr_backendrendertarget_new_metal_m118; // SkiaSharp 3.118+
private readonly ConstructorInfo _contextCtor; private readonly ConstructorInfo _contextCtor;
private readonly MethodInfo _contextOptionsToNative; private readonly MethodInfo _contextOptionsToNative;
private readonly ConstructorInfo _renderTargetCtor; private readonly ConstructorInfo _renderTargetCtor;
@ -50,8 +52,17 @@ internal unsafe class SkiaMetalApi
if(NativeLibraryEx.TryGetExport(dll, "gr_backendrendertarget_new_metal", out address)) if(NativeLibraryEx.TryGetExport(dll, "gr_backendrendertarget_new_metal", out address))
{ {
_gr_backendrendertarget_new_metal = // Skia milestone 118 removed the "samples" parameter
(delegate* unmanaged[Stdcall]<int, int, int, GRMtlTextureInfoNative*, IntPtr>)address; if (typeof(GRContext).Assembly.GetName().Version >= new Version(3, 118))
{
_gr_backendrendertarget_new_metal_m118 =
(delegate* unmanaged[Stdcall]<int, int, GRMtlTextureInfoNative*, IntPtr>)address;
}
else
{
_gr_backendrendertarget_new_metal_legacy =
(delegate* unmanaged[Stdcall]<int, int, int, GRMtlTextureInfoNative*, IntPtr>)address;
}
} }
else else
{ {
@ -100,9 +111,14 @@ internal unsafe class SkiaMetalApi
public GRBackendRenderTarget CreateBackendRenderTarget(int width, int height, int samples, IntPtr texture) public GRBackendRenderTarget CreateBackendRenderTarget(int width, int height, int samples, IntPtr texture)
{ {
var info = new GRMtlTextureInfoNative() { Texture = texture }; var info = new GRMtlTextureInfoNative() { Texture = texture };
var target = _gr_backendrendertarget_new_metal(width, height, samples, &info);
var target = _gr_backendrendertarget_new_metal_m118 is not null ?
_gr_backendrendertarget_new_metal_m118(width, height, &info) :
_gr_backendrendertarget_new_metal_legacy(width, height, samples, &info);
if (target == IntPtr.Zero) if (target == IntPtr.Zero)
throw new InvalidOperationException("Unable to create GRBackendRenderTarget"); throw new InvalidOperationException("Unable to create GRBackendRenderTarget");
return (GRBackendRenderTarget)_renderTargetCtor.Invoke(new object[] { target, true }); return (GRBackendRenderTarget)_renderTargetCtor.Invoke(new object[] { target, true });
} }
} }

Loading…
Cancel
Save