void DestroySurface()
 {
     if (hasSurface)
     {
         log("DestroySurface");
         windowInfo.DestroySurface();
         hasSurface = false;
     }
 }
Exemple #2
0
 private void DestroySurface()
 {
     log("DestroySurface");
     windowInfo.DestroySurface();
 }
		// This method is called everytime the context needs
		// to be recreated. Use it to set any egl-specific settings
		// prior to context creation
		protected override void CreateFrameBuffer ()
		{
			IEGL10 egl = EGLContext.EGL.JavaCast<IEGL10> ();
			var win = new AndroidWindow (Holder);
			win.InitializeDisplay ();

			int[] num_configs = new int[1];
			if (!egl.EglGetConfigs (win.Display, null, 0, num_configs)) {
				throw EglException.GenerateException ("Failed to retrieve GraphicsMode configurations", egl);
			}

			EGLConfig[] configs = new EGLConfig[num_configs[0]];
			if (!egl.EglGetConfigs (win.Display, configs, num_configs[0], num_configs)) {
				throw EglException.GenerateException ("Failed to retrieve GraphicsMode configurations", egl);
			}

			Log.Verbose ("GLDiag", "Testing {0} graphics configurations", num_configs[0]);

			Dictionary<IntPtr, AndroidGraphicsMode> validModes = new Dictionary<IntPtr, AndroidGraphicsMode> ();

			int count = 0;
			foreach (var c in configs) {
				var r = GetAttrib (egl, win.Display, c, EGL11.EglRedSize);
				var g = GetAttrib (egl, win.Display, c, EGL11.EglGreenSize);
				var b = GetAttrib (egl, win.Display, c, EGL11.EglBlueSize);
				var a = GetAttrib (egl, win.Display, c, EGL11.EglAlphaSize);
				var depth = GetAttrib (egl, win.Display, c, EGL11.EglDepthSize);
				var stencil = GetAttrib (egl, win.Display, c, EGL11.EglStencilSize);
				var s = GetAttrib (egl, win.Display, c, EGL11.EglSampleBuffers);
				var samples = GetAttrib (egl, win.Display, c, EGL11.EglSamples);

				Log.Verbose ("AndroidGraphicsMode", "Testing graphics mode: {8} red {0} green {1} blue {2} alpha {3} ({4}) depth {5} stencil {6} samples {7}",
						r, g, b,
						a, r+g+b+a, depth,
						stencil, samples, count++);

				try {
					win.CreateSurface (c);
					win.DestroySurface ();
					validModes.Add (c.Handle, new AndroidGraphicsMode (r+g+b+a, depth, stencil, s > 0 ? samples : 0, 2, true));
					Log.Verbose ("AndroidGraphicsMode", "Graphics mode {0} valid", count-1);
				} catch {
					Log.Verbose ("AndroidGraphicsMode", "Graphics mode {0} invalid", count-1);
				}
			}

			win.TerminateDisplay ();

			if (validModes.Count == 0)
				throw new EglException ("There is no valid graphics mode, aborting");

			IntPtr key = IntPtr.Zero;
			foreach (var k in validModes) {
				if (key == IntPtr.Zero)
					key = k.Key;
				var a = k.Value;
				Log.Verbose ("AndroidGraphicsMode", "Valid graphics mode: {9} red {0} green {1} blue {2} alpha {3} ({4}) depth {5} stencil {6} samples {7} buffers {8}",
						a.ColorFormat.Red, a.ColorFormat.Green, a.ColorFormat.Blue,
						a.ColorFormat.Alpha, a.ColorFormat.BitsPerPixel, a.Depth,
						a.Stencil, a.Samples, a.Buffers, (int)k.Key);
			}

			GraphicsMode = validModes[key];

			// if you don't call this, the context won't be created
			base.CreateFrameBuffer ();
		}