You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.6 KiB
62 lines
2.6 KiB
using System; |
|
using System.Runtime.CompilerServices; |
|
using Silk.NET.OpenGL; |
|
|
|
namespace gaemstone.Client; |
|
|
|
public static class GLExtensions |
|
{ |
|
public static uint CreateAndCompileShader(this GL GL, ShaderType type, string label, string source) |
|
{ |
|
var shader = GL.CreateShader(type); |
|
GL.ObjectLabel(ObjectIdentifier.Shader, shader, (uint)label.Length, label); |
|
GL.ShaderSource(shader, source); |
|
GL.CompileShader(shader); |
|
GL.GetShader(shader, ShaderParameterName.CompileStatus, out var result); |
|
if (result != (int)GLEnum.True) throw new Exception( |
|
$"Failed compiling shader \"{label}\" ({shader}):\n{GL.GetShaderInfoLog(shader)}"); |
|
return shader; |
|
} |
|
|
|
public static uint CreateAndLinkProgram(this GL GL, string label, params uint[] shaders) |
|
{ |
|
var program = GL.CreateProgram(); |
|
GL.ObjectLabel(ObjectIdentifier.Program, program, (uint)label.Length, label); |
|
foreach (var shader in shaders) GL.AttachShader(program, shader); |
|
GL.LinkProgram(program); |
|
foreach (var shader in shaders) GL.DetachShader(program, shader); |
|
foreach (var shader in shaders) GL.DeleteShader(shader); |
|
GL.GetProgram(program, ProgramPropertyARB.LinkStatus, out var result); |
|
if (result != (int)GLEnum.True) throw new Exception( |
|
$"Failed linking Program \"{label}\" ({program}):\n{GL.GetProgramInfoLog(program)}"); |
|
return program; |
|
} |
|
|
|
// These overloads are available because without them, the implicit casting |
|
// (say from T[] to ReadOnlySpan<T>) causes the generic type resolving to break. |
|
public static uint CreateBufferFromData<T>(this GL GL, T[] data, |
|
BufferTargetARB target = BufferTargetARB.ArrayBuffer, |
|
BufferUsageARB usage = BufferUsageARB.StaticDraw) |
|
where T : unmanaged |
|
=> GL.CreateBufferFromData((ReadOnlySpan<T>)data, target, usage); |
|
public static uint CreateBufferFromData<T>(this GL GL, ArraySegment<T> data, |
|
BufferTargetARB target = BufferTargetARB.ArrayBuffer, |
|
BufferUsageARB usage = BufferUsageARB.StaticDraw) |
|
where T : unmanaged |
|
=> GL.CreateBufferFromData((ReadOnlySpan<T>)data, target, usage); |
|
public static uint CreateBufferFromData<T>(this GL GL, Span<T> data, |
|
BufferTargetARB target = BufferTargetARB.ArrayBuffer, |
|
BufferUsageARB usage = BufferUsageARB.StaticDraw) |
|
where T : unmanaged |
|
=> GL.CreateBufferFromData((ReadOnlySpan<T>)data, target, usage); |
|
public static uint CreateBufferFromData<T>(this GL GL, ReadOnlySpan<T> data, |
|
BufferTargetARB target = BufferTargetARB.ArrayBuffer, |
|
BufferUsageARB usage = BufferUsageARB.StaticDraw) |
|
where T : unmanaged |
|
{ |
|
var buffer = GL.GenBuffer(); |
|
GL.BindBuffer(target, buffer); |
|
GL.BufferData(target, (nuint)(data.Length * Unsafe.SizeOf<T>()), data, usage); |
|
return buffer; |
|
} |
|
}
|
|
|