/* * Copyright 2010, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_ // NOLINT #define _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_ #define RS_DATA_TYPE_CLASS_ENUMS \ ENUM_RS_DATA_TYPE_CLASS(Primitive) \ ENUM_RS_DATA_TYPE_CLASS(Pointer) \ ENUM_RS_DATA_TYPE_CLASS(Vector) \ ENUM_RS_DATA_TYPE_CLASS(Matrix) \ ENUM_RS_DATA_TYPE_CLASS(ConstantArray) \ ENUM_RS_DATA_TYPE_CLASS(Record) #define PRIMITIVE_DATA_TYPE_ENUMS \ ENUM_PRIMITIVE_DATA_TYPE(Float16, NULL, 128) \ ENUM_PRIMITIVE_DATA_TYPE(Float32, "float", 256) \ ENUM_PRIMITIVE_DATA_TYPE(Float64, "double", 512) \ ENUM_PRIMITIVE_DATA_TYPE(Signed8, "char", 64) \ ENUM_PRIMITIVE_DATA_TYPE(Signed16, "short", 128) \ ENUM_PRIMITIVE_DATA_TYPE(Signed32, "int", 256) \ ENUM_PRIMITIVE_DATA_TYPE(Signed64, "long", 512) \ ENUM_PRIMITIVE_DATA_TYPE(Unsigned8, "uchar", 64) \ ENUM_PRIMITIVE_DATA_TYPE(Unsigned16, "ushort", 128) \ ENUM_PRIMITIVE_DATA_TYPE(Unsigned32, "uint", 256) \ ENUM_PRIMITIVE_DATA_TYPE(Unsigned64, "ulong", 512) \ ENUM_PRIMITIVE_DATA_TYPE(Boolean, "bool", 8) \ ENUM_PRIMITIVE_DATA_TYPE(Unsigned565, "u565", 128) \ ENUM_PRIMITIVE_DATA_TYPE(Unsigned5551, "u5551", 128) \ ENUM_PRIMITIVE_DATA_TYPE(Unsigned4444, "u4444", 128) \ PRIMITIVE_DATA_TYPE_RANGE(Float16, Unsigned4444) #define RS_MATRIX_DATA_TYPE_ENUMS \ ENUM_RS_MATRIX_DATA_TYPE(RSMatrix2x2, "rs_matrix2x2", 2) \ ENUM_RS_MATRIX_DATA_TYPE(RSMatrix3x3, "rs_matrix3x3", 3) \ ENUM_RS_MATRIX_DATA_TYPE(RSMatrix4x4, "rs_matrix4x4", 4) \ RS_MATRIX_DATA_TYPE_RANGE(RSMatrix2x2, RSMatrix4x4) #define RS_OBJECT_DATA_TYPE_ENUMS \ ENUM_RS_OBJECT_DATA_TYPE(RSElement, "rs_element") \ ENUM_RS_OBJECT_DATA_TYPE(RSType, "rs_type") \ ENUM_RS_OBJECT_DATA_TYPE(RSAllocation, "rs_allocation") \ ENUM_RS_OBJECT_DATA_TYPE(RSSampler, "rs_sampler") \ ENUM_RS_OBJECT_DATA_TYPE(RSScript, "rs_script") \ ENUM_RS_OBJECT_DATA_TYPE(RSMesh, "rs_mesh") \ ENUM_RS_OBJECT_DATA_TYPE(RSProgramFragment, "rs_program_fragment") \ ENUM_RS_OBJECT_DATA_TYPE(RSProgramVertex, "rs_program_vertex") \ ENUM_RS_OBJECT_DATA_TYPE(RSProgramRaster, "rs_program_raster") \ ENUM_RS_OBJECT_DATA_TYPE(RSProgramStore, "rs_program_store") \ ENUM_RS_OBJECT_DATA_TYPE(RSFont, "rs_font") \ RS_OBJECT_DATA_TYPE_RANGE(RSElement, RSFont) #define RS_DATA_KIND_ENUMS \ ENUM_RS_DATA_KIND(User) \ ENUM_RS_DATA_KIND(PixelL) \ ENUM_RS_DATA_KIND(PixelA) \ ENUM_RS_DATA_KIND(PixelLA) \ ENUM_RS_DATA_KIND(PixelRGB) \ ENUM_RS_DATA_KIND(PixelRGBA) enum RSTypeClass { #define ENUM_RS_DATA_TYPE_CLASS(x) RS_TC_ ## x, RS_DATA_TYPE_CLASS_ENUMS #undef ENUM_RS_DATA_TYPE_CLASS RS_TC_Max }; enum RSDataType { #define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) RS_DT_ ## x, #define PRIMITIVE_DATA_TYPE_RANGE(x, y) \ RS_DT_FirstPrimitiveType = RS_DT_ ## x, \ RS_DT_LastPrimitiveType = RS_DT_ ## y, PRIMITIVE_DATA_TYPE_ENUMS #undef ENUM_PRIMITIVE_DATA_TYPE #undef PRIMITIVE_DATA_TYPE_RANGE #define ENUM_RS_MATRIX_DATA_TYPE(x, name, dim) RS_DT_ ## x, #define RS_MATRIX_DATA_TYPE_RANGE(x, y) \ RS_DT_FirstMatrixType = RS_DT_ ## x, \ RS_DT_LastMatrixType = RS_DT_ ## y, RS_MATRIX_DATA_TYPE_ENUMS #undef ENUM_RS_MATRIX_DATA_TYPE #undef RS_MATRIX_DATA_TYPE_RANGE #define ENUM_RS_OBJECT_DATA_TYPE(x, name) RS_DT_ ## x, #define RS_OBJECT_DATA_TYPE_RANGE(x, y) \ RS_DT_FirstRSObjectType = RS_DT_ ## x, \ RS_DT_LastRSObjectType = RS_DT_ ## y, RS_OBJECT_DATA_TYPE_ENUMS #undef ENUM_RS_OBJECT_DATA_TYPE #undef RS_OBJECT_DATA_TYPE_RANGE RS_DT_USER_DEFINED }; enum RSDataKind { #define ENUM_RS_DATA_KIND(x) RS_DK_ ## x, RS_DATA_KIND_ENUMS #undef ENUM_RS_DATA_KIND RS_DK_Max }; // Forward declaration union RSType; // NOTE: Current design need to keep struct RSTypeBase as a 4-byte integer for // efficient decoding process (see DecodeTypeMetadata). struct RSTypeBase { /* enum RSTypeClass tc; */ // tc is encoded in b[0]. union { // FIXME: handle big-endianess case unsigned bits; // NOTE: Little-endian is assumed. unsigned char b[4]; }; }; struct RSPrimitiveType { struct RSTypeBase base; /* enum RSDataType dt; */ // dt is encoded in base.b[1] }; struct RSPointerType { struct RSTypeBase base; const union RSType *pointee; }; struct RSVectorType { struct RSPrimitiveType base; // base type of vec must be in primitive type /* unsigned char vsize; */ // vsize is encoded in base.b[2] }; // RSMatrixType is actually a specialize class of RSPrimitiveType whose value of // dt (data type) can only be RS_DT_RSMatrix2x2, RS_DT_RSMatrix3x3 and // RS_DT_RSMatrix4x4. struct RSMatrixType { struct RSTypeBase base; }; struct RSConstantArrayType { struct RSTypeBase base; const union RSType *element_type; /* unsigned esize; */ // esize is encoded in base.bits{8-31} in little-endian way. This implicates // the number of elements in any constant array type should never exceed 2^24. }; struct RSRecordField { const char *name; // field name const union RSType *type; enum RSDataKind dk; }; struct RSRecordType { struct RSTypeBase base; const char *name; // type name /* unsigned num_fields; */ // num_fields is encoded in base.bits{16-31} in little-endian way. This // implicates the number of fields defined in any record type should never // exceed 2^16. struct RSRecordField field[1]; }; union RSType { struct RSTypeBase base; struct RSPrimitiveType prim; struct RSPointerType pointer; struct RSVectorType vec; struct RSConstantArrayType ca; struct RSRecordType rec; }; #define RS_GET_TYPE_BASE(R) (&((R)->base)) #define RS_CAST_TO_PRIMITIVE_TYPE(R) (&((R)->prim)) #define RS_CAST_TO_POINTER_TYPE(R) (&((R)->pointer)) #define RS_CAST_TO_VECTOR_TYPE(R) (&((R)->vec)) #define RS_CAST_TO_CONSTANT_ARRAY_TYPE(R) (&((R)->ca)) #define RS_CAST_TO_RECORD_TYPE(R) (&((R)->rec)) // RSType #define RS_TYPE_GET_CLASS(R) RS_GET_TYPE_BASE(R)->b[0] #define RS_TYPE_SET_CLASS(R, V) RS_TYPE_GET_CLASS(R) = (V) // RSPrimitiveType #define RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) \ RS_CAST_TO_PRIMITIVE_TYPE(R)->base.b[1] #define RS_PRIMITIVE_TYPE_SET_DATA_TYPE(R, V) \ RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) = (V) // RSPointerType #define RS_POINTER_TYPE_GET_POINTEE_TYPE(R) \ RS_CAST_TO_POINTER_TYPE(R)->pointee #define RS_POINTER_TYPE_SET_POINTEE_TYPE(R, V) \ RS_POINTER_TYPE_GET_POINTEE_TYPE(R) = (V) // RSVectorType #define RS_VECTOR_TYPE_GET_ELEMENT_TYPE(R) \ RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) #define RS_VECTOR_TYPE_SET_ELEMENT_TYPE(R, V) \ RS_VECTOR_TYPE_GET_ELEMENT_TYPE(R) = (V) #define RS_VECTOR_TYPE_GET_VECTOR_SIZE(R) \ RS_CAST_TO_VECTOR_TYPE(R)->base.base.b[2] #define RS_VECTOR_TYPE_SET_VECTOR_SIZE(R, V) \ RS_VECTOR_TYPE_GET_VECTOR_SIZE(R) = (V) // RSMatrixType #define RS_MATRIX_TYPE_GET_DATA_TYPE(R) RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) #define RS_MATRIX_TYPE_SET_DATA_TYPE(R, V) \ RS_MATRIX_TYPE_GET_DATA_TYPE(R) = (V) // RSConstantArrayType #define RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(R) \ RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->element_type #define RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_TYPE(R, V) \ RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(R) = (V) #define RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_SIZE(R) \ (RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits & 0x00ffffff) #define RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_SIZE(R, V) \ RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits = \ ((RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits & 0x000000ff) | \ ((V & 0xffffff) << 8)) // RSRecordType #define RS_RECORD_TYPE_GET_NAME(R) RS_CAST_TO_RECORD_TYPE(R)->name #define RS_RECORD_TYPE_SET_NAME(R, V) RS_RECORD_TYPE_GET_NAME(R) = (V) #define RS_RECORD_TYPE_GET_NUM_FIELDS(R) \ ((RS_CAST_TO_RECORD_TYPE(R)->base.bits & 0xffff0000) >> 16) #define RS_RECORD_TYPE_SET_NUM_FIELDS(R, V) \ RS_CAST_TO_RECORD_TYPE(R)->base.bits = \ ((RS_CAST_TO_RECORD_TYPE(R)->base.bits & 0x0000ffff) | ((V & 0xffff) << 16)) #define RS_RECORD_TYPE_GET_FIELD_NAME(R, I) \ RS_CAST_TO_RECORD_TYPE(R)->field[(I)].name #define RS_RECORD_TYPE_SET_FIELD_NAME(R, I, V) \ RS_RECORD_TYPE_GET_FIELD_NAME(R, I) = (V) #define RS_RECORD_TYPE_GET_FIELD_TYPE(R, I) \ RS_CAST_TO_RECORD_TYPE(R)->field[(I)].type #define RS_RECORD_TYPE_SET_FIELD_TYPE(R, I, V) \ RS_RECORD_TYPE_GET_FIELD_TYPE(R, I) = (V) #define RS_RECORD_TYPE_GET_FIELD_DATA_KIND(R, I) \ RS_CAST_TO_RECORD_TYPE(R)->field[(I)].dk #define RS_RECORD_TYPE_SET_FIELD_DATA_KIND(R, I, V) \ RS_RECORD_TYPE_GET_FIELD_DATA_KIND(R, I) = (V) #endif // _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_ NOLINT