Browse Source

Updated LayerFbo

pull/8589/head
Nikita Tsukanov 4 years ago
parent
commit
fd42381afd
  1. 2
      src/Avalonia.OpenGL/GlInterface.cs
  2. 52
      src/iOS/Avalonia.iOS/LayerFbo.cs

2
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)]

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

Loading…
Cancel
Save