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_fEndCaptureBackBuffer;
internal GraphicsDevice(RenderSession session, string stDisplayName)
internal GraphicsDevice(RenderSession session, string stDisplayName) : base(session.EngineInfo)
{
this.m_session = session;
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");
[Obsolete]
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;
@@ -215,6 +217,11 @@ namespace Microsoft.Iris.Render.Graphics
public virtual void RenderNowIfPossible()
{
RenderWindowBase window = (RenderWindowBase)m_trackerWindows.LiveObjects[0];
window.RunOnUI(() =>
{
System.Diagnostics.Debug.WriteLine(EngineInfo.Surface);
});
}
public void BeginCaptureBackBuffer(string stFileName)
@@ -976,6 +976,11 @@ namespace Microsoft.Iris.Render.Internal
m_remoteWindow.SendSetCursors(cursor1.ResourceId, cursor3.ResourceId);
}
public override void RunOnUI(Action action)
{
throw new NotImplementedException();
}
public bool IsPreProcessedInput => m_fPreProcessedInput;
public delegate void RendererSuspendedHandler(object sender, RendererSuspendedArgs args);
@@ -16,7 +16,12 @@ namespace Microsoft.Iris.Render
private SKSurface m_skSurface;
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);
@@ -48,5 +53,9 @@ namespace Microsoft.Iris.Render
internal ConnectionInfo ConnectionInfo => this.m_connectionInfo;
internal RenderWindowBase Window => this.m_renderWindow;
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;
if (graphicsDeviceType.FulfillsRequirement(GraphicsDeviceType.Skia))
m_graphicsDevice = new SkiaGraphicsDevice(session);
m_graphicsDevice.RegisterWindow(this);
m_visualRoot = new VisualContainer(true, session, this, new Object(), out var visual);
InvokePaint();
@@ -103,7 +104,6 @@ namespace Microsoft.Iris.Render
public abstract void Close(FormCloseReason fcrCloseReason);
public abstract IHwndHostWindow CreateHwndHostWindow();
public abstract void ForceMouseIdle(bool fIdle);
public abstract void Initialize();
public abstract void LockMouseActive(bool fActive);
public abstract void RefreshHitTarget();
public abstract void Restore();
@@ -119,6 +119,7 @@ namespace Microsoft.Iris.Render
public abstract void TakeFocus();
public abstract void TakeForeground(bool fForce);
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 FireLoadEvent() => LoadEvent?.Invoke();
@@ -136,11 +137,16 @@ namespace Microsoft.Iris.Render
protected virtual void OnCloseRequest() => CloseRequestEvent?.Invoke();
protected virtual void OnSetFocus(bool focused) => SetFocusEvent?.Invoke(focused);
public virtual void Initialize()
{
}
public virtual void InvokePaint()
{
Session?.DeferredInvoke(new DeferredHandler((obj) =>
{
Debug2.WriteLine(DebugCategory.FormWindow, 0, (string)obj);
System.Diagnostics.Debug.WriteLine((string)obj);
}), "Howdy from dispatcher!", DeferredInvokePriority.VisualUpdate);
return;
+25 -21
View File
@@ -3,14 +3,12 @@
using Microsoft.Iris.Input;
using Microsoft.Iris.Render.Graphics;
using Microsoft.Iris.Render.Internal;
using Microsoft.Iris.Library;
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interop;
using System.Windows.Media;
using WpfCursor = System.Windows.Input.Cursor;
using WpfCursors = System.Windows.Input.Cursors;
namespace Microsoft.Iris.Render
@@ -187,7 +185,7 @@ namespace Microsoft.Iris.Render
}
set
{
WpfWindow.Dispatcher.Invoke(() =>
RunOnUI(() =>
{
WpfWindow.Background = new SolidColorBrush(Color.FromArgb(
(byte)(value.A * 255),
@@ -203,10 +201,7 @@ namespace Microsoft.Iris.Render
get
{
bool drop = false;
WpfWindow.Dispatcher.Invoke(() =>
{
drop = WpfWindow.AllowDrop;
});
RunOnUI(() => drop = WpfWindow.AllowDrop);
return drop;
}
set => WpfWindow.AllowDrop = true;
@@ -219,7 +214,7 @@ namespace Microsoft.Iris.Render
set
{
WpfWindow.Dispatcher.Invoke(() =>
RunOnUI(() =>
{
isFullscreen = value;
if (isFullscreen)
@@ -322,7 +317,7 @@ namespace Microsoft.Iris.Render
public override void ClientToScreen(ref Point point)
{
var locPoint = point;
WpfWindow.Dispatcher.Invoke(() =>
RunOnUI(() =>
{
var p = WpfWindow.PointToScreen(new System.Windows.Point(locPoint.X, locPoint.Y));
locPoint = new Point((int)p.X, (int)p.Y);
@@ -332,10 +327,7 @@ namespace Microsoft.Iris.Render
public override void Close(FormCloseReason fcrCloseReason)
{
WpfWindow.Dispatcher.Invoke(() =>
{
WpfWindow.Close();
});
RunOnUI(() => WpfWindow.Close());
}
public override IHwndHostWindow CreateHwndHostWindow()
@@ -350,7 +342,14 @@ namespace Microsoft.Iris.Render
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)
@@ -360,12 +359,12 @@ namespace Microsoft.Iris.Render
public override void RefreshHitTarget()
{
throw new NotImplementedException();
}
public override void Restore()
{
WpfWindow.Dispatcher.Invoke(() =>
RunOnUI(() =>
{
WpfWindow.WindowState = System.Windows.WindowState.Normal;
});
@@ -374,7 +373,7 @@ namespace Microsoft.Iris.Render
public override void ScreenToClient(ref Point point)
{
var locPoint = point;
WpfWindow.Dispatcher.Invoke(() =>
RunOnUI(() =>
{
var p = WpfWindow.PointFromScreen(new System.Windows.Point(locPoint.X, locPoint.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)
{
WpfWindow.Dispatcher.Invoke(() =>
RunOnUI(() =>
{
if (state)
WpfWindow.CaptureMouse();
@@ -405,7 +404,7 @@ namespace Microsoft.Iris.Render
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));
});
@@ -418,7 +417,7 @@ namespace Microsoft.Iris.Render
public override void SetWindowOptions(WindowOptions options, bool enable)
{
WpfWindow.Dispatcher.Invoke(() =>
RunOnUI(() =>
{
if (options.HasFlag(WindowOptions.FreeformResize))
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)
{
if (fForce)
WpfWindow.Activate();
RunOnUI(() => WpfWindow.Activate());
}
public override void TemporarilyExitExclusiveMode()
@@ -443,6 +442,11 @@ namespace Microsoft.Iris.Render
public override void SetCurrentDisplay(IDisplay inputIDisplay) => CurrentDisplay = inputIDisplay;
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 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)
{
Canvas.PaintSurface -= Canvas_InitPaintSurface;
Canvas.PaintSurface += Canvas_PaintSurface;
Canvas.InvalidateMeasure();
return;
}
@@ -41,13 +43,22 @@ namespace Xune.Wpf
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()
{
Microsoft.Iris.Application.Initialize(Surface, IrisWindow);
string pageUixPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,
"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)));
}