[mutter/wayland] texture-tower: Remove CPU codepath for mipmap generation
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wayland] texture-tower: Remove CPU codepath for mipmap generation
- Date: Wed, 9 Apr 2014 20:03:49 +0000 (UTC)
commit 99ad5c00a77b3dbbe4f7687ceced907ed2f0d336
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Tue Aug 20 16:32:02 2013 -0400
texture-tower: Remove CPU codepath for mipmap generation
The CPU codepath for mipmapping is unusably slow, and we expect modern
graphics cards with modern TFP/FBO support.
src/compositor/meta-texture-tower.c | 141 +----------------------------------
1 files changed, 2 insertions(+), 139 deletions(-)
---
diff --git a/src/compositor/meta-texture-tower.c b/src/compositor/meta-texture-tower.c
index 0fd5f5f..bafd508 100644
--- a/src/compositor/meta-texture-tower.c
+++ b/src/compositor/meta-texture-tower.c
@@ -373,7 +373,7 @@ texture_tower_create_texture (MetaTextureTower *tower,
tower->invalid[level].y2 = height;
}
-static gboolean
+static void
texture_tower_revalidate_fbo (MetaTextureTower *tower,
int level)
{
@@ -408,150 +408,13 @@ texture_tower_revalidate_fbo (MetaTextureTower *tower,
(2. * invalid->y2) / source_texture_height);
cogl_pop_framebuffer ();
-
- return TRUE;
-}
-
-static void
-fill_copy (guchar *buf,
- const guchar *source,
- int width)
-{
- memcpy (buf, source, width * 4);
-}
-
-static void
-fill_scale_down (guchar *buf,
- const guchar *source,
- int width)
-{
- while (width > 1)
- {
- buf[0] = (source[0] + source[4]) / 2;
- buf[1] = (source[1] + source[5]) / 2;
- buf[2] = (source[2] + source[6]) / 2;
- buf[3] = (source[3] + source[7]) / 2;
-
- buf += 4;
- source += 8;
- width -= 2;
- }
-
- if (width > 0)
- {
- buf[0] = source[0] / 2;
- buf[1] = source[1] / 2;
- buf[2] = source[2] / 2;
- buf[3] = source[3] / 2;
- }
-}
-
-static void
-texture_tower_revalidate_client (MetaTextureTower *tower,
- int level)
-{
- CoglTexture *source_texture = tower->textures[level - 1];
- int source_texture_width = cogl_texture_get_width (source_texture);
- int source_texture_height = cogl_texture_get_height (source_texture);
- guint source_rowstride;
- guchar *source_data;
- CoglTexture *dest_texture = tower->textures[level];
- int dest_texture_width = cogl_texture_get_width (dest_texture);
- int dest_texture_height = cogl_texture_get_height (dest_texture);
- int dest_x = tower->invalid[level].x1;
- int dest_y = tower->invalid[level].y1;
- int dest_width = tower->invalid[level].x2 - tower->invalid[level].x1;
- int dest_height = tower->invalid[level].y2 - tower->invalid[level].y1;
- guchar *dest_data;
- guchar *source_tmp1 = NULL, *source_tmp2 = NULL;
- int i, j;
-
- source_rowstride = source_texture_width * 4;
-
- source_data = g_malloc (source_texture_height * source_rowstride);
- cogl_texture_get_data (source_texture, TEXTURE_FORMAT, source_rowstride,
- source_data);
-
- dest_data = g_malloc (dest_height * dest_width * 4);
-
- if (dest_texture_height < source_texture_height)
- {
- source_tmp1 = g_malloc (dest_width * 4);
- source_tmp2 = g_malloc (dest_width * 4);
- }
-
- for (i = 0; i < dest_height; i++)
- {
- guchar *dest_row = dest_data + i * dest_width * 4;
- if (dest_texture_height < source_texture_height)
- {
- guchar *source1, *source2;
- guchar *dest;
-
- if (dest_texture_width < source_texture_width)
- {
- fill_scale_down (source_tmp1,
- source_data + ((i + dest_y) * 2) * source_rowstride + dest_x * 2 * 4,
- dest_width * 2);
- fill_scale_down (source_tmp2,
- source_data + ((i + dest_y) * 2 + 1) * source_rowstride + dest_x * 2 * 4,
- dest_width * 2);
- }
- else
- {
- fill_copy (source_tmp1,
- source_data + ((i + dest_y) * 2) * source_rowstride + dest_x * 4,
- dest_width);
- fill_copy (source_tmp2,
- source_data + ((i + dest_y) * 2 + 1) * source_rowstride + dest_x * 4,
- dest_width);
- }
-
- source1 = source_tmp1;
- source2 = source_tmp2;
-
- dest = dest_row;
- for (j = 0; j < dest_width * 4; j++)
- *(dest++) = (*(source1++) + *(source2++)) / 2;
- }
- else
- {
- if (dest_texture_width < source_texture_width)
- fill_scale_down (dest_row,
- source_data + (i + dest_y) * source_rowstride + dest_x * 2 * 4,
- dest_width * 2);
- else
- fill_copy (dest_row,
- source_data + (i + dest_y) * source_rowstride,
- dest_width);
- }
- }
-
- cogl_texture_set_region (dest_texture,
- 0, 0,
- dest_x, dest_y,
- dest_width, dest_height,
- dest_width, dest_height,
- TEXTURE_FORMAT,
- 4 * dest_width,
- dest_data);
-
- if (dest_texture_height < source_texture_height)
- {
- g_free (source_tmp1);
- g_free (source_tmp2);
- }
-
- g_free (source_data);
- g_free (dest_data);
}
static void
texture_tower_revalidate (MetaTextureTower *tower,
int level)
{
- if (!texture_tower_revalidate_fbo (tower, level))
- texture_tower_revalidate_client (tower, level);
+ texture_tower_revalidate_fbo (tower, level);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]