private static void Load_VERSION_3_1() { DrawArraysInstanced = GetAddress <DrawArraysInstanced>("glDrawArraysInstanced"); _DrawElementsInstanced = GetAddress <DrawElementsInstanced>("glDrawElementsInstanced"); TexBuffer = GetAddress <TexBuffer>("glTexBuffer"); PrimitiveRestartIndex = GetAddress <PrimitiveRestartIndex>("glPrimitiveRestartIndex"); GetUniformIndices = GetAddress <GetUniformIndices>("glGetUniformIndices"); GetActiveUniformsi = GetAddress <GetActiveUniformsi>("glGetActiveUniformsi"); GetActiveUniformsiv = GetAddress <GetActiveUniformsiv>("glGetActiveUniformsiv"); _GetActiveUniformName = GetAddress <GetActiveUniformName>("glGetActiveUniformName"); GetUniformBlockIndex = GetAddress <GetUniformBlockIndex>("glGetUniformBlockIndex"); GetActiveUniformBlocki = GetAddress <GetActiveUniformBlocki>("glGetActiveUniformBlocki"); GetActiveUniformBlockiv = GetAddress <GetActiveUniformBlockiv>("glGetActiveUniformBlockiv"); _GetActiveUniformBlockName = GetAddress <GetActiveUniformBlockName>("glGetActiveUniformBlockName"); UniformBlockBinding = GetAddress <UniformBlockBinding>("glUniformBlockBinding"); if (IntPtr.Size == 4) { CopyBufferSubData_32 = GetAddress <CopyBufferSubData_32>("glCopyBufferSubData"); } else { CopyBufferSubData_64 = GetAddress <CopyBufferSubData_64>("glCopyBufferSubData"); } bool CopyBufferSubData = CopyBufferSubData_32 != null || CopyBufferSubData_64 != null; VERSION_3_1 = VERSION_3_0 && DrawArraysInstanced != null && _DrawElementsInstanced != null && TexBuffer != null && PrimitiveRestartIndex != null && GetUniformIndices != null && GetActiveUniformsiv != null && _GetActiveUniformName != null && GetUniformBlockIndex != null && GetActiveUniformBlockiv != null && _GetActiveUniformBlockName != null && UniformBlockBinding != null && CopyBufferSubData; }
/// <summary> /// Collect information about uniform blocks defined in a ShaderProgram instance. /// </summary> /// <param name="ctx"> /// The <see cref="GraphicsContext"/> used for linking the ShaderProgram instance. /// </param> private void CollectActiveUniformBlocks(GraphicsContext ctx) { if (ctx == null) { throw new ArgumentNullException("ctx"); } if (ctx.Extensions.UniformBufferObject_ARB == false) { return; } int activeUniformBlocks = 0; Gl.GetProgram(ObjectName, Gl.ACTIVE_UNIFORM_BLOCKS, out activeUniformBlocks); // Clear uniform mapping _UniformBlockMap.Clear(); for (int i = 0; i < activeUniformBlocks; i++) { UniformBlockBinding uniformBlockBinding = new UniformBlockBinding(this, (uint)i); _UniformBlockMap.Add(uniformBlockBinding.Name, uniformBlockBinding); } }
/// <summary> /// Set uniform state variable (floating-point variable). /// </summary> /// <param name="ctx"> /// A <see cref="GraphicsContext"/> used for operations. /// </param> /// <param name="uniformName"> /// A <see cref="String"/> that specify the variable name in the shader source. /// </param> /// <param name="v"> /// A <see cref="Single"/> holding the uniform variabile data. /// </param> public void SetUniformBlock(GraphicsContext ctx, string uniformBlockName, UniformBuffer uniformBuffer) { if (ctx == null) { throw new ArgumentNullException("ctx"); } if (uniformBuffer == null) { throw new ArgumentNullException("uniformBuffer"); } // Select a binding point, if still invalid ctx.Bind(uniformBuffer); UniformBlockBinding uniformBlockBinding = GetUniformBlock(uniformBlockName); if (uniformBlockBinding == null) { throw new ArgumentException("no uniform block with such name", "uniformBlockName"); } #if ENABLE_UNIFORM_BLOCK_CACHING if (IsUniformBlockChanged(uniformBlockBinding.Index, uniformBuffer) == false) { return; } #endif // Link the uniform buffer Gl.UniformBlockBinding(ObjectName, uniformBlockBinding.Index, uniformBuffer.BindingIndex); #if ENABLE_UNIFORM_BLOCK_CACHING CacheUniformBlock(uniformBlockBinding.Index, uniformBuffer); #endif }
public UniformBufferObject CreateUniformBlock(string uniformBlockName, BufferObjectHint hint) { UniformBlockBinding uniformBlockBinding = GetUniformBlock(uniformBlockName); if (uniformBlockBinding == null) { throw new ArgumentException("no uniform block with such name", "uniformBlockName"); } UniformBufferObject uniformBuffer = new UniformBufferObject(hint); uniformBuffer.Create(uniformBlockBinding.DataSize); return(uniformBuffer); }
public void CreateUniformBlock(string uniformBlockName, UniformBufferObject uniformBuffer) { if (uniformBuffer == null) { throw new ArgumentNullException("uniformBuffer"); } UniformBlockBinding uniformBlockBinding = GetUniformBlock(uniformBlockName); if (uniformBlockBinding == null) { throw new ArgumentException("no uniform block with such name", "uniformBlockName"); } // Create/Update uniformBuffer.Create(uniformBlockBinding.DataSize); }
/// <summary> /// Create an <see cref="UniformBuffer"/> useful for backing with a buffer object the specified uniform block. /// </summary> /// <param name="uniformBlockName"></param> /// <param name="usageMask"></param> /// <returns></returns> public UniformBuffer CreateUniformBlock(string uniformBlockName, MapBufferUsageMask usageMask) { UniformBlockBinding uniformBlockBinding = GetUniformBlock(uniformBlockName); if (uniformBlockBinding == null) { throw new ArgumentException("no uniform block with such name", "uniformBlockName"); } UniformBuffer uniformBuffer = new UniformBuffer(usageMask); // Allocate client storage uniformBuffer.Create(uniformBlockBinding.DataSize); // Map uniform names with MapUniformBlock(uniformBlockName, uniformBuffer); return(uniformBuffer); }
private void MapUniformBlock(string uniformBlockName, UniformBuffer uniformBuffer) { UniformBlockBinding uniformBlockBinding = GetUniformBlock(uniformBlockName); if (uniformBlockBinding == null) { throw new ArgumentException("no uniform block with such name", "uniformBlockName"); } for (int i = 0; i < uniformBlockBinding.UniformIndices.Length; i++) { uint uniformIndex = uniformBlockBinding.UniformIndices[i]; UniformBinding uniformBinding; if (_UniformIndexMap.TryGetValue(uniformIndex, out uniformBinding) == false) { throw new InvalidOperationException("uniform buffer index mismatch with uniforms"); } UniformBuffer.UniformSegment uniformSegment = new UniformBuffer.UniformSegment(); uniformSegment.UniformIndex = uniformIndex; uniformSegment.Type = uniformBinding.UniformType; uniformSegment.Offset = uniformBinding.BlockOffset; uniformSegment.ArrayStride = uniformBinding.BlockArrayStride; uniformSegment.MatrixStride = uniformBinding.BlockMatrixStride; uniformSegment.RowMajor = uniformBinding.BlockMatrixRowMajor; uniformBuffer._UniformSegments[uniformBinding.Name] = uniformSegment; } foreach (KeyValuePair <string, UniformBinding> pair in _UniformMap) { if (pair.Value != null) { continue; } uniformBuffer._UniformSegments[pair.Key] = null; } }
public OpenGLESShaderConstantBindingSlots( ShaderSet shaderSet, ShaderResourceDescription[] constants) { var programID = ((OpenGLESShaderSet)shaderSet).ProgramID; int bindingIndex = 0; int constantsCount = constants.Length; _bindings = new UniformBinding[constantsCount]; for (int i = 0; i < constantsCount; i++) { ShaderResourceDescription description = constants[i]; int blockIndex = GL.GetUniformBlockIndex(programID, description.Name); if (blockIndex != -1) { ValidateBlockSize(programID, blockIndex, description.DataSizeInBytes, description.Name); _bindings[i] = new UniformBlockBinding( programID, blockIndex, bindingIndex, description.DataSizeInBytes); bindingIndex += 1; } else { int uniformLocation = GL.GetUniformLocation(programID, description.Name); if (uniformLocation == -1) { throw new VeldridException($"No uniform or uniform block with name {description.Name} was found."); } _bindings[i] = new UniformLocationBinding( programID, uniformLocation); } } }
/// <summary> /// Set uniform state variable (floating-point variable). /// </summary> /// <param name="ctx"> /// A <see cref="GraphicsContext"/> used for operations. /// </param> /// <param name="uniformName"> /// A <see cref="String"/> that specify the variable name in the shader source. /// </param> /// <param name="v"> /// A <see cref="Single"/> holding the uniform variabile data. /// </param> public void SetUniformBlock(GraphicsContext ctx, string uniformBlockName, UniformBufferObject uniformBuffer) { if (ctx == null) { throw new ArgumentNullException("ctx"); } if (uniformBuffer == null) { throw new ArgumentNullException("uniformBuffer"); } UniformBlockBinding uniformBlockBinding = GetUniformBlock(uniformBlockName); if (uniformBlockBinding == null) { throw new ArgumentException("no uniform block with such name", "uniformBlockName"); } // Select a binding point ctx.Bind(uniformBuffer); // Link the uniform buffer Gl.UniformBlockBinding(ObjectName, uniformBlockBinding.Index, uniformBuffer.BindingIndex); }
public OpenGLShaderConstantBindings( RenderContext rc, ShaderSet shaderSet, MaterialInputs <MaterialGlobalInputElement> globalInputs, MaterialInputs <MaterialPerObjectInputElement> perObjectInputs) { var programID = ((OpenGLShaderSet)shaderSet).ProgramID; int globalInputsCount = globalInputs.Elements.Length; int bindingIndex = 0; _globalUniformBindings = new GlobalBindingPair[globalInputsCount]; for (int i = 0; i < globalInputsCount; i++) { var element = globalInputs.Elements[i]; ConstantBufferDataProvider dataProvider = element.UseGlobalNamedBuffer ? rc.GetNamedGlobalBufferProviderPair(element.GlobalProviderName).DataProvider : element.DataProvider; int blockIndex = GL.GetUniformBlockIndex(programID, element.Name); if (blockIndex != -1) { ValidateBlockSize(programID, blockIndex, dataProvider.DataSizeInBytes, element.Name); _globalUniformBindings[i] = new GlobalBindingPair( new UniformBlockBinding( programID, blockIndex, bindingIndex, new OpenGLConstantBuffer(dataProvider), dataProvider.DataSizeInBytes), dataProvider); bindingIndex += 1; } else { int uniformLocation = GL.GetUniformLocation(programID, element.Name); if (uniformLocation == -1) { throw new InvalidOperationException($"No uniform or uniform block with name {element.Name} was found."); } _globalUniformBindings[i] = new GlobalBindingPair( new UniformLocationBinding( programID, uniformLocation), dataProvider); } } int perObjectInputsCount = perObjectInputs.Elements.Length; _perObjectBindings = new UniformBinding[perObjectInputsCount]; for (int i = 0; i < perObjectInputsCount; i++) { var element = perObjectInputs.Elements[i]; int blockIndex = GL.GetUniformBlockIndex(programID, element.Name); if (blockIndex != -1) { _perObjectBindings[i] = new UniformBlockBinding( programID, blockIndex, bindingIndex, new OpenGLConstantBuffer(), element.BufferSizeInBytes); bindingIndex += 1; } else { int uniformLocation = GL.GetUniformLocation(programID, element.Name); if (uniformLocation == -1) { throw new InvalidOperationException($"No uniform or uniform block with name {element.Name} was found."); } _perObjectBindings[i] = new UniformLocationBinding( programID, uniformLocation); } } }