Guys,

Does the attached patch make sense to you?

I replaced the incomplete switch-cases with calls to u_format_access functions that are complete but are going to be a bit more expensive to call. Since they are used not very often in mesa state tracker, I thought it's a good compromise.

Thanks.
diff --git a/src/gallium/auxiliary/util/u_pack_color.h 
b/src/gallium/auxiliary/util/u_pack_color.h
index a2e0f26..6080f1a 100644
--- a/src/gallium/auxiliary/util/u_pack_color.h
+++ b/src/gallium/auxiliary/util/u_pack_color.h
@@ -37,6 +37,7 @@
 
 #include "pipe/p_compiler.h"
 #include "pipe/p_format.h"
+#include "util/u_format.h"
 #include "util/u_math.h"
 
 
@@ -55,85 +56,14 @@ static INLINE void
 util_pack_color_ub(ubyte r, ubyte g, ubyte b, ubyte a,
                    enum pipe_format format, union util_color *uc)
 {
-   switch (format) {
-   case PIPE_FORMAT_R8G8B8A8_UNORM:
-      {
-         uc->ui = (r << 24) | (g << 16) | (b << 8) | a;
-      }
-      return;
-   case PIPE_FORMAT_R8G8B8X8_UNORM:
-      {
-         uc->ui = (r << 24) | (g << 16) | (b << 8) | 0xff;
-      }
-      return;
-   case PIPE_FORMAT_A8R8G8B8_UNORM:
-      {
-         uc->ui = (a << 24) | (r << 16) | (g << 8) | b;
-      }
-      return;
-   case PIPE_FORMAT_X8R8G8B8_UNORM:
-      {
-         uc->ui = (0xff << 24) | (r << 16) | (g << 8) | b;
-      }
-      return;
-   case PIPE_FORMAT_B8G8R8A8_UNORM:
-      {
-         uc->ui = (b << 24) | (g << 16) | (r << 8) | a;
-      }
-      return;
-   case PIPE_FORMAT_B8G8R8X8_UNORM:
-      {
-         uc->ui = (b << 24) | (g << 16) | (r << 8) | 0xff;
-      }
-      return;
-   case PIPE_FORMAT_R5G6B5_UNORM:
-      {
-         uc->us = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3);
-      }
-      return;
-   case PIPE_FORMAT_A1R5G5B5_UNORM:
-      {
-         uc->us = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | 
(b >> 3);
-      }
-      return;
-   case PIPE_FORMAT_A4R4G4B4_UNORM:
-      {
-         uc->us = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | 
(b >> 4);
-      }
-      return;
-   case PIPE_FORMAT_A8_UNORM:
-      {
-         uc->ub = a;
-      }
-      return;
-   case PIPE_FORMAT_L8_UNORM:
-   case PIPE_FORMAT_I8_UNORM:
-      {
-         uc->ub = a;
-      }
-      return;
-   case PIPE_FORMAT_R32G32B32A32_FLOAT:
-      {
-         uc->f[0] = (float)r / 255.0f;
-         uc->f[1] = (float)g / 255.0f;
-         uc->f[2] = (float)b / 255.0f;
-         uc->f[3] = (float)a / 255.0f;
-      }
-      return;
-   case PIPE_FORMAT_R32G32B32_FLOAT:
-      {
-         uc->f[0] = (float)r / 255.0f;
-         uc->f[1] = (float)g / 255.0f;
-         uc->f[2] = (float)b / 255.0f;
-      }
-      return;
+   ubyte src[4];
 
-   /* XXX lots more cases to add */
-   default:
-      uc->ui = 0; /* keep compiler happy */
-      debug_print_format("gallium: unhandled format in util_pack_color_ub()", 
format);
-      assert(0);
-   }
+   src[0] = r;
+   src[1] = g;
+   src[2] = b;
+   src[3] = a;
+
+   util_format_write_4ub(format, src, 0, uc, 0, 0, 0, 1, 1);
 }
  
 
@@ -144,150 +74,15 @@ static INLINE void
 util_unpack_color_ub(enum pipe_format format, union util_color *uc,
                      ubyte *r, ubyte *g, ubyte *b, ubyte *a)
 {
-   switch (format) {
-   case PIPE_FORMAT_R8G8B8A8_UNORM:
-      {
-         uint p = uc->ui;
-         *r = (ubyte) ((p >> 24) & 0xff);
-         *g = (ubyte) ((p >> 16) & 0xff);
-         *b = (ubyte) ((p >>  8) & 0xff);
-         *a = (ubyte) ((p >>  0) & 0xff);
-      }
-      return;
-   case PIPE_FORMAT_R8G8B8X8_UNORM:
-      {
-         uint p = uc->ui;
-         *r = (ubyte) ((p >> 24) & 0xff);
-         *g = (ubyte) ((p >> 16) & 0xff);
-         *b = (ubyte) ((p >>  8) & 0xff);
-         *a = (ubyte) 0xff;
-      }
-      return;
-   case PIPE_FORMAT_A8R8G8B8_UNORM:
-      {
-         uint p = uc->ui;
-         *r = (ubyte) ((p >> 16) & 0xff);
-         *g = (ubyte) ((p >>  8) & 0xff);
-         *b = (ubyte) ((p >>  0) & 0xff);
-         *a = (ubyte) ((p >> 24) & 0xff);
-      }
-      return;
-   case PIPE_FORMAT_X8R8G8B8_UNORM:
-      {
-         uint p = uc->ui;
-         *r = (ubyte) ((p >> 16) & 0xff);
-         *g = (ubyte) ((p >>  8) & 0xff);
-         *b = (ubyte) ((p >>  0) & 0xff);
-         *a = (ubyte) 0xff;
-      }
-      return;
-   case PIPE_FORMAT_B8G8R8A8_UNORM:
-      {
-         uint p = uc->ui;
-         *r = (ubyte) ((p >>  8) & 0xff);
-         *g = (ubyte) ((p >> 16) & 0xff);
-         *b = (ubyte) ((p >> 24) & 0xff);
-         *a = (ubyte) ((p >>  0) & 0xff);
-      }
-      return;
-   case PIPE_FORMAT_B8G8R8X8_UNORM:
-      {
-         uint p = uc->ui;
-         *r = (ubyte) ((p >>  8) & 0xff);
-         *g = (ubyte) ((p >> 16) & 0xff);
-         *b = (ubyte) ((p >> 24) & 0xff);
-         *a = (ubyte) 0xff;
-      }
-      return;
-   case PIPE_FORMAT_R5G6B5_UNORM:
-      {
-         ushort p = uc->us;
-         *r = (ubyte) (((p >> 8) & 0xf8) | ((p >> 13) & 0x7));
-         *g = (ubyte) (((p >> 3) & 0xfc) | ((p >>  9) & 0x3));
-         *b = (ubyte) (((p << 3) & 0xf8) | ((p >>  2) & 0x7));
-         *a = (ubyte) 0xff;
-      }
-      return;
-   case PIPE_FORMAT_A1R5G5B5_UNORM:
-      {
-         ushort p = uc->us;
-         *r = (ubyte) (((p >>  7) & 0xf8) | ((p >> 12) & 0x7));
-         *g = (ubyte) (((p >>  2) & 0xf8) | ((p >>  7) & 0x7));
-         *b = (ubyte) (((p <<  3) & 0xf8) | ((p >>  2) & 0x7));
-         *a = (ubyte) (0xff * (p >> 15));
-      }
-      return;
-   case PIPE_FORMAT_A4R4G4B4_UNORM:
-      {
-         ushort p = uc->us;
-         *r = (ubyte) (((p >> 4) & 0xf0) | ((p >>  8) & 0xf));
-         *g = (ubyte) (((p >> 0) & 0xf0) | ((p >>  4) & 0xf));
-         *b = (ubyte) (((p << 4) & 0xf0) | ((p >>  0) & 0xf));
-         *a = (ubyte) (((p >> 8) & 0xf0) | ((p >> 12) & 0xf));
-      }
-      return;
-   case PIPE_FORMAT_A8_UNORM:
-      {
-         ubyte p = uc->ub;
-         *r = *g = *b = (ubyte) 0xff;
-         *a = p;
-      }
-      return;
-   case PIPE_FORMAT_L8_UNORM:
-      {
-         ubyte p = uc->ub;
-         *r = *g = *b = p;
-         *a = (ubyte) 0xff;
-      }
-      return;
-   case PIPE_FORMAT_I8_UNORM:
-      {
-         ubyte p = uc->ub;
-         *r = *g = *b = *a = p;
-      }
-      return;
-   case PIPE_FORMAT_R32G32B32A32_FLOAT:
-      {
-         const float *p = &uc->f[0];
-         *r = float_to_ubyte(p[0]);
-         *g = float_to_ubyte(p[1]);
-         *b = float_to_ubyte(p[2]);
-         *a = float_to_ubyte(p[3]);
-      }
-      return;
-   case PIPE_FORMAT_R32G32B32_FLOAT:
-      {
-         const float *p = &uc->f[0];
-         *r = float_to_ubyte(p[0]);
-         *g = float_to_ubyte(p[1]);
-         *b = float_to_ubyte(p[2]);
-         *a = (ubyte) 0xff;
-      }
-      return;
+   ubyte dst[4];
 
-   case PIPE_FORMAT_R32G32_FLOAT:
-      {
-         const float *p = &uc->f[0];
-         *r = float_to_ubyte(p[0]);
-         *g = float_to_ubyte(p[1]);
-         *b = *a = (ubyte) 0xff;
-      }
-      return;
+   util_format_read_4ub(format, dst, 0, uc, 0, 0, 0, 1, 1);
 
-   case PIPE_FORMAT_R32_FLOAT:
-      {
-         const float *p = &uc->f[0];
-         *r = float_to_ubyte(p[0]);
-         *g = *b = *a = (ubyte) 0xff;
-      }
-      return;
+   *r = dst[0];
+   *g = dst[1];
+   *b = dst[2];
+   *a = dst[3];
 
-   /* XXX lots more cases to add */
-   default:
-      debug_print_format("gallium: unhandled format in util_unpack_color_ub()",
-                         format);
-      assert(0);
-   }
 }
 
 
@@ -297,97 +92,7 @@ util_unpack_color_ub(enum pipe_format format, union 
util_color *uc,
 static INLINE void
 util_pack_color(const float rgba[4], enum pipe_format format, union util_color 
*uc)
 {
-   ubyte r = 0;
-   ubyte g = 0;
-   ubyte b = 0;
-   ubyte a = 0;
-
-   if (pf_size_x(format) <= 8) {
-      /* format uses 8-bit components or less */
-      r = float_to_ubyte(rgba[0]);
-      g = float_to_ubyte(rgba[1]);
-      b = float_to_ubyte(rgba[2]);
-      a = float_to_ubyte(rgba[3]);
-   }
-
-   switch (format) {
-   case PIPE_FORMAT_R8G8B8A8_UNORM:
-      {
-         uc->ui = (r << 24) | (g << 16) | (b << 8) | a;
-      }
-      return;
-   case PIPE_FORMAT_R8G8B8X8_UNORM:
-      {
-         uc->ui = (r << 24) | (g << 16) | (b << 8) | 0xff;
-      }
-      return;
-   case PIPE_FORMAT_A8R8G8B8_UNORM:
-      {
-         uc->ui = (a << 24) | (r << 16) | (g << 8) | b;
-      }
-      return;
-   case PIPE_FORMAT_X8R8G8B8_UNORM:
-      {
-         uc->ui = (0xff << 24) | (r << 16) | (g << 8) | b;
-      }
-      return;
-   case PIPE_FORMAT_B8G8R8A8_UNORM:
-      {
-         uc->ui = (b << 24) | (g << 16) | (r << 8) | a;
-      }
-      return;
-   case PIPE_FORMAT_B8G8R8X8_UNORM:
-      {
-         uc->ui = (b << 24) | (g << 16) | (r << 8) | 0xff;
-      }
-      return;
-   case PIPE_FORMAT_R5G6B5_UNORM:
-      {
-         uc->us = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3);
-      }
-      return;
-   case PIPE_FORMAT_A1R5G5B5_UNORM:
-      {
-         uc->us = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | 
(b >> 3);
-      }
-      return;
-   case PIPE_FORMAT_A4R4G4B4_UNORM:
-      {
-         uc->ub = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | 
(b >> 4);
-      }
-      return;
-   case PIPE_FORMAT_A8_UNORM:
-      {
-         uc->ub = a;
-      }
-      return;
-   case PIPE_FORMAT_L8_UNORM:
-   case PIPE_FORMAT_I8_UNORM:
-      {
-         uc->ub = r;
-      }
-      return;
-   case PIPE_FORMAT_R32G32B32A32_FLOAT:
-      {
-         uc->f[0] = rgba[0];
-         uc->f[1] = rgba[1];
-         uc->f[2] = rgba[2];
-         uc->f[3] = rgba[3];
-      }
-      return;
-   case PIPE_FORMAT_R32G32B32_FLOAT:
-      {
-         uc->f[0] = rgba[0];
-         uc->f[1] = rgba[1];
-         uc->f[2] = rgba[2];
-      }
-      return;
-   /* XXX lots more cases to add */
-   default:
-      uc->ui = 0; /* keep compiler happy */
-      debug_print_format("gallium: unhandled format in util_pack_color()", 
format);
-      assert(0);
-   }
+   util_format_write_4f(format, rgba, 0, uc, 0, 0, 0, 1, 1);
 }
  
 
------------------------------------------------------------------------------
Return on Information:
Google Enterprise Search pays you back
Get the facts.
http://p.sf.net/sfu/google-dev2dev
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to