#ifndef R600_FORMATS_H
#define R600_FORMATS_H
#include "util/u_format.h"
#include "r600_pipe.h"
/* list of formats from R700 ISA document - apply across GPUs in different registers */
#define FMT_INVALID 0x00000000
#define FMT_8 0x00000001
#define FMT_4_4 0x00000002
#define FMT_3_3_2 0x00000003
#define FMT_16 0x00000005
#define FMT_16_FLOAT 0x00000006
#define FMT_8_8 0x00000007
#define FMT_5_6_5 0x00000008
#define FMT_6_5_5 0x00000009
#define FMT_1_5_5_5 0x0000000A
#define FMT_4_4_4_4 0x0000000B
#define FMT_5_5_5_1 0x0000000C
#define FMT_32 0x0000000D
#define FMT_32_FLOAT 0x0000000E
#define FMT_16_16 0x0000000F
#define FMT_16_16_FLOAT 0x00000010
#define FMT_8_24 0x00000011
#define FMT_8_24_FLOAT 0x00000012
#define FMT_24_8 0x00000013
#define FMT_24_8_FLOAT 0x00000014
#define FMT_10_11_11 0x00000015
#define FMT_10_11_11_FLOAT 0x00000016
#define FMT_11_11_10 0x00000017
#define FMT_11_11_10_FLOAT 0x00000018
#define FMT_2_10_10_10 0x00000019
#define FMT_8_8_8_8 0x0000001A
#define FMT_10_10_10_2 0x0000001B
#define FMT_X24_8_32_FLOAT 0x0000001C
#define FMT_32_32 0x0000001D
#define FMT_32_32_FLOAT 0x0000001E
#define FMT_16_16_16_16 0x0000001F
#define FMT_16_16_16_16_FLOAT 0x00000020
#define FMT_32_32_32_32 0x00000022
#define FMT_32_32_32_32_FLOAT 0x00000023
#define FMT_1 0x00000025
#define FMT_GB_GR 0x00000027
#define FMT_BG_RG 0x00000028
#define FMT_32_AS_8 0x00000029
#define FMT_32_AS_8_8 0x0000002a
#define FMT_5_9_9_9_SHAREDEXP 0x0000002b
#define FMT_8_8_8 0x0000002c
#define FMT_16_16_16 0x0000002d
#define FMT_16_16_16_FLOAT 0x0000002e
#define FMT_32_32_32 0x0000002f
#define FMT_32_32_32_FLOAT 0x00000030
#define FMT_BC1 0x00000031
#define FMT_BC2 0x00000032
#define FMT_BC3 0x00000033
#define FMT_BC4 0x00000034
#define FMT_BC5 0x00000035
#define FMT_BC6 0x00000036
#define FMT_BC7 0x00000037
#define FMT_32_AS_32_32_32_32 0x00000038
#define ENDIAN_NONE 0
#define ENDIAN_8IN16 1
#define ENDIAN_8IN32 2
#define ENDIAN_8IN64 3
static INLINE unsigned r600_endian_swap(unsigned size)
{
if (R600_BIG_ENDIAN) {
switch (size) {
case 64:
return ENDIAN_8IN64;
case 32:
return ENDIAN_8IN32;
case 16:
return ENDIAN_8IN16;
default:
return ENDIAN_NONE;
}
} else {
return ENDIAN_NONE;
}
}
static INLINE bool r600_is_vertex_format_supported(enum pipe_format format)
{
const struct util_format_description *desc = util_format_description(format);
unsigned i;
if (!desc)
return false;
/* Find the first non-VOID channel. */
for (i = 0; i < 4; i++) {
if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID)
break;
}
if (i == 4)
return false;
/* No fixed, no double. */
if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN ||
(desc->channel[i].size == 64 &&
desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) ||
desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED)
return false;
/* No scaled/norm formats with 32 bits per channel. */
if (desc->channel[i].size == 32 &&
(desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED ||
desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED))
return false;
return true;
}
#endif