On 01/27/2012 01:33 AM, Jose Fonseca wrote:
Brian,
This is probably right but a tad verbose, and error prone.
I'm not sure what's the best way to simplify this though. It's not
possible to canonize the comparisons because there are missing combinations.
But I think that at least using ternary operators would make the code
more compact and help ensuring thar cases don't follow through the
cracks. For example:
At the top of the function, why not just do:
if (swapBytes && type == GL_UNSIGNED_INT_8_8_8_8)
type = GL_UNSIGNED_INT_8_8_8_8_REV;
else if (swapBytes && type == GL_UNSIGNED_INT_8_8_8_8_REV)
type = GL_UNSIGNED_INT_8_8_8_8;
Or something similar to remap type based on swapBytes. That would incur
a lot less copy-and-paste.
case MESA_FORMAT_RGBA8888:
if (format == GL_RGBA&&
type == (!swapBytes ? GL_UNSIGNED_INT_8_8_8_8 :
GL_UNSIGNED_INT_8_8_8_8_REV))
return GL_TRUE;
if (format == GL_ABGR_EXT&&
type == (!swapBytes ? GL_UNSIGNED_INT_8_8_8_8_REV :
GL_UNSIGNED_INT_8_8_8_8))
return GL_TRUE;
if (format == (!littleEndian ? GL_RGBA : GL_ABGR_EXT)&&
type == GL_UNSIGNED_BYTE)
return GL_TRUE;
Jose
----- Original Message -----
This will let us use memcpy in more situations. We can also remove
the checks for byte spapping that happen before the calls to
_mesa_format_matches_format_and_type().
---
src/mesa/main/formats.c | 131
+++++++++++++++++++++++++++++++++--------------
1 files changed, 93 insertions(+), 38 deletions(-)
diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index f352395..a52b38b 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -2545,13 +2545,21 @@
_mesa_format_matches_format_and_type(gl_format gl_format,
return GL_FALSE;
case MESA_FORMAT_RGBA8888:
- if (format == GL_RGBA&& type == GL_UNSIGNED_INT_8_8_8_8)
+ if (format == GL_RGBA&& type == GL_UNSIGNED_INT_8_8_8_8&&
!swapBytes)
+ return GL_TRUE;
+
+ if (format == GL_RGBA&& type == GL_UNSIGNED_INT_8_8_8_8_REV
&& swapBytes)
return GL_TRUE;
if (format == GL_RGBA&& type == GL_UNSIGNED_BYTE&&
!littleEndian)
return GL_TRUE;
- if (format == GL_ABGR_EXT&& type ==
GL_UNSIGNED_INT_8_8_8_8_REV)
+ if (format == GL_ABGR_EXT&& type ==
GL_UNSIGNED_INT_8_8_8_8_REV
+&& !swapBytes)
+ return GL_TRUE;
+
+ if (format == GL_ABGR_EXT&& type == GL_UNSIGNED_INT_8_8_8_8
+&& swapBytes)
return GL_TRUE;
if (format == GL_ABGR_EXT&& type == GL_UNSIGNED_BYTE&&
littleEndian)
@@ -2560,10 +2568,35 @@
_mesa_format_matches_format_and_type(gl_format gl_format,
return GL_FALSE;
case MESA_FORMAT_RGBA8888_REV:
- return format == GL_RGBA&& type ==
GL_UNSIGNED_INT_8_8_8_8_REV;
+ if (format == GL_RGBA&& type == GL_UNSIGNED_INT_8_8_8_8_REV
&&
+ !swapBytes)
+ return GL_TRUE;
+
+ if (format == GL_RGBA&& type == GL_UNSIGNED_INT_8_8_8_8&&
swapBytes)
+ return GL_TRUE;
+
+ if (format == GL_RGBA&& type == GL_UNSIGNED_BYTE&&
littleEndian)
+ return GL_TRUE;
+
+ if (format == GL_ABGR_EXT&& type == GL_UNSIGNED_INT_8_8_8_8
&&
+ !swapBytes)
+ return GL_TRUE;
+
+ if (format == GL_ABGR_EXT&& type ==
GL_UNSIGNED_INT_8_8_8_8_REV&&
+ swapBytes)
+ return GL_TRUE;
+
+ if (format == GL_ABGR_EXT&& type == GL_UNSIGNED_BYTE&&
!littleEndian)
+ return GL_TRUE;
+
+ return GL_FALSE;
case MESA_FORMAT_ARGB8888:
- if (format == GL_BGRA&& type == GL_UNSIGNED_INT_8_8_8_8_REV)
+ if (format == GL_BGRA&& type == GL_UNSIGNED_INT_8_8_8_8_REV
&&
+ !swapBytes)
+ return GL_TRUE;
+
+ if (format == GL_BGRA&& type == GL_UNSIGNED_INT_8_8_8_8&&
swapBytes)
return GL_TRUE;
if (format == GL_BGRA&& type == GL_UNSIGNED_BYTE&&
littleEndian)
@@ -2572,7 +2605,11 @@ _mesa_format_matches_format_and_type(gl_format
gl_format,
return GL_FALSE;
case MESA_FORMAT_ARGB8888_REV:
- if (format == GL_BGRA&& type == GL_UNSIGNED_INT_8_8_8_8)
+ if (format == GL_BGRA&& type == GL_UNSIGNED_INT_8_8_8_8&&
!swapBytes)
+ return GL_TRUE;
+
+ if (format == GL_BGRA&& type == GL_UNSIGNED_INT_8_8_8_8_REV
&&
+ swapBytes)
return GL_TRUE;
if (format == GL_BGRA&& type == GL_UNSIGNED_BYTE&&
!littleEndian)
@@ -2595,7 +2632,8 @@ _mesa_format_matches_format_and_type(gl_format
gl_format,
return format == GL_RGB&& type == GL_UNSIGNED_BYTE&&
littleEndian;
case MESA_FORMAT_RGB565:
- return format == GL_RGB&& type == GL_UNSIGNED_SHORT_5_6_5;
+ return format == GL_RGB&& type == GL_UNSIGNED_SHORT_5_6_5&&
!swapBytes;
+
case MESA_FORMAT_RGB565_REV:
/* Some of the 16-bit MESA_FORMATs that would seem to
correspond to
* GL_UNSIGNED_SHORT_* are byte-swapped instead of
channel-reversed,
@@ -2604,15 +2642,20 @@
_mesa_format_matches_format_and_type(gl_format gl_format,
return GL_FALSE;
case MESA_FORMAT_ARGB4444:
- return format == GL_BGRA&& type ==
GL_UNSIGNED_SHORT_4_4_4_4_REV;
+ return format == GL_BGRA&& type ==
GL_UNSIGNED_SHORT_4_4_4_4_REV&&
+ !swapBytes;
+
case MESA_FORMAT_ARGB4444_REV:
return GL_FALSE;
case MESA_FORMAT_RGBA5551:
- return format == GL_RGBA&& type == GL_UNSIGNED_SHORT_5_5_5_1;
+ return format == GL_RGBA&& type == GL_UNSIGNED_SHORT_5_5_5_1
&&
+ !swapBytes;
case MESA_FORMAT_ARGB1555:
- return format == GL_BGRA&& type ==
GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ return format == GL_BGRA&& type ==
GL_UNSIGNED_SHORT_1_5_5_5_REV&&
+ !swapBytes;
+
case MESA_FORMAT_ARGB1555_REV:
return GL_FALSE;
@@ -2624,7 +2667,7 @@ _mesa_format_matches_format_and_type(gl_format
gl_format,
return GL_FALSE;
case MESA_FORMAT_AL1616:
- return format == GL_LUMINANCE_ALPHA&& type ==
GL_UNSIGNED_SHORT&& littleEndian;
+ return format == GL_LUMINANCE_ALPHA&& type ==
GL_UNSIGNED_SHORT&& littleEndian&& !swapBytes;
case MESA_FORMAT_AL1616_REV:
return GL_FALSE;
@@ -2634,15 +2677,18 @@
_mesa_format_matches_format_and_type(gl_format gl_format,
case MESA_FORMAT_A8:
return format == GL_ALPHA&& type == GL_UNSIGNED_BYTE;
case MESA_FORMAT_A16:
- return format == GL_ALPHA&& type == GL_UNSIGNED_SHORT&&
littleEndian;
+ return format == GL_ALPHA&& type == GL_UNSIGNED_SHORT&&
+ littleEndian&& !swapBytes;
case MESA_FORMAT_L8:
return format == GL_LUMINANCE&& type == GL_UNSIGNED_BYTE;
case MESA_FORMAT_L16:
- return format == GL_LUMINANCE&& type == GL_UNSIGNED_SHORT&&
littleEndian;
+ return format == GL_LUMINANCE&& type == GL_UNSIGNED_SHORT&&
+ littleEndian&& !swapBytes;
case MESA_FORMAT_I8:
return format == GL_INTENSITY&& type == GL_UNSIGNED_BYTE;
case MESA_FORMAT_I16:
- return format == GL_INTENSITY&& type == GL_UNSIGNED_SHORT&&
littleEndian;
+ return format == GL_INTENSITY&& type == GL_UNSIGNED_SHORT&&
+ littleEndian&& !swapBytes;
case MESA_FORMAT_YCBCR:
case MESA_FORMAT_YCBCR_REV:
@@ -2656,29 +2702,35 @@
_mesa_format_matches_format_and_type(gl_format gl_format,
return GL_FALSE;
case MESA_FORMAT_R16:
- return format == GL_RED&& type == GL_UNSIGNED_SHORT&&
littleEndian;
+ return format == GL_RED&& type == GL_UNSIGNED_SHORT&&
littleEndian&&
+ !swapBytes;
case MESA_FORMAT_RG1616:
- return format == GL_RG&& type == GL_UNSIGNED_SHORT&&
littleEndian;
+ return format == GL_RG&& type == GL_UNSIGNED_SHORT&&
littleEndian&&
+ !swapBytes;
case MESA_FORMAT_RG1616_REV:
return GL_FALSE;
case MESA_FORMAT_ARGB2101010:
- return format == GL_BGRA&& type ==
GL_UNSIGNED_INT_2_10_10_10_REV;
+ return format == GL_BGRA&& type ==
GL_UNSIGNED_INT_2_10_10_10_REV&&
+ !swapBytes;
case MESA_FORMAT_Z24_S8:
- return format == GL_DEPTH_STENCIL&& type ==
GL_UNSIGNED_INT_24_8;
+ return format == GL_DEPTH_STENCIL&& type ==
GL_UNSIGNED_INT_24_8&&
+ !swapBytes;
case MESA_FORMAT_Z24_X8:
case MESA_FORMAT_S8_Z24:
return GL_FALSE;
case MESA_FORMAT_Z16:
- return format == GL_DEPTH_COMPONENT&& type ==
GL_UNSIGNED_SHORT;
+ return format == GL_DEPTH_COMPONENT&& type ==
GL_UNSIGNED_SHORT&&
+ !swapBytes;
case MESA_FORMAT_X8_Z24:
return GL_FALSE;
case MESA_FORMAT_Z32:
- return format == GL_DEPTH_COMPONENT&& type ==
GL_UNSIGNED_INT;
+ return format == GL_DEPTH_COMPONENT&& type == GL_UNSIGNED_INT
&&
+ !swapBytes;
case MESA_FORMAT_S8:
return GL_FALSE;
@@ -2703,44 +2755,44 @@
_mesa_format_matches_format_and_type(gl_format gl_format,
return GL_FALSE;
case MESA_FORMAT_RGBA_FLOAT32:
- return format == GL_RGBA&& type == GL_FLOAT;
+ return format == GL_RGBA&& type == GL_FLOAT&& !swapBytes;
case MESA_FORMAT_RGBA_FLOAT16:
- return format == GL_RGBA&& type == GL_HALF_FLOAT;
+ return format == GL_RGBA&& type == GL_HALF_FLOAT&&
!swapBytes;
case MESA_FORMAT_RGB_FLOAT32:
- return format == GL_RGB&& type == GL_FLOAT;
+ return format == GL_RGB&& type == GL_FLOAT&& !swapBytes;
case MESA_FORMAT_RGB_FLOAT16:
- return format == GL_RGB&& type == GL_HALF_FLOAT;
+ return format == GL_RGB&& type == GL_HALF_FLOAT&&
!swapBytes;
case MESA_FORMAT_ALPHA_FLOAT32:
- return format == GL_ALPHA&& type == GL_FLOAT;
+ return format == GL_ALPHA&& type == GL_FLOAT&& !swapBytes;
case MESA_FORMAT_ALPHA_FLOAT16:
- return format == GL_ALPHA&& type == GL_HALF_FLOAT;
+ return format == GL_ALPHA&& type == GL_HALF_FLOAT&&
!swapBytes;
case MESA_FORMAT_LUMINANCE_FLOAT32:
- return format == GL_LUMINANCE&& type == GL_FLOAT;
+ return format == GL_LUMINANCE&& type == GL_FLOAT&&
!swapBytes;
case MESA_FORMAT_LUMINANCE_FLOAT16:
- return format == GL_LUMINANCE&& type == GL_HALF_FLOAT;
+ return format == GL_LUMINANCE&& type == GL_HALF_FLOAT&&
!swapBytes;
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
- return format == GL_LUMINANCE_ALPHA&& type == GL_FLOAT;
+ return format == GL_LUMINANCE_ALPHA&& type == GL_FLOAT&&
!swapBytes;
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
- return format == GL_LUMINANCE_ALPHA&& type == GL_HALF_FLOAT;
+ return format == GL_LUMINANCE_ALPHA&& type == GL_HALF_FLOAT
&& !swapBytes;
case MESA_FORMAT_INTENSITY_FLOAT32:
- return format == GL_INTENSITY&& type == GL_FLOAT;
+ return format == GL_INTENSITY&& type == GL_FLOAT&&
!swapBytes;
case MESA_FORMAT_INTENSITY_FLOAT16:
- return format == GL_INTENSITY&& type == GL_HALF_FLOAT;
+ return format == GL_INTENSITY&& type == GL_HALF_FLOAT&&
!swapBytes;
case MESA_FORMAT_R_FLOAT32:
- return format == GL_RED&& type == GL_FLOAT;
+ return format == GL_RED&& type == GL_FLOAT&& !swapBytes;
case MESA_FORMAT_R_FLOAT16:
- return format == GL_RED&& type == GL_HALF_FLOAT;
+ return format == GL_RED&& type == GL_HALF_FLOAT&&
!swapBytes;
case MESA_FORMAT_RG_FLOAT32:
- return format == GL_RG&& type == GL_FLOAT;
+ return format == GL_RG&& type == GL_FLOAT&& !swapBytes;
case MESA_FORMAT_RG_FLOAT16:
- return format == GL_RG&& type == GL_HALF_FLOAT;
+ return format == GL_RG&& type == GL_HALF_FLOAT&& !swapBytes;
/* FINISHME: What do we want to do for GL_EXT_texture_integer?
*/
case MESA_FORMAT_ALPHA_UINT8:
@@ -2847,12 +2899,15 @@
_mesa_format_matches_format_and_type(gl_format gl_format,
return GL_FALSE;
case MESA_FORMAT_RGB9_E5_FLOAT:
- return format == GL_RGB&& type ==
GL_UNSIGNED_INT_5_9_9_9_REV;
+ return format == GL_RGB&& type == GL_UNSIGNED_INT_5_9_9_9_REV
&&
+ !swapBytes;
+
case MESA_FORMAT_R11_G11_B10_FLOAT:
- return format == GL_RGB&& type ==
GL_UNSIGNED_INT_10F_11F_11F_REV;
+ return format == GL_RGB&& type ==
GL_UNSIGNED_INT_10F_11F_11F_REV&&
+ !swapBytes;
case MESA_FORMAT_Z32_FLOAT:
- return format == GL_DEPTH_COMPONENT&& type == GL_FLOAT;
+ return format == GL_DEPTH_COMPONENT&& type == GL_FLOAT&&
!swapBytes;
case MESA_FORMAT_Z32_FLOAT_X24S8:
return GL_FALSE;
--
1.7.1
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev