/// <summary> /// Creates the effect pass' collection of uniforms. /// </summary> /// <returns>The collection of uniforms that was created.</returns> private OpenGLShaderUniformCollection CreateUniformCollection() { return(Ultraviolet.QueueWorkItemAndWait((state) => { var programObject = ((OpenGLShaderProgram)state); var program = programObject.program; var uniforms = new List <OpenGLShaderUniform>(); var sampler = 0; var count = gl.GetProgrami(program, gl.GL_ACTIVE_UNIFORMS); gl.ThrowIfError(); for (uint i = 0; i < count; i++) { var type = 0u; var name = gl.GetActiveUniform(program, i, out type); gl.ThrowIfError(); var location = gl.GetUniformLocation(program, name); gl.ThrowIfError(); uniforms.Add(new OpenGLShaderUniform(programObject.Ultraviolet, name, type, program, location, sampler)); if (type == gl.GL_SAMPLER_2D) { sampler++; } } return new OpenGLShaderUniformCollection(uniforms); }, this)); }
/// <inheritdoc/> public override void Attach(RenderBuffer2D buffer) { Contract.Require(buffer, nameof(buffer)); Contract.Ensure <ArgumentException>( buffer.Width == width && buffer.Height == height, OpenGLStrings.RenderBufferIsWrongSize); Contract.EnsureNotDisposed(this, Disposed); Ultraviolet.ValidateResource(buffer); var sdlBuffer = (OpenGLRenderBuffer2D)buffer; Ultraviolet.QueueWorkItemAndWait(() => { using (OpenGLState.ScopedBindFramebuffer(framebuffer)) { AttachRenderBuffer(sdlBuffer); framebufferStatus = gl.CheckNamedFramebufferStatus(framebuffer, gl.GL_FRAMEBUFFER); gl.ThrowIfError(); } }); sdlBuffer.MarkAttached(); buffers.Add(sdlBuffer); }