public IntPtr GetDirect3DDevice() { if (!EglInterface.QueryDisplayAttribExt(Handle, EglConsts.EGL_DEVICE_EXT, out var eglDevice)) { throw new OpenGlException("Unable to get EGL_DEVICE_EXT"); } if (!EglInterface.QueryDeviceAttribExt(eglDevice, PlatformApi == AngleOptions.PlatformApi.DirectX9 ? EGL_D3D9_DEVICE_ANGLE : EGL_D3D11_DEVICE_ANGLE, out var d3dDeviceHandle)) { throw new OpenGlException("Unable to get EGL_D3D9_DEVICE_ANGLE"); } return(d3dDeviceHandle); }
static AngleInfo CreateAngleDisplay(EglInterface _egl) { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { throw new PlatformNotSupportedException(); } var display = IntPtr.Zero; AngleOptions.PlatformApi angleApi = default; { if (_egl.GetPlatformDisplayEXT == null) { throw new OpenGlException("eglGetPlatformDisplayEXT is not supported by libegl.dll"); } var allowedApis = AvaloniaLocator.Current.GetService <AngleOptions>()?.AllowedPlatformApis ?? new [] { AngleOptions.PlatformApi.DirectX11, AngleOptions.PlatformApi.DirectX9 }; foreach (var platformApi in allowedApis) { int dapi; if (platformApi == AngleOptions.PlatformApi.DirectX9) { dapi = EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE; } else if (platformApi == AngleOptions.PlatformApi.DirectX11) { dapi = EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE; } else { continue; } display = _egl.GetPlatformDisplayEXT(EGL_PLATFORM_ANGLE_ANGLE, IntPtr.Zero, new[] { EGL_PLATFORM_ANGLE_TYPE_ANGLE, dapi, EGL_NONE }); if (display != IntPtr.Zero) { angleApi = platformApi; break; } } if (display == IntPtr.Zero) { throw new OpenGlException("Unable to create ANGLE display"); } return(new AngleInfo { Display = display, PlatformApi = angleApi }); } }
public AngleWin32EglDisplay(EglInterface egl) : this(egl, CreateAngleDisplay(egl)) { }
private AngleWin32EglDisplay(EglInterface egl, AngleInfo info) : base(egl, info.Display) { PlatformApi = info.PlatformApi; }