Merge pull request #7857 from sinf/glgl
Print GLSL info log if shader compilation fails
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user