mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
118 lines
3.6 KiB
C++
118 lines
3.6 KiB
C++
// 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 "fl_renderer.h"
|
|
|
|
#include <epoxy/egl.h>
|
|
#include <epoxy/gl.h>
|
|
|
|
#include "flutter/shell/platform/embedder/embedder.h"
|
|
#include "flutter/shell/platform/linux/fl_backing_store_provider.h"
|
|
|
|
G_DEFINE_QUARK(fl_renderer_error_quark, fl_renderer_error)
|
|
|
|
typedef struct {
|
|
FlView* view;
|
|
|
|
GdkGLContext* main_context;
|
|
GdkGLContext* resource_context;
|
|
} FlRendererPrivate;
|
|
|
|
G_DEFINE_TYPE_WITH_PRIVATE(FlRenderer, fl_renderer, G_TYPE_OBJECT)
|
|
|
|
static void fl_renderer_class_init(FlRendererClass* klass) {}
|
|
|
|
static void fl_renderer_init(FlRenderer* self) {}
|
|
|
|
gboolean fl_renderer_start(FlRenderer* self, FlView* view, GError** error) {
|
|
g_return_val_if_fail(FL_IS_RENDERER(self), FALSE);
|
|
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
|
|
fl_renderer_get_instance_private(self));
|
|
priv->view = view;
|
|
gboolean result = FL_RENDERER_GET_CLASS(self)->create_contexts(
|
|
self, GTK_WIDGET(view), &priv->main_context, &priv->resource_context,
|
|
error);
|
|
|
|
if (result) {
|
|
gdk_gl_context_realize(priv->main_context, error);
|
|
gdk_gl_context_realize(priv->resource_context, error);
|
|
}
|
|
|
|
if (*error != nullptr)
|
|
return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
FlView* fl_renderer_get_view(FlRenderer* self) {
|
|
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
|
|
fl_renderer_get_instance_private(self));
|
|
return priv->view;
|
|
}
|
|
|
|
GdkGLContext* fl_renderer_get_context(FlRenderer* self) {
|
|
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
|
|
fl_renderer_get_instance_private(self));
|
|
return priv->main_context;
|
|
}
|
|
|
|
void* fl_renderer_get_proc_address(FlRenderer* self, const char* name) {
|
|
return reinterpret_cast<void*>(eglGetProcAddress(name));
|
|
}
|
|
|
|
gboolean fl_renderer_make_current(FlRenderer* self, GError** error) {
|
|
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
|
|
fl_renderer_get_instance_private(self));
|
|
if (priv->main_context) {
|
|
gdk_gl_context_make_current(priv->main_context);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
gboolean fl_renderer_make_resource_current(FlRenderer* self, GError** error) {
|
|
FlRendererPrivate* priv = reinterpret_cast<FlRendererPrivate*>(
|
|
fl_renderer_get_instance_private(self));
|
|
if (priv->resource_context) {
|
|
gdk_gl_context_make_current(priv->resource_context);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
gboolean fl_renderer_clear_current(FlRenderer* self, GError** error) {
|
|
gdk_gl_context_clear_current();
|
|
return TRUE;
|
|
}
|
|
|
|
guint32 fl_renderer_get_fbo(FlRenderer* self) {
|
|
// There is only one frame buffer object - always return that.
|
|
return 0;
|
|
}
|
|
|
|
gboolean fl_renderer_present(FlRenderer* self, GError** error) {
|
|
return TRUE;
|
|
}
|
|
|
|
gboolean fl_renderer_create_backing_store(
|
|
FlRenderer* self,
|
|
const FlutterBackingStoreConfig* config,
|
|
FlutterBackingStore* backing_store_out) {
|
|
return FL_RENDERER_GET_CLASS(self)->create_backing_store(self, config,
|
|
backing_store_out);
|
|
}
|
|
|
|
gboolean fl_renderer_collect_backing_store(
|
|
FlRenderer* self,
|
|
const FlutterBackingStore* backing_store) {
|
|
return FL_RENDERER_GET_CLASS(self)->collect_backing_store(self,
|
|
backing_store);
|
|
}
|
|
|
|
gboolean fl_renderer_present_layers(FlRenderer* self,
|
|
const FlutterLayer** layers,
|
|
size_t layers_count) {
|
|
return FL_RENDERER_GET_CLASS(self)->present_layers(self, layers,
|
|
layers_count);
|
|
}
|