| Flutter Linux Embedder |

fl_framebuffer.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "fl_framebuffer.h"
6
7 #include <epoxy/gl.h>
8
9 struct _FlFramebuffer {
10 GObject parent_instance;
11
12 // Width of framebuffer in pixels.
13 size_t width;
14
15 // Height of framebuffer in pixels.
16 size_t height;
17
18 // Framebuffer ID.
19 GLuint framebuffer_id;
20
21 // Texture backing framebuffer.
22 GLuint texture_id;
23
24 // Stencil buffer associated with this framebuffer.
25 GLuint depth_stencil;
26 };
27
28 G_DEFINE_TYPE(FlFramebuffer, fl_framebuffer, G_TYPE_OBJECT)
29
30 static void fl_framebuffer_dispose(GObject* object) {
31 FlFramebuffer* self = FL_FRAMEBUFFER(object);
32
33 glDeleteFramebuffers(1, &self->framebuffer_id);
34 glDeleteTextures(1, &self->texture_id);
35 glDeleteRenderbuffers(1, &self->depth_stencil);
36
37 G_OBJECT_CLASS(fl_framebuffer_parent_class)->dispose(object);
38 }
39
40 static void fl_framebuffer_class_init(FlFramebufferClass* klass) {
41 G_OBJECT_CLASS(klass)->dispose = fl_framebuffer_dispose;
42 }
43
44 static void fl_framebuffer_init(FlFramebuffer* self) {}
45
46 FlFramebuffer* fl_framebuffer_new(GLint format, size_t width, size_t height) {
47 FlFramebuffer* provider =
48 FL_FRAMEBUFFER(g_object_new(fl_framebuffer_get_type(), nullptr));
49
50 provider->width = width;
51 provider->height = height;
52
53 glGenTextures(1, &provider->texture_id);
54 glGenFramebuffers(1, &provider->framebuffer_id);
55
56 glBindFramebuffer(GL_FRAMEBUFFER, provider->framebuffer_id);
57
58 glBindTexture(GL_TEXTURE_2D, provider->texture_id);
59 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
60 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
61 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
62 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
63 glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format,
64 GL_UNSIGNED_BYTE, NULL);
65 glBindTexture(GL_TEXTURE_2D, 0);
66
67 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
68 provider->texture_id, 0);
69
70 glGenRenderbuffers(1, &provider->depth_stencil);
71 glBindRenderbuffer(GL_RENDERBUFFER, provider->depth_stencil);
72 glRenderbufferStorage(GL_RENDERBUFFER, // target
73 GL_DEPTH24_STENCIL8, // internal format
74 width, // width
75 height // height
76 );
77 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
78 GL_RENDERBUFFER, provider->depth_stencil);
79 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
80 GL_RENDERBUFFER, provider->depth_stencil);
81
82 return provider;
83 }
84
85 GLuint fl_framebuffer_get_id(FlFramebuffer* self) {
86 return self->framebuffer_id;
87 }
88
89 GLuint fl_framebuffer_get_texture_id(FlFramebuffer* self) {
90 return self->texture_id;
91 }
92
93 GLenum fl_framebuffer_get_target(FlFramebuffer* self) {
94 return GL_TEXTURE_2D;
95 }
96
97 size_t fl_framebuffer_get_width(FlFramebuffer* self) {
98 return self->width;
99 }
100
101 size_t fl_framebuffer_get_height(FlFramebuffer* self) {
102 return self->height;
103 }
G_DEFINE_TYPE
G_DEFINE_TYPE(FlBasicMessageChannelResponseHandle, fl_basic_message_channel_response_handle, G_TYPE_OBJECT) static void fl_basic_message_channel_response_handle_dispose(GObject *object)
Definition: fl_basic_message_channel.cc:37
fl_framebuffer_get_height
size_t fl_framebuffer_get_height(FlFramebuffer *self)
Definition: fl_framebuffer.cc:101
fl_framebuffer_init
static void fl_framebuffer_init(FlFramebuffer *self)
Definition: fl_framebuffer.cc:44
fl_framebuffer_get_id
GLuint fl_framebuffer_get_id(FlFramebuffer *self)
Definition: fl_framebuffer.cc:85
fl_framebuffer_get_target
GLenum fl_framebuffer_get_target(FlFramebuffer *self)
Definition: fl_framebuffer.cc:93
fl_framebuffer_class_init
static void fl_framebuffer_class_init(FlFramebufferClass *klass)
Definition: fl_framebuffer.cc:40
fl_framebuffer_dispose
static void fl_framebuffer_dispose(GObject *object)
Definition: fl_framebuffer.cc:30
fl_framebuffer_get_width
size_t fl_framebuffer_get_width(FlFramebuffer *self)
Definition: fl_framebuffer.cc:97
fl_framebuffer_get_texture_id
GLuint fl_framebuffer_get_texture_id(FlFramebuffer *self)
Definition: fl_framebuffer.cc:89
fl_framebuffer_new
FlFramebuffer * fl_framebuffer_new(GLint format, size_t width, size_t height)
Definition: fl_framebuffer.cc:46
fl_framebuffer.h
height
const uint8_t uint32_t uint32_t * height
Definition: fl_pixel_buffer_texture_test.cc:39
width
const uint8_t uint32_t * width
Definition: fl_pixel_buffer_texture_test.cc:38
format
uint32_t uint32_t * format
Definition: fl_texture_registrar_test.cc:42
_FlFramebuffer
Definition: fl_framebuffer.cc:9
_FlFramebuffer::framebuffer_id
GLuint framebuffer_id
Definition: fl_framebuffer.cc:19
_FlFramebuffer::parent_instance
GObject parent_instance
Definition: fl_framebuffer.cc:10
_FlFramebuffer::width
size_t width
Definition: fl_framebuffer.cc:13
_FlFramebuffer::depth_stencil
GLuint depth_stencil
Definition: fl_framebuffer.cc:25
_FlFramebuffer::texture_id
GLuint texture_id
Definition: fl_framebuffer.cc:22
_FlFramebuffer::height
size_t height
Definition: fl_framebuffer.cc:16