Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_opengl_manager.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 <epoxy/egl.h>
6#include <gdk/gdkwayland.h>
7#ifdef GDK_WINDOWING_X11
8#include <gdk/gdkx.h>
9#endif
10
12
15
16 // Display being rendered to.
17 EGLDisplay display;
18
19 // Context used by Flutter to render.
20 EGLContext render_context;
21
22 // Context used by Flutter to share resources.
23 EGLContext resource_context;
24};
25
26G_DEFINE_TYPE(FlOpenGLManager, fl_opengl_manager, G_TYPE_OBJECT)
27
28static void fl_opengl_manager_dispose(GObject* object) {
29 FlOpenGLManager* self = FL_OPENGL_MANAGER(object);
30
31 eglDestroyContext(self->display, self->render_context);
32 eglDestroyContext(self->display, self->resource_context);
33 eglTerminate(self->display);
34
35 G_OBJECT_CLASS(fl_opengl_manager_parent_class)->dispose(object);
36}
37
38static void fl_opengl_manager_class_init(FlOpenGLManagerClass* klass) {
39 G_OBJECT_CLASS(klass)->dispose = fl_opengl_manager_dispose;
40}
41
42static void fl_opengl_manager_init(FlOpenGLManager* self) {
43 GdkDisplay* display = gdk_display_get_default();
44 if (GDK_IS_WAYLAND_DISPLAY(display)) {
45 self->display = eglGetPlatformDisplayEXT(
46 EGL_PLATFORM_WAYLAND_EXT, gdk_wayland_display_get_wl_display(display),
47 NULL);
48#ifdef GDK_WINDOWING_X11
49 } else if (GDK_IS_X11_DISPLAY(display)) {
50 self->display = eglGetPlatformDisplayEXT(
51 EGL_PLATFORM_X11_EXT, gdk_x11_display_get_xdisplay(display), NULL);
52#endif
53 } else {
54 g_critical("Unsupported GDK backend, unable to get EGL display");
55 }
56
57 eglInitialize(self->display, nullptr, nullptr);
58
59 const EGLint config_attributes[] = {EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8,
60 EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8,
61 EGL_DEPTH_SIZE, 8, EGL_STENCIL_SIZE, 8,
62 EGL_NONE};
63 EGLConfig config = nullptr;
64 EGLint num_config = 0;
65 eglChooseConfig(self->display, config_attributes, &config, 1, &num_config);
66
67 const EGLint context_attributes[] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
68 self->render_context = eglCreateContext(self->display, config, EGL_NO_CONTEXT,
69 context_attributes);
70 self->resource_context = eglCreateContext(
71 self->display, config, self->render_context, context_attributes);
72}
73
74FlOpenGLManager* fl_opengl_manager_new() {
75 FlOpenGLManager* self =
76 FL_OPENGL_MANAGER(g_object_new(fl_opengl_manager_get_type(), nullptr));
77 return self;
78}
79
80gboolean fl_opengl_manager_make_current(FlOpenGLManager* self) {
81 return eglMakeCurrent(self->display, EGL_NO_SURFACE, EGL_NO_SURFACE,
82 self->render_context) == EGL_TRUE;
83}
84
86 return eglMakeCurrent(self->display, EGL_NO_SURFACE, EGL_NO_SURFACE,
87 self->resource_context) == EGL_TRUE;
88}
89
90gboolean fl_opengl_manager_clear_current(FlOpenGLManager* self) {
91 return eglMakeCurrent(self->display, EGL_NO_SURFACE, EGL_NO_SURFACE,
92 EGL_NO_CONTEXT) == EGL_TRUE;
93}
G_DEFINE_TYPE(FlBasicMessageChannelResponseHandle, fl_basic_message_channel_response_handle, G_TYPE_OBJECT) static void fl_basic_message_channel_response_handle_dispose(GObject *object)
static void fl_opengl_manager_dispose(GObject *object)
static void fl_opengl_manager_class_init(FlOpenGLManagerClass *klass)
gboolean fl_opengl_manager_make_resource_current(FlOpenGLManager *self)
FlOpenGLManager * fl_opengl_manager_new()
gboolean fl_opengl_manager_clear_current(FlOpenGLManager *self)
gboolean fl_opengl_manager_make_current(FlOpenGLManager *self)
static void fl_opengl_manager_init(FlOpenGLManager *self)
GdkDisplay * gdk_display_get_default()
Definition mock_gtk.cc:66
EGLContext resource_context