private void linkProgram(OpenGL gl, ActiveProgramValues programValues, uint glProgramHandle)
        {
            //TODO add debug assertions in case a shader fails to compile, or a program fails to link
            var glShaderHandles = new List<uint>(programValues.AttachedShaderValues.Count);
            foreach (var shaderValues in programValues.AttachedShaderValues)
            {
            var glShaderHandle = gl.CreateShader(shaderValues.Stage.GlEnumValue());
            glShaderHandles.Add(glShaderHandle);

            gl.ShaderSource(glShaderHandle, shaderValues.Source);
            gl.CompileShader(glShaderHandle);

            gl.AttachShader(glProgramHandle, glShaderHandle);
            }

            gl.LinkProgram(glProgramHandle);

            foreach (var glShaderHandle in glShaderHandles)
            {
            gl.DetachShader(glProgramHandle, glShaderHandle);
            gl.DeleteShader(glShaderHandle);
            }
        }
 private void resetActiveProgramValues()
 {
     lock (this)
     {
     activeProgramValues = new ActiveProgramValues(activeProgram);
     }
 }