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.
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(FlBasicMessageChannelResponseHandle, fl_basic_message_channel_response_handle, G_TYPE_OBJECT) static void fl_basic_message_channel_response_handle_dispose(GObject *object)
size_t fl_framebuffer_get_height(FlFramebuffer *self)
static void fl_framebuffer_init(FlFramebuffer *self)
GLuint fl_framebuffer_get_id(FlFramebuffer *self)
GLenum fl_framebuffer_get_target(FlFramebuffer *self)
static void fl_framebuffer_class_init(FlFramebufferClass *klass)
static void fl_framebuffer_dispose(GObject *object)
size_t fl_framebuffer_get_width(FlFramebuffer *self)
GLuint fl_framebuffer_get_texture_id(FlFramebuffer *self)
FlFramebuffer * fl_framebuffer_new(GLint format, size_t width, size_t height)
const uint8_t uint32_t uint32_t * height
const uint8_t uint32_t * width
uint32_t uint32_t * format
GObject parent_instance