public override void BindProgramParameters(GpuProgramParameters parms, GpuProgramParameters.GpuParamVariability mask) { // only supports float constants var floatStruct = parms.FloatLogicalBufferStruct; foreach (var i in floatStruct.Map) { if ((i.Value.Variability & mask) != 0) { var logicalIndex = i.Key; var pFloat = parms.GetFloatPointer(i.Value.PhysicalIndex).Pointer; // Iterate over the params, set in 4-float chunks (low-level) for (var j = 0; j < i.Value.CurrentSize; j += 4) { Gl.glSetFragmentShaderConstantATI(Gl.GL_CON_0_ATI + logicalIndex, pFloat.Pin()); pFloat.UnPin(); pFloat += 4; ++logicalIndex; } } } }
/// <summary> /// Updates program object uniforms using data from GpuProgramParameters. /// normally called by GLSLGpuProgram.BindParameters() just before rendering occurs. /// </summary> /// <param name="parameters">GPU Parameters to use to update the uniforms params.</param> public void UpdateUniforms(GpuProgramParameters parameters, GpuProgramParameters.GpuParamVariability mask, GpuProgramType fromProgType) { foreach (var currentUniform in this.uniformReferences) { // 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 ((def.Variability & mask) != 0) { var glArraySize = def.ArraySize; // get the index in the parameter real list switch (def.ConstantType) { case GpuProgramParameters.GpuConstantType.Float1: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniform1fvARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Float2: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniform2fvARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Float3: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniform3fvARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Float4: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniform4fvARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_2X2: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix2fvARB(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_2X3: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix2x3fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_2X4: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix2x4fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_3X2: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix3x2fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_3X3: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix3fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_3X4: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix3x4fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_4X2: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix4x2fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_4X3: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix4x3fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Matrix_4X4: using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex)) { Gl.glUniformMatrix4fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Int1: using (var ptr = parameters.GetIntPointer(def.PhysicalIndex)) { Gl.glUniform1ivARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Int2: using (var ptr = parameters.GetIntPointer(def.PhysicalIndex)) { Gl.glUniform2ivARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Int3: using (var ptr = parameters.GetIntPointer(def.PhysicalIndex)) { Gl.glUniform3ivARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin()); } break; case GpuProgramParameters.GpuConstantType.Int4: using (var ptr = parameters.GetIntPointer(def.PhysicalIndex)) { Gl.glUniform4ivARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin()); } 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: var value = parameters.GetIntConstant(def.PhysicalIndex); Gl.glUniform1iARB(currentUniform.Location, value); break; case GpuProgramParameters.GpuConstantType.Unknown: break; } // end switch GLSLHelper.CheckForGLSLError("GLSLLinkProgram::updateUniforms", 0); } // variability & mask } // fromProgType == currentUniform->mSourceProgType } // end for }