SkiaSharp icon indicating copy to clipboard operation
SkiaSharp copied to clipboard

[BUG] SKGLElement on multiple threads

Open imerzan opened this issue 1 month ago • 3 comments

Description

Using the new SKGLElement in SkiaSharp, I get an access violation at the following location in GLWPFControl when I try create an additional SKGLElement on a new Thread:

	public unsafe static IntPtr DXRegisterObjectNV(IntPtr hDevice, IntPtr dxObject, uint name, uint type, WGL_NV_DX_interop access)
	{
		return ((delegate* unmanaged[Stdcall]<IntPtr, IntPtr, uint, uint, WGL_NV_DX_interop, IntPtr>)EntryPoints[21])(hDevice, dxObject, name, type, access);
	}

Code

                var t = new Thread(() =>
                {
                    var form = new MainWindow(); // Main Window has an SKGLElement defined in XAML
                    form.Show();
                    // Start the Dispatcher loop
                    System.Windows.Threading.Dispatcher.Run();
                });
                t.SetApartmentState(ApartmentState.STA);
                t.Start();

Expected Behavior

Ability to create multiple controls (across multiple threads) in application like in SkiaSharp.Views.WindowsForms

Actual Behavior

Unable to do this

Version of SkiaSharp

3.x (Alpha)

Last Known Good Version of SkiaSharp

Other (Please indicate in the description)

IDE / Editor

Visual Studio (Windows)

Platform / Operating System

Windows

Platform / Operating System Version

Windows 11 23H2 64 bit

Devices

No response

Relevant Screenshots

No response

Relevant Log Output

Call stack:


 	[Managed to Native Transition]	
>	OpenTK.Graphics.dll!OpenTK.Graphics.Wgl.Wgl.DXRegisterObjectNV(nint hDevice, nint dxObject, uint name, uint type, OpenTK.Platform.Windows.WGL_NV_DX_interop access) Line 533	C#
 	GLWpfControl.dll!OpenTK.Wpf.DxGLFramebuffer.DxGLFramebuffer(OpenTK.Wpf.DxGlContext context, int width, int height, double dpiScaleX, double dpiScaleY, OpenTK.Wpf.Interop.Format format)	Unknown
 	GLWpfControl.dll!OpenTK.Wpf.GLWpfControlRenderer.SetSize(int width, int height, double dpiScaleX, double dpiScaleY, OpenTK.Wpf.Interop.Format format)	Unknown
 	GLWpfControl.dll!OpenTK.Wpf.GLWpfControl.SetupRenderSize()	Unknown
 	GLWpfControl.dll!OpenTK.Wpf.GLWpfControl.OnRender(System.Windows.Media.DrawingContext drawingContext)	Unknown
 	xxxxxx.dll!SkiaSharp.Views.WPF.SKGLElement.OnRender(System.Windows.Media.DrawingContext drawingContext)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!MS.Internal.Helper.ArrangeElementWithSingleChild(System.Windows.UIElement element, System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Border.ArrangeOverride(System.Windows.Size finalSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Control.ArrangeOverride(System.Windows.Size arrangeBounds)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!MS.Internal.Helper.ArrangeElementWithSingleChild(System.Windows.UIElement element, System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!MS.Internal.Helper.ArrangeElementWithSingleChild(System.Windows.UIElement element, System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Border.ArrangeOverride(System.Windows.Size finalSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Control.ArrangeOverride(System.Windows.Size arrangeBounds)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Border.ArrangeOverride(System.Windows.Size finalSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Control.ArrangeOverride(System.Windows.Size arrangeBounds)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!MS.Internal.Helper.ArrangeElementWithSingleChild(System.Windows.UIElement element, System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!MS.Internal.Helper.ArrangeElementWithSingleChild(System.Windows.UIElement element, System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Decorator.ArrangeOverride(System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.Documents.AdornerDecorator.ArrangeOverride(System.Windows.Size finalSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Control.ArrangeOverride(System.Windows.Size arrangeBounds)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Decorator.ArrangeOverride(System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.Documents.AdornerDecorator.ArrangeOverride(System.Windows.Size finalSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size arrangeSize)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationFramework.dll!System.Windows.Window.ArrangeOverride(System.Windows.Size arrangeBounds)	Unknown
 	PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)	Unknown
 	PresentationCore.dll!System.Windows.Interop.HwndSource.SetLayoutSize()	Unknown
 	PresentationCore.dll!System.Windows.Interop.HwndSource.RootVisualInternal.set(System.Windows.Media.Visual value)	Unknown
 	PresentationFramework.dll!System.Windows.Window.SetRootVisualAndUpdateSTC()	Unknown
 	PresentationFramework.dll!System.Windows.Window.SetupInitialState(double requestedTop, double requestedLeft, double requestedWidth, double requestedHeight)	Unknown
 	PresentationFramework.dll!System.Windows.Window.CreateSourceWindow(bool duringShow)	Unknown
 	PresentationFramework.dll!System.Windows.Window.ShowHelper(object booleanBox)	Unknown
 	PresentationFramework.dll!System.Windows.Window.Show()	Unknown

Code of Conduct

  • [X] I agree to follow this project's Code of Conduct

imerzan avatar May 27 '24 17:05 imerzan