mesa: add GL_NV_viewport_swizzle support
[mesa.git] / src / mesa / main / formats.c
index 9c65e7decc7418604c2f019fd28b026f4face4b0..53f01ffc18a0ced67776a5ce505b878ba8ef37f9 100644 (file)
@@ -25,7 +25,7 @@
 
 
 #include "errors.h"
-#include "imports.h"
+#include "util/imports.h"
 #include "formats.h"
 #include "macros.h"
 #include "glformats.h"
@@ -85,6 +85,13 @@ _mesa_get_format_info(mesa_format format)
 {
    const struct mesa_format_info *info = &format_info[format];
    STATIC_ASSERT(ARRAY_SIZE(format_info) == MESA_FORMAT_COUNT);
+
+   /* The MESA_FORMAT_* enums are sparse, don't return a format info
+    * for empty entries.
+    */
+   if (info->Name == MESA_FORMAT_NONE && format != MESA_FORMAT_NONE)
+      return NULL;
+
    assert(info->Name == format);
    return info;
 }
@@ -95,6 +102,8 @@ const char *
 _mesa_get_format_name(mesa_format format)
 {
    const struct mesa_format_info *info = _mesa_get_format_info(format);
+   if (!info)
+      return NULL;
    return info->StrName;
 }
 
@@ -465,7 +474,13 @@ format_array_format_table_init(void)
 
    for (f = 1; f < MESA_FORMAT_COUNT; ++f) {
       info = _mesa_get_format_info(f);
-      if (!info->ArrayFormat)
+      if (!info || !info->ArrayFormat)
+         continue;
+
+      /* All sRGB formats should have an equivalent UNORM format, and that's
+       * the one we want in the table.
+       */
+      if (_mesa_is_format_srgb(f))
          continue;
 
 #if UTIL_ARCH_LITTLE_ENDIAN
@@ -474,14 +489,6 @@ format_array_format_table_init(void)
          array_format = _mesa_array_format_flip_channels(info->ArrayFormat);
 #endif
 
-      /* This can happen and does for some of the BGR formats.  Let's take
-       * the first one in the list.
-       */
-      if (_mesa_hash_table_search_pre_hashed(format_array_format_table,
-                                             array_format,
-                                             (void *)(intptr_t)array_format))
-         continue;
-
       _mesa_hash_table_insert_pre_hashed(format_array_format_table,
                                          array_format,
                                          (void *)(intptr_t)array_format,
@@ -1409,15 +1416,17 @@ _mesa_uncompressed_format_to_type_and_comps(mesa_format format,
    case MESA_FORMAT_COUNT:
       assert(0);
       return;
-   default:
+   default: {
+      const char *name = _mesa_get_format_name(format);
       /* Warn if any formats are not handled */
       _mesa_problem(NULL, "bad format %s in _mesa_uncompressed_format_to_type_and_comps",
-                    _mesa_get_format_name(format));
+                    name ? name : "???");
       assert(format == MESA_FORMAT_NONE ||
              _mesa_is_format_compressed(format));
       *datatype = 0;
       *comps = 1;
    }
+   }
 }
 
 /**