From a177b30f1f2a74c14a649e9990eaab8826523c69 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Thu, 30 Oct 2014 11:55:02 +0100 Subject: [PATCH] mesa: Add _mesa_swap2_copy and _mesa_swap4_copy We have _mesa_swap{2,4} but these do in-place byte-swapping only. The new functions receive an extra parameter so we can swap bytes on a source input array and store the results in a (possibly different) destination array. This is useful to implement byte-swapping in pixel uploads, since in this case we need to swap bytes on the src data which is owned by the application so we can't do an in-place byte swap. v2: - Include compiler.h in image.h, which is necessary to build in MSCV as indicated by Brian Paul. Reviewed-by: Jason Ekstrand --- src/mesa/main/image.c | 25 +++++++++++++++++-------- src/mesa/main/image.h | 17 +++++++++++++++-- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c index 4ea5f04..9ad97c5 100644 --- a/src/mesa/main/image.c +++ b/src/mesa/main/image.c @@ -41,36 +41,45 @@ /** - * Flip the order of the 2 bytes in each word in the given array. + * Flip the order of the 2 bytes in each word in the given array (src) and + * store the result in another array (dst). For in-place byte-swapping this + * function can be called with the same array for src and dst. * - * \param p array. + * \param dst the array where byte-swapped data will be stored. + * \param src the array with the source data we want to byte-swap. * \param n number of words. */ void -_mesa_swap2( GLushort *p, GLuint n ) +_mesa_swap2_copy( GLushort *dst, GLushort *src, GLuint n ) { GLuint i; for (i = 0; i < n; i++) { - p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00); + dst[i] = (src[i] >> 8) | ((src[i] << 8) & 0xff00); } } /* - * Flip the order of the 4 bytes in each word in the given array. + * Flip the order of the 4 bytes in each word in the given array (src) and + * store the result in another array (dst). For in-place byte-swapping this + * function can be called with the same array for src and dst. + * + * \param dst the array where byte-swapped data will be stored. + * \param src the array with the source data we want to byte-swap. + * \param n number of words. */ void -_mesa_swap4( GLuint *p, GLuint n ) +_mesa_swap4_copy( GLuint *dst, GLuint *src, GLuint n ) { GLuint i, a, b; for (i = 0; i < n; i++) { - b = p[i]; + b = src[i]; a = (b >> 24) | ((b >> 8) & 0xff00) | ((b << 8) & 0xff0000) | ((b << 24) & 0xff000000); - p[i] = a; + dst[i] = a; } } diff --git a/src/mesa/main/image.h b/src/mesa/main/image.h index abd84bf..44863cc 100644 --- a/src/mesa/main/image.h +++ b/src/mesa/main/image.h @@ -28,15 +28,28 @@ #include "glheader.h" +#include "compiler.h" struct gl_context; struct gl_pixelstore_attrib; extern void -_mesa_swap2( GLushort *p, GLuint n ); +_mesa_swap2_copy(GLushort *dst, GLushort *src, GLuint n); extern void -_mesa_swap4( GLuint *p, GLuint n ); +_mesa_swap4_copy(GLuint *dst, GLuint *src, GLuint n); + +static inline void +_mesa_swap2(GLushort *p, GLuint n) +{ + _mesa_swap2_copy(p, p, n); +} + +static inline void +_mesa_swap4(GLuint *p, GLuint n) +{ + _mesa_swap4_copy(p, p, n); +} extern GLintptr _mesa_image_offset( GLuint dimensions, -- 2.7.4