CPF/CPF.Skia/GlContexts/Cgl/CglContext.cs
2023-11-21 23:05:03 +08:00

86 lines
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using CPF.Drawing;
using SkiaSharp;
namespace CPF.Skia
{
internal class CglContext : GlContext
{
private IntPtr fContext;
public CglContext(IRenderTarget renderTarget)
{
var attributes = new [] {
CGLPixelFormatAttribute.kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)CGLOpenGLProfile.kCGLOGLPVersion_3_2_Core,
CGLPixelFormatAttribute.kCGLPFADoubleBuffer,
CGLPixelFormatAttribute.kCGLPFANone
};
IntPtr pixFormat;
int npix;
Cgl.CGLChoosePixelFormat(attributes, out pixFormat, out npix);
if (pixFormat == IntPtr.Zero) {
throw new Exception("CGLChoosePixelFormat failed.");
}
Cgl.CGLCreateContext(pixFormat, IntPtr.Zero, out fContext);
Cgl.CGLReleasePixelFormat(pixFormat);
if (fContext == IntPtr.Zero) {
throw new Exception("CGLCreateContext failed.");
}
}
public override void MakeCurrent()
{
Cgl.CGLSetCurrentContext(fContext);
}
public override void SwapBuffers()
{
Cgl.CGLFlushDrawable(fContext);
}
public override void Dispose()
{
if (fContext != IntPtr.Zero) {
Cgl.CGLReleaseContext(fContext);
fContext = IntPtr.Zero;
}
}
public override GRGlTextureInfo CreateTexture(SKSizeI textureSize)
{
var textures = new uint[1];
Cgl.glGenTextures(textures.Length, textures);
var textureId = textures[0];
Cgl.glBindTexture(Cgl.GL_TEXTURE_2D, textureId);
Cgl.glTexImage2D(Cgl.GL_TEXTURE_2D, 0, Cgl.GL_RGBA, textureSize.Width, textureSize.Height, 0, Cgl.GL_RGBA, Cgl.GL_UNSIGNED_BYTE, IntPtr.Zero);
Cgl.glBindTexture(Cgl.GL_TEXTURE_2D, 0);
return new GRGlTextureInfo {
Id = textureId,
Target = Cgl.GL_TEXTURE_2D,
Format = Cgl.GL_RGBA8
};
}
public override void DestroyTexture(uint texture)
{
Cgl.glDeleteTextures(1, new[] { texture });
}
public const int GL_FRAMEBUFFER_BINDING = 0x8CA6;
public override void GetFramebufferInfo(out int framebuffer, out int samples, out int stencil)
{
Glx.glGetIntegerv(GL_FRAMEBUFFER_BINDING, out framebuffer);
Glx.glGetIntegerv(3415, out stencil);
Glx.glGetIntegerv(32937, out samples);
}
}
}