1 /* 2 * Copyright 2010, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_ // NOLINT 18 #define _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_ 19 20 #define RS_DATA_TYPE_CLASS_ENUMS \ 21 ENUM_RS_DATA_TYPE_CLASS(Primitive) \ 22 ENUM_RS_DATA_TYPE_CLASS(Pointer) \ 23 ENUM_RS_DATA_TYPE_CLASS(Vector) \ 24 ENUM_RS_DATA_TYPE_CLASS(Matrix) \ 25 ENUM_RS_DATA_TYPE_CLASS(ConstantArray) \ 26 ENUM_RS_DATA_TYPE_CLASS(Record) 27 28 #define PRIMITIVE_DATA_TYPE_ENUMS \ 29 ENUM_PRIMITIVE_DATA_TYPE(Float16, NULL, 128) \ 30 ENUM_PRIMITIVE_DATA_TYPE(Float32, "float", 256) \ 31 ENUM_PRIMITIVE_DATA_TYPE(Float64, "double", 512) \ 32 ENUM_PRIMITIVE_DATA_TYPE(Signed8, "char", 64) \ 33 ENUM_PRIMITIVE_DATA_TYPE(Signed16, "short", 128) \ 34 ENUM_PRIMITIVE_DATA_TYPE(Signed32, "int", 256) \ 35 ENUM_PRIMITIVE_DATA_TYPE(Signed64, "long", 512) \ 36 ENUM_PRIMITIVE_DATA_TYPE(Unsigned8, "uchar", 64) \ 37 ENUM_PRIMITIVE_DATA_TYPE(Unsigned16, "ushort", 128) \ 38 ENUM_PRIMITIVE_DATA_TYPE(Unsigned32, "uint", 256) \ 39 ENUM_PRIMITIVE_DATA_TYPE(Unsigned64, "ulong", 512) \ 40 ENUM_PRIMITIVE_DATA_TYPE(Boolean, "bool", 8) \ 41 ENUM_PRIMITIVE_DATA_TYPE(Unsigned565, "u565", 128) \ 42 ENUM_PRIMITIVE_DATA_TYPE(Unsigned5551, "u5551", 128) \ 43 ENUM_PRIMITIVE_DATA_TYPE(Unsigned4444, "u4444", 128) \ 44 PRIMITIVE_DATA_TYPE_RANGE(Float16, Unsigned4444) 45 46 #define RS_MATRIX_DATA_TYPE_ENUMS \ 47 ENUM_RS_MATRIX_DATA_TYPE(RSMatrix2x2, "rs_matrix2x2", 2) \ 48 ENUM_RS_MATRIX_DATA_TYPE(RSMatrix3x3, "rs_matrix3x3", 3) \ 49 ENUM_RS_MATRIX_DATA_TYPE(RSMatrix4x4, "rs_matrix4x4", 4) \ 50 RS_MATRIX_DATA_TYPE_RANGE(RSMatrix2x2, RSMatrix4x4) 51 52 #define RS_OBJECT_DATA_TYPE_ENUMS \ 53 ENUM_RS_OBJECT_DATA_TYPE(RSElement, "rs_element") \ 54 ENUM_RS_OBJECT_DATA_TYPE(RSType, "rs_type") \ 55 ENUM_RS_OBJECT_DATA_TYPE(RSAllocation, "rs_allocation") \ 56 ENUM_RS_OBJECT_DATA_TYPE(RSSampler, "rs_sampler") \ 57 ENUM_RS_OBJECT_DATA_TYPE(RSScript, "rs_script") \ 58 ENUM_RS_OBJECT_DATA_TYPE(RSMesh, "rs_mesh") \ 59 ENUM_RS_OBJECT_DATA_TYPE(RSProgramFragment, "rs_program_fragment") \ 60 ENUM_RS_OBJECT_DATA_TYPE(RSProgramVertex, "rs_program_vertex") \ 61 ENUM_RS_OBJECT_DATA_TYPE(RSProgramRaster, "rs_program_raster") \ 62 ENUM_RS_OBJECT_DATA_TYPE(RSProgramStore, "rs_program_store") \ 63 ENUM_RS_OBJECT_DATA_TYPE(RSFont, "rs_font") \ 64 RS_OBJECT_DATA_TYPE_RANGE(RSElement, RSFont) 65 66 #define RS_DATA_KIND_ENUMS \ 67 ENUM_RS_DATA_KIND(User) \ 68 ENUM_RS_DATA_KIND(PixelL) \ 69 ENUM_RS_DATA_KIND(PixelA) \ 70 ENUM_RS_DATA_KIND(PixelLA) \ 71 ENUM_RS_DATA_KIND(PixelRGB) \ 72 ENUM_RS_DATA_KIND(PixelRGBA) 73 74 enum RSTypeClass { 75 #define ENUM_RS_DATA_TYPE_CLASS(x) RS_TC_ ## x, 76 RS_DATA_TYPE_CLASS_ENUMS 77 #undef ENUM_RS_DATA_TYPE_CLASS 78 RS_TC_Max 79 }; 80 81 enum RSDataType { 82 #define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) RS_DT_ ## x, 83 #define PRIMITIVE_DATA_TYPE_RANGE(x, y) \ 84 RS_DT_FirstPrimitiveType = RS_DT_ ## x, \ 85 RS_DT_LastPrimitiveType = RS_DT_ ## y, 86 PRIMITIVE_DATA_TYPE_ENUMS 87 #undef ENUM_PRIMITIVE_DATA_TYPE 88 #undef PRIMITIVE_DATA_TYPE_RANGE 89 90 #define ENUM_RS_MATRIX_DATA_TYPE(x, name, dim) RS_DT_ ## x, 91 #define RS_MATRIX_DATA_TYPE_RANGE(x, y) \ 92 RS_DT_FirstMatrixType = RS_DT_ ## x, \ 93 RS_DT_LastMatrixType = RS_DT_ ## y, 94 RS_MATRIX_DATA_TYPE_ENUMS 95 #undef ENUM_RS_MATRIX_DATA_TYPE 96 #undef RS_MATRIX_DATA_TYPE_RANGE 97 98 #define ENUM_RS_OBJECT_DATA_TYPE(x, name) RS_DT_ ## x, 99 #define RS_OBJECT_DATA_TYPE_RANGE(x, y) \ 100 RS_DT_FirstRSObjectType = RS_DT_ ## x, \ 101 RS_DT_LastRSObjectType = RS_DT_ ## y, 102 RS_OBJECT_DATA_TYPE_ENUMS 103 #undef ENUM_RS_OBJECT_DATA_TYPE 104 #undef RS_OBJECT_DATA_TYPE_RANGE 105 106 RS_DT_USER_DEFINED 107 }; 108 109 enum RSDataKind { 110 #define ENUM_RS_DATA_KIND(x) RS_DK_ ## x, 111 RS_DATA_KIND_ENUMS 112 #undef ENUM_RS_DATA_KIND 113 RS_DK_Max 114 }; 115 116 // Forward declaration 117 union RSType; 118 119 // NOTE: Current design need to keep struct RSTypeBase as a 4-byte integer for 120 // efficient decoding process (see DecodeTypeMetadata). 121 struct RSTypeBase { 122 /* enum RSTypeClass tc; */ 123 // tc is encoded in b[0]. 124 union { 125 // FIXME: handle big-endianess case 126 unsigned bits; // NOTE: Little-endian is assumed. 127 unsigned char b[4]; 128 }; 129 }; 130 131 struct RSPrimitiveType { 132 struct RSTypeBase base; 133 /* enum RSDataType dt; */ 134 // dt is encoded in base.b[1] 135 }; 136 137 struct RSPointerType { 138 struct RSTypeBase base; 139 const union RSType *pointee; 140 }; 141 142 struct RSVectorType { 143 struct RSPrimitiveType base; // base type of vec must be in primitive type 144 /* unsigned char vsize; */ 145 // vsize is encoded in base.b[2] 146 }; 147 148 // RSMatrixType is actually a specialize class of RSPrimitiveType whose value of 149 // dt (data type) can only be RS_DT_RSMatrix2x2, RS_DT_RSMatrix3x3 and 150 // RS_DT_RSMatrix4x4. 151 struct RSMatrixType { 152 struct RSTypeBase base; 153 }; 154 155 struct RSConstantArrayType { 156 struct RSTypeBase base; 157 const union RSType *element_type; 158 /* unsigned esize; */ 159 // esize is encoded in base.bits{8-31} in little-endian way. This implicates 160 // the number of elements in any constant array type should never exceed 2^24. 161 }; 162 163 struct RSRecordField { 164 const char *name; // field name 165 const union RSType *type; 166 enum RSDataKind dk; 167 }; 168 169 struct RSRecordType { 170 struct RSTypeBase base; 171 const char *name; // type name 172 /* unsigned num_fields; */ 173 // num_fields is encoded in base.bits{16-31} in little-endian way. This 174 // implicates the number of fields defined in any record type should never 175 // exceed 2^16. 176 177 struct RSRecordField field[1]; 178 }; 179 180 union RSType { 181 struct RSTypeBase base; 182 struct RSPrimitiveType prim; 183 struct RSPointerType pointer; 184 struct RSVectorType vec; 185 struct RSConstantArrayType ca; 186 struct RSRecordType rec; 187 }; 188 189 #define RS_GET_TYPE_BASE(R) (&((R)->base)) 190 #define RS_CAST_TO_PRIMITIVE_TYPE(R) (&((R)->prim)) 191 #define RS_CAST_TO_POINTER_TYPE(R) (&((R)->pointer)) 192 #define RS_CAST_TO_VECTOR_TYPE(R) (&((R)->vec)) 193 #define RS_CAST_TO_CONSTANT_ARRAY_TYPE(R) (&((R)->ca)) 194 #define RS_CAST_TO_RECORD_TYPE(R) (&((R)->rec)) 195 196 // RSType 197 #define RS_TYPE_GET_CLASS(R) RS_GET_TYPE_BASE(R)->b[0] 198 #define RS_TYPE_SET_CLASS(R, V) RS_TYPE_GET_CLASS(R) = (V) 199 200 // RSPrimitiveType 201 #define RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) \ 202 RS_CAST_TO_PRIMITIVE_TYPE(R)->base.b[1] 203 #define RS_PRIMITIVE_TYPE_SET_DATA_TYPE(R, V) \ 204 RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) = (V) 205 206 // RSPointerType 207 #define RS_POINTER_TYPE_GET_POINTEE_TYPE(R) \ 208 RS_CAST_TO_POINTER_TYPE(R)->pointee 209 #define RS_POINTER_TYPE_SET_POINTEE_TYPE(R, V) \ 210 RS_POINTER_TYPE_GET_POINTEE_TYPE(R) = (V) 211 212 // RSVectorType 213 #define RS_VECTOR_TYPE_GET_ELEMENT_TYPE(R) \ 214 RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) 215 #define RS_VECTOR_TYPE_SET_ELEMENT_TYPE(R, V) \ 216 RS_VECTOR_TYPE_GET_ELEMENT_TYPE(R) = (V) 217 218 #define RS_VECTOR_TYPE_GET_VECTOR_SIZE(R) \ 219 RS_CAST_TO_VECTOR_TYPE(R)->base.base.b[2] 220 #define RS_VECTOR_TYPE_SET_VECTOR_SIZE(R, V) \ 221 RS_VECTOR_TYPE_GET_VECTOR_SIZE(R) = (V) 222 223 // RSMatrixType 224 #define RS_MATRIX_TYPE_GET_DATA_TYPE(R) RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) 225 #define RS_MATRIX_TYPE_SET_DATA_TYPE(R, V) \ 226 RS_MATRIX_TYPE_GET_DATA_TYPE(R) = (V) 227 228 // RSConstantArrayType 229 #define RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(R) \ 230 RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->element_type 231 #define RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_TYPE(R, V) \ 232 RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(R) = (V) 233 234 #define RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_SIZE(R) \ 235 (RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits & 0x00ffffff) 236 #define RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_SIZE(R, V) \ 237 RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits = \ 238 ((RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits & 0x000000ff) | \ 239 ((V & 0xffffff) << 8)) 240 241 // RSRecordType 242 #define RS_RECORD_TYPE_GET_NAME(R) RS_CAST_TO_RECORD_TYPE(R)->name 243 #define RS_RECORD_TYPE_SET_NAME(R, V) RS_RECORD_TYPE_GET_NAME(R) = (V) 244 245 #define RS_RECORD_TYPE_GET_NUM_FIELDS(R) \ 246 ((RS_CAST_TO_RECORD_TYPE(R)->base.bits & 0xffff0000) >> 16) 247 #define RS_RECORD_TYPE_SET_NUM_FIELDS(R, V) \ 248 RS_CAST_TO_RECORD_TYPE(R)->base.bits = \ 249 ((RS_CAST_TO_RECORD_TYPE(R)->base.bits & 0x0000ffff) | ((V & 0xffff) << 16)) 250 251 #define RS_RECORD_TYPE_GET_FIELD_NAME(R, I) \ 252 RS_CAST_TO_RECORD_TYPE(R)->field[(I)].name 253 #define RS_RECORD_TYPE_SET_FIELD_NAME(R, I, V) \ 254 RS_RECORD_TYPE_GET_FIELD_NAME(R, I) = (V) 255 256 #define RS_RECORD_TYPE_GET_FIELD_TYPE(R, I) \ 257 RS_CAST_TO_RECORD_TYPE(R)->field[(I)].type 258 #define RS_RECORD_TYPE_SET_FIELD_TYPE(R, I, V) \ 259 RS_RECORD_TYPE_GET_FIELD_TYPE(R, I) = (V) 260 261 #define RS_RECORD_TYPE_GET_FIELD_DATA_KIND(R, I) \ 262 RS_CAST_TO_RECORD_TYPE(R)->field[(I)].dk 263 #define RS_RECORD_TYPE_SET_FIELD_DATA_KIND(R, I, V) \ 264 RS_RECORD_TYPE_GET_FIELD_DATA_KIND(R, I) = (V) 265 266 #endif // _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_ NOLINT 267