public void ResetBackBuffer(PresentationParameters presentationParameters,
                             Framework.Graphics.GraphicsAdapter adapter)
 {
     //if (UseFauxBackbuffer(presentationParameters, adapter.CurrentDisplayMode))
     //{
     //	if (Backbuffer is NullBackbuffer)
     //	{
     //		if (!supportsFauxBackbuffer)
     //		{
     //			throw new NoSuitableGraphicsDeviceException(
     //				"Your hardware does not support the faux-backbuffer!" +
     //				"\n\nKeep the window/backbuffer resolution the same."
     //			);
     //		}
     //		Backbuffer = new OpenGLBackbuffer(
     //			this,
     //			presentationParameters.BackBufferWidth,
     //			presentationParameters.BackBufferHeight,
     //			presentationParameters.DepthStencilFormat,
     //			presentationParameters.MultiSampleCount
     //		);
     //	}
     //	else
     //	{
     //		Backbuffer.ResetFramebuffer(
     //			presentationParameters
     //		);
     //	}
     //}
     //else
     //{
     //	if (Backbuffer is OpenGLBackbuffer)
     //	{
     //		(Backbuffer as OpenGLBackbuffer).Dispose();
     //		Backbuffer = new NullBackbuffer(
     //			presentationParameters.BackBufferWidth,
     //			presentationParameters.BackBufferHeight,
     //			windowDepthFormat
     //		);
     //	}
     //	else
     //	{
     //		Backbuffer.ResetFramebuffer(presentationParameters);
     //	}
     //}
 }
        public static Framework.Graphics.GraphicsAdapter[] GetGraphicsAdapters()
        {
            if (_adapters != null)
            {
                return(_adapters);
            }

            _adapters = new Framework.Graphics.GraphicsAdapter[SDL.SDL_GetNumVideoDisplays()];
            for (int i = 0; i < _adapters.Length; i += 1)
            {
                List <DisplayMode> modes = new List <DisplayMode>();
                int numModes             = SDL.SDL_GetNumDisplayModes(i);
                for (int j = numModes - 1; j >= 0; j -= 1)
                {
                    SDL.SDL_GetDisplayMode(i, j, out var filler);

                    // Check for dupes caused by varying refresh rates.
                    bool dupe = false;
                    foreach (DisplayMode mode in modes)
                    {
                        if (filler.w == mode.Width && filler.h == mode.Height)
                        {
                            dupe = true;
                        }
                    }
                    if (!dupe)
                    {
                        modes.Add(
                            new DisplayMode(
                                filler.w,
                                filler.h,
                                SurfaceFormat.Color                                 // FIXME: Assumption!
                                )
                            );
                    }
                }

                _adapters[i] = new GraphicsAdapter(modes, $@"\\.\DISPLAY{(i + 1)}", SDL.SDL_GetDisplayName(i));
            }
            return(_adapters);
        }
        public GraphicsDevice(PresentationParameters presentationParameters, Framework.Graphics.GraphicsAdapter adapter)
        {
            PresentationParameters = presentationParameters;
            Adapter = adapter;

            _glContext = SDL.SDL_GL_CreateContext(presentationParameters.DeviceWindowHandle);

            SDL.SDL_GL_GetAttribute(SDL.SDL_GLattr.SDL_GL_CONTEXT_PROFILE_MASK, out var flags);

            // Check for a possible Core context
            _useCoreProfile = IsSet(flags, (int)SDL.SDL_GLprofile.SDL_GL_CONTEXT_PROFILE_CORE);

            // UIKit needs special treatment for back buffer behavior
            var wmInfo = new SDL.SDL_SysWMinfo();

            SDL.SDL_VERSION(out wmInfo.version);
            SDL.SDL_GetWindowWMInfo(presentationParameters.DeviceWindowHandle, ref wmInfo);

            if (wmInfo.subsystem == SDL.SDL_SYSWM_TYPE.SDL_SYSWM_UIKIT)
            {
                _realBackbufferFBO = wmInfo.info.uikit.framebuffer;
                _realBackbufferRBO = wmInfo.info.uikit.colorbuffer;
            }
            else
            {
                _realBackbufferFBO = 0;
                _realBackbufferRBO = 0;
            }


            GL.LoadEntryPoints();

            string renderer = GL.GetString(GL.StringName.Renderer);
            string version  = GL.GetString(GL.StringName.Version);
            string vendor   = GL.GetString(GL.StringName.Vendor);
            string shadingLanguageVersion = GL.GetString(GL.StringName.ShadingLanguageVersion);
            var    extensions             = GL.GetString(GL.StringName.Extensions);
        }
        public override void Reset(PresentationParameters presentationParameters,
                                   Framework.Graphics.GraphicsAdapter graphicsAdapter)
        {
            PresentationParameters =
                presentationParameters ?? throw new ArgumentNullException(nameof(presentationParameters));
            Adapter = graphicsAdapter;

            // Verify MSAA before we really start...
            //PresentationParameters.MultiSampleCount = Math.Min(
            //	MathHelper.ClosestMSAAPower(
            //		PresentationParameters.MultiSampleCount
            //	),
            //	GLDevice.MaxMultiSampleCount
            //);

            // We're about to reset, let the application know.
            OnDeviceResetting();

            /* FIXME: Why are we not doing this...? -flibit
             * lock (resourcesLock)
             * {
             *      foreach (WeakReference resource in resources)
             *      {
             *              object target = resource.Target;
             *              if (target != null)
             *              {
             *                      (target as GraphicsResource).GraphicsDeviceResetting();
             *              }
             *      }
             *
             *      // Remove references to resources that have been garbage collected.
             *      resources.RemoveAll(wr => !wr.IsAlive);
             * }
             */

            /* Reset the backbuffer first, before doing anything else.
             * The GLDevice needs to know what we're up to right away.
             * -flibit
             */
            ResetBackBuffer(PresentationParameters, Adapter);

            // The mouse needs to know this for faux-backbuffer mouse scaling.
            //Input.Mouse.INTERNAL_BackBufferWidth = PresentationParameters.BackBufferWidth;
            //Input.Mouse.INTERNAL_BackBufferHeight = PresentationParameters.BackBufferHeight;

            //// The Touch Panel needs this too, for the same reason.
            //Input.Touch.TouchPanel.DisplayWidth = PresentationParameters.BackBufferWidth;
            //Input.Touch.TouchPanel.DisplayHeight = PresentationParameters.BackBufferHeight;

            // Now, update the viewport
            Viewport = new Viewport(0, 0, PresentationParameters.BackBufferWidth,
                                    PresentationParameters.BackBufferHeight);

            // Update the scissor rectangle to our new default target size
            ScissorRectangle = new Rectangle(0, 0,
                                             PresentationParameters.BackBufferWidth,
                                             PresentationParameters.BackBufferHeight);

            // Finally, update the swap interval
            SetPresentationInterval(PresentationParameters.PresentationInterval);

            // We just reset, let the application know.
            OnDeviceReset();
        }