Esempio n. 1
0
        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);
            }
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 10
0
        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);
                }
            }
        }