| // 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; |
| } |