From 39066900773e7857faf2d02e7ed51b71d219d97d Mon Sep 17 00:00:00 2001 From: godosa Date: Tue, 6 Oct 2026 23:39:36 +0200 Subject: godosa-engine: initial public history --- src/Godosa.Desktop/GlProgram.cs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/Godosa.Desktop/GlProgram.cs (limited to 'src/Godosa.Desktop/GlProgram.cs') diff --git a/src/Godosa.Desktop/GlProgram.cs b/src/Godosa.Desktop/GlProgram.cs new file mode 100644 index 0000000..25ebe5c --- /dev/null +++ b/src/Godosa.Desktop/GlProgram.cs @@ -0,0 +1,35 @@ +using Silk.NET.OpenGL; + +namespace Godosa.Desktop; + +/// Shader program helpers: compile + link with the driver's info log in the +/// exception, so a bad shader fails loudly at startup instead of drawing nothing. +public static class GlProgram +{ + public static uint Link(GL gl, string vertexSource, string fragmentSource) + { + uint vs = Compile(gl, ShaderType.VertexShader, vertexSource); + uint fs = Compile(gl, ShaderType.FragmentShader, fragmentSource); + uint program = gl.CreateProgram(); + gl.AttachShader(program, vs); + gl.AttachShader(program, fs); + gl.LinkProgram(program); + gl.GetProgram(program, ProgramPropertyARB.LinkStatus, out int linkStatus); + if (linkStatus == 0) + throw new InvalidOperationException($"Shader link failed: {gl.GetProgramInfoLog(program)}"); + gl.DeleteShader(vs); + gl.DeleteShader(fs); + return program; + } + + public static uint Compile(GL gl, ShaderType type, string source) + { + uint shader = gl.CreateShader(type); + gl.ShaderSource(shader, source); + gl.CompileShader(shader); + gl.GetShader(shader, ShaderParameterName.CompileStatus, out int status); + if (status == 0) + throw new InvalidOperationException($"Shader compile failed: {gl.GetShaderInfoLog(shader)}"); + return shader; + } +} -- cgit