public override void UpdateUniforms( Graphics.GpuProgramParameters parms, int mask, Graphics.GpuProgramType fromProgType ) { foreach ( var currentUniform in glUniformReferences ) { //Only pull values from buffer it's supposed to be in (vertex or fragment) //This method will be called twice, once for vertex program params, //and once for fragment program params. if ( fromProgType == currentUniform.SourceProgType ) { var def = currentUniform.ConstantDef; if ( ( (int) def.Variability & mask ) != 0 ) { int glArraySize = def.ArraySize; switch ( def.ConstantType ) { case GpuProgramParameters.GpuConstantType.Float1: unsafe { GL.Uniform1( currentUniform.Location, glArraySize, parms.GetFloatPointer( def.PhysicalIndex ).Pointer.ToFloatPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Float2: unsafe { GL.Uniform2( currentUniform.Location, glArraySize, parms.GetFloatPointer( def.PhysicalIndex ).Pointer.ToFloatPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Float3: unsafe { GL.Uniform3( currentUniform.Location, glArraySize, parms.GetFloatPointer( def.PhysicalIndex ).Pointer.ToFloatPointer() ); } break; case GpuProgramParameters.GpuConstantType.Float4: unsafe { GL.Uniform4( currentUniform.Location, glArraySize, parms.GetFloatPointer( def.PhysicalIndex ).Pointer.ToFloatPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Matrix_2X2: unsafe { GL.UniformMatrix2( currentUniform.Location, glArraySize, false, parms.GetFloatPointer( def.PhysicalIndex ).Pointer.ToFloatPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Matrix_3X3: unsafe { GL.UniformMatrix3( currentUniform.Location, glArraySize, false, parms.GetFloatPointer( def.PhysicalIndex ).Pointer.ToFloatPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Matrix_4X4: unsafe { GL.UniformMatrix4( currentUniform.Location, glArraySize, false, parms.GetFloatPointer( def.PhysicalIndex ).Pointer.ToFloatPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Int1: unsafe { GL.Uniform1( currentUniform.Location, glArraySize, parms.GetIntPointer( def.PhysicalIndex ).Pointer.ToIntPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Int2: unsafe { GL.Uniform2( currentUniform.Location, glArraySize, parms.GetIntPointer( def.PhysicalIndex ).Pointer.ToIntPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Int3: unsafe { GL.Uniform3( currentUniform.Location, glArraySize, parms.GetIntPointer( def.PhysicalIndex ).Pointer.ToIntPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Int4: unsafe { GL.Uniform4( currentUniform.Location, glArraySize, parms.GetIntPointer( def.PhysicalIndex ).Pointer.ToIntPointer() ); GLES2Config.GlCheckError( this ); } break; case GpuProgramParameters.GpuConstantType.Sampler1D: case GpuProgramParameters.GpuConstantType.Sampler1DShadow: case GpuProgramParameters.GpuConstantType.Sampler2D: case GpuProgramParameters.GpuConstantType.Sampler2DShadow: case GpuProgramParameters.GpuConstantType.Sampler3D: case GpuProgramParameters.GpuConstantType.SamplerCube: //samplers handled like 1-elemnt ints unsafe { GL.Uniform1( currentUniform.Location, 1, parms.GetIntPointer( def.PhysicalIndex ).Pointer.ToIntPointer() ); GLES2Config.GlCheckError( this ); } break; } } } } }