[Mesa-dev] [PATCH 09/29] mesa: Add _mesa_swap2_copy and _mesa_swap4_copy

Iago Toral itoral at igalia.com
Thu Nov 20 00:19:02 PST 2014


No good reason really, simply that the original functions seemed simpler
for the case of in-place swapping since you don't have to pass the dst
parameter explicitly, so I figured there was a marginal gain in letting
them stay, specially since their implementation is just an inline call
to the other version. Do you prefer the other solution?

Iago

On Wed, 2014-11-19 at 12:00 -0800, Jason Ekstrand wrote:
> Any reason why you added 2 new functions, instead of just altering the
> ones we have and updating where they are used?
> 
> 
> On Tue, Nov 18, 2014 at 1:23 AM, Iago Toral Quiroga
> <itoral at igalia.com> wrote:
>         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.
>         ---
>          src/mesa/main/image.c | 25 +++++++++++++++++--------
>          src/mesa/main/image.h | 10 ++++++++--
>          2 files changed, 25 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..79c6e68 100644
>         --- a/src/mesa/main/image.h
>         +++ b/src/mesa/main/image.h
>         @@ -33,10 +33,16 @@ 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,
>         --
>         1.9.1
>         
>         _______________________________________________
>         mesa-dev mailing list
>         mesa-dev at lists.freedesktop.org
>         http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> 




More information about the mesa-dev mailing list