| // 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 "flutter/shell/platform/linux/fl_renderer_gdk.h" | |
| struct _FlRendererGdk { | |
| FlRenderer parent_instance; | |
| // Window being rendered on. | |
| GdkWindow* window; | |
| // Main OpenGL rendering context. | |
| GdkGLContext* main_context; | |
| // Secondary OpenGL rendering context. | |
| GdkGLContext* resource_context; | |
| }; | |
| G_DEFINE_TYPE(FlRendererGdk, fl_renderer_gdk, fl_renderer_get_type()) | |
| // Implements FlRenderer::make_current. | |
| static void fl_renderer_gdk_make_current(FlRenderer* renderer) { | |
| FlRendererGdk* self = FL_RENDERER_GDK(renderer); | |
| gdk_gl_context_make_current(self->main_context); | |
| } | |
| // Implements FlRenderer::make_resource_current. | |
| static void fl_renderer_gdk_make_resource_current(FlRenderer* renderer) { | |
| FlRendererGdk* self = FL_RENDERER_GDK(renderer); | |
| gdk_gl_context_make_current(self->resource_context); | |
| } | |
| // Implements FlRenderer::clear_current. | |
| static void fl_renderer_gdk_clear_current(FlRenderer* renderer) { | |
| gdk_gl_context_clear_current(); | |
| } | |
| static void fl_renderer_gdk_dispose(GObject* object) { | |
| FlRendererGdk* self = FL_RENDERER_GDK(object); | |
| g_clear_object(&self->main_context); | |
| g_clear_object(&self->resource_context); | |
| G_OBJECT_CLASS(fl_renderer_gdk_parent_class)->dispose(object); | |
| } | |
| static void fl_renderer_gdk_class_init(FlRendererGdkClass* klass) { | |
| G_OBJECT_CLASS(klass)->dispose = fl_renderer_gdk_dispose; | |
| FL_RENDERER_CLASS(klass)->make_current = fl_renderer_gdk_make_current; | |
| FL_RENDERER_CLASS(klass)->make_resource_current = | |
| fl_renderer_gdk_make_resource_current; | |
| FL_RENDERER_CLASS(klass)->clear_current = fl_renderer_gdk_clear_current; | |
| } | |
| static void fl_renderer_gdk_init(FlRendererGdk* self) {} | |
| FlRendererGdk* fl_renderer_gdk_new(GdkWindow* window) { | |
| FlRendererGdk* self = | |
| FL_RENDERER_GDK(g_object_new(fl_renderer_gdk_get_type(), nullptr)); | |
| self->window = window; | |
| return self; | |
| } | |
| gboolean fl_renderer_gdk_create_contexts(FlRendererGdk* self, GError** error) { | |
| self->main_context = gdk_window_create_gl_context(self->window, error); | |
| if (self->main_context == nullptr) { | |
| return FALSE; | |
| } | |
| if (!gdk_gl_context_realize(self->main_context, error)) { | |
| return FALSE; | |
| } | |
| self->resource_context = gdk_window_create_gl_context(self->window, error); | |
| if (self->resource_context == nullptr) { | |
| return FALSE; | |
| } | |
| if (!gdk_gl_context_realize(self->resource_context, error)) { | |
| return FALSE; | |
| } | |
| return TRUE; | |
| } | |
| GdkGLContext* fl_renderer_gdk_get_context(FlRendererGdk* self) { | |
| g_return_val_if_fail(FL_IS_RENDERER_GDK(self), nullptr); | |
| return self->main_context; | |
| } |