1 // SPDX-License-Identifier: MIT 2 #ifndef R600_FORMATS_H 3 #define R600_FORMATS_H 4 5 #include "util/format/u_format.h" 6 #include "util/u_endian.h" 7 8 /* list of formats from R700 ISA document - apply across GPUs in different registers */ 9 #define FMT_INVALID 0x00000000 10 #define FMT_8 0x00000001 11 #define FMT_4_4 0x00000002 12 #define FMT_3_3_2 0x00000003 13 #define FMT_16 0x00000005 14 #define FMT_16_FLOAT 0x00000006 15 #define FMT_8_8 0x00000007 16 #define FMT_5_6_5 0x00000008 17 #define FMT_6_5_5 0x00000009 18 #define FMT_1_5_5_5 0x0000000A 19 #define FMT_4_4_4_4 0x0000000B 20 #define FMT_5_5_5_1 0x0000000C 21 #define FMT_32 0x0000000D 22 #define FMT_32_FLOAT 0x0000000E 23 #define FMT_16_16 0x0000000F 24 #define FMT_16_16_FLOAT 0x00000010 25 #define FMT_8_24 0x00000011 26 #define FMT_8_24_FLOAT 0x00000012 27 #define FMT_24_8 0x00000013 28 #define FMT_24_8_FLOAT 0x00000014 29 #define FMT_10_11_11 0x00000015 30 #define FMT_10_11_11_FLOAT 0x00000016 31 #define FMT_11_11_10 0x00000017 32 #define FMT_11_11_10_FLOAT 0x00000018 33 #define FMT_2_10_10_10 0x00000019 34 #define FMT_8_8_8_8 0x0000001A 35 #define FMT_10_10_10_2 0x0000001B 36 #define FMT_X24_8_32_FLOAT 0x0000001C 37 #define FMT_32_32 0x0000001D 38 #define FMT_32_32_FLOAT 0x0000001E 39 #define FMT_16_16_16_16 0x0000001F 40 #define FMT_16_16_16_16_FLOAT 0x00000020 41 #define FMT_32_32_32_32 0x00000022 42 #define FMT_32_32_32_32_FLOAT 0x00000023 43 #define FMT_1 0x00000025 44 #define FMT_GB_GR 0x00000027 45 #define FMT_BG_RG 0x00000028 46 #define FMT_32_AS_8 0x00000029 47 #define FMT_32_AS_8_8 0x0000002a 48 #define FMT_5_9_9_9_SHAREDEXP 0x0000002b 49 #define FMT_8_8_8 0x0000002c 50 #define FMT_16_16_16 0x0000002d 51 #define FMT_16_16_16_FLOAT 0x0000002e 52 #define FMT_32_32_32 0x0000002f 53 #define FMT_32_32_32_FLOAT 0x00000030 54 #define FMT_BC1 0x00000031 55 #define FMT_BC2 0x00000032 56 #define FMT_BC3 0x00000033 57 #define FMT_BC4 0x00000034 58 #define FMT_BC5 0x00000035 59 #define FMT_BC6 0x00000036 60 #define FMT_BC7 0x00000037 61 #define FMT_32_AS_32_32_32_32 0x00000038 62 63 #define ENDIAN_NONE 0 64 #define ENDIAN_8IN16 1 65 #define ENDIAN_8IN32 2 66 #define ENDIAN_8IN64 3 67 r600_endian_swap(unsigned size)68static inline unsigned r600_endian_swap(unsigned size) 69 { 70 if (UTIL_ARCH_BIG_ENDIAN) { 71 switch (size) { 72 case 64: 73 return ENDIAN_8IN64; 74 case 32: 75 return ENDIAN_8IN32; 76 case 16: 77 return ENDIAN_8IN16; 78 default: 79 return ENDIAN_NONE; 80 } 81 } else { 82 return ENDIAN_NONE; 83 } 84 } 85 r600_is_buffer_format_supported(enum pipe_format format,bool for_vbo)86static inline bool r600_is_buffer_format_supported(enum pipe_format format, bool for_vbo) 87 { 88 const struct util_format_description *desc = util_format_description(format); 89 unsigned i; 90 91 if (format == PIPE_FORMAT_R11G11B10_FLOAT) 92 return true; 93 94 i = util_format_get_first_non_void_channel(format); 95 if (i == -1) 96 return false; 97 98 /* No fixed, no double. */ 99 if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN || 100 (desc->channel[i].size == 64 && 101 desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT) || 102 desc->channel[i].type == UTIL_FORMAT_TYPE_FIXED) 103 return false; 104 105 /* No scaled/norm formats with 32 bits per channel. */ 106 if (desc->channel[i].size == 32 && 107 !desc->channel[i].pure_integer && 108 (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED || 109 desc->channel[i].type == UTIL_FORMAT_TYPE_UNSIGNED)) 110 return false; 111 112 /* No 8 bit 3 channel formats for TBOs */ 113 if (desc->channel[i].size == 8 && desc->nr_channels == 3) 114 return for_vbo; 115 116 return true; 117 } 118 r600_is_index_format_supported(enum pipe_format format)119static inline bool r600_is_index_format_supported(enum pipe_format format) 120 { 121 switch (format) { 122 case PIPE_FORMAT_R8_UINT: 123 case PIPE_FORMAT_R16_UINT: 124 case PIPE_FORMAT_R32_UINT: 125 return true; 126 127 default: 128 return false; 129 } 130 } 131 132 #endif 133