#pragma once #include extern "C" { HRESULT __stdcall CreateDirect3D11DeviceFromDXGIDevice(::IDXGIDevice* dxgiDevice, ::IInspectable** graphicsDevice); HRESULT __stdcall CreateDirect3D11SurfaceFromDXGISurface(::IDXGISurface* dgxiSurface, ::IInspectable** graphicsSurface); } struct __declspec(uuid("A9B3D012-3DF2-4EE3-B8D1-8695F457D3C1")) IDirect3DDxgiInterfaceAccess : ::IUnknown { virtual HRESULT __stdcall GetInterface(GUID const& id, void** object) = 0; }; inline auto CreateDirect3DDevice(IDXGIDevice* dxgi_device) { winrt::com_ptr<::IInspectable> d3d_device; winrt::check_hresult(CreateDirect3D11DeviceFromDXGIDevice(dxgi_device, d3d_device.put())); return d3d_device.as(); } inline auto CreateDirect3DSurface(IDXGISurface* dxgi_surface) { winrt::com_ptr<::IInspectable> d3d_surface; winrt::check_hresult(CreateDirect3D11SurfaceFromDXGISurface(dxgi_surface, d3d_surface.put())); return d3d_surface.as(); } template auto GetDXGIInterfaceFromObject(winrt::Windows::Foundation::IInspectable const& object) { auto access = object.as(); winrt::com_ptr result; winrt::check_hresult(access->GetInterface(winrt::guid_of(), result.put_void())); return result; }