Browse Source

code tidy.

tmp-winuicomp_with_manual_fbo
Dan Walmsley 6 years ago
parent
commit
8913cea89e
  1. 15
      src/Windows/Avalonia.Win32/Composition/CompositionEglGlPlatformSurface.cs
  2. 42
      src/Windows/Avalonia.Win32/Composition/CompositionHost.cs

15
src/Windows/Avalonia.Win32/Composition/CompositionEglGlPlatformSurface.cs

@ -27,7 +27,7 @@ namespace Avalonia.Win32
} }
public override IGlPlatformSurfaceRenderTarget CreateGlRenderTarget() public override IGlPlatformSurfaceRenderTarget CreateGlRenderTarget()
{ {
return new CompositionRenderTarget(_display, _context, _surface, _surfaceInterop, _info); return new CompositionRenderTarget(_display, _context, _surface, _surfaceInterop, _info);
} }
@ -40,11 +40,11 @@ namespace Avalonia.Win32
private static Guid s_Iid = Guid.Parse("6f15aaf2-d208-4e89-9ab4-489535d34f9c"); private static Guid s_Iid = Guid.Parse("6f15aaf2-d208-4e89-9ab4-489535d34f9c");
private Windows.UI.Composition.Visual _compositionVisual; private Windows.UI.Composition.Visual _compositionVisual;
public CompositionRenderTarget(EglDisplay display, public CompositionRenderTarget(EglDisplay display,
EglContext context, EglContext context,
Windows.UI.Composition.Visual compositionVisual, Windows.UI.Composition.Visual compositionVisual,
ICompositionDrawingSurfaceInterop interopSurface, ICompositionDrawingSurfaceInterop interopSurface,
IEglWindowGlPlatformSurfaceInfo info) IEglWindowGlPlatformSurfaceInfo info)
: base(display, context) : base(display, context)
{ {
_display = display; _display = display;
@ -53,6 +53,7 @@ namespace Avalonia.Win32
_initialSize = info.Size; _initialSize = info.Size;
_compositionVisual = compositionVisual; _compositionVisual = compositionVisual;
_surfaceInterop.Resize(new POINT { X = _info.Size.Width, Y = _info.Size.Height }); _surfaceInterop.Resize(new POINT { X = _info.Size.Width, Y = _info.Size.Height });
_compositionVisual.Size = new System.Numerics.Vector2(_info.Size.Width, _info.Size.Height);
} }
public override bool IsCorrupted => _initialSize != _info.Size; public override bool IsCorrupted => _initialSize != _info.Size;
@ -67,7 +68,7 @@ namespace Avalonia.Win32
var surface = (_display as AngleWin32EglDisplay).WrapDirect3D11Texture(texture, offset.X, offset.Y, _info.Size.Width, _info.Size.Height); var surface = (_display as AngleWin32EglDisplay).WrapDirect3D11Texture(texture, offset.X, offset.Y, _info.Size.Width, _info.Size.Height);
return base.BeginDraw(surface, _info, () => { _surfaceInterop.EndDraw(); Marshal.Release(texture); surface.Dispose(); _compositionVisual.Size = new System.Numerics.Vector2(_info.Size.Width, _info.Size.Height); }, true); return base.BeginDraw(surface, _info, () => { _surfaceInterop.EndDraw(); Marshal.Release(texture); surface.Dispose(); }, true);
} }
} }
} }

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

@ -48,41 +48,13 @@ namespace Avalonia.Win32
Initialize(); Initialize();
} }
public void AddElement(CompositionTarget target, float size, float x, float y)
{
if (target.Root != null)
{
var visuals = target.Root.As<ContainerVisual>().Children;
var visual = _compositor.CreateSpriteVisual();
var element = _compositor.CreateSpriteVisual();
var rand = new Random();
element.Brush = _compositor.CreateColorBrush(new Windows.UI.Color { A = 255, R = (byte)(rand.NextDouble() * 255), G = (byte)(rand.NextDouble() * 255), B = (byte)(rand.NextDouble() * 255) });
element.Size = new System.Numerics.Vector2(size, size);
element.Offset = new System.Numerics.Vector3(x, y, 0.0f);
var animation = _compositor.CreateVector3KeyFrameAnimation();
var bottom = (float)600 - element.Size.Y;
animation.InsertKeyFrame(1, new System.Numerics.Vector3(element.Offset.X, bottom, 0));
animation.Duration = TimeSpan.FromSeconds(2);
animation.DelayTime = TimeSpan.FromSeconds(3);
element.StartAnimation("Offset", animation);
visuals.InsertAtTop(element);
visuals.InsertAtTop(visual);
}
}
private void Initialize() private void Initialize()
{ {
EnsureDispatcherQueue(); EnsureDispatcherQueue();
if (_dispatcherQueueController != null) if (_dispatcherQueueController != null)
_compositor = new Windows.UI.Composition.Compositor(); _compositor = new Compositor();
var interop = _compositor.As<Windows.UI.Composition.Interop.ICompositorInterop>(); var interop = _compositor.As<ICompositorInterop>();
var display = Win32GlManager.EglFeature.Display as AngleWin32EglDisplay; var display = Win32GlManager.EglFeature.Display as AngleWin32EglDisplay;
@ -91,19 +63,19 @@ namespace Avalonia.Win32
public ICompositionDrawingSurfaceInterop InitialiseWindowCompositionTree(IntPtr hwnd, out Windows.UI.Composition.Visual surfaceVisual) public ICompositionDrawingSurfaceInterop InitialiseWindowCompositionTree(IntPtr hwnd, out Windows.UI.Composition.Visual surfaceVisual)
{ {
var target = CreateDesktopWindowTarget(hwnd); var target = CreateDesktopWindowTarget(hwnd);
var surface = _graphicsDevice.CreateDrawingSurface(new Windows.Foundation.Size(0, 0), var surface = _graphicsDevice.CreateDrawingSurface(new Windows.Foundation.Size(0, 0),
Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalized, Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalized,
Windows.Graphics.DirectX.DirectXAlphaMode.Premultiplied); Windows.Graphics.DirectX.DirectXAlphaMode.Premultiplied);
var surfaceInterop = surface.As<ICompositionDrawingSurfaceInterop>(); var surfaceInterop = surface.As<ICompositionDrawingSurfaceInterop>();
var brush = _compositor.CreateSurfaceBrush(surface); var brush = _compositor.CreateSurfaceBrush(surface);
var visual = _compositor.CreateSpriteVisual(); var visual = _compositor.CreateSpriteVisual();
visual.Brush = brush; visual.Brush = brush;
visual.Offset = new System.Numerics.Vector3(0, 0, 0); visual.Offset = new System.Numerics.Vector3(0, 0, 0);
target.Root = CreateBlur(); target.Root = CreateBlur();
var visuals = target.Root.As<ContainerVisual>().Children; var visuals = target.Root.As<ContainerVisual>().Children;
@ -139,7 +111,7 @@ namespace Avalonia.Win32
{ {
var interop = _compositor.As<global::Windows.UI.Composition.Desktop.ICompositorDesktopInterop>(); var interop = _compositor.As<global::Windows.UI.Composition.Desktop.ICompositorDesktopInterop>();
interop.CreateDesktopWindowTarget(window, true, out var windowTarget); interop.CreateDesktopWindowTarget(window, false, out var windowTarget);
return Windows.UI.Composition.Desktop.DesktopWindowTarget.FromAbi(windowTarget); return Windows.UI.Composition.Desktop.DesktopWindowTarget.FromAbi(windowTarget);
} }

Loading…
Cancel
Save