protected override void PlatformSetConstantBuffer(int slot, ConstantBuffer cb) { OpenGLESUniformBinding binding = ShaderResourceBindingSlots.GetUniformBindingForSlot(slot); ((OpenGLESConstantBuffer)cb).BindToBlock(ShaderSet.ProgramID, binding.BlockLocation, ((OpenGLESConstantBuffer)cb).BufferSize, slot); //if (binding.BlockLocation != -1) //{ // BindUniformBlock(ShaderSet, slot, binding.BlockLocation, (OpenGLESConstantBuffer)cb); //} //else //{ // Debug.Assert(binding.StorageAdapter != null); // SetUniformLocationDataSlow((OpenGLESConstantBuffer)cb, binding.StorageAdapter); //} }
public OpenGLESShaderResourceBindingSlots(OpenGLESShaderSet shaderSet, ShaderResourceDescription[] resources) { Resources = resources; int programID = shaderSet.ProgramID; int lastTextureLocation = -1; int relativeTextureIndex = -1; for (int i = 0; i < resources.Length; i++) { ShaderResourceDescription resource = resources[i]; if (resource.Type == ShaderResourceType.ConstantBuffer) { int blockIndex = GL.GetUniformBlockIndex(programID, resource.Name); Utilities.CheckLastGLES3Error(); if (blockIndex != -1) { ValidateBlockSize(programID, blockIndex, resource.DataSizeInBytes, resource.Name); _constantBindings[i] = new OpenGLESUniformBinding(programID, blockIndex, resource.DataSizeInBytes); } else { int uniformLocation = GL.GetUniformLocation(programID, resource.Name); Utilities.CheckLastGLES3Error(); if (uniformLocation == -1) { throw new VeldridException($"No uniform or uniform block with name {resource.Name} was found."); } OpenGLESUniformStorageAdapter storageAdapter = new OpenGLESUniformStorageAdapter(programID, uniformLocation); _constantBindings[i] = new OpenGLESUniformBinding(programID, storageAdapter); } } else if (resource.Type == ShaderResourceType.Texture) { int location = GL.GetUniformLocation(shaderSet.ProgramID, resource.Name); Utilities.CheckLastGLES3Error(); if (location == -1) { throw new VeldridException($"No sampler was found with the name {resource.Name}"); } relativeTextureIndex += 1; _textureBindings[i] = new OpenGLESTextureBindingSlotInfo() { RelativeIndex = relativeTextureIndex, UniformLocation = location }; lastTextureLocation = location; } else { Debug.Assert(resource.Type == ShaderResourceType.Sampler); if (lastTextureLocation == -1) { throw new VeldridException( "OpenGL Shaders must specify at least one texture before a sampler. Samplers are implicity linked with the closest-previous texture resource in the binding list."); } _samplerBindings[i] = new OpenGLESTextureBindingSlotInfo() { RelativeIndex = relativeTextureIndex, UniformLocation = lastTextureLocation }; } } }