|
|
|
@ -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"); |
|
|
|
} |
|
|
|
|