Avalonia: Exception in render loop when using more than one window

Created on 4 Nov 2020  路  9Comments  路  Source: AvaloniaUI/Avalonia

Affected c575283
While using DevTools to debug an application, when I navigate the spec tree, the following exceptions are randomly thrown in the render loop.

If I don't use devtools and there is only one window the problem doesn't occur.

I ran simulations with ControlCatalog.NetCore
OS Windows 10 build 2004 64 bit
These are the stack traces:

 Exception in render loop: 'Avalonia.OpenGL.OpenGlException: eglCreatePbufferFromClientBuffer failed with error EGL_BAD_PARAMETER (0x300C)
   at Avalonia.OpenGL.Egl.EglPlatformOpenGlInterface.CreatePBufferFromClientBuffer(Int32 bufferType, IntPtr handle, Int32[] attribs) in C:\GitHub\Avalonia\src\Avalonia.OpenGL\Egl\EglPlatformOpenGlInterface.cs:line 67
   at Avalonia.OpenGL.Angle.AngleWin32EglDisplay.WrapDirect3D11Texture(EglPlatformOpenGlInterface egl, IntPtr handle, Int32 offsetX, Int32 offsetY, Int32 width, Int32 height) in C:\GitHub\Avalonia\src\Avalonia.OpenGL\Angle\AngleWin32EglDisplay.cs:line 92
   at Avalonia.Win32.CompositionEglGlPlatformSurface.CompositionRenderTarget.BeginDraw() in C:\GitHub\Avalonia\src\Windows\Avalonia.Win32\Composition\CompositionEglGlPlatformSurface.cs:line 88
   at Avalonia.Skia.GlRenderTarget.BeginRenderingSession() in C:\GitHub\Avalonia\src\Skia\Avalonia.Skia\Gpu\OpenGl\GlRenderTarget.cs:line 63
   at Avalonia.Skia.SkiaGpuRenderTarget.CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) in C:\GitHub\Avalonia\src\Skia\Avalonia.Skia\Gpu\SkiaGpuRenderTarget.cs:line 27
   at Avalonia.Rendering.DeferredRenderer.EnsureDrawingContext(IDrawingContextImpl& context) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 553
   at Avalonia.Rendering.DeferredRenderer.UpdateRenderLayersAndConsumeSceneIfNeeded(IDrawingContextImpl& context, Boolean recursiveCall) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 310
   at Avalonia.Rendering.DeferredRenderer.Render(Boolean forceComposite) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 266
   at Avalonia.Rendering.DeferredRenderer.Avalonia.Rendering.IRenderLoopTask.Render() in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 220
   at Avalonia.Rendering.RenderLoop.TimerTick(TimeSpan time) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\RenderLoop.cs:line 147' (RenderLoop #66629781)
System.AccessViolationException
  HResult=0x80004003
  Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>



md5-61277a9b4972ddfd63ebd48250e53a62



   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode)
   at ABI.Windows.UI.Composition.Interop.ICompositionDrawingSurfaceInterop.BeginDraw(IntPtr updateRect, Guid& iid, IntPtr& updateObject, POINT& point) in C:\GitHub\Avalonia\src\Windows\Avalonia.Win32\Composition\ICompositionDrawingSurfaceInterop.cs:line 123
   at Avalonia.Win32.CompositionEglGlPlatformSurface.CompositionRenderTarget.BeginDraw() in C:\GitHub\Avalonia\src\Windows\Avalonia.Win32\Composition\CompositionEglGlPlatformSurface.cs:line 83
   at Avalonia.Skia.GlRenderTarget.BeginRenderingSession() in C:\GitHub\Avalonia\src\Skia\Avalonia.Skia\Gpu\OpenGl\GlRenderTarget.cs:line 63
   at Avalonia.Skia.SkiaGpuRenderTarget.CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) in C:\GitHub\Avalonia\src\Skia\Avalonia.Skia\Gpu\SkiaGpuRenderTarget.cs:line 27
   at Avalonia.Rendering.DeferredRenderer.EnsureDrawingContext(IDrawingContextImpl& context) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 553
   at Avalonia.Rendering.DeferredRenderer.UpdateRenderLayersAndConsumeSceneIfNeeded(IDrawingContextImpl& context, Boolean recursiveCall) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 310
   at Avalonia.Rendering.DeferredRenderer.Render(Boolean forceComposite) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 266
   at Avalonia.Rendering.DeferredRenderer.Avalonia.Rendering.IRenderLoopTask.Render() in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 220
   at Avalonia.Rendering.RenderLoop.TimerTick(TimeSpan time) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\RenderLoop.cs:line 147' (RenderLoop #66629781)

All 9 comments

@danwalmsley I think we should disable winuicomp for now

@workgroupengineering can you test https://github.com/AvaloniaUI/Avalonia/pull/4939

and see if it helps the issue?

I tried but problem is the same ad adding new one.

System.Runtime.InteropServices.COMException
  HResult=0x887A0005
  Message=GPU device instance suspended. Use GetDeviceRemovedReason for appropriate action.


  Source=System.Private.CoreLib
  StackTrace:
   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode)
   at ABI.Windows.UI.Composition.Interop.ICompositionDrawingSurfaceInterop.Resize(POINT sizePixels) in C:\GitHub\Avalonia\src\Windows\Avalonia.Win32\Composition\ICompositionDrawingSurfaceInterop.cs:line 133
   at Avalonia.Win32.CompositionEglGlPlatformSurface.CompositionRenderTarget.BeginDraw() in C:\GitHub\Avalonia\src\Windows\Avalonia.Win32\Composition\CompositionEglGlPlatformSurface.cs:line 80
   at Avalonia.Skia.GlRenderTarget.BeginRenderingSession() in C:\GitHub\Avalonia\src\Skia\Avalonia.Skia\Gpu\OpenGl\GlRenderTarget.cs:line 63
   at Avalonia.Skia.SkiaGpuRenderTarget.CreateDrawingContext(IVisualBrushRenderer visualBrushRenderer) in C:\GitHub\Avalonia\src\Skia\Avalonia.Skia\Gpu\SkiaGpuRenderTarget.cs:line 27
   at Avalonia.Rendering.DeferredRenderer.EnsureDrawingContext(IDrawingContextImpl& context) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 553
   at Avalonia.Rendering.DeferredRenderer.UpdateRenderLayersAndConsumeSceneIfNeeded(IDrawingContextImpl& context, Boolean recursiveCall) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 310
   at Avalonia.Rendering.DeferredRenderer.Render(Boolean forceComposite) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 266
   at Avalonia.Rendering.DeferredRenderer.Paint(Rect rect) in C:\GitHub\Avalonia\src\Avalonia.Visuals\Rendering\DeferredRenderer.cs:line 187
   at Avalonia.Controls.TopLevel.HandlePaint(Rect rect) in C:\GitHub\Avalonia\src\Avalonia.Controls\TopLevel.cs:line 329
   at Avalonia.Win32.WindowImpl.AppWndProc(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam) in C:\GitHub\Avalonia\src\Windows\Avalonia.Win32\WindowImpl.AppWndProc.cs:line 370
   at Avalonia.Win32.WindowImpl.WndProc(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam) in C:\GitHub\Avalonia\src\Windows\Avalonia.Win32\WindowImpl.WndProc.cs:line 30

immagine

immagine
immagine
immagine

The problem occurs when you open multiple windows and quickly resize one.

To simulate the problem, run ControlCatalog.NetCore, open DevTools and quickly resize the main window.
If there is a window, the problem is not generated.

@danwalmsley does each window have its own IDrawingContextImpl or is it shared?

each has its own!

we made some progress on this... more to come early in the week.

Hi,
if it disabled AllowEglInitialization I have no problem

Just for case, with AllowEglInitialization disabled, application will use software renderer.
For some applications it can cause worse rendering performance.

Another update, everything works fine by setting AllowEglInitialization = True and IRenderTimer to UiThreadRenderTimer. Probably ANGLE allows access to memory only to the Thread that created the context.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

GitHubington picture GitHubington  路  3Comments

maxkatz6 picture maxkatz6  路  3Comments

kekekeks picture kekekeks  路  4Comments

MiKaMaru picture MiKaMaru  路  4Comments

MarchingCube picture MarchingCube  路  4Comments