Mesa (master): st/mesa: use a single memcpy in st_ReadPixels when possible

Nicolai Hähnle nh at kemper.freedesktop.org
Wed Jun 22 09:44:11 UTC 2016


Module: Mesa
Branch: master
Commit: 3948cd37973696dc319170877382676809659465
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3948cd37973696dc319170877382676809659465

Author: Nicolai Hähnle <nicolai.haehnle at amd.com>
Date:   Tue Jun 14 20:03:53 2016 +0200

st/mesa: use a single memcpy in st_ReadPixels when possible

This avoids costly address recomputations, function overhead, and may trigger
large copy optimizations.

Reviewed-by: Brian Paul <brianp at vmware.com>
Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 src/mesa/state_tracker/st_cb_readpixels.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c
index 39d2274..77c6332 100644
--- a/src/mesa/state_tracker/st_cb_readpixels.c
+++ b/src/mesa/state_tracker/st_cb_readpixels.c
@@ -520,14 +520,21 @@ st_ReadPixels(struct gl_context *ctx, GLint x, GLint y,
    /* memcpy data into a user buffer */
    {
       const uint bytesPerRow = width * util_format_get_blocksize(dst_format);
-      GLuint row;
-
-      for (row = 0; row < (unsigned) height; row++) {
-         void *dest = _mesa_image_address2d(pack, pixels,
-                                              width, height, format,
-                                              type, row, 0);
-         memcpy(dest, map, bytesPerRow);
-         map += tex_xfer->stride;
+      const uint destStride = _mesa_image_row_stride(pack, width, format, type);
+      char *dest = _mesa_image_address2d(pack, pixels,
+                                         width, height, format,
+                                         type, 0, 0);
+
+      if (tex_xfer->stride == bytesPerRow && destStride == bytesPerRow) {
+         memcpy(dest, map, bytesPerRow * height);
+      } else {
+         GLuint row;
+
+         for (row = 0; row < (unsigned) height; row++) {
+            memcpy(dest, map, bytesPerRow);
+            map += tex_xfer->stride;
+            dest += destStride;
+         }
       }
    }
 




More information about the mesa-commit mailing list