blob: 947b540301cc4f457772faa4762845651171f924 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fl_framebuffer.h"
#include <epoxy/gl.h>
struct _FlFramebuffer {
GObject parent_instance;
// Width of framebuffer in pixels.
size_t width;
// Height of framebuffer in pixels.
size_t height;
// Framebuffer ID.
GLuint framebuffer_id;
// Texture backing framebuffer.
GLuint texture_id;
};
G_DEFINE_TYPE(FlFramebuffer, fl_framebuffer, G_TYPE_OBJECT)
static void fl_framebuffer_dispose(GObject* object) {
FlFramebuffer* self = FL_FRAMEBUFFER(object);
glDeleteFramebuffers(1, &self->framebuffer_id);
glDeleteTextures(1, &self->texture_id);
G_OBJECT_CLASS(fl_framebuffer_parent_class)->dispose(object);
}
static void fl_framebuffer_class_init(FlFramebufferClass* klass) {
G_OBJECT_CLASS(klass)->dispose = fl_framebuffer_dispose;
}
static void fl_framebuffer_init(FlFramebuffer* self) {}
FlFramebuffer* fl_framebuffer_new(GLint format, size_t width, size_t height) {
FlFramebuffer* provider =
FL_FRAMEBUFFER(g_object_new(fl_framebuffer_get_type(), nullptr));
provider->width = width;
provider->height = height;
glGenTextures(1, &provider->texture_id);
glGenFramebuffers(1, &provider->framebuffer_id);
glBindFramebuffer(GL_FRAMEBUFFER, provider->framebuffer_id);
glBindTexture(GL_TEXTURE_2D, provider->texture_id);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format,
GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
provider->texture_id, 0);
return provider;
}
GLuint fl_framebuffer_get_id(FlFramebuffer* self) {
return self->framebuffer_id;
}
GLuint fl_framebuffer_get_texture_id(FlFramebuffer* self) {
return self->texture_id;
}
GLenum fl_framebuffer_get_target(FlFramebuffer* self) {
return GL_TEXTURE_2D;
}
size_t fl_framebuffer_get_width(FlFramebuffer* self) {
return self->width;
}
size_t fl_framebuffer_get_height(FlFramebuffer* self) {
return self->height;
}