diff --git a/src/ComputeSharp.UI/ComputeSharp.UI.projitems b/src/ComputeSharp.UI/ComputeSharp.UI.projitems index aa0cebec5..5d500adc7 100644 --- a/src/ComputeSharp.UI/ComputeSharp.UI.projitems +++ b/src/ComputeSharp.UI/ComputeSharp.UI.projitems @@ -17,7 +17,7 @@ - + diff --git a/src/ComputeSharp.UI/Helpers/SwapChainManager.IID.cs b/src/ComputeSharp.UI/Helpers/SwapChainManager.IID.cs deleted file mode 100644 index b9e9fdf8f..000000000 --- a/src/ComputeSharp.UI/Helpers/SwapChainManager.IID.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -#if WINDOWS_UWP -namespace ComputeSharp.Uwp.Helpers; -#else -namespace ComputeSharp.WinUI.Helpers; -#endif - -/// -partial class SwapChainManager -{ - /// - /// Gets the IID of . - /// - private static unsafe Guid* IID_ISwapChainPanelNative - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - ReadOnlySpan data = - [ -#if WINDOWS_UWP - 0xD2, 0x19, 0x2F, 0xF9, - 0xDE, 0x3A, - 0xA6, 0x45, - 0xA2, - 0x0C, - 0xF6, - 0xF1, - 0xEA, - 0x90, - 0x55, - 0x4B -#else - 0xB8, 0xD0, 0xAA, 0x63, - 0x24, 0x7C, - 0xFF, 0x40, - 0x85, - 0xA8, - 0x64, - 0x0D, - 0x94, - 0x4C, - 0xC3, - 0x25 -#endif - ]; - - return (Guid*)Unsafe.AsPointer(ref MemoryMarshal.GetReference(data)); - } - } -} \ No newline at end of file diff --git a/src/ComputeSharp.UI/Helpers/SwapChainManager.cs b/src/ComputeSharp.UI/Helpers/SwapChainManager.cs index c160c7e8c..c999eebd1 100644 --- a/src/ComputeSharp.UI/Helpers/SwapChainManager.cs +++ b/src/ComputeSharp.UI/Helpers/SwapChainManager.cs @@ -20,7 +20,6 @@ using Windows.System; using Windows.UI.Xaml.Controls; #endif -using WinRT; #if WINDOWS_UWP namespace ComputeSharp.Uwp.Helpers; @@ -233,7 +232,7 @@ public SwapChainManager(TOwner owner, GraphicsDevice device) // IDXGISwapChain reference just created and set that as the swap chain panel to use. fixed (ISwapChainPanelNative** swapChainPanelNative = this.swapChainPanelNative) { - ((IWinRTObject)owner).NativeObject.TryAs(*IID_ISwapChainPanelNative, out *(nint*)swapChainPanelNative).Assert(); + SwapChainPanelNativeMarshaller.GetNativeObject(owner, swapChainPanelNative); } // Get the underlying ID3D12Device in use diff --git a/src/ComputeSharp.UI/Helpers/SwapChainPanelNativeMarshaller.cs b/src/ComputeSharp.UI/Helpers/SwapChainPanelNativeMarshaller.cs new file mode 100644 index 000000000..12315dc89 --- /dev/null +++ b/src/ComputeSharp.UI/Helpers/SwapChainPanelNativeMarshaller.cs @@ -0,0 +1,68 @@ +using System; +using System.Runtime.CompilerServices; +using ComputeSharp.Core.Extensions; +using ComputeSharp.Win32; +#if !WINDOWS_UWP +using Microsoft.UI.Xaml.Controls; +#endif +using System.Runtime.InteropServices; +#if WINDOWS_UWP +using Windows.UI.Xaml.Controls; +#endif +using WinRT; + +#if WINDOWS_UWP +namespace ComputeSharp.Uwp.Helpers; +#else +namespace ComputeSharp.WinUI.Helpers; +#endif + +/// +/// A helper type to handle marshalling objects for native interop. +/// +internal static unsafe class SwapChainPanelNativeMarshaller +{ + /// + /// Retrieves the underlying object for an input instance. + /// + /// The input instance to unwrap. + /// A pointer to the resulting object to retrieve. + public static void GetNativeObject(SwapChainPanel managedObject, ISwapChainPanelNative** nativeObject) + { +#if WINDOWS_UWP + ReadOnlySpan data = + [ + 0xD2, 0x19, 0x2F, 0xF9, + 0xDE, 0x3A, + 0xA6, 0x45, + 0xA2, + 0x0C, + 0xF6, + 0xF1, + 0xEA, + 0x90, + 0x55, + 0x4B + ]; +#else + ReadOnlySpan data = + [ + 0xB8, 0xD0, 0xAA, 0x63, + 0x24, 0x7C, + 0xFF, 0x40, + 0x85, + 0xA8, + 0x64, + 0x0D, + 0x94, + 0x4C, + 0xC3, + 0x25 + ]; +#endif + // Unwrap and get the 'ISwapChainPanelNative' interface with the right IID depending on the UI framework + ((IWinRTObject)managedObject).NativeObject.TryAs( + iid: Unsafe.As(ref MemoryMarshal.GetReference(data)), + ppv: out *(nint*)nativeObject).Assert(); + } +} \ No newline at end of file