[mutter: 12/13] backends/native: Set offscreen on the transformed MetaRendererViews
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter: 12/13] backends/native: Set offscreen on the transformed MetaRendererViews
- Date: Wed, 24 Aug 2016 00:41:33 +0000 (UTC)
commit 9e641f623fd917f7c795f0c07c64a7627923f566
Author: Carlos Garnacho <carlosg gnome org>
Date: Mon Aug 1 03:48:30 2016 +0200
backends/native: Set offscreen on the transformed MetaRendererViews
The texture is only created if the view is transformed at the software level,
otherwise the texture is NULL, and rendering happens on the onscreen.
https://bugzilla.gnome.org/show_bug.cgi?id=745079
src/backends/native/meta-renderer-native.c | 57 ++++++++++++++++++++++++++++
1 files changed, 57 insertions(+), 0 deletions(-)
---
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 9867a5b..2093e09 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -885,6 +885,39 @@ meta_renderer_native_create_onscreen (MetaRendererNative *renderer,
return onscreen;
}
+static CoglOffscreen *
+meta_renderer_native_create_offscreen (MetaRendererNative *renderer,
+ CoglContext *context,
+ MetaMonitorTransform transform,
+ gint view_width,
+ gint view_height)
+{
+ CoglOffscreen *fb;
+ CoglTexture2D *tex;
+ GError *error = NULL;
+
+ tex = cogl_texture_2d_new_with_size (context, view_width, view_height);
+ cogl_primitive_texture_set_auto_mipmap (COGL_PRIMITIVE_TEXTURE (tex), FALSE);
+
+ if (!cogl_texture_allocate (COGL_TEXTURE (tex), &error))
+ {
+ cogl_object_unref (tex);
+ return FALSE;
+ }
+
+ fb = cogl_offscreen_new_with_texture (COGL_TEXTURE (tex));
+ cogl_object_unref (tex);
+ if (!cogl_framebuffer_allocate (COGL_FRAMEBUFFER (fb), &error))
+ {
+ g_warning ("Could not create offscreen: %s", error->message);
+ g_error_free (error);
+ cogl_object_unref (fb);
+ return FALSE;
+ }
+
+ return fb;
+}
+
gboolean
meta_renderer_native_set_legacy_view_size (MetaRendererNative *renderer_native,
MetaRendererView *view,
@@ -1083,8 +1116,12 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
MetaBackend *backend = meta_get_backend ();
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
CoglContext *cogl_context = clutter_backend_get_cogl_context (clutter_backend);
+ CoglDisplay *cogl_display = cogl_context_get_display (cogl_context);
+ CoglDisplayEGL *egl_display = cogl_display->winsys;
+ CoglOnscreenEGL *egl_onscreen;
MetaMonitorTransform transform;
CoglOnscreen *onscreen = NULL;
+ CoglOffscreen *offscreen = NULL;
MetaRendererView *view;
transform = meta_renderer_native_get_monitor_info_transform (renderer,
@@ -1098,13 +1135,33 @@ meta_renderer_native_create_view (MetaRenderer *renderer,
if (!onscreen)
meta_fatal ("Failed to allocate onscreen framebuffer\n");
+ /* Ensure we don't point to stale surfaces when creating the offscreen */
+ egl_onscreen = onscreen->winsys;
+ _cogl_winsys_egl_make_current (cogl_display,
+ egl_onscreen->egl_surface,
+ egl_onscreen->egl_surface,
+ egl_display->egl_context);
+
+ if (transform != META_MONITOR_TRANSFORM_NORMAL)
+ {
+ offscreen = meta_renderer_native_create_offscreen (META_RENDERER_NATIVE (renderer),
+ cogl_context,
+ transform,
+ monitor_info->rect.width,
+ monitor_info->rect.height);
+ if (!offscreen)
+ meta_fatal ("Failed to allocate back buffer texture\n");
+ }
+
view = g_object_new (META_TYPE_RENDERER_VIEW,
"layout", &monitor_info->rect,
"framebuffer", onscreen,
+ "offscreen", offscreen,
"monitor-info", monitor_info,
"transform", transform,
NULL);
cogl_object_unref (onscreen);
+ g_clear_pointer (&offscreen, cogl_object_unref);
meta_onscreen_native_set_view (onscreen, view);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]