Merge pull request #7857 from sinf/glgl

Print GLSL info log if shader compilation fails
This commit is contained in:
Paul Chote
2015-04-25 17:56:32 +12:00

View File

@@ -23,40 +23,44 @@ namespace OpenRA.Renderer.Sdl2
readonly Dictionary<int, ITexture> textures = new Dictionary<int, ITexture>(); readonly Dictionary<int, ITexture> textures = new Dictionary<int, ITexture>();
int program; int program;
public Shader(string name) protected int CompileShaderObject(ShaderType type, string name)
{ {
// Vertex shader string ext = type == ShaderType.VertexShader ? "vert" : "frag";
string vertexCode; string filename = "glsl{0}{1}.{2}".F(Path.DirectorySeparatorChar, name, ext);
using (var file = new StreamReader(GlobalFileSystem.Open("glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, name)))) string code;
vertexCode = file.ReadToEnd(); using (var file = new StreamReader(GlobalFileSystem.Open(filename)))
code = file.ReadToEnd();
var vertexShader = GL.CreateShader(ShaderType.VertexShader); var shader = GL.CreateShader(type);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
GL.ShaderSource(vertexShader, vertexCode); GL.ShaderSource(shader, code);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
GL.CompileShader(vertexShader); GL.CompileShader(shader);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
int success; int success;
GL.GetShader(vertexShader, ShaderParameter.CompileStatus, out success); GL.GetShader(shader, ShaderParameter.CompileStatus, out success);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
if (success == (int)All.False) if (success == (int)All.False)
throw new InvalidProgramException("Compile error in glsl{0}{1}.vert".F(Path.DirectorySeparatorChar, name)); {
int len;
GL.GetShader(shader, ShaderParameter.InfoLogLength, out len);
var log = new StringBuilder(len);
unsafe
{
GL.GetShaderInfoLog(shader, len, null, log);
}
// Fragment shader Log.Write("graphics", "GL Info Log:\n{0}", log.ToString());
string fragmentCode; throw new InvalidProgramException("Compile error in shader object '{0}'".F(filename));
using (var file = new StreamReader(GlobalFileSystem.Open("glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name)))) }
fragmentCode = file.ReadToEnd();
var fragmentShader = GL.CreateShader(ShaderType.FragmentShader); return shader;
ErrorHandler.CheckGlError(); }
GL.ShaderSource(fragmentShader, fragmentCode);
ErrorHandler.CheckGlError(); public Shader(string name)
GL.CompileShader(fragmentShader); {
ErrorHandler.CheckGlError(); var vertexShader = CompileShaderObject(ShaderType.VertexShader, name);
GL.GetShader(vertexShader, ShaderParameter.CompileStatus, out success); var fragmentShader = CompileShaderObject(ShaderType.FragmentShader, name);
ErrorHandler.CheckGlError();
if (success == (int)All.False)
throw new InvalidProgramException("Compile error in glsl{0}{1}.frag".F(Path.DirectorySeparatorChar, name));
// Assemble program // Assemble program
program = GL.CreateProgram(); program = GL.CreateProgram();
@@ -68,10 +72,22 @@ namespace OpenRA.Renderer.Sdl2
GL.LinkProgram(program); GL.LinkProgram(program);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
int success;
GL.GetProgram(program, ProgramParameter.LinkStatus, out success); GL.GetProgram(program, ProgramParameter.LinkStatus, out success);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();
if (success == (int)All.False) if (success == (int)All.False)
throw new InvalidProgramException("Linking error in {0} shader".F(name)); {
int len;
GL.GetProgram(program, ProgramParameter.InfoLogLength, out len);
var log = new StringBuilder(len);
unsafe
{
GL.GetProgramInfoLog(program, len, null, log);
}
Log.Write("graphics", "GL Info Log:\n{0}", log.ToString());
throw new InvalidProgramException("Link error in shader program '{0}'".F(name));
}
GL.UseProgram(program); GL.UseProgram(program);
ErrorHandler.CheckGlError(); ErrorHandler.CheckGlError();