Browse Source

Merge pull request #4254 from MarchingCube/fix-fb-crash-zero-size

Fix NREs that occur when rendering to 0x0 framebuffer
pull/4281/head
Dariusz Komosiński 6 years ago
committed by GitHub
parent
commit
00efafcb70
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      src/Shared/PlatformSupport/StandardRuntimePlatform.cs
  2. 20
      src/Windows/Avalonia.Win32/FramebufferManager.cs
  3. 2
      src/Windows/Avalonia.Win32/WindowImpl.cs

10
src/Shared/PlatformSupport/StandardRuntimePlatform.cs

@ -86,11 +86,15 @@ namespace Avalonia.Shared.PlatformSupport
#if DEBUG #if DEBUG
if (Thread.CurrentThread.ManagedThreadId == GCThread?.ManagedThreadId) if (Thread.CurrentThread.ManagedThreadId == GCThread?.ManagedThreadId)
{ {
lock(_lock) lock (_lock)
{
if (!IsDisposed) if (!IsDisposed)
{
Console.Error.WriteLine("Native blob disposal from finalizer thread\nBacktrace: " Console.Error.WriteLine("Native blob disposal from finalizer thread\nBacktrace: "
+ Environment.StackTrace + Environment.StackTrace
+ "\n\nBlob created by " + _backtrace); + "\n\nBlob created by " + _backtrace);
}
}
} }
#endif #endif
DoDispose(); DoDispose();

20
src/Windows/Avalonia.Win32/FramebufferManager.cs

@ -5,7 +5,7 @@ using Avalonia.Win32.Interop;
namespace Avalonia.Win32 namespace Avalonia.Win32
{ {
class FramebufferManager : IFramebufferPlatformSurface class FramebufferManager : IFramebufferPlatformSurface, IDisposable
{ {
private readonly IntPtr _hwnd; private readonly IntPtr _hwnd;
private WindowFramebuffer _fb; private WindowFramebuffer _fb;
@ -17,17 +17,25 @@ namespace Avalonia.Win32
public ILockedFramebuffer Lock() public ILockedFramebuffer Lock()
{ {
UnmanagedMethods.RECT rc; UnmanagedMethods.GetClientRect(_hwnd, out var rc);
UnmanagedMethods.GetClientRect(_hwnd, out rc);
var width = rc.right - rc.left; var width = Math.Max(1, rc.right - rc.left);
var height = rc.bottom - rc.top; var height = Math.Max(1, rc.bottom - rc.top);
if ((_fb == null || _fb.Size.Width != width || _fb.Size.Height != height) && width > 0 && height > 0)
if ((_fb == null || _fb.Size.Width != width || _fb.Size.Height != height))
{ {
_fb?.Deallocate(); _fb?.Deallocate();
_fb = null; _fb = null;
_fb = new WindowFramebuffer(_hwnd, new PixelSize(width, height)); _fb = new WindowFramebuffer(_hwnd, new PixelSize(width, height));
} }
return _fb; return _fb;
} }
public void Dispose()
{
_fb?.Deallocate();
_fb = null;
}
} }
} }

2
src/Windows/Avalonia.Win32/WindowImpl.cs

@ -389,6 +389,8 @@ namespace Avalonia.Win32
UnregisterClass(_className, GetModuleHandle(null)); UnregisterClass(_className, GetModuleHandle(null));
_className = null; _className = null;
} }
_framebuffer.Dispose();
} }
public void Invalidate(Rect rect) public void Invalidate(Rect rect)

Loading…
Cancel
Save