aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Gal/OpenGL/OglShaderProgram.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics/Gal/OpenGL/OglShaderProgram.cs')
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OglShaderProgram.cs86
1 files changed, 86 insertions, 0 deletions
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OglShaderProgram.cs b/Ryujinx.Graphics/Gal/OpenGL/OglShaderProgram.cs
new file mode 100644
index 00000000..9e68a8e6
--- /dev/null
+++ b/Ryujinx.Graphics/Gal/OpenGL/OglShaderProgram.cs
@@ -0,0 +1,86 @@
+using OpenTK.Graphics.OpenGL;
+using System;
+using System.Collections.Generic;
+
+namespace Ryujinx.Graphics.Gal.OpenGL
+{
+ struct OglShaderProgram
+ {
+ public OglShaderStage Vertex;
+ public OglShaderStage TessControl;
+ public OglShaderStage TessEvaluation;
+ public OglShaderStage Geometry;
+ public OglShaderStage Fragment;
+ }
+
+ class OglShaderStage : IDisposable
+ {
+ public int Handle { get; private set; }
+
+ public bool IsCompiled { get; private set; }
+
+ public GalShaderType Type { get; private set; }
+
+ public string Code { get; private set; }
+
+ public IEnumerable<ShaderDeclInfo> ConstBufferUsage { get; private set; }
+ public IEnumerable<ShaderDeclInfo> TextureUsage { get; private set; }
+
+ public OglShaderStage(
+ GalShaderType type,
+ string code,
+ IEnumerable<ShaderDeclInfo> constBufferUsage,
+ IEnumerable<ShaderDeclInfo> textureUsage)
+ {
+ Type = type;
+ Code = code;
+ ConstBufferUsage = constBufferUsage;
+ TextureUsage = textureUsage;
+ }
+
+ public void Compile()
+ {
+ if (Handle == 0)
+ {
+ Handle = GL.CreateShader(OglEnumConverter.GetShaderType(Type));
+
+ CompileAndCheck(Handle, Code);
+ }
+ }
+
+ public void Dispose()
+ {
+ Dispose(true);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing && Handle != 0)
+ {
+ GL.DeleteShader(Handle);
+
+ Handle = 0;
+ }
+ }
+
+ public static void CompileAndCheck(int handle, string code)
+ {
+ GL.ShaderSource(handle, code);
+ GL.CompileShader(handle);
+
+ CheckCompilation(handle);
+ }
+
+ private static void CheckCompilation(int handle)
+ {
+ int status = 0;
+
+ GL.GetShader(handle, ShaderParameter.CompileStatus, out status);
+
+ if (status == 0)
+ {
+ throw new ShaderException(GL.GetShaderInfoLog(handle));
+ }
+ }
+ }
+} \ No newline at end of file