Browse Source

make begindraw work.

tmp-winuicomp_with_manual_fbo
Dan Walmsley 6 years ago
parent
commit
203e346a4d
  1. 96
      src/Windows/Avalonia.Win32/Composition/CompositionHost.cs
  2. 45
      src/Windows/Avalonia.Win32/Composition/ICompositionDrawingSurfaceInterop.cs

96
src/Windows/Avalonia.Win32/Composition/CompositionHost.cs

@ -28,36 +28,99 @@ namespace Avalonia.Win32
}
public override IGlPlatformSurfaceRenderTarget CreateGlRenderTarget()
{
var glSurface = _display.CreateWindowSurface(_info.Handle);
return new CompositionRenderTarget(_display, _context, glSurface, _surfaceInterop, _info);
{
return new CompositionRenderTarget(_display, _context, _surfaceInterop, _info);
}
class CompositionRenderTarget : EglPlatformSurfaceRenderTargetBase
{
private readonly EglDisplay _display;
private readonly EglContext _context;
private readonly EglSurface _glSurface;
private readonly EglContext _context;
private readonly IEglWindowGlPlatformSurfaceInfo _info;
private PixelSize _initialSize;
private readonly ICompositionDrawingSurfaceInterop _surfaceInterop;
public CompositionRenderTarget(EglDisplay display, EglContext context,
EglSurface glSurface, ICompositionDrawingSurfaceInterop interopSurface, IEglWindowGlPlatformSurfaceInfo info) : base(display, context)
public CompositionRenderTarget(EglDisplay display, EglContext context, ICompositionDrawingSurfaceInterop interopSurface, IEglWindowGlPlatformSurfaceInfo info) : base(display, context)
{
_display = display;
_context = context;
_glSurface = glSurface;
_context = context;
_surfaceInterop = interopSurface;
_info = info;
_initialSize = info.Size;
}
public override void Dispose() => _glSurface.Dispose();
public override bool IsCorrupted => _initialSize != _info.Size;
public override IGlPlatformSurfaceRenderingSession BeginDraw()
{
var l = _context.Lock();
var iid = Guid.Parse("6f15aaf2-d208-4e89-9ab4-489535d34f9c");
var updateRect = new RECT { right = _info.Size.Width, bottom = _info.Size.Height };
var offset = new POINT();
_surfaceInterop.Resize(new POINT { X = _info.Size.Width, Y = _info.Size.Height });
_surfaceInterop.BeginDraw(
ref updateRect,
ref iid,
out IntPtr texture, ref offset);
public override bool IsCorrupted => _initialSize != _info.Size;
var surface = (_display as AngleWin32EglDisplay).WrapDirect3D11Texture(texture);
public override IGlPlatformSurfaceRenderingSession BeginDraw() => base.BeginDraw(_glSurface, _info);
var restoreContext = _context.MakeCurrent(surface);
return new Session(_display, _context, null, _info, l, restoreContext, () => { }, true);
}
public override void Dispose()
{
_surfaceInterop.EndDraw();
base.Dispose();
}
}
class Session : IGlPlatformSurfaceRenderingSession
{
private readonly EglContext _context;
private readonly EglSurface _glSurface;
private readonly EglGlPlatformSurfaceBase.IEglWindowGlPlatformSurfaceInfo _info;
private readonly EglDisplay _display;
private readonly IDisposable _lock;
private readonly IDisposable _restoreContext;
private readonly Action _onFinish;
public Session(EglDisplay display, EglContext context,
EglSurface glSurface, EglGlPlatformSurfaceBase.IEglWindowGlPlatformSurfaceInfo info,
IDisposable @lock, IDisposable restoreContext, Action onFinish, bool isYFlipped)
{
IsYFlipped = isYFlipped;
_context = context;
_display = display;
_glSurface = glSurface;
_info = info;
_lock = @lock;
_restoreContext = restoreContext;
_onFinish = onFinish;
}
public void Dispose()
{
_context.GlInterface.Flush();
_display.EglInterface.WaitGL();
_glSurface?.SwapBuffers();
_display.EglInterface.WaitClient();
_display.EglInterface.WaitGL();
_display.EglInterface.WaitNative(EglConsts.EGL_CORE_NATIVE_ENGINE);
_restoreContext.Dispose();
_lock.Dispose();
_onFinish?.Invoke();
}
public IGlContext Context => _context;
public PixelSize Size => _info.Size;
public double Scaling => _info.Scaling;
public bool IsYFlipped { get; }
}
}
@ -146,12 +209,11 @@ namespace Avalonia.Win32
var gDevice = interop.CreateGraphicsDevice(display.GetDirect3DDevice());
var surface = gDevice.CreateDrawingSurface(new Windows.Foundation.Size(100, 100), Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalized, Windows.Graphics.DirectX.DirectXAlphaMode.Premultiplied);
var surfaceInterop = surface.As<ICompositionDrawingSurfaceInterop>();
var surface = gDevice.CreateDrawingSurface(new Windows.Foundation.Size(100, 100),
Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalized,
Windows.Graphics.DirectX.DirectXAlphaMode.Premultiplied);
//surfaceInterop.BeginDraw(new Windows.Foundation.Rect(0, 0, 100, 100), Guid.Parse("6f15aaf2-d208-4e89-9ab4-489535d34f9c"), out var texture, new Windows.Foundation.Point(0, 0));
//surfaceInterop.EndDraw();
var surfaceInterop = surface.As<ICompositionDrawingSurfaceInterop>();
var brush = _compositor.CreateSurfaceBrush(surface);

45
src/Windows/Avalonia.Win32/Composition/ICompositionDrawingSurfaceInterop.cs

@ -1,23 +1,39 @@
using System;
using System.Runtime.InteropServices;
using Windows.Foundation;
using WinRT;
namespace Windows.UI.Composition.Interop
{
public struct POINT
{
public int X;
public int Y;
}
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
public int Width => right - left;
public int Height => bottom - top;
}
[WindowsRuntimeType]
[Guid("FD04E6E3-FE0C-4C3C-AB19-A07601A576EE")]
public interface ICompositionDrawingSurfaceInterop
{
void BeginDraw(Rect updateRect, Guid iid, out IntPtr updateObject, Point point);
void BeginDraw(ref RECT updateRect, ref Guid iid, out IntPtr updateObject, ref POINT point);
void EndDraw();
void Resize(Size sizePixels);
void Resize(POINT sizePixels);
void ResumeDraw();
void Scroll(Rect scrollRect, Rect clipRect, int offsetX, int offsetY);
void Scroll(RECT scrollRect, RECT clipRect, int offsetX, int offsetY);
void SuspendDraw();
}
@ -28,6 +44,7 @@ namespace ABI.Windows.UI.Composition.Interop
using global::System;
using global::System.Runtime.InteropServices;
using global::Windows.UI.Composition;
using global::Windows.UI.Composition.Interop;
[Guid("FD04E6E3-FE0C-4C3C-AB19-A07601A576EE")]
internal class ICompositionDrawingSurfaceInterop : global::Windows.UI.Composition.Interop.ICompositionDrawingSurfaceInterop
@ -36,11 +53,11 @@ namespace ABI.Windows.UI.Composition.Interop
[Guid("FD04E6E3-FE0C-4C3C-AB19-A07601A576EE")]
public struct Vftbl
{
public delegate int _BeginDraw(IntPtr ThisPtr, Guid iid, out IntPtr updateObject, Point updateOffset);
public delegate int _BeginDraw(IntPtr ThisPtr, ref RECT updateRect, ref Guid iid, out IntPtr updateObject, ref POINT updateOffset);
public delegate int _EndDraw(IntPtr ThisPtr);
public delegate int _Resize(IntPtr ThisPtr, Size sizePixels);
public delegate int _Resize(IntPtr ThisPtr, POINT sizePixels);
public delegate int _ResumeDraw(IntPtr ThisPtr);
public delegate int _Scroll(IntPtr ThisPtr, Rect scrollRect, Rect clipRect, int offsetX, int offsetY);
public delegate int _Scroll(IntPtr ThisPtr, RECT scrollRect, RECT clipRect, int offsetX, int offsetY);
public delegate int _SuspendDraw(IntPtr ThisPtr);
internal global::WinRT.Interop.IUnknownVftbl IUnknownVftbl;
@ -70,7 +87,7 @@ namespace ABI.Windows.UI.Composition.Interop
Marshal.StructureToPtr(AbiToProjectionVftable, AbiToProjectionVftablePtr, false);
}
private static int Do_Abi_BeginDraw(IntPtr ThisPtr, Guid iid, out IntPtr updateObject, Point updateOffset)
private static int Do_Abi_BeginDraw(IntPtr ThisPtr, ref RECT updateRect, ref Guid iid, out IntPtr updateObject, ref POINT updateOffset)
{
updateObject = IntPtr.Zero;
return 0;
@ -81,7 +98,7 @@ namespace ABI.Windows.UI.Composition.Interop
return 0;
}
private static int Do_Abi_Resize(IntPtr ThisPtr, Size sizePixels)
private static int Do_Abi_Resize(IntPtr ThisPtr, POINT sizePixels)
{
return 0;
}
@ -101,9 +118,9 @@ namespace ABI.Windows.UI.Composition.Interop
_obj = obj;
}
public void BeginDraw(Rect updateRect, Guid iid, out IntPtr updateObject, Point point)
public void BeginDraw(ref RECT updateRect, ref Guid iid, out IntPtr updateObject, ref POINT point)
{
Marshal.ThrowExceptionForHR(_obj.Vftbl.BeginDraw(ThisPtr, iid, out updateObject, point));
Marshal.ThrowExceptionForHR(_obj.Vftbl.BeginDraw(ThisPtr, ref updateRect, ref iid, out updateObject, ref point));
}
public void EndDraw()
@ -111,9 +128,9 @@ namespace ABI.Windows.UI.Composition.Interop
Marshal.ThrowExceptionForHR(_obj.Vftbl.EndDraw(ThisPtr));
}
public void Resize(Size sizePixels)
public void Resize(POINT sizePixels)
{
throw new NotImplementedException();
Marshal.ThrowExceptionForHR(_obj.Vftbl.Resize(ThisPtr, sizePixels));
}
public void ResumeDraw()
@ -121,7 +138,7 @@ namespace ABI.Windows.UI.Composition.Interop
throw new NotImplementedException();
}
public void Scroll(Rect scrollRect, Rect clipRect, int offsetX, int offsetY)
public void Scroll(RECT scrollRect, RECT clipRect, int offsetX, int offsetY)
{
throw new NotImplementedException();
}

Loading…
Cancel
Save