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:
+17
-8
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user