[mutter/wayland] texture-tower: Remove CPU codepath for mipmap generation



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]