slang_rs_type_spec.h revision db6dfdfcb7e8183f1c796475e5098ee4be80b5b8
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(RSPath, "rs_path")                         \
60    ENUM_RS_OBJECT_DATA_TYPE(RSProgramFragment, "rs_program_fragment")  \
61    ENUM_RS_OBJECT_DATA_TYPE(RSProgramVertex, "rs_program_vertex")      \
62    ENUM_RS_OBJECT_DATA_TYPE(RSProgramRaster, "rs_program_raster")      \
63    ENUM_RS_OBJECT_DATA_TYPE(RSProgramStore, "rs_program_store")        \
64    ENUM_RS_OBJECT_DATA_TYPE(RSFont, "rs_font")                         \
65    RS_OBJECT_DATA_TYPE_RANGE(RSElement, RSFont)
66
67#define RS_DATA_KIND_ENUMS        \
68    ENUM_RS_DATA_KIND(User)       \
69    ENUM_RS_DATA_KIND(PixelL)     \
70    ENUM_RS_DATA_KIND(PixelA)     \
71    ENUM_RS_DATA_KIND(PixelLA)    \
72    ENUM_RS_DATA_KIND(PixelRGB)   \
73    ENUM_RS_DATA_KIND(PixelRGBA)
74
75enum RSTypeClass {
76#define ENUM_RS_DATA_TYPE_CLASS(x)  RS_TC_ ## x,
77  RS_DATA_TYPE_CLASS_ENUMS
78#undef ENUM_RS_DATA_TYPE_CLASS
79  RS_TC_Max
80};
81
82enum RSDataType {
83#define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) RS_DT_ ## x,
84#define PRIMITIVE_DATA_TYPE_RANGE(x, y) \
85    RS_DT_FirstPrimitiveType = RS_DT_ ## x, \
86    RS_DT_LastPrimitiveType = RS_DT_ ## y,
87  PRIMITIVE_DATA_TYPE_ENUMS
88#undef ENUM_PRIMITIVE_DATA_TYPE
89#undef PRIMITIVE_DATA_TYPE_RANGE
90
91#define ENUM_RS_MATRIX_DATA_TYPE(x, name, dim) RS_DT_ ## x,
92#define RS_MATRIX_DATA_TYPE_RANGE(x, y) \
93      RS_DT_FirstMatrixType = RS_DT_ ## x,  \
94      RS_DT_LastMatrixType = RS_DT_ ## y,
95  RS_MATRIX_DATA_TYPE_ENUMS
96#undef ENUM_RS_MATRIX_DATA_TYPE
97#undef RS_MATRIX_DATA_TYPE_RANGE
98
99#define ENUM_RS_OBJECT_DATA_TYPE(x, name) RS_DT_ ## x,
100#define RS_OBJECT_DATA_TYPE_RANGE(x, y) \
101    RS_DT_FirstRSObjectType = RS_DT_ ## x,  \
102    RS_DT_LastRSObjectType = RS_DT_ ## y,
103  RS_OBJECT_DATA_TYPE_ENUMS
104#undef ENUM_RS_OBJECT_DATA_TYPE
105#undef RS_OBJECT_DATA_TYPE_RANGE
106
107  RS_DT_USER_DEFINED
108};
109
110enum RSDataKind {
111#define ENUM_RS_DATA_KIND(x) RS_DK_ ## x,
112  RS_DATA_KIND_ENUMS
113#undef ENUM_RS_DATA_KIND
114  RS_DK_Max
115};
116
117// Forward declaration
118union RSType;
119
120// NOTE: Current design need to keep struct RSTypeBase as a 4-byte integer for
121//       efficient decoding process (see DecodeTypeMetadata).
122struct RSTypeBase {
123  /* enum RSTypeClass tc; */
124  // tc is encoded in b[0].
125  union {
126    // FIXME: handle big-endianess case
127    unsigned bits;  // NOTE: Little-endian is assumed.
128    unsigned char b[4];
129  };
130};
131
132struct RSPrimitiveType {
133  struct RSTypeBase base;
134  /* enum RSDataType dt; */
135  // dt is encoded in base.b[1]
136};
137
138struct RSPointerType {
139  struct RSTypeBase base;
140  const union RSType *pointee;
141};
142
143struct RSVectorType {
144  struct RSPrimitiveType base;  // base type of vec must be in primitive type
145  /* unsigned char vsize; */
146  // vsize is encoded in base.b[2]
147};
148
149// RSMatrixType is actually a specialize class of RSPrimitiveType whose value of
150// dt (data type) can only be RS_DT_RSMatrix2x2, RS_DT_RSMatrix3x3 and
151// RS_DT_RSMatrix4x4.
152struct RSMatrixType {
153  struct RSTypeBase base;
154};
155
156struct RSConstantArrayType {
157  struct RSTypeBase base;
158  const union RSType *element_type;
159  /* unsigned esize; */
160  // esize is encoded in base.bits{8-31} in little-endian way. This implicates
161  // the number of elements in any constant array type should never exceed 2^24.
162};
163
164struct RSRecordField {
165  const char *name;  // field name
166  const union RSType *type;
167  enum RSDataKind dk;
168};
169
170struct RSRecordType {
171  struct RSTypeBase base;
172  const char *name;  // type name
173  /* unsigned num_fields; */
174  // num_fields is encoded in base.bits{16-31} in little-endian way. This
175  // implicates the number of fields defined in any record type should never
176  // exceed 2^16.
177
178  struct RSRecordField field[1];
179};
180
181union RSType {
182  struct RSTypeBase base;
183  struct RSPrimitiveType prim;
184  struct RSPointerType pointer;
185  struct RSVectorType vec;
186  struct RSConstantArrayType ca;
187  struct RSRecordType rec;
188};
189
190#define RS_GET_TYPE_BASE(R)               (&((R)->base))
191#define RS_CAST_TO_PRIMITIVE_TYPE(R)      (&((R)->prim))
192#define RS_CAST_TO_POINTER_TYPE(R)        (&((R)->pointer))
193#define RS_CAST_TO_VECTOR_TYPE(R)         (&((R)->vec))
194#define RS_CAST_TO_CONSTANT_ARRAY_TYPE(R) (&((R)->ca))
195#define RS_CAST_TO_RECORD_TYPE(R)         (&((R)->rec))
196
197// RSType
198#define RS_TYPE_GET_CLASS(R)  RS_GET_TYPE_BASE(R)->b[0]
199#define RS_TYPE_SET_CLASS(R, V) RS_TYPE_GET_CLASS(R) = (V)
200
201// RSPrimitiveType
202#define RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R)  \
203    RS_CAST_TO_PRIMITIVE_TYPE(R)->base.b[1]
204#define RS_PRIMITIVE_TYPE_SET_DATA_TYPE(R, V) \
205    RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) = (V)
206
207// RSPointerType
208#define RS_POINTER_TYPE_GET_POINTEE_TYPE(R) \
209    RS_CAST_TO_POINTER_TYPE(R)->pointee
210#define RS_POINTER_TYPE_SET_POINTEE_TYPE(R, V) \
211    RS_POINTER_TYPE_GET_POINTEE_TYPE(R) = (V)
212
213// RSVectorType
214#define RS_VECTOR_TYPE_GET_ELEMENT_TYPE(R) \
215    RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R)
216#define RS_VECTOR_TYPE_SET_ELEMENT_TYPE(R, V) \
217    RS_VECTOR_TYPE_GET_ELEMENT_TYPE(R) = (V)
218
219#define RS_VECTOR_TYPE_GET_VECTOR_SIZE(R) \
220    RS_CAST_TO_VECTOR_TYPE(R)->base.base.b[2]
221#define RS_VECTOR_TYPE_SET_VECTOR_SIZE(R, V) \
222    RS_VECTOR_TYPE_GET_VECTOR_SIZE(R) = (V)
223
224// RSMatrixType
225#define RS_MATRIX_TYPE_GET_DATA_TYPE(R) RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R)
226#define RS_MATRIX_TYPE_SET_DATA_TYPE(R, V)  \
227    RS_MATRIX_TYPE_GET_DATA_TYPE(R) = (V)
228
229// RSConstantArrayType
230#define RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(R) \
231    RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->element_type
232#define RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_TYPE(R, V) \
233    RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(R) = (V)
234
235#define RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_SIZE(R)  \
236    (RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits & 0x00ffffff)
237#define RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_SIZE(R, V) \
238    RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits =  \
239    ((RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits & 0x000000ff) |  \
240     ((V & 0xffffff) << 8))
241
242// RSRecordType
243#define RS_RECORD_TYPE_GET_NAME(R)  RS_CAST_TO_RECORD_TYPE(R)->name
244#define RS_RECORD_TYPE_SET_NAME(R, V) RS_RECORD_TYPE_GET_NAME(R) = (V)
245
246#define RS_RECORD_TYPE_GET_NUM_FIELDS(R)  \
247    ((RS_CAST_TO_RECORD_TYPE(R)->base.bits & 0xffff0000) >> 16)
248#define RS_RECORD_TYPE_SET_NUM_FIELDS(R, V) \
249    RS_CAST_TO_RECORD_TYPE(R)->base.bits =  \
250    ((RS_CAST_TO_RECORD_TYPE(R)->base.bits & 0x0000ffff) | ((V & 0xffff) << 16))
251
252#define RS_RECORD_TYPE_GET_FIELD_NAME(R, I) \
253    RS_CAST_TO_RECORD_TYPE(R)->field[(I)].name
254#define RS_RECORD_TYPE_SET_FIELD_NAME(R, I, V) \
255    RS_RECORD_TYPE_GET_FIELD_NAME(R, I) = (V)
256
257#define RS_RECORD_TYPE_GET_FIELD_TYPE(R, I) \
258    RS_CAST_TO_RECORD_TYPE(R)->field[(I)].type
259#define RS_RECORD_TYPE_SET_FIELD_TYPE(R, I, V) \
260    RS_RECORD_TYPE_GET_FIELD_TYPE(R, I) = (V)
261
262#define RS_RECORD_TYPE_GET_FIELD_DATA_KIND(R, I)  \
263    RS_CAST_TO_RECORD_TYPE(R)->field[(I)].dk
264#define RS_RECORD_TYPE_SET_FIELD_DATA_KIND(R, I, V) \
265    RS_RECORD_TYPE_GET_FIELD_DATA_KIND(R, I) = (V)
266
267#endif  // _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_  NOLINT
268