private void Link(Shader vertexShader, Shader pixelShader)
{
// NOTE: No need to worry about background threads here
// as this is only called at draw time when we're in the
// main drawing thread.
var program = GL.CreateProgram();
GraphicsExtensions.CheckGLError();
GL.AttachShader(program, vertexShader.GetShaderHandle());
GraphicsExtensions.CheckGLError();
GL.AttachShader(program, pixelShader.GetShaderHandle());
GraphicsExtensions.CheckGLError();
//vertexShader.BindVertexAttributes(program);
GL.LinkProgram(program);
GraphicsExtensions.CheckGLError();
GL.UseProgram(program);
GraphicsExtensions.CheckGLError();
vertexShader.GetVertexAttributeLocations(program);
pixelShader.ApplySamplerTextureUnits(program);
var linked = 0;
#if GLES
GL.GetProgram(program, ProgramParameter.LinkStatus, ref linked);
#else
GL.GetProgram(program, ProgramParameter.LinkStatus, out linked);
#endif
GraphicsExtensions.LogGLError("VertexShaderCache.Link(), GL.GetProgram");
if (linked == 0)
{
#if !GLES
var log = GL.GetProgramInfoLog(program);
Console.WriteLine(log);
#endif
GL.DetachShader(program, vertexShader.GetShaderHandle());
GL.DetachShader(program, pixelShader.GetShaderHandle());
#if MONOMAC
GL.DeleteProgram(1, ref program);
#else
GL.DeleteProgram(program);
#endif
throw new InvalidOperationException("Unable to link effect program");
}
ShaderProgramInfo info;
info.program = program;
info.posFixupLoc = GL.GetUniformLocation(program, "posFixup");
_programCache.Add(vertexShader.HashKey | pixelShader.HashKey, info);
}