mirror of
				https://github.com/Ryujinx/Opentk.git
				synced 2025-11-04 15:55:00 +00:00 
			
		
		
		
	Merge branch 'graphicsmode' into develop
This commit is contained in:
		
						commit
						40ce2c4288
					
				| 
						 | 
					@ -22,7 +22,6 @@ namespace OpenTK.Graphics
 | 
				
			||||||
        IntPtr? index = null;  // The id of the pixel format or visual.
 | 
					        IntPtr? index = null;  // The id of the pixel format or visual.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static GraphicsMode defaultMode;
 | 
					        static GraphicsMode defaultMode;
 | 
				
			||||||
        static IGraphicsMode implementation;
 | 
					 | 
				
			||||||
        static readonly object SyncRoot = new object();
 | 
					        static readonly object SyncRoot = new object();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #region Constructors
 | 
					        #region Constructors
 | 
				
			||||||
| 
						 | 
					@ -44,7 +43,7 @@ namespace OpenTK.Graphics
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            if (depth < 0) throw new ArgumentOutOfRangeException("depth", "Must be greater than, or equal to zero.");
 | 
					            if (depth < 0) throw new ArgumentOutOfRangeException("depth", "Must be greater than, or equal to zero.");
 | 
				
			||||||
            if (stencil < 0) throw new ArgumentOutOfRangeException("stencil", "Must be greater than, or equal to zero.");
 | 
					            if (stencil < 0) throw new ArgumentOutOfRangeException("stencil", "Must be greater than, or equal to zero.");
 | 
				
			||||||
            if (buffers <= 0) throw new ArgumentOutOfRangeException("buffers", "Must be greater than zero.");
 | 
					            if (buffers < 0) throw new ArgumentOutOfRangeException("buffers", "Must be greater than, or equal to zero.");
 | 
				
			||||||
            if (samples < 0) throw new ArgumentOutOfRangeException("samples", "Must be greater than, or equal to zero.");
 | 
					            if (samples < 0) throw new ArgumentOutOfRangeException("samples", "Must be greater than, or equal to zero.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            this.Index = index;
 | 
					            this.Index = index;
 | 
				
			||||||
| 
						 | 
					@ -255,7 +254,14 @@ namespace OpenTK.Graphics
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                return samples;
 | 
					                return samples;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            private set { samples = value; }
 | 
					            private set
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                // Clamp antialiasing samples to max 64x
 | 
				
			||||||
 | 
					                // This protects against a potential DOS during
 | 
				
			||||||
 | 
					                // mode selection, when the user requests an
 | 
				
			||||||
 | 
					                // abnormally high AA level.
 | 
				
			||||||
 | 
					                samples = MathHelper.Clamp(value, 0, 64);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,8 +52,6 @@ namespace OpenTK.Platform.MacOS
 | 
				
			||||||
        DisplayDevice device;
 | 
					        DisplayDevice device;
 | 
				
			||||||
        bool mIsFullscreen = false;
 | 
					        bool mIsFullscreen = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        readonly MacOSGraphicsMode ModeSelector = new MacOSGraphicsMode();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        public AglContext(GraphicsMode mode, IWindowInfo window, IGraphicsContext shareContext)
 | 
					        public AglContext(GraphicsMode mode, IWindowInfo window, IGraphicsContext shareContext)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Debug.Print("Context Type: {0}", shareContext);
 | 
					            Debug.Print("Context Type: {0}", shareContext);
 | 
				
			||||||
| 
						 | 
					@ -103,6 +101,7 @@ namespace OpenTK.Platform.MacOS
 | 
				
			||||||
            aglAttributes.Add((int)pixelFormatAttribute);
 | 
					            aglAttributes.Add((int)pixelFormatAttribute);
 | 
				
			||||||
            aglAttributes.Add(value);
 | 
					            aglAttributes.Add(value);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        void CreateContext(GraphicsMode mode, CarbonWindowInfo carbonWindow, IntPtr shareContextRef, bool fullscreen)
 | 
					        void CreateContext(GraphicsMode mode, CarbonWindowInfo carbonWindow, IntPtr shareContextRef, bool fullscreen)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Debug.Print("AGL pixel format attributes:");
 | 
					            Debug.Print("AGL pixel format attributes:");
 | 
				
			||||||
| 
						 | 
					@ -110,51 +109,30 @@ namespace OpenTK.Platform.MacOS
 | 
				
			||||||
            AGLPixelFormat myAGLPixelFormat;
 | 
					            AGLPixelFormat myAGLPixelFormat;
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
            // Choose a pixel format with the attributes we specified.
 | 
					            // Choose a pixel format with the attributes we specified.
 | 
				
			||||||
            if (fullscreen)
 | 
					            IntPtr gdevice;
 | 
				
			||||||
            {
 | 
					            IntPtr cgdevice = GetQuartzDevice(carbonWindow);
 | 
				
			||||||
                IntPtr gdevice;
 | 
					 | 
				
			||||||
                IntPtr cgdevice = GetQuartzDevice(carbonWindow);
 | 
					 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                if (cgdevice == IntPtr.Zero)
 | 
					            if (cgdevice == IntPtr.Zero)
 | 
				
			||||||
                    cgdevice = (IntPtr)DisplayDevice.Default.Id;
 | 
					                cgdevice = (IntPtr)DisplayDevice.Default.Id;
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                OSStatus status = Carbon.API.DMGetGDeviceByDisplayID(cgdevice, out gdevice, false);
 | 
					            OSStatus status = Carbon.API.DMGetGDeviceByDisplayID(cgdevice, out gdevice, false);
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                if (status != OSStatus.NoError)
 | 
					            if (status != OSStatus.NoError)
 | 
				
			||||||
                    throw new MacOSException(status, "DMGetGDeviceByDisplayID failed.");
 | 
					                throw new MacOSException(status, "DMGetGDeviceByDisplayID failed.");
 | 
				
			||||||
                
 | 
					
 | 
				
			||||||
                myAGLPixelFormat = ModeSelector.SelectPixelFormat(
 | 
					            IGraphicsMode selector = new MacOSGraphicsMode(gdevice);
 | 
				
			||||||
                    mode.ColorFormat, mode.Depth, mode.Stencil, mode.Samples,
 | 
					            Mode = selector.SelectGraphicsMode(
 | 
				
			||||||
                    mode.AccumulatorFormat, mode.Buffers, mode.Stereo,
 | 
					                mode.ColorFormat, mode.Depth, mode.Stencil, mode.Samples,
 | 
				
			||||||
                    true, gdevice);
 | 
					                mode.AccumulatorFormat, mode.Buffers, mode.Stereo);
 | 
				
			||||||
                
 | 
					            MyAGLReportError("aglChoosePixelFormat");
 | 
				
			||||||
                Agl.AglError err = Agl.GetError();
 | 
					
 | 
				
			||||||
                if (myAGLPixelFormat == IntPtr.Zero || err == Agl.AglError.BadPixelFormat)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    Debug.Print("Failed to create full screen pixel format.");
 | 
					 | 
				
			||||||
                    Debug.Print("Trying again to create a non-fullscreen pixel format.");
 | 
					 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                    CreateContext(mode, carbonWindow, shareContextRef, false);
 | 
					 | 
				
			||||||
                    return;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                myAGLPixelFormat = ModeSelector.SelectPixelFormat(
 | 
					 | 
				
			||||||
                    mode.ColorFormat, mode.Depth, mode.Stencil, mode.Samples,
 | 
					 | 
				
			||||||
                    mode.AccumulatorFormat, mode.Buffers, mode.Stereo,
 | 
					 | 
				
			||||||
                    false, IntPtr.Zero);
 | 
					 | 
				
			||||||
                MyAGLReportError("aglChoosePixelFormat");
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            Debug.Print("Creating AGL context.  Sharing with {0}", shareContextRef);
 | 
					            Debug.Print("Creating AGL context.  Sharing with {0}", shareContextRef);
 | 
				
			||||||
            
 | 
					            myAGLPixelFormat = Mode.Index.Value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // create the context and share it with the share reference.
 | 
					            // create the context and share it with the share reference.
 | 
				
			||||||
            Handle = new ContextHandle(Agl.aglCreateContext(myAGLPixelFormat, shareContextRef));
 | 
					            Handle = new ContextHandle(Agl.aglCreateContext(myAGLPixelFormat, shareContextRef));
 | 
				
			||||||
            MyAGLReportError("aglCreateContext");
 | 
					            MyAGLReportError("aglCreateContext");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Mode = ModeSelector.GetGraphicsModeFromPixelFormat(myAGLPixelFormat);
 | 
					 | 
				
			||||||
                        
 | 
					 | 
				
			||||||
            // Free the pixel format from memory.
 | 
					            // Free the pixel format from memory.
 | 
				
			||||||
            Agl.aglDestroyPixelFormat(myAGLPixelFormat);
 | 
					            Agl.aglDestroyPixelFormat(myAGLPixelFormat);
 | 
				
			||||||
            MyAGLReportError("aglDestroyPixelFormat");
 | 
					            MyAGLReportError("aglDestroyPixelFormat");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,14 +37,47 @@ namespace OpenTK.Platform.MacOS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class MacOSGraphicsMode : IGraphicsMode
 | 
					    class MacOSGraphicsMode : IGraphicsMode
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        readonly IntPtr Device;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public MacOSGraphicsMode(IntPtr device)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            Device = device;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #region IGraphicsMode Members
 | 
					        #region IGraphicsMode Members
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public GraphicsMode SelectGraphicsMode(ColorFormat color, int depth, int stencil,
 | 
					        public GraphicsMode SelectGraphicsMode(ColorFormat color, int depth, int stencil,
 | 
				
			||||||
            int samples, ColorFormat accum, int buffers, bool stereo)
 | 
					            int samples, ColorFormat accum, int buffers, bool stereo)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            IntPtr pixelformat = SelectPixelFormat(
 | 
					            IntPtr pixelformat;
 | 
				
			||||||
                color, depth, stencil, samples, accum, buffers, stereo,
 | 
					            do
 | 
				
			||||||
                false, IntPtr.Zero);
 | 
					            {
 | 
				
			||||||
 | 
					                pixelformat = SelectPixelFormat(
 | 
				
			||||||
 | 
					                    color, depth, stencil, samples, accum, buffers, stereo,
 | 
				
			||||||
 | 
					                    true, Device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                Agl.AglError err = Agl.GetError();
 | 
				
			||||||
 | 
					                if (pixelformat == IntPtr.Zero || err == Agl.AglError.BadPixelFormat)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    Debug.Print("Failed to create full screen pixel format.");
 | 
				
			||||||
 | 
					                    Debug.Print("Trying again to create a non-fullscreen pixel format.");
 | 
				
			||||||
 | 
					                    pixelformat = SelectPixelFormat(
 | 
				
			||||||
 | 
					                        color, depth, stencil, samples, accum, buffers, stereo,
 | 
				
			||||||
 | 
					                        false, IntPtr.Zero);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (pixelformat == IntPtr.Zero)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    if (!Utilities.RelaxGraphicsMode(
 | 
				
			||||||
 | 
					                        ref color, ref depth, ref stencil, ref samples, ref accum,
 | 
				
			||||||
 | 
					                        ref buffers, ref stereo))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        throw new GraphicsModeException("Requested GraphicsMode not available.");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            while (pixelformat == IntPtr.Zero);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return GetGraphicsModeFromPixelFormat(pixelformat);
 | 
					            return GetGraphicsModeFromPixelFormat(pixelformat);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,7 +85,7 @@ namespace OpenTK.Platform.MacOS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #region Internal Members
 | 
					        #region Internal Members
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        internal GraphicsMode GetGraphicsModeFromPixelFormat(IntPtr pixelformat)
 | 
					        GraphicsMode GetGraphicsModeFromPixelFormat(IntPtr pixelformat)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            int r, g, b, a;
 | 
					            int r, g, b, a;
 | 
				
			||||||
            Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_RED_SIZE, out r);
 | 
					            Agl.aglDescribePixelFormat(pixelformat, Agl.PixelFormatAttribute.AGL_RED_SIZE, out r);
 | 
				
			||||||
| 
						 | 
					@ -75,7 +108,7 @@ namespace OpenTK.Platform.MacOS
 | 
				
			||||||
                depth, stencil, samples, new ColorFormat(ar, ag, ab, aa), buffers + 1, stereo != 0);
 | 
					                depth, stencil, samples, new ColorFormat(ar, ag, ab, aa), buffers + 1, stereo != 0);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        internal IntPtr SelectPixelFormat(ColorFormat color, int depth, int stencil, int samples,
 | 
					        IntPtr SelectPixelFormat(ColorFormat color, int depth, int stencil, int samples,
 | 
				
			||||||
            ColorFormat accum, int buffers, bool stereo, bool fullscreen, IntPtr device)
 | 
					            ColorFormat accum, int buffers, bool stereo, bool fullscreen, IntPtr device)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            List<int> attribs = new List<int>();
 | 
					            List<int> attribs = new List<int>();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,8 +63,20 @@ namespace OpenTK.Platform.SDL2
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            lock (SDL.Sync)
 | 
					            lock (SDL.Sync)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                SetGLAttributes(mode, shareContext, major, minor, flags);
 | 
					                bool retry = false;
 | 
				
			||||||
                SdlContext = new ContextHandle(SDL.GL.CreateContext(Window.Handle));
 | 
					                do
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    SetGLAttributes(mode, shareContext, major, minor, flags);
 | 
				
			||||||
 | 
					                    SdlContext = new ContextHandle(SDL.GL.CreateContext(Window.Handle));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // If we failed to create a valid context, relax the GraphicsMode
 | 
				
			||||||
 | 
					                    // and try again.
 | 
				
			||||||
 | 
					                    retry =
 | 
				
			||||||
 | 
					                        SdlContext == ContextHandle.Zero &&
 | 
				
			||||||
 | 
					                        Utilities.RelaxGraphicsMode(ref mode);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                while (retry);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (SdlContext == ContextHandle.Zero)
 | 
					                if (SdlContext == ContextHandle.Zero)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    var error = SDL.GetError();
 | 
					                    var error = SDL.GetError();
 | 
				
			||||||
| 
						 | 
					@ -152,12 +164,37 @@ namespace OpenTK.Platform.SDL2
 | 
				
			||||||
                stereo != 0 ? true : false);
 | 
					                stereo != 0 ? true : false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        static void ClearGLAttributes()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.ACCUM_ALPHA_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.ACCUM_RED_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.ACCUM_GREEN_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.ACCUM_BLUE_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.DOUBLEBUFFER, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.ALPHA_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.RED_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.GREEN_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.BLUE_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.DEPTH_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.MULTISAMPLEBUFFERS, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.MULTISAMPLESAMPLES, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.STENCIL_SIZE, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.STEREO, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.CONTEXT_MAJOR_VERSION, 1);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.CONTEXT_MINOR_VERSION, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.CONTEXT_FLAGS, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.CONTEXT_EGL, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.CONTEXT_PROFILE_MASK, 0);
 | 
				
			||||||
 | 
					            SDL.GL.SetAttribute(ContextAttribute.SHARE_WITH_CURRENT_CONTEXT, 0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static void SetGLAttributes(GraphicsMode mode,
 | 
					        static void SetGLAttributes(GraphicsMode mode,
 | 
				
			||||||
            IGraphicsContext shareContext,
 | 
					            IGraphicsContext shareContext,
 | 
				
			||||||
            int major, int minor,
 | 
					            int major, int minor,
 | 
				
			||||||
            GraphicsContextFlags flags)
 | 
					            GraphicsContextFlags flags)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            ContextProfileFlags cpflags = 0;
 | 
					            ContextProfileFlags cpflags = 0;
 | 
				
			||||||
 | 
					            ClearGLAttributes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (mode.AccumulatorFormat.BitsPerPixel > 0)
 | 
					            if (mode.AccumulatorFormat.BitsPerPixel > 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -307,5 +307,113 @@ namespace OpenTK.Platform
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        #endregion
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #region RelaxGraphicsMode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        internal static bool RelaxGraphicsMode(ref GraphicsMode mode)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ColorFormat color = mode.ColorFormat;
 | 
				
			||||||
 | 
					            int depth = mode.Depth;
 | 
				
			||||||
 | 
					            int stencil = mode.Stencil;
 | 
				
			||||||
 | 
					            int samples = mode.Samples;
 | 
				
			||||||
 | 
					            ColorFormat accum = mode.AccumulatorFormat;
 | 
				
			||||||
 | 
					            int buffers = mode.Buffers;
 | 
				
			||||||
 | 
					            bool stereo = mode.Stereo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            bool success = RelaxGraphicsMode(
 | 
				
			||||||
 | 
					                ref color, ref depth, ref stencil, ref samples,
 | 
				
			||||||
 | 
					                ref accum, ref buffers, ref stereo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            mode = new GraphicsMode(
 | 
				
			||||||
 | 
					                color, depth, stencil, samples,
 | 
				
			||||||
 | 
					                accum, buffers, stereo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return success;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// \internal
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Relaxes graphics mode parameters. Use this function to increase compatibility
 | 
				
			||||||
 | 
					        /// on systems that do not directly support a requested GraphicsMode. For example:
 | 
				
			||||||
 | 
					        /// - user requested stereoscopic rendering, but GPU does not support stereo
 | 
				
			||||||
 | 
					        /// - user requseted 16x antialiasing, but GPU only supports 4x
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <returns><c>true</c>, if a graphics mode parameter was relaxed, <c>false</c> otherwise.</returns>
 | 
				
			||||||
 | 
					        /// <param name="color">Color bits.</param>
 | 
				
			||||||
 | 
					        /// <param name="depth">Depth bits.</param>
 | 
				
			||||||
 | 
					        /// <param name="stencil">Stencil bits.</param>
 | 
				
			||||||
 | 
					        /// <param name="samples">Number of antialiasing samples.</param>
 | 
				
			||||||
 | 
					        /// <param name="accum">Accumulator buffer bits.</param>
 | 
				
			||||||
 | 
					        /// <param name="buffers">Number of rendering buffers (1 for single buffering, 2+ for double buffering, 0 for don't care).</param>
 | 
				
			||||||
 | 
					        /// <param name="stereo">Stereoscopic rendering enabled/disabled.</param>
 | 
				
			||||||
 | 
					        internal static bool RelaxGraphicsMode(ref ColorFormat color, ref int depth, ref int stencil, ref int samples, ref ColorFormat accum, ref int buffers, ref bool stereo)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // Parameters are relaxed in order of importance.
 | 
				
			||||||
 | 
					            // - Accumulator buffers are way outdated as a concept,
 | 
				
			||||||
 | 
					            // so they go first.
 | 
				
			||||||
 | 
					            // - Triple+ buffering is generally not supported by the
 | 
				
			||||||
 | 
					            // core WGL/GLX/AGL/CGL/EGL specs, so we clamp
 | 
				
			||||||
 | 
					            // to double-buffering as a second step. (If this doesn't help
 | 
				
			||||||
 | 
					            // we will also fall back to undefined single/double buffering
 | 
				
			||||||
 | 
					            // as a last resort).
 | 
				
			||||||
 | 
					            // - AA samples are an easy way to increase compatibility
 | 
				
			||||||
 | 
					            // so they go next.
 | 
				
			||||||
 | 
					            // - Stereoscopic is only supported on very few GPUs
 | 
				
			||||||
 | 
					            // (Quadro/FirePro series) so it goes next.
 | 
				
			||||||
 | 
					            // - The rest of the parameters then follow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (accum != 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                accum = 0;
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (buffers > 2)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                buffers = 2;
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (samples > 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                samples = Math.Max(samples - 1, 0);
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (stereo)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                stereo = false;
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (stencil != 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                stencil = 0;
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (depth != 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                depth = 0;
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (color != 24)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                color = 24;
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (buffers != 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                buffers = 0;
 | 
				
			||||||
 | 
					                return true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // no parameters left to relax, fail
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #endregion
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,114 +96,123 @@ namespace OpenTK.Platform.Windows
 | 
				
			||||||
        // hardware acceleration (e.g. we are running in a VM or in a remote desktop
 | 
					        // hardware acceleration (e.g. we are running in a VM or in a remote desktop
 | 
				
			||||||
        // connection), this method will return 0 formats and we will fall back to
 | 
					        // connection), this method will return 0 formats and we will fall back to
 | 
				
			||||||
        // ChoosePixelFormatPFD.
 | 
					        // ChoosePixelFormatPFD.
 | 
				
			||||||
        GraphicsMode ChoosePixelFormatARB(IntPtr device, GraphicsMode mode)
 | 
					        GraphicsMode ChoosePixelFormatARB(IntPtr device, GraphicsMode desired_mode)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            GraphicsMode created_mode = null;
 | 
					            GraphicsMode created_mode = null;
 | 
				
			||||||
 | 
					            GraphicsMode mode = new GraphicsMode(desired_mode);
 | 
				
			||||||
            if (Wgl.SupportsExtension("WGL_ARB_pixel_format") &&
 | 
					            if (Wgl.SupportsExtension("WGL_ARB_pixel_format") &&
 | 
				
			||||||
                Wgl.SupportsFunction("wglChoosePixelFormatARB"))
 | 
					                Wgl.SupportsFunction("wglChoosePixelFormatARB"))
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                List<int> attributes = new List<int>();
 | 
					 | 
				
			||||||
                attributes.Add((int)WGL_ARB_pixel_format.AccelerationArb);
 | 
					 | 
				
			||||||
                attributes.Add((int)WGL_ARB_pixel_format.FullAccelerationArb);
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
                attributes.Add((int)WGL_ARB_pixel_format.DrawToWindowArb);
 | 
					 | 
				
			||||||
                attributes.Add(1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.ColorFormat.Red > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.RedBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.ColorFormat.Red);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.ColorFormat.Green > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.GreenBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.ColorFormat.Green);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.ColorFormat.Blue > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.BlueBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.ColorFormat.Blue);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.ColorFormat.Alpha > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.AlphaBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.ColorFormat.Alpha);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.Depth > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.DepthBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.Depth);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.Stencil > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.StencilBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.Stencil);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.AccumulatorFormat.Red > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.AccumRedBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.AccumulatorFormat.Red);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.AccumulatorFormat.Green > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.AccumGreenBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.AccumulatorFormat.Green);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.AccumulatorFormat.Blue > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.AccumBlueBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.AccumulatorFormat.Blue);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.AccumulatorFormat.Alpha > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.AccumAlphaBitsArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.AccumulatorFormat.Alpha);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.Samples > 0 &&
 | 
					 | 
				
			||||||
                    Wgl.SupportsExtension("WGL_ARB_multisample"))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_multisample.SampleBuffersArb);
 | 
					 | 
				
			||||||
                    attributes.Add(1);
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_multisample.SamplesArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.Samples);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.Buffers > 0)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.DoubleBufferArb);
 | 
					 | 
				
			||||||
                    attributes.Add(mode.Buffers > 1 ? 1 : 0);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (mode.Stereo)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    attributes.Add((int)WGL_ARB_pixel_format.StereoArb);
 | 
					 | 
				
			||||||
                    attributes.Add(1);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                attributes.Add(0);
 | 
					 | 
				
			||||||
                attributes.Add(0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                int[] format = new int[1];
 | 
					                int[] format = new int[1];
 | 
				
			||||||
                int count;
 | 
					                int count;
 | 
				
			||||||
                if (Wgl.Arb.ChoosePixelFormat(device, attributes.ToArray(), null, format.Length, format, out count)
 | 
					                List<int> attributes = new List<int>();
 | 
				
			||||||
                    && count > 0)
 | 
					                bool retry = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                do
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    created_mode = DescribePixelFormatARB(device, format[0]);
 | 
					                    attributes.Clear();
 | 
				
			||||||
                }
 | 
					                    attributes.Add((int)WGL_ARB_pixel_format.AccelerationArb);
 | 
				
			||||||
                else
 | 
					                    attributes.Add((int)WGL_ARB_pixel_format.FullAccelerationArb);
 | 
				
			||||||
                {
 | 
					                    attributes.Add((int)WGL_ARB_pixel_format.DrawToWindowArb);
 | 
				
			||||||
                    Debug.Print("[WGL] ChoosePixelFormatARB failed with {0}", Marshal.GetLastWin32Error());
 | 
					                    attributes.Add(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.ColorFormat.Red > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.RedBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.ColorFormat.Red);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.ColorFormat.Green > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.GreenBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.ColorFormat.Green);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.ColorFormat.Blue > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.BlueBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.ColorFormat.Blue);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.ColorFormat.Alpha > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.AlphaBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.ColorFormat.Alpha);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.Depth > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.DepthBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.Depth);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.Stencil > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.StencilBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.Stencil);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.AccumulatorFormat.Red > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.AccumRedBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.AccumulatorFormat.Red);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.AccumulatorFormat.Green > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.AccumGreenBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.AccumulatorFormat.Green);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.AccumulatorFormat.Blue > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.AccumBlueBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.AccumulatorFormat.Blue);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.AccumulatorFormat.Alpha > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.AccumAlphaBitsArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.AccumulatorFormat.Alpha);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.Samples > 0 &&
 | 
				
			||||||
 | 
					                    Wgl.SupportsExtension("WGL_ARB_multisample"))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_multisample.SampleBuffersArb);
 | 
				
			||||||
 | 
					                        attributes.Add(1);
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_multisample.SamplesArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.Samples);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.Buffers > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.DoubleBufferArb);
 | 
				
			||||||
 | 
					                        attributes.Add(mode.Buffers > 1 ? 1 : 0);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (mode.Stereo)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        attributes.Add((int)WGL_ARB_pixel_format.StereoArb);
 | 
				
			||||||
 | 
					                        attributes.Add(1);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    attributes.Add(0);
 | 
				
			||||||
 | 
					                    attributes.Add(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (Wgl.Arb.ChoosePixelFormat(device, attributes.ToArray(), null, format.Length, format, out count)
 | 
				
			||||||
 | 
					                        && count > 0)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        created_mode = DescribePixelFormatARB(device, format[0]);
 | 
				
			||||||
 | 
					                        retry = false;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        Debug.Print("[WGL] ChoosePixelFormatARB failed with {0}", Marshal.GetLastWin32Error());
 | 
				
			||||||
 | 
					                        retry = Utilities.RelaxGraphicsMode(ref mode);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                while (retry);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -52,49 +52,8 @@ namespace OpenTK.Platform.X11
 | 
				
			||||||
                if (visual == IntPtr.Zero)
 | 
					                if (visual == IntPtr.Zero)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    // Relax parameters and retry
 | 
					                    // Relax parameters and retry
 | 
				
			||||||
                    if (stereo)
 | 
					                    if (!Utilities.RelaxGraphicsMode(ref color, ref depth, ref stencil, ref samples, ref accum, ref buffers, ref stereo))
 | 
				
			||||||
                    {
 | 
					                        throw new GraphicsModeException("Requested GraphicsMode not available.");
 | 
				
			||||||
                        stereo = false;
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (accum != 0)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        accum = 0;
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                    if (samples > 0)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        samples = Math.Max(samples - 2, 0);
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                    if (stencil != 0)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        stencil = 0;
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                    if (depth != 0)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        depth = 0;
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    
 | 
					 | 
				
			||||||
                    if (color != 24)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        color = 24;
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (buffers != 0)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        buffers = 0;
 | 
					 | 
				
			||||||
                        continue;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    throw new GraphicsModeException("Requested GraphicsMode not available.");
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            while (visual == IntPtr.Zero);
 | 
					            while (visual == IntPtr.Zero);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue