using System.Runtime.CompilerServices; using TerraFX.Interop.Windows; namespace Ghost.Graphics.D3D12.Utilities; internal unsafe static class Win32Utility { public static void ThrowIfFailed(this HRESULT hr) { Windows.ThrowIfFailed(hr); } public static void** GetVoidAddressOf(this ComPtr comPtr) where T : unmanaged, IUnknown.Interface { return (void**)comPtr.GetAddressOf(); } public static void** ReleaseAndGetVoidAddressOf(this ComPtr comPtr) where T : unmanaged, IUnknown.Interface { return (void**)comPtr.ReleaseAndGetAddressOf(); } public static ComPtr Move(this ComPtr comPtr) where T : unmanaged, IUnknown.Interface { ComPtr copy = default; Unsafe.AsRef(in comPtr).Swap(ref copy); return copy; } public static bool HasFlag(this uint flags, T flag) where T : Enum { return (flags & Unsafe.As(ref flag)) != 0; } }