Update SKSurface every host UI cycle

This commit is contained in:
Yoshi Askharoun
2021-10-08 13:47:22 -05:00
parent 68a7919f49
commit efb5ef6dca
7 changed files with 75 additions and 28 deletions
@@ -35,7 +35,7 @@ namespace Microsoft.Iris.Render.Graphics
private bool m_fBeginCaptureBackBuffer; private bool m_fBeginCaptureBackBuffer;
private bool m_fEndCaptureBackBuffer; private bool m_fEndCaptureBackBuffer;
internal GraphicsDevice(RenderSession session, string stDisplayName) internal GraphicsDevice(RenderSession session, string stDisplayName) : base(session.EngineInfo)
{ {
this.m_session = session; this.m_session = session;
this.m_stDisplayName = stDisplayName; this.m_stDisplayName = stDisplayName;
@@ -138,7 +138,9 @@ namespace Microsoft.Iris.Render.Graphics
internal virtual void CreateVideoPoolWorker(object oSurfacePool, object oHandle) => Debug2.Validate(false, null, "GraphicsDevice type does not support Video Pool"); internal virtual void CreateVideoPoolWorker(object oSurfacePool, object oHandle) => Debug2.Validate(false, null, "GraphicsDevice type does not support Video Pool");
[Obsolete]
internal void RegisterWindow(RenderWindow win) => this.m_trackerWindows.AddObject(win); internal void RegisterWindow(RenderWindow win) => this.m_trackerWindows.AddObject(win);
internal void RegisterWindow(RenderWindowBase win) => this.m_trackerWindows.AddObject(win);
public virtual bool CanPlayAnimationType(AnimationInputType type) => false; public virtual bool CanPlayAnimationType(AnimationInputType type) => false;
@@ -215,6 +217,11 @@ namespace Microsoft.Iris.Render.Graphics
public virtual void RenderNowIfPossible() public virtual void RenderNowIfPossible()
{ {
RenderWindowBase window = (RenderWindowBase)m_trackerWindows.LiveObjects[0];
window.RunOnUI(() =>
{
System.Diagnostics.Debug.WriteLine(EngineInfo.Surface);
});
} }
public void BeginCaptureBackBuffer(string stFileName) public void BeginCaptureBackBuffer(string stFileName)
@@ -976,6 +976,11 @@ namespace Microsoft.Iris.Render.Internal
m_remoteWindow.SendSetCursors(cursor1.ResourceId, cursor3.ResourceId); m_remoteWindow.SendSetCursors(cursor1.ResourceId, cursor3.ResourceId);
} }
public override void RunOnUI(Action action)
{
throw new NotImplementedException();
}
public bool IsPreProcessedInput => m_fPreProcessedInput; public bool IsPreProcessedInput => m_fPreProcessedInput;
public delegate void RendererSuspendedHandler(object sender, RendererSuspendedArgs args); public delegate void RendererSuspendedHandler(object sender, RendererSuspendedArgs args);
@@ -16,7 +16,12 @@ namespace Microsoft.Iris.Render
private SKSurface m_skSurface; private SKSurface m_skSurface;
private ConnectionInfo m_connectionInfo; private ConnectionInfo m_connectionInfo;
public static EngineInfo CreateLocal(SKSurface skSurface, RenderWindowBase renderWindow) => new IrisEngineInfo(skSurface, renderWindow, true); public static EngineInfo CreateLocal(SKSurface skSurface, RenderWindowBase renderWindow)
{
var info = new IrisEngineInfo(skSurface, renderWindow, true);
Current = info;
return info;
}
public static EngineInfo CreateRemote(SKSurface skSurface, RenderWindowBase renderWindow) => new IrisEngineInfo(skSurface, renderWindow, true, TransportProtocol.TCP, "127.0.0.1", false); public static EngineInfo CreateRemote(SKSurface skSurface, RenderWindowBase renderWindow) => new IrisEngineInfo(skSurface, renderWindow, true, TransportProtocol.TCP, "127.0.0.1", false);
@@ -48,5 +53,9 @@ namespace Microsoft.Iris.Render
internal ConnectionInfo ConnectionInfo => this.m_connectionInfo; internal ConnectionInfo ConnectionInfo => this.m_connectionInfo;
internal RenderWindowBase Window => this.m_renderWindow; internal RenderWindowBase Window => this.m_renderWindow;
internal SKSurface Surface => this.m_skSurface; internal SKSurface Surface => this.m_skSurface;
public static IrisEngineInfo Current { get; private set; }
public static void UpdateSurface(SKSurface surface) => Current.m_skSurface = surface;
} }
} }
@@ -21,6 +21,7 @@ namespace Microsoft.Iris.Render
m_session = session; m_session = session;
if (graphicsDeviceType.FulfillsRequirement(GraphicsDeviceType.Skia)) if (graphicsDeviceType.FulfillsRequirement(GraphicsDeviceType.Skia))
m_graphicsDevice = new SkiaGraphicsDevice(session); m_graphicsDevice = new SkiaGraphicsDevice(session);
m_graphicsDevice.RegisterWindow(this);
m_visualRoot = new VisualContainer(true, session, this, new Object(), out var visual); m_visualRoot = new VisualContainer(true, session, this, new Object(), out var visual);
InvokePaint(); InvokePaint();
@@ -103,7 +104,6 @@ namespace Microsoft.Iris.Render
public abstract void Close(FormCloseReason fcrCloseReason); public abstract void Close(FormCloseReason fcrCloseReason);
public abstract IHwndHostWindow CreateHwndHostWindow(); public abstract IHwndHostWindow CreateHwndHostWindow();
public abstract void ForceMouseIdle(bool fIdle); public abstract void ForceMouseIdle(bool fIdle);
public abstract void Initialize();
public abstract void LockMouseActive(bool fActive); public abstract void LockMouseActive(bool fActive);
public abstract void RefreshHitTarget(); public abstract void RefreshHitTarget();
public abstract void Restore(); public abstract void Restore();
@@ -119,6 +119,7 @@ namespace Microsoft.Iris.Render
public abstract void TakeFocus(); public abstract void TakeFocus();
public abstract void TakeForeground(bool fForce); public abstract void TakeForeground(bool fForce);
public abstract void TemporarilyExitExclusiveMode(); public abstract void TemporarilyExitExclusiveMode();
public abstract void RunOnUI(Action action);
protected virtual void OnForwardWndMsg(uint msg, IntPtr wParam, IntPtr lParam) => ForwardMessageEvent?.Invoke(msg, wParam, lParam); protected virtual void OnForwardWndMsg(uint msg, IntPtr wParam, IntPtr lParam) => ForwardMessageEvent?.Invoke(msg, wParam, lParam);
protected virtual void FireLoadEvent() => LoadEvent?.Invoke(); protected virtual void FireLoadEvent() => LoadEvent?.Invoke();
@@ -136,11 +137,16 @@ namespace Microsoft.Iris.Render
protected virtual void OnCloseRequest() => CloseRequestEvent?.Invoke(); protected virtual void OnCloseRequest() => CloseRequestEvent?.Invoke();
protected virtual void OnSetFocus(bool focused) => SetFocusEvent?.Invoke(focused); protected virtual void OnSetFocus(bool focused) => SetFocusEvent?.Invoke(focused);
public virtual void Initialize()
{
}
public virtual void InvokePaint() public virtual void InvokePaint()
{ {
Session?.DeferredInvoke(new DeferredHandler((obj) => Session?.DeferredInvoke(new DeferredHandler((obj) =>
{ {
Debug2.WriteLine(DebugCategory.FormWindow, 0, (string)obj); System.Diagnostics.Debug.WriteLine((string)obj);
}), "Howdy from dispatcher!", DeferredInvokePriority.VisualUpdate); }), "Howdy from dispatcher!", DeferredInvokePriority.VisualUpdate);
return; return;
+25 -21
View File
@@ -3,14 +3,12 @@
using Microsoft.Iris.Input; using Microsoft.Iris.Input;
using Microsoft.Iris.Render.Graphics; using Microsoft.Iris.Render.Graphics;
using Microsoft.Iris.Render.Internal; using Microsoft.Iris.Render.Internal;
using Microsoft.Iris.Library;
using System; using System;
using System.Globalization; using System.Globalization;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using System.Windows.Interop; using System.Windows.Interop;
using System.Windows.Media; using System.Windows.Media;
using WpfCursor = System.Windows.Input.Cursor;
using WpfCursors = System.Windows.Input.Cursors; using WpfCursors = System.Windows.Input.Cursors;
namespace Microsoft.Iris.Render namespace Microsoft.Iris.Render
@@ -187,7 +185,7 @@ namespace Microsoft.Iris.Render
} }
set set
{ {
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() =>
{ {
WpfWindow.Background = new SolidColorBrush(Color.FromArgb( WpfWindow.Background = new SolidColorBrush(Color.FromArgb(
(byte)(value.A * 255), (byte)(value.A * 255),
@@ -203,10 +201,7 @@ namespace Microsoft.Iris.Render
get get
{ {
bool drop = false; bool drop = false;
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() => drop = WpfWindow.AllowDrop);
{
drop = WpfWindow.AllowDrop;
});
return drop; return drop;
} }
set => WpfWindow.AllowDrop = true; set => WpfWindow.AllowDrop = true;
@@ -219,7 +214,7 @@ namespace Microsoft.Iris.Render
set set
{ {
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() =>
{ {
isFullscreen = value; isFullscreen = value;
if (isFullscreen) if (isFullscreen)
@@ -322,7 +317,7 @@ namespace Microsoft.Iris.Render
public override void ClientToScreen(ref Point point) public override void ClientToScreen(ref Point point)
{ {
var locPoint = point; var locPoint = point;
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() =>
{ {
var p = WpfWindow.PointToScreen(new System.Windows.Point(locPoint.X, locPoint.Y)); var p = WpfWindow.PointToScreen(new System.Windows.Point(locPoint.X, locPoint.Y));
locPoint = new Point((int)p.X, (int)p.Y); locPoint = new Point((int)p.X, (int)p.Y);
@@ -332,10 +327,7 @@ namespace Microsoft.Iris.Render
public override void Close(FormCloseReason fcrCloseReason) public override void Close(FormCloseReason fcrCloseReason)
{ {
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() => WpfWindow.Close());
{
WpfWindow.Close();
});
} }
public override IHwndHostWindow CreateHwndHostWindow() public override IHwndHostWindow CreateHwndHostWindow()
@@ -350,7 +342,14 @@ namespace Microsoft.Iris.Render
public override void Initialize() public override void Initialize()
{ {
base.Initialize();
var timer = new System.Timers.Timer(10);
timer.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) =>
{
//Iris.Session.UIDispatcher.Post(Iris.Session.DispatchPriority.Render, new Queues.QueueItem());
};
timer.Start();
} }
public override void LockMouseActive(bool fActive) public override void LockMouseActive(bool fActive)
@@ -360,12 +359,12 @@ namespace Microsoft.Iris.Render
public override void RefreshHitTarget() public override void RefreshHitTarget()
{ {
throw new NotImplementedException();
} }
public override void Restore() public override void Restore()
{ {
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() =>
{ {
WpfWindow.WindowState = System.Windows.WindowState.Normal; WpfWindow.WindowState = System.Windows.WindowState.Normal;
}); });
@@ -374,7 +373,7 @@ namespace Microsoft.Iris.Render
public override void ScreenToClient(ref Point point) public override void ScreenToClient(ref Point point)
{ {
var locPoint = point; var locPoint = point;
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() =>
{ {
var p = WpfWindow.PointFromScreen(new System.Windows.Point(locPoint.X, locPoint.Y)); var p = WpfWindow.PointFromScreen(new System.Windows.Point(locPoint.X, locPoint.Y));
locPoint = new Point((int)p.X, (int)p.Y); locPoint = new Point((int)p.X, (int)p.Y);
@@ -384,7 +383,7 @@ namespace Microsoft.Iris.Render
public override void SetCapture(IRawInputSite captureSite, bool state) public override void SetCapture(IRawInputSite captureSite, bool state)
{ {
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() =>
{ {
if (state) if (state)
WpfWindow.CaptureMouse(); WpfWindow.CaptureMouse();
@@ -405,7 +404,7 @@ namespace Microsoft.Iris.Render
public override void SetIcon(string sModuleName, uint nResourceID, IconFlags nOptions) public override void SetIcon(string sModuleName, uint nResourceID, IconFlags nOptions)
{ {
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() =>
{ {
WpfWindow.Icon = new System.Windows.Media.Imaging.BitmapImage(new Uri(sModuleName)); WpfWindow.Icon = new System.Windows.Media.Imaging.BitmapImage(new Uri(sModuleName));
}); });
@@ -418,7 +417,7 @@ namespace Microsoft.Iris.Render
public override void SetWindowOptions(WindowOptions options, bool enable) public override void SetWindowOptions(WindowOptions options, bool enable)
{ {
WpfWindow.Dispatcher.Invoke(() => RunOnUI(() =>
{ {
if (options.HasFlag(WindowOptions.FreeformResize)) if (options.HasFlag(WindowOptions.FreeformResize))
WpfWindow.ResizeMode = enable ? ResizeMode.CanResize : ResizeMode.NoResize; WpfWindow.ResizeMode = enable ? ResizeMode.CanResize : ResizeMode.NoResize;
@@ -427,12 +426,12 @@ namespace Microsoft.Iris.Render
}); });
} }
public override void TakeFocus() => WpfWindow.Focus(); public override void TakeFocus() => RunOnUI(() => WpfWindow.Focus());
public override void TakeForeground(bool fForce) public override void TakeForeground(bool fForce)
{ {
if (fForce) if (fForce)
WpfWindow.Activate(); RunOnUI(() => WpfWindow.Activate());
} }
public override void TemporarilyExitExclusiveMode() public override void TemporarilyExitExclusiveMode()
@@ -443,6 +442,11 @@ namespace Microsoft.Iris.Render
public override void SetCurrentDisplay(IDisplay inputIDisplay) => CurrentDisplay = inputIDisplay; public override void SetCurrentDisplay(IDisplay inputIDisplay) => CurrentDisplay = inputIDisplay;
public override void SetFullScreenExclusive(bool fNewValue) => FullScreenExclusive = fNewValue; public override void SetFullScreenExclusive(bool fNewValue) => FullScreenExclusive = fNewValue;
public override void RunOnUI(Action action)
{
WpfWindow.Dispatcher.Invoke(action);
}
} }
} }
@@ -304,6 +304,11 @@ namespace Microsoft.Iris.Render
public override void SetCurrentDisplay(IDisplay inputIDisplay) => CurrentDisplay = inputIDisplay; public override void SetCurrentDisplay(IDisplay inputIDisplay) => CurrentDisplay = inputIDisplay;
public override void SetFullScreenExclusive(bool fNewValue) => FullScreenExclusive = fNewValue; public override void SetFullScreenExclusive(bool fNewValue) => FullScreenExclusive = fNewValue;
public override async void RunOnUI(Action action)
{
await XamlWindow.Dispatcher.RunAsync(CoreDispatcherPriority.High, new DispatchedHandler(action));
}
} }
} }
+12 -1
View File
@@ -33,6 +33,8 @@ namespace Xune.Wpf
if (irisInitTask != null || Microsoft.Iris.Application.IsInitialized || Microsoft.Iris.Application.IsInitializing) if (irisInitTask != null || Microsoft.Iris.Application.IsInitialized || Microsoft.Iris.Application.IsInitializing)
{ {
Canvas.PaintSurface -= Canvas_InitPaintSurface; Canvas.PaintSurface -= Canvas_InitPaintSurface;
Canvas.PaintSurface += Canvas_PaintSurface;
Canvas.InvalidateMeasure();
return; return;
} }
@@ -41,13 +43,22 @@ namespace Xune.Wpf
irisInitTask.Start(); irisInitTask.Start();
} }
private void Canvas_PaintSurface(object sender, SKPaintSurfaceEventArgs e)
{
//System.Diagnostics.Debug.WriteLine("Canvas invalidated");
IrisEngineInfo.UpdateSurface(e.Surface);
Canvas.InvalidateMeasure();
}
private void Init() private void Init()
{ {
Microsoft.Iris.Application.Initialize(Surface, IrisWindow); Microsoft.Iris.Application.Initialize(Surface, IrisWindow);
string pageUixPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, string pageUixPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,
"Pages", "Home.uix"); "Pages", "Home.uix");
Microsoft.Iris.Application.LoadMarkup("file://" + pageUixPath); string uiName = "Default";
//Microsoft.Iris.Application.LoadMarkup("file://" + pageUixPath);
Microsoft.Iris.Application.Window.RequestLoad("file://" + pageUixPath);
Microsoft.Iris.Application.Run(new Microsoft.Iris.DeferredInvokeHandler((obj) => System.Diagnostics.Debug.WriteLine("Init done: {0}", obj))); Microsoft.Iris.Application.Run(new Microsoft.Iris.DeferredInvokeHandler((obj) => System.Diagnostics.Debug.WriteLine("Init done: {0}", obj)));
} }