private void Init() { // default #if OPENTK_0 GLContextVersion = GLContextVersion.Gles1_1; #else ContextRenderingApi = GLVersion.ES1; #endif mHolder = Holder; RenderThreadRestartRetries = 3; // Add callback to get the SurfaceCreated etc events mHolder.AddCallback(this); // Force the SurfaceType to be Gpu to API_11 and earlier // it is ignored in later API's mHolder.SetType(SurfaceType.Gpu); windowInfo = new AndroidWindow(mHolder); windowInfo.InitializeDisplay(); pauseSignal = new ManualResetEvent(true); }
void Init (GraphicsMode mode, IWindowInfo win, IGraphicsContext sharedContext, int major, int minor, GraphicsContextFlags flags) { window = win as AndroidWindow; if (window == null) throw new ArgumentException ("win"); AndroidGraphicsContext shared = sharedContext as AndroidGraphicsContext; egl = EGLContext.EGL.JavaCast<IEGL10> (); window.InitializeDisplay (); if (mode == null) mode = new GraphicsMode (); if (mode is AndroidGraphicsMode) { GraphicsMode = mode; } else { GraphicsMode = new AndroidGraphicsMode (window.Display, major, mode); } if (shared != null && !PBufferSupported) throw new EglException ("Multiple Context's are not supported by this device"); if (Mode.Config == null) Mode.Initialize (window.Display, major); /* * Create an OpenGL ES context. We want to do this as rarely as possible, an * OpenGL context is a somewhat heavy object. */ int EglContextClientVersion = 0x3098; int EglContextMinorVersion = 0x30fb; int[] attribList = null; if (major >= 2) { string extensions = egl.EglQueryString (window.Display, Egl.Egl.EXTENSIONS); if (minor > 0 && !string.IsNullOrEmpty (extensions) && extensions.Contains ("EGL_KHR_create_context")) { attribList = new int [] { EglContextClientVersion, major, EglContextMinorVersion, minor, EGL10.EglNone }; } else { attribList = new int [] { EglContextClientVersion, major, EGL10.EglNone }; } } EGLContext = egl.EglCreateContext (window.Display, EGLConfig, shared != null && shared.EGLContext != null ? shared.EGLContext : EGL10.EglNoContext, attribList); if (EGLContext == EGL10.EglNoContext) throw EglException.GenerateException ("EglCreateContext == EGL10.EglNoContext", egl, null); if (shared != null && shared.EGLContext != null) { egl.EglMakeCurrent (window.Display, EGL10.EglNoSurface, EGL10.EglNoSurface, EGL10.EglNoContext); int[] pbufferAttribList = new int [] { EGL10.EglWidth, 64, EGL10.EglHeight, 64, EGL10.EglNone }; surface = window.CreatePBufferSurface (EGLConfig, pbufferAttribList); if (surface == EGL10.EglNoSurface) throw new EglException ("Could not create PBuffer for shared context!"); } }
void Init(GraphicsMode mode, IWindowInfo win, IGraphicsContext sharedContext, int major, int minor, GraphicsContextFlags flags) { window = win as AndroidWindow; if (window == null) { throw new ArgumentException("win"); } AndroidGraphicsContext shared = sharedContext as AndroidGraphicsContext; egl = EGLContext.EGL.JavaCast <IEGL10> (); window.InitializeDisplay(); if (mode == null) { mode = new GraphicsMode(); } if (mode is AndroidGraphicsMode) { GraphicsMode = mode; } else { GraphicsMode = new AndroidGraphicsMode(window.Display, major, mode); } if (shared != null && !PBufferSupported) { throw new EglException("Multiple Context's are not supported by this device"); } if (Mode.Config == null) { Mode.Initialize(window.Display, major); } /* * Create an OpenGL ES context. We want to do this as rarely as possible, an * OpenGL context is a somewhat heavy object. */ int EglContextClientVersion = 0x3098; int EglContextMinorVersion = 0x30fb; int[] attribList = null; if (major >= 2) { string extensions = egl.EglQueryString(window.Display, Egl.Egl.EXTENSIONS); if (minor > 0 && !string.IsNullOrEmpty(extensions) && extensions.Contains("EGL_KHR_create_context")) { attribList = new int [] { EglContextClientVersion, major, EglContextMinorVersion, minor, EGL10.EglNone }; } else { attribList = new int [] { EglContextClientVersion, major, EGL10.EglNone }; } } EGLContext = egl.EglCreateContext(window.Display, EGLConfig, shared != null && shared.EGLContext != null ? shared.EGLContext : EGL10.EglNoContext, attribList); if (EGLContext == EGL10.EglNoContext) { throw EglException.GenerateException("EglCreateContext == EGL10.EglNoContext", egl, null); } if (shared != null && shared.EGLContext != null) { egl.EglMakeCurrent(window.Display, EGL10.EglNoSurface, EGL10.EglNoSurface, EGL10.EglNoContext); int[] pbufferAttribList = new int [] { EGL10.EglWidth, 64, EGL10.EglHeight, 64, EGL10.EglNone }; surface = window.CreatePBufferSurface(EGLConfig, pbufferAttribList); if (surface == EGL10.EglNoSurface) { throw new EglException("Could not create PBuffer for shared context!"); } } }
// 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 (); }