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 <jason.ekstrand@intel.com>
This commit is contained in:
Iago Toral Quiroga
2014-10-30 11:55:02 +01:00
parent dcef50b9b5
commit a177b30f1f
2 changed files with 32 additions and 10 deletions
+17 -8
View File
@@ -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;
}
}
+15 -2
View File
@@ -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,