示例#1
0
 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);
 }
示例#2
0
        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
                });
            }
        }
示例#3
0
 public AngleWin32EglDisplay(EglInterface egl) : this(egl, CreateAngleDisplay(egl))
 {
 }
示例#4
0
 private AngleWin32EglDisplay(EglInterface egl, AngleInfo info) : base(egl, info.Display)
 {
     PlatformApi = info.PlatformApi;
 }