Discussion:
correct Mesa endian test
Jonathan Gray
2016-02-16 13:43:56 UTC
Permalink
Due to the way Mesa can be built there are two headers that setup endian
tests.

src/mesa/main/compiler.h and src/gallium/include/pipe/p_config.h

The former relies on indirect inclusion as was recently pointed out
on the Mesa list.

The compiler.h version is used in the following places, it turns out
endian.h is always included before compiler.h where it matters except
for shaderimage.c.

CPU_TO_LE32 not used

src/mesa/drivers/dri/r200/radeon_queryobj.c: query->Base.Result += LE32_TO_CPU(result[i]);
src/mesa/drivers/dri/r200/radeon_queryobj.c: radeon_print(RADEON_STATE, RADEON_TRACE, "result[%d] = %d\n", i, LE32_TO_CPU(result[i]));
src/mesa/drivers/dri/radeon/radeon_queryobj.c: query->Base.Result += LE32_TO_CPU(result[i]);
src/mesa/drivers/dri/radeon/radeon_queryobj.c: radeon_print(RADEON_STATE, RADEON_TRACE, "result[%d] = %d\n", i, LE32_TO_CPU(result[i]));

src/mesa/drivers/dri/r200/r200_state_init.c:#ifdef MESA_BIG_ENDIAN
src/mesa/drivers/dri/r200/r200_tcl.c:#ifdef MESA_BIG_ENDIAN
src/mesa/drivers/dri/radeon/radeon_state_init.c:#ifdef MESA_BIG_ENDIAN
src/mesa/drivers/dri/radeon/radeon_tcl.c:#ifdef MESA_BIG_ENDIAN
src/mesa/main/shaderimage.c:#ifdef MESA_BIG_ENDIAN
src/gallium/auxiliary/util/u_format_rgb9e5.h:#if defined(MESA_BIG_ENDIAN) || defined(PIPE_ARCH_BIG_ENDIAN)
src/gallium/auxiliary/util/u_format_rgb9e5.h:#if defined(MESA_BIG_ENDIAN) || defined(PIPE_ARCH_BIG_ENDIAN)

src/mesa/drivers/dri/r200/r200_swtcl.c:#if MESA_LITTLE_ENDIAN
src/mesa/drivers/dri/r200/r200_swtcl.c:#if MESA_LITTLE_ENDIAN
src/mesa/drivers/dri/radeon/radeon_swtcl.c:#if MESA_LITTLE_ENDIAN
src/mesa/drivers/dri/radeon/radeon_swtcl.c:#if MESA_LITTLE_ENDIAN

This should be handled better in future Mesa releases but for now I'd
like to commit the following. Looking for testers.

Index: lib/mesa/src/mesa/main/compiler.h
===================================================================
RCS file: /cvs/xenocara/lib/mesa/src/mesa/main/compiler.h,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 compiler.h
--- lib/mesa/src/mesa/main/compiler.h 22 Nov 2015 02:39:08 -0000 1.1.1.1
+++ lib/mesa/src/mesa/main/compiler.h 16 Feb 2016 11:42:18 -0000
@@ -66,28 +66,16 @@ extern "C" {
* Try to use a runtime test instead.
* For now, only used by some DRI hardware drivers for color/texel packing.
*/
-#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN
-#if defined(__linux__)
-#include <byteswap.h>
-#define CPU_TO_LE32( x ) bswap_32( x )
-#elif defined(__APPLE__)
-#include <CoreFoundation/CFByteOrder.h>
-#define CPU_TO_LE32( x ) CFSwapInt32HostToLittle( x )
-#elif defined(__OpenBSD__)
-#include <sys/types.h>
+#ifdef __OpenBSD__
+#include <endian.h>
#define CPU_TO_LE32( x ) htole32( x )
-#else /*__linux__ */
-#include <sys/endian.h>
-#define CPU_TO_LE32( x ) bswap32( x )
-#endif /*__linux__*/
+#define LE32_TO_CPU( x ) letoh32( x )
+#if BYTE_ORDER == BIG_ENDIAN
#define MESA_BIG_ENDIAN 1
#else
-#define CPU_TO_LE32( x ) ( x )
#define MESA_LITTLE_ENDIAN 1
#endif
-#define LE32_TO_CPU( x ) CPU_TO_LE32( x )
-
-
+#endif /* __OpenBSD__ */

#define IEEE_ONE 0x3f800000
Martin Pieuchot
2016-02-17 14:41:46 UTC
Permalink
Post by Jonathan Gray
Due to the way Mesa can be built there are two headers that setup endian
tests.
src/mesa/main/compiler.h and src/gallium/include/pipe/p_config.h
The former relies on indirect inclusion as was recently pointed out
on the Mesa list.
The compiler.h version is used in the following places, it turns out
endian.h is always included before compiler.h where it matters except
for shaderimage.c.
CPU_TO_LE32 not used
src/mesa/drivers/dri/r200/radeon_queryobj.c: query->Base.Result += LE32_TO_CPU(result[i]);
src/mesa/drivers/dri/r200/radeon_queryobj.c: radeon_print(RADEON_STATE, RADEON_TRACE, "result[%d] = %d\n", i, LE32_TO_CPU(result[i]));
src/mesa/drivers/dri/radeon/radeon_queryobj.c: query->Base.Result += LE32_TO_CPU(result[i]);
src/mesa/drivers/dri/radeon/radeon_queryobj.c: radeon_print(RADEON_STATE, RADEON_TRACE, "result[%d] = %d\n", i, LE32_TO_CPU(result[i]));
src/mesa/drivers/dri/r200/r200_state_init.c:#ifdef MESA_BIG_ENDIAN
src/mesa/drivers/dri/r200/r200_tcl.c:#ifdef MESA_BIG_ENDIAN
src/mesa/drivers/dri/radeon/radeon_state_init.c:#ifdef MESA_BIG_ENDIAN
src/mesa/drivers/dri/radeon/radeon_tcl.c:#ifdef MESA_BIG_ENDIAN
src/mesa/main/shaderimage.c:#ifdef MESA_BIG_ENDIAN
src/gallium/auxiliary/util/u_format_rgb9e5.h:#if defined(MESA_BIG_ENDIAN) || defined(PIPE_ARCH_BIG_ENDIAN)
src/gallium/auxiliary/util/u_format_rgb9e5.h:#if defined(MESA_BIG_ENDIAN) || defined(PIPE_ARCH_BIG_ENDIAN)
src/mesa/drivers/dri/r200/r200_swtcl.c:#if MESA_LITTLE_ENDIAN
src/mesa/drivers/dri/r200/r200_swtcl.c:#if MESA_LITTLE_ENDIAN
src/mesa/drivers/dri/radeon/radeon_swtcl.c:#if MESA_LITTLE_ENDIAN
src/mesa/drivers/dri/radeon/radeon_swtcl.c:#if MESA_LITTLE_ENDIAN
This should be handled better in future Mesa releases but for now I'd
like to commit the following. Looking for testers.
I don't have any machine with a r100 or r200. You might want a test
from somebody using a MacMini G4 or iBook G4, but I can confirm that
there's no regression with the Gallium r300 driver on my G5.
Post by Jonathan Gray
Index: lib/mesa/src/mesa/main/compiler.h
===================================================================
RCS file: /cvs/xenocara/lib/mesa/src/mesa/main/compiler.h,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 compiler.h
--- lib/mesa/src/mesa/main/compiler.h 22 Nov 2015 02:39:08 -0000 1.1.1.1
+++ lib/mesa/src/mesa/main/compiler.h 16 Feb 2016 11:42:18 -0000
@@ -66,28 +66,16 @@ extern "C" {
* Try to use a runtime test instead.
* For now, only used by some DRI hardware drivers for color/texel packing.
*/
-#if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN
-#if defined(__linux__)
-#include <byteswap.h>
-#define CPU_TO_LE32( x ) bswap_32( x )
-#elif defined(__APPLE__)
-#include <CoreFoundation/CFByteOrder.h>
-#define CPU_TO_LE32( x ) CFSwapInt32HostToLittle( x )
-#elif defined(__OpenBSD__)
-#include <sys/types.h>
+#ifdef __OpenBSD__
+#include <endian.h>
#define CPU_TO_LE32( x ) htole32( x )
-#else /*__linux__ */
-#include <sys/endian.h>
-#define CPU_TO_LE32( x ) bswap32( x )
-#endif /*__linux__*/
+#define LE32_TO_CPU( x ) letoh32( x )
+#if BYTE_ORDER == BIG_ENDIAN
#define MESA_BIG_ENDIAN 1
#else
-#define CPU_TO_LE32( x ) ( x )
#define MESA_LITTLE_ENDIAN 1
#endif
-#define LE32_TO_CPU( x ) CPU_TO_LE32( x )
-
-
+#endif /* __OpenBSD__ */
#define IEEE_ONE 0x3f800000
Loading...