Esempio n. 1
0
        protected override void CreateFrameBuffer()
        {
            try {
                ContextRenderingApi = EAGLRenderingAPI.OpenGLES3;

                float       screenScale = UIScreen.MainScreen.Scale;
                CAEAGLLayer eaglLayer   = (CAEAGLLayer)Layer;
                Size        size        = new Size(
                    (int)Math.Round(screenScale * eaglLayer.Bounds.Size.Width),
                    (int)Math.Round(screenScale * eaglLayer.Bounds.Size.Height));

                base.CreateFrameBuffer();

                GL.GenRenderbuffers(1, out depthRenderbuffer);
                GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthRenderbuffer);
                GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, size.Width, size.Height);
                GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, depthRenderbuffer);

                Console.WriteLine("using ES 3.0");
                Console.WriteLine("version: {0} glsl version: {1}", GL.GetString(StringName.Version), GL.GetString(StringName.ShadingLanguageVersion));
            } catch (Exception e) {
                throw new Exception("Looks like OpenGL ES 3.0 not available", e);
            }

            if (ContextRenderingApi == EAGLRenderingAPI.OpenGLES2 || ContextRenderingApi == EAGLRenderingAPI.OpenGLES3)
            {
                keys.LoadShaders();
            }
        }
Esempio n. 2
0
        /// <summary>
        /// ICreate an ES 2.0 context
        /// </summary>
        /// <param name='context'>
        /// Context.
        /// </param>
        /// <param name='drawable'>
        /// Drawable.
        /// </param>
        public void InitWithContext(EAGLContext context, CAEAGLLayer drawable)
        {
            GL.GenFramebuffers(1, out m_defaultFBOName);

            // Create default framebuffer object. The backing will be allocated for the current layer in resizeFromLayer
            GL.GenRenderbuffers(1, out m_colorRenderbuffer);
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, m_defaultFBOName);
            GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, m_colorRenderbuffer);
            m_context = context;

            // This call associates the storage for the current render buffer with the EAGLDrawable (our CAEGLLAyer)
            // allowing us to draw into a buffer that will later be rendered to the screen wherever the layer is
            //(which correspondes with our) view.
            m_context.RenderBufferStorage((uint)All.Renderbuffer, drawable);

            GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.ColorAttachment0, RenderbufferTarget.Renderbuffer, m_colorRenderbuffer);

            int backingWidth;
            int backingHeight;
            GL.GetRenderbufferParameter(RenderbufferTarget.Renderbuffer, RenderbufferParameterName.RenderbufferWidth, out backingWidth);
            GL.GetRenderbufferParameter(RenderbufferTarget.Renderbuffer, RenderbufferParameterName.RenderbufferHeight, out backingHeight);

            GL.GenRenderbuffers(1, out m_depthRenderbuffer);
            GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, m_depthRenderbuffer);
            GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, backingWidth, backingHeight);
            GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, m_depthRenderbuffer);

            var frameBufferError = GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer);
            if(frameBufferError != FramebufferErrorCode.FramebufferComplete)
            {
                throw new ApplicationException("Failed to make complete framebuffer object: " + frameBufferError);
            }

            InitWithDefaultFBO(m_defaultFBOName);
        }
Esempio n. 3
0
        protected override void CreateFrameBuffer()
        {
            Debug.WriteLine("IOS Game View create frame buffer");
            OpenTK.Toolkit.Init();
            nfloat      screenScale = UIScreen.MainScreen.Scale;
            CAEAGLLayer eaglLayer   = (CAEAGLLayer)Layer;

            //CGSize size = new CGSize(
            //    (int)Math.Round(screenScale * eaglLayer.Bounds.Size.Width),
            //    (int)Math.Round(screenScale * eaglLayer.Bounds.Size.Height));

            try
            {
                ContextRenderingApi = EAGLRenderingAPI.OpenGLES2;

                //OpenTK.Graphics.OpenGL.LoadAll();
                //OpenTK.Graphics.ES20.GL.ClearColor(1f, 1f, 1f, 1f);
                base.CreateFrameBuffer();

                Console.WriteLine("using ES 2.0");
                Console.WriteLine("version: {0} glsl version: {1}", GL.GetString(StringName.Version), GL.GetString(StringName.ShadingLanguageVersion));
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.ToString());
                throw new Exception("Looks like OpenGL ES 2.0 not available", e);
            }
        }
        private void CreateFrameBuffer(CAEAGLLayer eaglLayer)
        {
            int oldRenderbuffer = 1;

            gl.GetInteger(All.RenderbufferBindingOes, out oldRenderbuffer);

            gl.GenRenderbuffers(1, out renderbuffer);
            gl.BindRenderbuffer(All.RenderbufferOes, renderbuffer);

            if (!EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer))
            {
                gl.DeleteRenderbuffers(1, ref renderbuffer);
                renderbuffer = 0;
                gl.BindRenderbuffer(All.RenderbufferBindingOes, oldRenderbuffer);
                throw new InvalidOperationException("Error with EAGLContext.RenderBufferStorage!");
            }

            gl.BindFramebuffer(All.FramebufferOes, framebuffer);
            gl.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, renderbuffer);

            Size newSize = new Size(
                (int)Math.Round(eaglLayer.Bounds.Size.Width),
                (int)Math.Round(eaglLayer.Bounds.Size.Height));

            Size = newSize;

            gl.Viewport(0, 0, newSize.Width, newSize.Height);
            gl.Scissor(0, 0, newSize.Width, newSize.Height);
        }
Esempio n. 5
0
 protected override void ConfigureLayer(CAEAGLLayer eaglLayer)
 {
     eaglLayer.Opaque       = true;
     ExclusiveTouch         = true;
     MultipleTouchEnabled   = true;
     UserInteractionEnabled = true;
 }
Esempio n. 6
0
        void CreateSurface()
        {
            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            if (!_context.IsCurrent)
            {
                _context.MakeCurrent(null);
            }

            var newSize = eaglLayer.Bounds.Size;

            newSize.Width  = (float)Math.Round(newSize.Width);
            newSize.Height = (float)Math.Round(newSize.Height);

            int oldRenderbuffer = 0, oldFramebuffer = 0;

            GL.GetInteger(All.RenderbufferBindingOes, ref oldRenderbuffer);
            GL.GetInteger(All.FramebufferBindingOes, ref oldFramebuffer);

            GL.Oes.GenRenderbuffers(1, ref _renderbuffer);
            GL.Oes.BindRenderbuffer(All.RenderbufferOes, _renderbuffer);

            if (!_context.EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer))
            {
                GL.Oes.DeleteRenderbuffers(1, ref _renderbuffer);
                GL.Oes.BindRenderbuffer(All.RenderbufferBindingOes, (uint)oldRenderbuffer);
                throw new InvalidOperationException("Error with RenderbufferStorage()!");
            }

            GL.Oes.GenFramebuffers(1, ref _framebuffer);
            GL.Oes.BindFramebuffer(All.FramebufferOes, _framebuffer);
            GL.Oes.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, _renderbuffer);
            if (_depthFormat != 0)
            {
                GL.Oes.GenRenderbuffers(1, ref _depthbuffer);
                GL.Oes.BindFramebuffer(All.RenderbufferOes, _depthbuffer);
                GL.Oes.RenderbufferStorage(All.RenderbufferOes, _depthFormat, (int)newSize.Width, (int)newSize.Height);
                GL.Oes.FramebufferRenderbuffer(All.FramebufferOes, All.DepthAttachmentOes, All.RenderbufferOes, _depthbuffer);
            }
            _size = newSize;
            if (!_hasBeenCurrent)
            {
                GL.Viewport(0, 0, (int)newSize.Width, (int)newSize.Height);
                GL.Scissor(0, 0, (int)newSize.Width, (int)newSize.Height);
                _hasBeenCurrent = true;
            }
            else
            {
                GL.Oes.BindFramebuffer(All.FramebufferOes, (uint)oldFramebuffer);
            }
            GL.Oes.BindRenderbuffer(All.RenderbufferOes, (uint)oldRenderbuffer);

            Action <EAGLView> a = OnResized;

            if (a != null)
            {
                a(this);
            }
        }
Esempio n. 7
0
 protected override void ConfigureLayer(CAEAGLLayer eaglLayer)
 {
     eaglLayer.Opaque = true;
     // Grisha: support retina displays
     // read
     // http://stackoverflow.com/questions/4884176/retina-display-image-quality-problem/9644622
     // for more information.
     eaglLayer.ContentsScale = screenScale;
 }
Esempio n. 8
0
 private LayerFbo(EAGLContext context, GlInterface gl, CAEAGLLayer layer, int framebuffer, int renderbuffer, int depthBuffer)
 {
     _context      = context;
     _gl           = gl;
     _layer        = layer;
     _framebuffer  = framebuffer;
     _renderbuffer = renderbuffer;
     _depthBuffer  = depthBuffer;
 }
Esempio n. 9
0
        void SetupProjection()
        {
            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;
            int         width     = (int)(UIScreen.MainScreen.Scale * eaglLayer.Bounds.Size.Width);
            int         height    = (int)(UIScreen.MainScreen.Scale * eaglLayer.Bounds.Size.Height);

            cube.SetupProjection(width, height);
            GL.Viewport(0, 0, width, height);
        }
Esempio n. 10
0
        private void CreateFrameBuffer()
        {
            // Setup layer

            eaglLayer = (CAEAGLLayer)this.Layer;
            eaglLayer.Opaque = false;

            bool layerRetainsBacking = false;
            NSString layerColorFormat = EAGLColorFormat.RGBA8;

            eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(new NSObject[]
                                                                           {
                NSNumber.FromBoolean(layerRetainsBacking),
                layerColorFormat
            }, new NSObject[]
            {
                EAGLDrawableProperty.RetainedBacking,
                EAGLDrawableProperty.ColorFormat
            });

            // Create OpenGL drawing context

            EAGLRenderingAPI api = EAGLRenderingAPI.OpenGLES2;

            context = new EAGLContext(api);

            if (context == null)
            {
                throw new InvalidOperationException("Failed to initialize OpenGLES 2.0 context");
            }

            if (!EAGLContext.SetCurrentContext(context))
            {
                throw new InvalidOperationException("Failed to set current OpenGL context");
            }

            // Create render buffer and assign it to the context

            GL.GenRenderbuffers(1, ref colorRenderBuffer);
            GL.BindRenderbuffer(All.Renderbuffer, colorRenderBuffer);
            context.RenderBufferStorage((uint)All.Renderbuffer, eaglLayer);

            // Create frame buffer

            uint frameBuffer = 0;

            GL.GenFramebuffers(1, ref frameBuffer);
            GL.BindFramebuffer(All.Framebuffer, frameBuffer);
            GL.FramebufferRenderbuffer(All.Framebuffer, All.ColorAttachment0, All.Renderbuffer, colorRenderBuffer);

            // Create CADisplayLink for animation loop

            displayLink = CADisplayLink.Create(this, new Selector("render"));
            displayLink.FrameInterval = 1;
            displayLink.AddToRunLoop(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);
        }
        /// <summary>
        /// Resizes the frame buffer.
        /// On IOS, when the device is rotated from portrait to landscape, if the framebuffer is not recreated
        /// then the EAGLContext will stretch the render buffer to fit the screen.
        /// If you care at all about aspect ratio, then this behavior is not desired, and in that case this method
        /// should be called when rotating the device.
        /// See here: http://stackoverflow.com/questions/20326947/opengl-what-need-to-reconfig-when-rotate-screen
        /// And also here: https://gamedev.stackexchange.com/questions/75965/how-do-i-reconfigure-my-gles-frame-buffer-after-a-rotation
        /// </summary>
        public void ResizeFrameBuffer()
        {
            MakeCurrent();

            gl.DeleteRenderbuffers(1, ref renderbuffer);

            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            CreateFrameBuffer(eaglLayer);
        }
Esempio n. 12
0
        protected override void ConfigureLayer(CAEAGLLayer eaglLayer)
        {
            eaglLayer.Opaque = true;

            // Scale OpenGL layer to the scale of the main layer
            // On iPhone 4 this makes the renderbuffer size the same as actual device resolution
            // On iPad with user-selected scale of 2x at startup, this will trigger but has no effect on the renderbuffer
            if (UIScreen.MainScreen.Scale != 1)
            {
                eaglLayer.ContentsScale = UIScreen.MainScreen.Scale;
            }
        }
        protected virtual void CreateFrameBuffer()
        {
            AssertValid();
            if (LayerColorFormat == null)
            {
                throw new InvalidOperationException("Set the LayerColorFormat property to an EAGLColorFormat value before calling Run().");
            }

            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(
                new NSObject [] { NSNumber.FromBoolean(LayerRetainsBacking), LayerColorFormat },
                new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }
                );
            ConfigureLayer(eaglLayer);

            GraphicsContext = Utilities.CreateGraphicsContext(ContextRenderingApi);
            gl = GLCalls.GetGLCalls(ContextRenderingApi);

            int oldFramebuffer = 0, oldRenderbuffer = 1;

            gl.GetInteger(All.FramebufferBindingOes, ref oldFramebuffer);
            gl.GetInteger(All.RenderbufferBindingOes, ref oldRenderbuffer);

            gl.GenRenderbuffers(1, ref renderbuffer);
            gl.BindRenderbuffer(All.RenderbufferOes, renderbuffer);

            if (!EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer))
            {
                gl.DeleteRenderbuffers(1, ref renderbuffer);
                renderbuffer = 0;
                gl.BindRenderbuffer(All.RenderbufferBindingOes, oldRenderbuffer);
                throw new InvalidOperationException("Error with EAGLContext.RenderBufferStorage!");
            }

            gl.GenFramebuffers(1, ref framebuffer);
            gl.BindFramebuffer(All.FramebufferOes, framebuffer);
            gl.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, renderbuffer);

            Size newSize = new Size(
                (int)Math.Round(eaglLayer.Bounds.Size.Width),
                (int)Math.Round(eaglLayer.Bounds.Size.Height));

            Size = newSize;

            gl.Viewport(0, 0, newSize.Width, newSize.Height);
            gl.Scissor(0, 0, newSize.Width, newSize.Height);

            frameBufferWindow = new WeakReference(Window);
            frameBufferLayer  = new WeakReference(Layer);
        }
Esempio n. 14
0
        public EAGLView(CGRect frame, All format, All depth, bool retained) : base(frame)
        {
            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            eaglLayer.DrawableProperties = new NSDictionary(
                EAGLDrawableProperty.RetainedBacking, true,
                EAGLDrawableProperty.ColorFormat, EAGLColorFormat.RGBA8
                );

            _depthFormat = depth;

            _context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation;
            CreateSurface();
        }
Esempio n. 15
0
        public EAGLView(RectangleF frame, All format, All depth, bool retained) : base(frame)
        {
            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(
                new NSObject [] { NSNumber.FromBoolean(true), EAGLColorFormat.RGBA8 },
                new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }
                );
            _format      = format;
            _depthFormat = depth;

            _context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation;
            CreateSurface();
        }
Esempio n. 16
0
    public EAGLView(NSCoder coder) : base(coder)
    {
        CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

        eaglLayer.Opaque             = true;
        eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(
            new NSObject [] { NSNumber.FromBoolean(false), EAGLColorFormat.RGBA8 },
            new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }
            );
        Context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation;

        Context.MakeCurrent(null);
        AnimationInterval = 1.0 / 60.0;
    }
Esempio n. 17
0
        public EAGLView(NSCoder coder) : base(coder)
        {
            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            eaglLayer.Opaque             = true;
            eaglLayer.DrawableProperties = new NSDictionary(
                EAGLDrawableProperty.RetainedBacking, false,
                EAGLDrawableProperty.ColorFormat, EAGLColorFormat.RGBA8
                );
            Context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation;

            Context.MakeCurrent(null);
            AnimationInterval = 1.0 / 60.0;
        }
Esempio n. 18
0
        public GLView() : base()
        {
            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            eaglLayer.Opaque = true;

            context = new EAGLContext(EAGLRenderingAPI.OpenGLES2);

            if (context == null || !EAGLContext.SetCurrentContext(context))
            {
                return;
            }

            animating = false;
            AnimationFrameInterval = 2;
        }
Esempio n. 19
0
        public static LayerFbo TryCreate(EAGLContext context, GlInterface gl, CAEAGLLayer layer)
        {
            if (context != EAGLContext.CurrentContext)
            {
                return(null);
            }

            var fb = new int[2];
            var rb = new int[2];
            var db = new int[2];

            gl.GenRenderbuffers(1, rb);
            gl.BindRenderbuffer(GlConsts.GL_RENDERBUFFER, rb[0]);
            context.RenderBufferStorage(GlConsts.GL_RENDERBUFFER, layer);

            gl.GenFramebuffers(1, fb);
            gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, fb[0]);
            gl.FramebufferRenderbuffer(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_COLOR_ATTACHMENT0, GlConsts.GL_RENDERBUFFER, rb[0]);

            int[] w = new int[1];
            int[] h = new int[1];
            gl.GetRenderbufferParameteriv(GlConsts.GL_RENDERBUFFER, GlConsts.GL_RENDERBUFFER_WIDTH, w);
            gl.GetRenderbufferParameteriv(GlConsts.GL_RENDERBUFFER, GlConsts.GL_RENDERBUFFER_HEIGHT, h);

            gl.GenRenderbuffers(1, db);

            //GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthBuffer);
            //GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, w, h);
            gl.FramebufferRenderbuffer(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_DEPTH_ATTACHMENT, GlConsts.GL_RENDERBUFFER, db[0]);

            var frameBufferError = gl.CheckFramebufferStatus(GlConsts.GL_FRAMEBUFFER);

            if (frameBufferError != GlConsts.GL_FRAMEBUFFER_COMPLETE)
            {
                gl.DeleteFramebuffers(1, fb);
                gl.DeleteRenderbuffers(1, db);
                gl.DeleteRenderbuffers(1, rb);
                return(null);
            }

            return(new LayerFbo(context, gl, layer, fb, rb, db)
            {
                Width = w[0],
                Height = h[0]
            });
        }
Esempio n. 20
0
        protected virtual void CreateFrameBuffer()
        {
            AssertValid();
            if (LayerColorFormat == null)
            {
                throw new InvalidOperationException("Set the LayerColorFormat property to an EAGLColorFormat value before calling Run().");
            }

            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(
                new NSObject [] { NSNumber.FromBoolean(LayerRetainsBacking), LayerColorFormat },
                new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }
                );
            ConfigureLayer(eaglLayer);

            int major = 0, minor = 0;

            switch (ContextRenderingApi)
            {
            case EAGLRenderingAPI.OpenGLES1: major = 1; minor = 1; break;

            case EAGLRenderingAPI.OpenGLES2: major = 2; minor = 0; break;

            case EAGLRenderingAPI.OpenGLES3: major = 3; minor = 0; break;

            default:
                throw new ArgumentException("Unsupported EAGLRenderingAPI version: " + ContextRenderingApi);
            }
            GraphicsContext = new GraphicsContext(GraphicsMode.Default, WindowInfo, major, minor, GraphicsContextFlags.Embedded);
            GraphicsContext.MakeCurrent(WindowInfo);
            gl = GLCalls.GetGLCalls(ContextRenderingApi);

            int oldFramebuffer = 0;

            gl.GetInteger(All.FramebufferBindingOes, out oldFramebuffer);
            gl.GenFramebuffers(1, out framebuffer);

            CreateFrameBuffer(eaglLayer);

            frameBufferWindow = new WeakReference(Window);
            frameBufferLayer  = new WeakReference(Layer);
        }
Esempio n. 21
0
        public RosyWriterPreviewWindow(RectangleF frame) : base(frame)
        {
            // Use 2x scale factor on Retina dispalys.
            ContentScaleFactor = UIScreen.MainScreen.Scale;

            // Initialize OpenGL ES 2
            CAEAGLLayer eagleLayer = (CAEAGLLayer)Layer;

            eagleLayer.Opaque             = true;
            eagleLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(
                new object[] { NSNumber.FromBoolean(false), EAGLColorFormat.RGBA8 },
                new object[] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }
                );

            Context = new EAGLContext(EAGLRenderingAPI.OpenGLES2);

            if (!EAGLContext.SetCurrentContext(Context))
            {
                throw new ApplicationException("Could not set EAGLContext");
            }
        }
Esempio n. 22
0
        public EAGLView(RectangleF frame) : base(frame)
        {
            CAEAGLLayer eagl = (CAEAGLLayer)Layer;

            eagl.DrawableProperties = NSDictionary.FromObjectsAndKeys(new NSObject[] {
                NSNumber.FromBoolean(true),
                EAGLColorFormat.RGBA8
            }, new NSObject[] {
                EAGLDrawableProperty.RetainedBacking,
                EAGLDrawableProperty.ColorFormat
            });

            eagl.ContentsScale = UIScreen.MainScreen.Scale;

            context = (iPhoneOSGraphicsContext)((IGraphicsContextInternal)GraphicsContext.CurrentContext).Implementation;

            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            context.MakeCurrent(null);

            GL.Oes.GenRenderbuffers(1, out renderbuffer);
            GL.Oes.BindRenderbuffer(All.RenderbufferOes, renderbuffer);

            if (!context.EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer))
            {
                throw new InvalidOperationException("Error with RenderbufferStorage()!");
            }

            GL.Oes.GenFramebuffers(1, out frameBuffer);
            GL.Oes.BindFramebuffer(All.FramebufferOes, frameBuffer);
            GL.Oes.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, renderbuffer);

            Instance = this;

            Opaque                 = true;
            ExclusiveTouch         = true;
            MultipleTouchEnabled   = true;
            UserInteractionEnabled = true;
        }
Esempio n. 23
0
        protected override void CreateFrameBuffer()
        {
            // Fetch desired depth / stencil size
            // Need to more robustly handle

            RemoveExistingView();

            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            if (bufferCreated || eaglLayer.Bounds.Size.Width == 0 || eaglLayer.Bounds.Size.Height == 0)
            {
                return;
            }

            base.CreateFrameBuffer();

            MakeCurrent();

            var newSize = new System.Drawing.Size(
                (int)Math.Round(eaglLayer.Bounds.Size.Width * Layer.ContentsScale),
                (int)Math.Round(eaglLayer.Bounds.Size.Height * Layer.ContentsScale));

            GL.GenRenderbuffers(1, out depthbuffer);
            GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthbuffer);
            GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, newSize.Width, newSize.Height);
            GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, depthbuffer);

            Threading.BackgroundContext = new OpenGLES.EAGLContext(EAGLContext.API, EAGLContext.ShareGroup);

            Size = newSize;

            Initialise();

            // For iOS, MonoGame's GraphicsDevice needs to maintain reference to default framebuffer
            graphicsDevice.glFramebuffer = Framebuffer;

            bufferCreated = true;
        }
Esempio n. 24
0
        public bool ResizeFromLayer(CAEAGLLayer layer)
        {
            // The pixel dimensions of the CAEAGLLayer
            int backingWidth;
            int backingHeight;

            // Allocate color buffer backing based on the current layer size
            GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, m_colorRenderbuffer);
            m_context.RenderBufferStorage((uint)RenderbufferTarget.Renderbuffer, layer);
            GL.GetRenderbufferParameter(RenderbufferTarget.Renderbuffer, RenderbufferParameterName.RenderbufferWidth, out backingWidth);
            GL.GetRenderbufferParameter(RenderbufferTarget.Renderbuffer, RenderbufferParameterName.RenderbufferHeight, out backingHeight);

            GL.GenRenderbuffers(1, out m_depthRenderbuffer);
            GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, m_depthRenderbuffer);
            GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, backingWidth, backingHeight);
            GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferSlot.DepthAttachment, RenderbufferTarget.Renderbuffer, m_depthRenderbuffer);

            base.ResizeWithWidth(backingWidth, backingHeight);

            if(GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer) != FramebufferErrorCode.FramebufferComplete)
            {
                Console.WriteLine("Failed to make complete framebuffer object", GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer));
                return false;
            }

            return true;
        }
 public EaglLayerSurface(CAEAGLLayer layer)
 {
     _layer = layer;
 }
Esempio n. 26
0
        void SetupProjection()
        {
            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            cube.SetupProjection((int)(UIScreen.MainScreen.Scale * eaglLayer.Bounds.Size.Width), (int)(UIScreen.MainScreen.Scale * eaglLayer.Bounds.Size.Height));
        }
Esempio n. 27
0
 protected override void ConfigureLayer(CAEAGLLayer eaglLayer)
 {
     eaglLayer.Opaque = true;
 }
Esempio n. 28
0
        private void CreateFrameBuffer()
        {
            // Setup layer

            eaglLayer = (CAEAGLLayer)this.Layer;
            eaglLayer.Opaque = false;

            bool layerRetainsBacking = false;
            NSString layerColorFormat = EAGLColorFormat.RGBA8;

            eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(new NSObject[]
                                                                           {
                NSNumber.FromBoolean(layerRetainsBacking),
                layerColorFormat
            }, new NSObject[]
            {
                EAGLDrawableProperty.RetainedBacking,
                EAGLDrawableProperty.ColorFormat
            });

            // Create OpenGL drawing context

            EAGLRenderingAPI api = EAGLRenderingAPI.OpenGLES2;

            context = new EAGLContext(api);

            if (context == null)
            {
                throw new InvalidOperationException("Failed to initialize OpenGLES 2.0 context");
            }

            if (!EAGLContext.SetCurrentContext(context))
            {
                throw new InvalidOperationException("Failed to set current OpenGL context");
            }

            // Create size for use later

            size = new Size((int)Math.Round((double)eaglLayer.Bounds.Size.Width), (int)Math.Round((double)eaglLayer.Bounds.Size.Height));

            // Create depth buffer (you have to do this BEFORE creating the color buffer)
            GL.GenRenderbuffers(1, ref depthRenderBuffer);
            GL.BindRenderbuffer(All.Renderbuffer, depthRenderBuffer);
            GL.RenderbufferStorage(All.Renderbuffer, All.DepthComponent16, size.Width, size.Height);

            // Create color buffer and allocate storage through the context (as a special case for this particular buffer)

            GL.GenRenderbuffers(1, ref colorRenderBuffer);
            GL.BindRenderbuffer(All.Renderbuffer, colorRenderBuffer);
            context.RenderBufferStorage((uint)All.Renderbuffer, eaglLayer);

            // Create frame buffer

            uint frameBuffer = 0;

            GL.GenFramebuffers(1, ref frameBuffer);
            GL.BindFramebuffer(All.Framebuffer, frameBuffer);
            GL.FramebufferRenderbuffer(All.Framebuffer, All.ColorAttachment0, All.Renderbuffer, colorRenderBuffer);
            GL.FramebufferRenderbuffer(All.Framebuffer, All.DepthAttachment, All.Renderbuffer, depthRenderBuffer);

            // Set viewport
            GL.Viewport(0, 0, size.Width, size.Height);

            // Create CADisplayLink for animation loop

            displayLink = CADisplayLink.Create(this, new Selector("render"));
            displayLink.FrameInterval = 1;
            displayLink.AddToRunLoop(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode);
        }
Esempio n. 29
0
 protected override void ConfigureLayer(CAEAGLLayer eaglLayer)
 {
     eaglLayer.Opaque = true;
     eaglLayer.AllowsEdgeAntialiasing = true;
     eaglLayer.EdgeAntialiasingMask   = CAEdgeAntialiasingMask.All;
 }
Esempio n. 30
0
		protected override void ConfigureLayer (CAEAGLLayer eaglLayer)
		{
			eaglLayer.Opaque = true;
			eaglLayer.AllowsEdgeAntialiasing = true;
			eaglLayer.EdgeAntialiasingMask = CAEdgeAntialiasingMask.All;
		}
Esempio n. 31
0
        protected virtual void CreateFrameBuffer()
        {
            AssertValid();
            if (LayerColorFormat == null)
            {
                throw new InvalidOperationException("Set the LayerColorFormat property to an EAGLColorFormat value before calling Run().");
            }

            CAEAGLLayer eaglLayer = (CAEAGLLayer)Layer;

            eaglLayer.DrawableProperties = NSDictionary.FromObjectsAndKeys(
                new NSObject [] { NSNumber.FromBoolean(LayerRetainsBacking), LayerColorFormat },
                new NSObject [] { EAGLDrawableProperty.RetainedBacking, EAGLDrawableProperty.ColorFormat }
                );
            ConfigureLayer(eaglLayer);

            int major = 0, minor = 0;

            switch (ContextRenderingApi)
            {
            case EAGLRenderingAPI.OpenGLES1: major = 1; minor = 1; break;

            case EAGLRenderingAPI.OpenGLES2: major = 2; minor = 0; break;

            case EAGLRenderingAPI.OpenGLES3: major = 3; minor = 0; break;

            default:
                throw new ArgumentException("Unsupported EAGLRenderingAPI version: " + ContextRenderingApi);
            }
            GraphicsContext = new GraphicsContext(GraphicsMode.Default, WindowInfo, major, minor, GraphicsContextFlags.Embedded);
            GraphicsContext.MakeCurrent(WindowInfo);
            gl = GLCalls.GetGLCalls(ContextRenderingApi);

            int oldFramebuffer = 0, oldRenderbuffer = 1;

            gl.GetInteger(All.FramebufferBindingOes, out oldFramebuffer);
            gl.GetInteger(All.RenderbufferBindingOes, out oldRenderbuffer);

            gl.GenRenderbuffers(1, out renderbuffer);
            gl.BindRenderbuffer(All.RenderbufferOes, renderbuffer);

            if (!EAGLContext.RenderBufferStorage((uint)All.RenderbufferOes, eaglLayer))
            {
                gl.DeleteRenderbuffers(1, ref renderbuffer);
                renderbuffer = 0;
                gl.BindRenderbuffer(All.RenderbufferBindingOes, oldRenderbuffer);
                throw new InvalidOperationException("Error with EAGLContext.RenderBufferStorage!");
            }

            gl.GenFramebuffers(1, out framebuffer);
            gl.BindFramebuffer(All.FramebufferOes, framebuffer);
            gl.FramebufferRenderbuffer(All.FramebufferOes, All.ColorAttachment0Oes, All.RenderbufferOes, renderbuffer);

            Size newSize = new Size(
                (int)Math.Round(eaglLayer.Bounds.Size.Width),
                (int)Math.Round(eaglLayer.Bounds.Size.Height));

            Size = newSize;

            gl.Viewport(0, 0, newSize.Width, newSize.Height);
            gl.Scissor(0, 0, newSize.Width, newSize.Height);

            frameBufferWindow = new WeakReference(Window);
            frameBufferLayer  = new WeakReference(Layer);
        }
Esempio n. 32
0
 protected virtual void ConfigureLayer(CAEAGLLayer eaglLayer)
 {
 }
Esempio n. 33
0
        protected override void ConfigureLayer(CAEAGLLayer eaglLayer)
        {
            eaglLayer.Opaque = true;

            // Scale OpenGL layer to the scale of the main layer
            // On iPhone 4 this makes the renderbuffer size the same as actual device resolution
            // On iPad with user-selected scale of 2x at startup, this will trigger but has no effect on the renderbuffer
            if(UIScreen.MainScreen.Scale != 1)
                eaglLayer.ContentsScale = UIScreen.MainScreen.Scale;
        }
Esempio n. 34
0
 protected virtual void ConfigureLayer(CAEAGLLayer eaglLayer)
 {
 }
Esempio n. 35
0
 public SizeSynchronizedLayerFbo(EAGLContext context, GlInterface gl, CAEAGLLayer layer)
 {
     _context = context;
     _gl      = gl;
     _layer   = layer;
 }
		protected override void ConfigureLayer (CAEAGLLayer eaglLayer)
		{
			eaglLayer.Opaque = true;
		}
Esempio n. 37
0
 private LayerFbo(EAGLContext context, CAEAGLLayer layer, in int framebuffer, in int renderbuffer, in int depthBuffer)