[cogl] texture: When reading, convert data directly into user's buffer



commit f65a895b4f1dbc8c31abce2b56462b8bd2dcf0ab
Author: Neil Roberts <neil linux intel com>
Date:   Tue Mar 13 11:33:05 2012 +0000

    texture: When reading, convert data directly into user's buffer
    
    On GLES, when reading texture data back it may need to allocate a
    temporary CoglBitmap if the requested format is not supported by the
    driver. Previously it would then copy this temporary buffer back into
    the user's buffer by calling _cogl_bitmap_convert which would allocate
    a second temporary buffer. It would then copy that data into the
    user's buffer. This patch changes it to create a CoglBitmap which
    points to the user's data and then convert directly into that buffer
    using the new _cogl_bitmap_convert_into_bitmap.
    
    This also fixes a small leak where target_bmp would not get freed if
    the target format and the closest supported format do match.
    
    Reviewed-by: Robert Bragg <robert linux intel com>

 cogl/cogl-texture.c |   53 ++++++++++++++++----------------------------------
 1 files changed, 17 insertions(+), 36 deletions(-)
---
diff --git a/cogl/cogl-texture.c b/cogl/cogl-texture.c
index dd27b34..6d6a1f2 100644
--- a/cogl/cogl-texture.c
+++ b/cogl/cogl-texture.c
@@ -1129,10 +1129,6 @@ cogl_texture_get_data (CoglTexture     *texture,
   GLenum           closest_gl_format;
   GLenum           closest_gl_type;
   CoglBitmap      *target_bmp;
-  CoglBitmap      *new_bmp;
-  guint8          *src;
-  guint8          *dst;
-  int              y;
   int              tex_width;
   int              tex_height;
   CoglPixelFormat  texture_format;
@@ -1236,42 +1232,27 @@ cogl_texture_get_data (CoglTexture     *texture,
   /* Was intermediate used? */
   if (closest_format != format)
     {
-      guint8 *new_bmp_data;
-      int new_bmp_rowstride;
+      CoglBitmap *new_bmp;
+      gboolean result;
+
+      /* Convert to requested format directly into the user's buffer */
+      new_bmp = _cogl_bitmap_new_from_data (data,
+                                            format,
+                                            tex_width, tex_height,
+                                            rowstride,
+                                            NULL, /* destroy_fn */
+                                            NULL /* destroy_fn_data */);
+      result = _cogl_bitmap_convert_into_bitmap (target_bmp, new_bmp);
+
+      if (!result)
+        /* Return failure after cleaning up */
+        byte_size = 0;
 
-      /* Convert to requested format */
-      new_bmp = _cogl_bitmap_convert (target_bmp, format);
-
-      /* Free intermediate data and return if failed */
-      cogl_object_unref (target_bmp);
-
-      if (new_bmp == NULL)
-        return 0;
-
-      new_bmp_rowstride = cogl_bitmap_get_rowstride (new_bmp);
-      new_bmp_data = _cogl_bitmap_map (new_bmp, COGL_BUFFER_ACCESS_WRITE,
-                                       COGL_BUFFER_MAP_HINT_DISCARD);
-
-      if (new_bmp_data == NULL)
-        {
-          cogl_object_unref (new_bmp);
-          return 0;
-        }
-
-      /* Copy to user buffer */
-      for (y = 0; y < tex_height; ++y)
-        {
-          src = new_bmp_data + y * new_bmp_rowstride;
-          dst = data + y * rowstride;
-          memcpy (dst, src, tex_width * bpp);
-        }
-
-      _cogl_bitmap_unmap (new_bmp);
-
-      /* Free converted data */
       cogl_object_unref (new_bmp);
     }
 
+  cogl_object_unref (target_bmp);
+
   return byte_size;
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]