[mutter] Use a template material for shadows
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] Use a template material for shadows
- Date: Thu, 18 Nov 2010 14:49:11 +0000 (UTC)
commit 21a246eb4267487e8950974608bb338bb62696ff
Author: Owen W. Taylor <otaylor fishsoup net>
Date: Thu Nov 11 16:35:34 2010 -0500
Use a template material for shadows
To avoid unnecessary shader recompilation, use a root template material
for all shadows.
https://bugzilla.gnome.org/show_bug.cgi?id=592382
src/compositor/meta-shadow-factory.c | 49 +++++++++++++++++++++++++++++++--
1 files changed, 46 insertions(+), 3 deletions(-)
---
diff --git a/src/compositor/meta-shadow-factory.c b/src/compositor/meta-shadow-factory.c
index bf0aadf..04bafbe 100644
--- a/src/compositor/meta-shadow-factory.c
+++ b/src/compositor/meta-shadow-factory.c
@@ -4,7 +4,8 @@
*
* Create and cache shadow textures for abritrary window shapes
*
- * Copyright (C) 2010 Red Hat, Inc.
+ * Copyright 2010 Red Hat, Inc.
+ * Copyright 2010 Intel Corporation
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -617,6 +618,49 @@ flip_buffer (guchar *buffer,
#undef BLOCK_SIZE
}
+/* Creates a material with a single layer. Using a common template
+ * allows sharing a shader between all shadows. To share the same
+ * shader with all other materials that are just texture plus
+ * opacity would require cogl fixes. Based on
+ * gnome-shell/src/st/_st_create_texture_material.c
+ */
+static CoglHandle
+create_texture_material (CoglHandle src_texture)
+{
+ static CoglHandle texture_material_template = COGL_INVALID_HANDLE;
+ CoglHandle material;
+
+ g_return_val_if_fail (src_texture != COGL_INVALID_HANDLE,
+ COGL_INVALID_HANDLE);
+
+ /* We use a material that has a dummy texture as a base for all
+ texture materials. The idea is that only the Cogl texture object
+ would be different in the children so it is likely that Cogl will
+ be able to share GL programs between all the textures. */
+ if (G_UNLIKELY (texture_material_template == COGL_INVALID_HANDLE))
+ {
+ static const guint8 white_pixel[] = { 0xff, 0xff, 0xff, 0xff };
+ CoglHandle dummy_texture;
+
+ dummy_texture =
+ cogl_texture_new_from_data (1, 1,
+ COGL_TEXTURE_NONE,
+ COGL_PIXEL_FORMAT_RGBA_8888_PRE,
+ COGL_PIXEL_FORMAT_ANY,
+ 4, white_pixel);
+
+ texture_material_template = cogl_material_new ();
+ cogl_material_set_layer (texture_material_template, 0, dummy_texture);
+ cogl_handle_unref (dummy_texture);
+ }
+
+ material = cogl_material_copy (texture_material_template);
+
+ cogl_material_set_layer (material, 0, src_texture);
+
+ return material;
+}
+
static void
make_shadow (MetaShadow *shadow,
cairo_region_t *region)
@@ -724,8 +768,7 @@ make_shadow (MetaShadow *shadow,
cairo_region_destroy (column_convolve_region);
g_free (buffer);
- shadow->material = cogl_material_new ();
- cogl_material_set_layer (shadow->material, 0, shadow->texture);
+ shadow->material = create_texture_material (shadow->texture);
}
static MetaShadowParams *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]