public void Bind(ISystemOpenGL.Context context) { // create new framebuffer if it's needed // frame buffers are not shared between contexts if (!framebuffers.TryGetValue(context, out uint id)) { id = GL.GenFramebuffer(); GL.BindFramebuffer(GLEnum.FRAMEBUFFER, id); // color attachments int i = 0; foreach (Texture texture in Attachments) { if (texture.Implementation is GL_Texture glTexture) { if (texture.Format.IsTextureColorFormat()) { GL.FramebufferTexture2D(GLEnum.FRAMEBUFFER, GLEnum.COLOR_ATTACHMENT0 + i, GLEnum.TEXTURE_2D, glTexture.ID, 0); i++; } else { GL.FramebufferTexture2D(GLEnum.FRAMEBUFFER, GLEnum.DEPTH_STENCIL_ATTACHMENT, GLEnum.TEXTURE_2D, glTexture.ID, 0); } } } framebuffers.Add(context, id); } else { GL.BindFramebuffer(GLEnum.FRAMEBUFFER, id); } }
internal ContextMeta GetContextMeta(ISystemOpenGL.Context context) { if (!contextMetadata.TryGetValue(context, out var meta)) { contextMetadata[context] = meta = new ContextMeta(); } return(meta); }
protected override void FirstWindowCreated() { GL.Init(this, System); GL.DepthMask(true); MaxTextureSize = GL.MaxTextureSize; OriginBottomLeft = true; ApiVersion = new Version(GL.MajorVersion, GL.MinorVersion); DeviceName = GL.GetString(GLEnum.RENDERER); BackgroundContext = System.CreateGLContext(); }
static void Clear(GL_Graphics graphics, ISystemOpenGL.Context context, RenderTarget target, Clear flags, Color color, float depth, int stencil, RectInt viewport) { // update the viewport var meta = graphics.GetContextMeta(context); { viewport.Y = target.RenderHeight - viewport.Y - viewport.Height; if (meta.Viewport != viewport) { GL.Viewport(viewport.X, viewport.Y, viewport.Width, viewport.Height); meta.Viewport = viewport; } } // we disable the scissor for clearing meta.ForceScissorUpdate = true; GL.Disable(GLEnum.SCISSOR_TEST); // clear var mask = GLEnum.ZERO; if (flags.HasFlag(Framework.Clear.Color)) { GL.ClearColor(color.R / 255f, color.G / 255f, color.B / 255f, color.A / 255f); mask |= GLEnum.COLOR_BUFFER_BIT; } if (flags.HasFlag(Framework.Clear.Depth)) { GL.ClearDepth(depth); mask |= GLEnum.DEPTH_BUFFER_BIT; } if (flags.HasFlag(Framework.Clear.Stencil)) { GL.ClearStencil(stencil); mask |= GLEnum.STENCIL_BUFFER_BIT; } GL.Clear(mask); GL.BindFramebuffer(GLEnum.FRAMEBUFFER, 0); }