#include "errors.h"
-#include "imports.h"
+#include "util/imports.h"
#include "formats.h"
#include "macros.h"
#include "glformats.h"
{
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;
}
_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;
}
_mesa_format_to_array_format(mesa_format format)
{
const struct mesa_format_info *info = _mesa_get_format_info(format);
- if (info->ArrayFormat && !_mesa_little_endian() &&
- info->Layout == MESA_FORMAT_LAYOUT_PACKED)
+#if UTIL_ARCH_BIG_ENDIAN
+ if (info->ArrayFormat && info->Layout == MESA_FORMAT_LAYOUT_PACKED)
return _mesa_array_format_flip_channels(info->ArrayFormat);
else
+#endif
return info->ArrayFormat;
}
for (f = 1; f < MESA_FORMAT_COUNT; ++f) {
info = _mesa_get_format_info(f);
- if (!info->ArrayFormat)
+ if (!info || !info->ArrayFormat)
continue;
- if (_mesa_little_endian()) {
- array_format = info->ArrayFormat;
- } else {
- array_format = _mesa_array_format_flip_channels(info->ArrayFormat);
- }
-
- /* This can happen and does for some of the BGR formats. Let's take
- * the first one in the list.
+ /* All sRGB formats should have an equivalent UNORM format, and that's
+ * the one we want in the table.
*/
- if (_mesa_hash_table_search_pre_hashed(format_array_format_table,
- array_format,
- (void *)(intptr_t)array_format))
+ if (_mesa_is_format_srgb(f))
continue;
+#if UTIL_ARCH_LITTLE_ENDIAN
+ array_format = info->ArrayFormat;
+#else
+ array_format = _mesa_array_format_flip_channels(info->ArrayFormat);
+#endif
+
_mesa_hash_table_insert_pre_hashed(format_array_format_table,
array_format,
(void *)(intptr_t)array_format,
case MESA_FORMAT_R_RGTC1_SNORM:
return MESA_FORMAT_R_SNORM8;
case MESA_FORMAT_RG_RGTC2_UNORM:
- return MESA_FORMAT_R8G8_UNORM;
+ return MESA_FORMAT_RG_UNORM8;
case MESA_FORMAT_RG_RGTC2_SNORM:
- return MESA_FORMAT_R8G8_SNORM;
+ return MESA_FORMAT_RG_SNORM8;
case MESA_FORMAT_L_LATC1_UNORM:
return MESA_FORMAT_L_UNORM8;
case MESA_FORMAT_L_LATC1_SNORM:
return MESA_FORMAT_L_SNORM8;
case MESA_FORMAT_LA_LATC2_UNORM:
- return MESA_FORMAT_L8A8_UNORM;
+ return MESA_FORMAT_LA_UNORM8;
case MESA_FORMAT_LA_LATC2_SNORM:
- return MESA_FORMAT_L8A8_SNORM;
+ return MESA_FORMAT_LA_SNORM8;
case MESA_FORMAT_ETC1_RGB8:
case MESA_FORMAT_ETC2_RGB8:
case MESA_FORMAT_ETC2_SRGB8:
return MESA_FORMAT_R_UNORM16;
case MESA_FORMAT_ETC2_RG11_EAC:
case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
- return MESA_FORMAT_R16G16_UNORM;
+ return MESA_FORMAT_RG_UNORM16;
case MESA_FORMAT_BPTC_RGBA_UNORM:
case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
return MESA_FORMAT_A8B8G8R8_UNORM;
*comps = 2;
return;
- case MESA_FORMAT_L8A8_UNORM:
- case MESA_FORMAT_A8L8_UNORM:
- case MESA_FORMAT_R8G8_UNORM:
- case MESA_FORMAT_G8R8_UNORM:
+ case MESA_FORMAT_LA_UNORM8:
+ case MESA_FORMAT_RG_UNORM8:
*datatype = GL_UNSIGNED_BYTE;
*comps = 2;
return;
- case MESA_FORMAT_L16A16_UNORM:
- case MESA_FORMAT_A16L16_UNORM:
- case MESA_FORMAT_R16G16_UNORM:
- case MESA_FORMAT_G16R16_UNORM:
+ case MESA_FORMAT_LA_UNORM16:
+ case MESA_FORMAT_RG_UNORM16:
*datatype = GL_UNSIGNED_SHORT;
*comps = 2;
return;
*datatype = GL_BYTE;
*comps = 1;
return;
- case MESA_FORMAT_R8G8_SNORM:
- case MESA_FORMAT_L8A8_SNORM:
- case MESA_FORMAT_A8L8_SNORM:
+ case MESA_FORMAT_RG_SNORM8:
+ case MESA_FORMAT_LA_SNORM8:
*datatype = GL_BYTE;
*comps = 2;
return;
*datatype = GL_SHORT;
*comps = 1;
return;
- case MESA_FORMAT_R16G16_SNORM:
+ case MESA_FORMAT_RG_SNORM16:
case MESA_FORMAT_LA_SNORM16:
*datatype = GL_SHORT;
*comps = 2;
*datatype = GL_UNSIGNED_BYTE;
*comps = 1;
return;
- case MESA_FORMAT_L8A8_SRGB:
- case MESA_FORMAT_A8L8_SRGB:
+ case MESA_FORMAT_LA_SRGB8:
*datatype = GL_UNSIGNED_BYTE;
*comps = 2;
return;
*datatype = GL_UNSIGNED_BYTE;
*comps = 3;
return;
- case MESA_FORMAT_RGBA_UINT8:
- *datatype = GL_UNSIGNED_BYTE;
- *comps = 4;
- return;
case MESA_FORMAT_R_UINT16:
*datatype = GL_UNSIGNED_SHORT;
*comps = 1;
*comps = 4;
return;
- case MESA_FORMAT_G8R8_SNORM:
- *datatype = GL_BYTE;
- *comps = 2;
- return;
-
- case MESA_FORMAT_G16R16_SNORM:
- *datatype = GL_SHORT;
- *comps = 2;
- return;
-
case MESA_FORMAT_B8G8R8X8_SRGB:
case MESA_FORMAT_X8R8G8B8_SRGB:
*datatype = GL_UNSIGNED_BYTE;
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;
}
+ }
}
/**