slang_rs_spec_table.cpp revision 7363d8430db732c42d392fcab47cf0e3f8eb4515
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#include <string> 18#include <cstring> 19#include <cstdio> 20 21#define PRIMITIVE_DATA_TYPE_ENUMS \ 22 ENUM_PRIMITIVE_DATA_TYPE(Float16, NULL, 128) \ 23 ENUM_PRIMITIVE_DATA_TYPE(Float32, "float", 256) \ 24 ENUM_PRIMITIVE_DATA_TYPE(Float64, "double", 512) \ 25 ENUM_PRIMITIVE_DATA_TYPE(Signed8, "char", 64) \ 26 ENUM_PRIMITIVE_DATA_TYPE(Signed16, "short", 128) \ 27 ENUM_PRIMITIVE_DATA_TYPE(Signed32, "int", 256) \ 28 ENUM_PRIMITIVE_DATA_TYPE(Signed64, "long", 512) \ 29 ENUM_PRIMITIVE_DATA_TYPE(Unsigned8, "uchar", 64) \ 30 ENUM_PRIMITIVE_DATA_TYPE(Unsigned16, "ushort", 128) \ 31 ENUM_PRIMITIVE_DATA_TYPE(Unsigned32, "uint", 256) \ 32 ENUM_PRIMITIVE_DATA_TYPE(Unsigned64, "ulong", 512) \ 33 ENUM_PRIMITIVE_DATA_TYPE(Boolean, "bool", 8) \ 34 ENUM_PRIMITIVE_DATA_TYPE(Unsigned565, "u565", 128) \ 35 ENUM_PRIMITIVE_DATA_TYPE(Unsigned5551, "u5551", 128) \ 36 ENUM_PRIMITIVE_DATA_TYPE(Unsigned4444, "u4444", 128) 37 38#define RS_OBJECT_DATA_TYPE_ENUMS \ 39 ENUM_RS_OBJECT_DATA_TYPE(RSMatrix2x2, "rs_matrix2x2") \ 40 ENUM_RS_OBJECT_DATA_TYPE(RSMatrix3x3, "rs_matrix3x3") \ 41 ENUM_RS_OBJECT_DATA_TYPE(RSMatrix4x4, "rs_matrix4x4") \ 42 ENUM_RS_OBJECT_DATA_TYPE(RSElement, "rs_element") \ 43 ENUM_RS_OBJECT_DATA_TYPE(RSType, "rs_type") \ 44 ENUM_RS_OBJECT_DATA_TYPE(RSAllocation, "rs_allocation") \ 45 ENUM_RS_OBJECT_DATA_TYPE(RSSampler, "rs_sampler") \ 46 ENUM_RS_OBJECT_DATA_TYPE(RSScript, "rs_script") \ 47 ENUM_RS_OBJECT_DATA_TYPE(RSMesh, "rs_mesh") \ 48 ENUM_RS_OBJECT_DATA_TYPE(RSProgramFragment, "rs_program_fragment") \ 49 ENUM_RS_OBJECT_DATA_TYPE(RSProgramVertex, "rs_program_vertex") \ 50 ENUM_RS_OBJECT_DATA_TYPE(RSProgramRaster, "rs_program_raster") \ 51 ENUM_RS_OBJECT_DATA_TYPE(RSProgramStore, "rs_program_store") \ 52 ENUM_RS_OBJECT_DATA_TYPE(RSFont, "rs_font") 53 54#define RS_DATA_KIND_ENUMS \ 55 ENUM_RS_DATA_KIND(User) \ 56 ENUM_RS_DATA_KIND(PixelL) \ 57 ENUM_RS_DATA_KIND(PixelA) \ 58 ENUM_RS_DATA_KIND(PixelLA) \ 59 ENUM_RS_DATA_KIND(PixelRGB) \ 60 ENUM_RS_DATA_KIND(PixelRGBA) 61 62enum { 63#define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) x, 64 PRIMITIVE_DATA_TYPE_ENUMS 65#undef ENUM_PRIMITIVE_DATA_TYPE 66#define ENUM_RS_OBJECT_DATA_TYPE(x, name) x, 67 RS_OBJECT_DATA_TYPE_ENUMS 68#undef ENUM_RS_OBJECT_DATA_TYPE 69}; 70 71enum { 72#define ENUM_RS_DATA_KIND(x) x, 73 RS_DATA_KIND_ENUMS 74#undef ENUM_RS_DATA_KIND 75}; 76 77class RSDataTypeSpec { 78 private: 79 const char *mTypeName; // e.g. Float32 80 // FIXME: better name 81 const char *mTypePragmaName; // e.g. float 82 size_t mBits; 83 84 protected: 85 bool mIsRSObject; 86 87 public: 88 RSDataTypeSpec(const char *TypeName, 89 const char *TypePragmaName, 90 size_t Bits) 91 : mTypeName(TypeName), 92 mTypePragmaName(TypePragmaName), 93 mBits(Bits), 94 mIsRSObject(false) { 95 return; 96 } 97 98 inline const char *getTypeName() const { return mTypeName; } 99 inline const char *getTypePragmaName() const { return mTypePragmaName; } 100 inline size_t getSizeInBit() const { return mBits; } 101 inline bool isRSObject() const { return mIsRSObject; } 102}; 103 104class RSObjectDataTypeSpec : public RSDataTypeSpec { 105 public: 106 RSObjectDataTypeSpec(const char *TypeName, 107 const char *TypePragmaName) 108 : RSDataTypeSpec(TypeName, TypePragmaName, 32 /* opaque pointer */) { 109 mIsRSObject = true; 110 return; 111 } 112}; 113 114///////////////////////////////////////////////////////////////////////////// 115 116// clang::BuiltinType::Kind -> RSDataTypeSpec 117class ClangBuiltinTypeMap { 118 const char *mBuiltinTypeKind; 119 const RSDataTypeSpec *mDataType; 120 121 public: 122 ClangBuiltinTypeMap(const char *BuiltinTypeKind, 123 const RSDataTypeSpec *DataType) 124 : mBuiltinTypeKind(BuiltinTypeKind), 125 mDataType(DataType) { 126 return; 127 } 128 129 inline const char *getBuiltinTypeKind() const { return mBuiltinTypeKind; } 130 inline const RSDataTypeSpec *getDataType() const { return mDataType; } 131}; 132 133///////////////////////////////////////////////////////////////////////////// 134 135class RSDataKindSpec { 136 private: 137 const char *mKindName; 138 139 public: 140 explicit RSDataKindSpec(const char *KindName) : mKindName(KindName) { 141 return; 142 } 143 144 inline const char *getKindName() const { return mKindName; } 145}; 146 147///////////////////////////////////////////////////////////////////////////// 148 149class RSDataElementSpec { 150 private: 151 const char *mElementName; 152 const RSDataKindSpec *mDataKind; 153 const RSDataTypeSpec *mDataType; 154 bool mIsNormal; 155 unsigned mVectorSize; 156 157 public: 158 RSDataElementSpec(const char *ElementName, 159 const RSDataKindSpec *DataKind, 160 const RSDataTypeSpec *DataType, 161 bool IsNormal, 162 unsigned VectorSize) 163 : mElementName(ElementName), 164 mDataKind(DataKind), 165 mDataType(DataType), 166 mIsNormal(IsNormal), 167 mVectorSize(VectorSize) { 168 return; 169 } 170 171 inline const char *getElementName() const { return mElementName; } 172 inline const RSDataKindSpec *getDataKind() const { return mDataKind; } 173 inline const RSDataTypeSpec *getDataType() const { return mDataType; } 174 inline bool isNormal() const { return mIsNormal; } 175 inline unsigned getVectorSize() const { return mVectorSize; } 176}; 177 178///////////////////////////////////////////////////////////////////////////// 179 180// -gen-rs-data-type-enums 181// 182// ENUM_RS_DATA_TYPE(type, cname, bits) 183// e.g., ENUM_RS_DATA_TYPE(Float32, "float", 256) 184static int GenRSDataTypeEnums(const RSDataTypeSpec *const DataTypes[], 185 unsigned NumDataTypes) { 186 for (unsigned i = 0; i < NumDataTypes; i++) 187 printf("ENUM_RS_DATA_TYPE(%s, \"%s\", %u)\n", 188 DataTypes[i]->getTypeName(), 189 DataTypes[i]->getTypePragmaName(), 190 DataTypes[i]->getSizeInBit()); 191 return 0; 192} 193 194// -gen-clang-builtin-cnames 195// 196// ENUM_SUPPORT_BUILTIN_TYPE(builtin_type, type, cname) 197// e.g., ENUM_SUPPORT_BUILTIN_TYPE(clang::BuiltinType::Float, Float32, "float") 198static int GenClangBuiltinEnum( 199 const ClangBuiltinTypeMap *const ClangBuilitinsMap[], 200 unsigned NumClangBuilitins) { 201 for (unsigned i = 0; i < NumClangBuilitins; i++) 202 printf("ENUM_SUPPORT_BUILTIN_TYPE(%s, %s, \"%s\")\n", 203 ClangBuilitinsMap[i]->getBuiltinTypeKind(), 204 ClangBuilitinsMap[i]->getDataType()->getTypeName(), 205 ClangBuilitinsMap[i]->getDataType()->getTypePragmaName()); 206 return 0; 207} 208 209// -gen-rs-object-type-enums 210// 211// ENUM_RS_OBJECT_TYPE(type, cname) 212// e.g., ENUM_RS_OBJECT_TYPE(RSMatrix2x2, "rs_matrix2x2") 213static int GenRSObjectTypeEnums(const RSDataTypeSpec *const DataTypes[], 214 unsigned NumDataTypes) { 215 for (unsigned i = 0; i < NumDataTypes; i++) 216 if (DataTypes[i]->isRSObject()) 217 printf("ENUM_RS_OBJECT_TYPE(%s, \"%s\")\n", 218 DataTypes[i]->getTypeName(), 219 DataTypes[i]->getTypePragmaName()); 220 return 0; 221} 222 223// -gen-rs-data-kind-enums 224// 225// ENUM_RS_DATA_KIND(kind) 226// e.g., ENUM_RS_DATA_KIND(PixelRGB) 227int GenRSDataKindEnums(const RSDataKindSpec *const DataKinds[], 228 unsigned NumDataKinds) { 229 for (unsigned i = 0; i < NumDataKinds; i++) 230 printf("ENUM_RS_DATA_KIND(%s)\n", DataKinds[i]->getKindName()); 231 return 0; 232} 233 234// -gen-rs-data-element-enums 235// 236// ENUM_RS_DATA_ELEMENT(name, dt, dk, normailized, vsize) 237// e.g., ENUM_RS_DATA_ELEMENT("rs_pixel_rgba", PixelRGB, Unsigned8, true, 4) 238int GenRSDataElementEnums(const RSDataElementSpec *const DataElements[], 239 unsigned NumDataElements) { 240 for (unsigned i = 0; i < NumDataElements; i++) 241 printf("ENUM_RS_DATA_ELEMENT(\"%s\", %s, %s, %s, %d)\n", 242 DataElements[i]->getElementName(), 243 DataElements[i]->getDataKind()->getKindName(), 244 DataElements[i]->getDataType()->getTypeName(), 245 ((DataElements[i]->isNormal()) ? "true" : "false"), 246 DataElements[i]->getVectorSize()); 247 return 0; 248} 249 250int main(int argc, char **argv) { 251 if (argc < 2) { 252 fprintf(stderr, "usage: %s [gen type]\n", argv[0]); 253 return 1; 254 } 255 256 RSDataTypeSpec *DataTypes[] = { 257#define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) \ 258 new RSDataTypeSpec(#x , name, bits), 259 PRIMITIVE_DATA_TYPE_ENUMS 260#undef ENUM_PRIMITIVE_DATA_TYPE 261#define ENUM_RS_OBJECT_DATA_TYPE(x, name) \ 262 new RSObjectDataTypeSpec(#x, name), 263 RS_OBJECT_DATA_TYPE_ENUMS 264#undef ENUM_RS_OBJECT_DATA_TYPE 265 }; 266 267 unsigned NumDataTypes = sizeof(DataTypes) / sizeof(DataTypes[0]); 268 ///////////////////////////////////////////////////////////////////////////// 269 270 ClangBuiltinTypeMap *ClangBuilitinsMap[] = { 271 new ClangBuiltinTypeMap("clang::BuiltinType::Bool", DataTypes[Boolean]), 272 new ClangBuiltinTypeMap("clang::BuiltinType::Char_U", DataTypes[Unsigned8]), 273 new ClangBuiltinTypeMap("clang::BuiltinType::UChar", DataTypes[Unsigned8]), 274 new ClangBuiltinTypeMap("clang::BuiltinType::Char16", DataTypes[Signed16]), 275 new ClangBuiltinTypeMap("clang::BuiltinType::Char32", DataTypes[Signed32]), 276 new ClangBuiltinTypeMap("clang::BuiltinType::UShort", DataTypes[Unsigned16]), 277 new ClangBuiltinTypeMap("clang::BuiltinType::UInt", DataTypes[Unsigned32]), 278 new ClangBuiltinTypeMap("clang::BuiltinType::ULong", DataTypes[Unsigned32]), 279 new ClangBuiltinTypeMap("clang::BuiltinType::ULongLong", DataTypes[Unsigned64]), 280 281 new ClangBuiltinTypeMap("clang::BuiltinType::Char_S", DataTypes[Signed8]), 282 new ClangBuiltinTypeMap("clang::BuiltinType::SChar", DataTypes[Signed8]), 283 new ClangBuiltinTypeMap("clang::BuiltinType::Short", DataTypes[Signed16]), 284 new ClangBuiltinTypeMap("clang::BuiltinType::Int", DataTypes[Signed32]), 285 new ClangBuiltinTypeMap("clang::BuiltinType::Long", DataTypes[Signed64]), 286 new ClangBuiltinTypeMap("clang::BuiltinType::LongLong", DataTypes[Signed64]), 287 288 new ClangBuiltinTypeMap("clang::BuiltinType::Float", DataTypes[Float32]), 289 new ClangBuiltinTypeMap("clang::BuiltinType::Double", DataTypes[Float64]), 290 }; 291 292 unsigned NumClangBuilitins = 293 sizeof(ClangBuilitinsMap) / sizeof(ClangBuilitinsMap[0]); 294 295 ///////////////////////////////////////////////////////////////////////////// 296 297 RSDataKindSpec *DataKinds[] = { 298#define ENUM_RS_DATA_KIND(x) \ 299 new RSDataKindSpec(#x), 300 RS_DATA_KIND_ENUMS 301#undef ENUM_RS_DATA_KIND 302 }; 303 304 unsigned NumDataKinds = sizeof(DataKinds) / sizeof(DataKinds[0]); 305 ///////////////////////////////////////////////////////////////////////////// 306 307 RSDataElementSpec *DataElements[] = { 308 new RSDataElementSpec("rs_pixel_l", 309 DataKinds[PixelL], 310 DataTypes[Unsigned8], 311 /* IsNormal = */true, /* VectorSize = */1), 312 new RSDataElementSpec("rs_pixel_a", 313 DataKinds[PixelA], 314 DataTypes[Unsigned8], 315 true, 1), 316 new RSDataElementSpec("rs_pixel_la", 317 DataKinds[PixelLA], 318 DataTypes[Unsigned8], 319 true, 2), 320 new RSDataElementSpec("rs_pixel_rgb", 321 DataKinds[PixelRGB], 322 DataTypes[Unsigned8], 323 true, 3), 324 new RSDataElementSpec("rs_pixel_rgba", 325 DataKinds[PixelRGB], 326 DataTypes[Unsigned8], 327 true, 4), 328 new RSDataElementSpec("rs_pixel_rgb565", 329 DataKinds[PixelRGB], 330 DataTypes[Unsigned8], 331 true, 3), 332 new RSDataElementSpec("rs_pixel_rgb5551", 333 DataKinds[PixelRGBA], 334 DataTypes[Unsigned8], 335 true, 4), 336 new RSDataElementSpec("rs_pixel_rgb4444", 337 DataKinds[PixelRGBA], 338 DataTypes[Unsigned8], 339 true, 4), 340 }; 341 342 unsigned NumDataElements = sizeof(DataElements) / sizeof(DataElements[0]); 343 ///////////////////////////////////////////////////////////////////////////// 344 int Result = 1; 345 346 if (::strcmp(argv[1], "-gen-rs-data-type-enums") == 0) 347 Result = GenRSDataTypeEnums(DataTypes, NumDataTypes); 348 else if (::strcmp(argv[1], "-gen-clang-builtin-enums") == 0) 349 Result = GenClangBuiltinEnum(ClangBuilitinsMap, NumClangBuilitins); 350 else if (::strcmp(argv[1], "-gen-rs-object-type-enums") == 0) 351 Result = GenRSObjectTypeEnums(DataTypes, NumDataTypes); 352 else if (::strcmp(argv[1], "-gen-rs-data-kind-enums") == 0) 353 Result = GenRSDataKindEnums(DataKinds, NumDataKinds); 354 else if (::strcmp(argv[1], "-gen-rs-data-element-enums") == 0) 355 Result = GenRSDataElementEnums(DataElements, NumDataElements); 356 else 357 fprintf(stderr, "%s: Unknown table generation type '%s'\n", 358 argv[0], argv[1]); 359 360 361 ///////////////////////////////////////////////////////////////////////////// 362 for (unsigned i = 0; i < NumDataTypes; i++) 363 delete DataTypes[i]; 364 for (unsigned i = 0; i < NumClangBuilitins; i++) 365 delete ClangBuilitinsMap[i]; 366 for (unsigned i = 0; i < NumDataKinds; i++) 367 delete DataKinds[i]; 368 for (unsigned i = 0; i < NumDataElements; i++) 369 delete DataElements[i]; 370 371 return Result; 372} 373