diff --git a/src/Avalonia.OpenGL/GlInterface.cs b/src/Avalonia.OpenGL/GlInterface.cs index d6eff9a35f..a9dd882e3b 100644 --- a/src/Avalonia.OpenGL/GlInterface.cs +++ b/src/Avalonia.OpenGL/GlInterface.cs @@ -335,7 +335,7 @@ namespace Avalonia.OpenGL public partial void DeleteShader(int shader); [GetProcAddress("glGetRenderbufferParameteriv")] - public partial void GLGetRenderbufferParameteriv(int target, int name, int* value); + public partial void GetRenderbufferParameteriv(int target, int name, out int value); // ReSharper restore UnassignedGetOnlyAutoProperty [GetProcAddress(true)] diff --git a/src/iOS/Avalonia.iOS/LayerFbo.cs b/src/iOS/Avalonia.iOS/LayerFbo.cs index 955aaef59f..9a93cdfb22 100644 --- a/src/iOS/Avalonia.iOS/LayerFbo.cs +++ b/src/iOS/Avalonia.iOS/LayerFbo.cs @@ -10,12 +10,12 @@ namespace Avalonia.iOS private readonly EAGLContext _context; private readonly GlInterface _gl; private readonly CAEAGLLayer _layer; - private int[] _framebuffer; - private int[] _renderbuffer; - private int[] _depthBuffer; + private int _framebuffer; + private int _renderbuffer; + private int _depthBuffer; private bool _disposed; - private LayerFbo(EAGLContext context, GlInterface gl, CAEAGLLayer layer, int[] framebuffer, int[] renderbuffer, int[] depthBuffer) + private LayerFbo(EAGLContext context, GlInterface gl, CAEAGLLayer layer, int framebuffer, int renderbuffer, int depthBuffer) { _context = context; _gl = gl; @@ -30,42 +30,36 @@ namespace Avalonia.iOS 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]); + var rb = gl.GenRenderbuffer(); + gl.BindRenderbuffer(GlConsts.GL_RENDERBUFFER, rb); 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); + var fb = gl.GenFramebuffer(); + gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, fb); + gl.FramebufferRenderbuffer(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_COLOR_ATTACHMENT0, GlConsts.GL_RENDERBUFFER, rb); - gl.GenRenderbuffers(1, db); + gl.GetRenderbufferParameteriv(GlConsts.GL_RENDERBUFFER, GlConsts.GL_RENDERBUFFER_WIDTH, out var w); + gl.GetRenderbufferParameteriv(GlConsts.GL_RENDERBUFFER, GlConsts.GL_RENDERBUFFER_HEIGHT, out var h); + + var db = gl.GenRenderbuffer(); //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]); + gl.FramebufferRenderbuffer(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_DEPTH_ATTACHMENT, GlConsts.GL_RENDERBUFFER, db); 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); + gl.DeleteFramebuffer(fb); + gl.DeleteRenderbuffer(db); + gl.DeleteRenderbuffer(rb); return null; } return new LayerFbo(context, gl, layer, fb, rb, db) { - Width = w[0], - Height = h[0] + Width = w, + Height = h }; } @@ -74,7 +68,7 @@ namespace Avalonia.iOS public void Bind() { - _gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, _framebuffer[0]); + _gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, _framebuffer); } public void Present() @@ -88,9 +82,9 @@ namespace Avalonia.iOS if(_disposed) return; _disposed = true; - _gl.DeleteFramebuffers(1, _framebuffer); - _gl.DeleteRenderbuffers(1, _depthBuffer); - _gl.DeleteRenderbuffers(1, _renderbuffer); + _gl.DeleteFramebuffer(_framebuffer); + _gl.DeleteRenderbuffer(_depthBuffer); + _gl.DeleteRenderbuffer(_renderbuffer); if (_context != EAGLContext.CurrentContext) throw new InvalidOperationException("Associated EAGLContext is not current"); }