internal GLProgram(bool valid, int programHandle, GLVertexSignature signature, GLUniformBlock[] uniformBlocks, GLUniform[] uniforms, string infoLog = null) { Valid = valid; Handle = programHandle; Signature = signature; UniformBlocks = uniformBlocks; Uniforms = uniforms; InfoLog = infoLog; }
public static GLProgram BuildShaderProgram(ShaderProgramSource source) { int programHandle = GL.CreateProgram(); int vertexShaderHandle = 0, tessControlShaderHandle = 0, tessEvalShaderHandle = 0, geometryShaderHandle = 0, fragmentShaderHandle = 0; #region build single shaders if (source.HasVertexStage) { vertexShaderHandle = BuildSingleShader(ShaderType.VertexShader, source.VertexSource); GL.AttachShader(programHandle, vertexShaderHandle); } if (source.HasTessControlStage) { tessControlShaderHandle = BuildSingleShader(ShaderType.TessControlShader, source.TessControlSource); GL.AttachShader(programHandle, tessControlShaderHandle); } if (source.HasTessEvalStage) { tessEvalShaderHandle = BuildSingleShader(ShaderType.TessEvaluationShader, source.TessEvalSource); GL.AttachShader(programHandle, tessEvalShaderHandle); } if (source.HasGeometryStage) { geometryShaderHandle = BuildSingleShader(ShaderType.GeometryShader, source.GeometrySource); GL.AttachShader(programHandle, geometryShaderHandle); } if (source.HasFragmentStage) { fragmentShaderHandle = BuildSingleShader(ShaderType.FragmentShader, source.FragmentSource); GL.AttachShader(programHandle, fragmentShaderHandle); } #endregion #region pre linking operations #endregion #region linking GL.LinkProgram(programHandle); int programStatus; GL.GetProgram(programHandle, GetProgramParameterName.ValidateStatus, out programStatus); string infoLog = GL.GetProgramInfoLog(programHandle); #endregion #region post linking operations bool programValid = ValidateShaderProgram(programHandle); var uniforms = ExtractUniforms(programHandle); var uniformBlocks = ExtractUniformBlocks(programHandle, uniforms); var attributes = ExtractAttributes(programHandle); #endregion #region clear single shaders if (source.HasVertexStage) { GL.DeleteShader(vertexShaderHandle); } if (source.HasTessControlStage) { GL.DeleteShader(tessControlShaderHandle); } if (source.HasTessEvalStage) { GL.DeleteShader(tessEvalShaderHandle); } if (source.HasGeometryStage) { GL.DeleteShader(geometryShaderHandle); } if (source.HasFragmentStage) { GL.DeleteShader(fragmentShaderHandle); } #endregion var signature = new GLVertexSignature(attributes); return new GLProgram(programValid, programHandle, signature, uniformBlocks, uniforms, infoLog); }