10307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang/*
20307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * Copyright 2010, The Android Open Source Project
30307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang *
40307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
50307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * you may not use this file except in compliance with the License.
60307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * You may obtain a copy of the License at
70307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang *
80307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
90307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang *
100307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * Unless required by applicable law or agreed to in writing, software
110307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
120307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * See the License for the specific language governing permissions and
140307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang * limitations under the License.
150307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang */
160307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_  // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_
190307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
200307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_DATA_TYPE_CLASS_ENUMS            \
210307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_DATA_TYPE_CLASS(Primitive)      \
220307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_DATA_TYPE_CLASS(Pointer)        \
230307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_DATA_TYPE_CLASS(Vector)         \
240307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_DATA_TYPE_CLASS(Matrix)         \
250307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_DATA_TYPE_CLASS(ConstantArray)  \
260307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_DATA_TYPE_CLASS(Record)
270307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
280307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define PRIMITIVE_DATA_TYPE_ENUMS                         \
291f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Float16, NULL, 16)           \
301f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Float32, "float", 32)        \
311f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Float64, "double", 64)       \
321f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Signed8, "char", 8)          \
331f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Signed16, "short", 16)       \
341f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Signed32, "int", 32)         \
351f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Signed64, "long", 64)        \
361f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Unsigned8, "uchar", 8)       \
371f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Unsigned16, "ushort", 16)    \
381f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Unsigned32, "uint", 32)      \
391f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Unsigned64, "ulong", 64)     \
400307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_PRIMITIVE_DATA_TYPE(Boolean, "bool", 8)          \
411f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Unsigned565, "u565", 16)     \
421f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Unsigned5551, "u5551", 16)   \
431f6c331d622ac645ab68a016aa4c577998547373Stephen Hines    ENUM_PRIMITIVE_DATA_TYPE(Unsigned4444, "u4444", 16)   \
44b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    PRIMITIVE_DATA_TYPE_RANGE(Float16, Unsigned4444)
45b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
46b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define RS_MATRIX_DATA_TYPE_ENUMS                             \
47b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    ENUM_RS_MATRIX_DATA_TYPE(RSMatrix2x2, "rs_matrix2x2", 2)  \
48b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    ENUM_RS_MATRIX_DATA_TYPE(RSMatrix3x3, "rs_matrix3x3", 3)  \
49b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    ENUM_RS_MATRIX_DATA_TYPE(RSMatrix4x4, "rs_matrix4x4", 4)  \
50b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    RS_MATRIX_DATA_TYPE_RANGE(RSMatrix2x2, RSMatrix4x4)
510307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
520307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_OBJECT_DATA_TYPE_ENUMS                                       \
530307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSElement, "rs_element")                   \
540307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSType, "rs_type")                         \
550307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSAllocation, "rs_allocation")             \
560307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSSampler, "rs_sampler")                   \
570307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSScript, "rs_script")                     \
580307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSMesh, "rs_mesh")                         \
59db6dfdfcb7e8183f1c796475e5098ee4be80b5b8Jason Sams    ENUM_RS_OBJECT_DATA_TYPE(RSPath, "rs_path")                         \
600307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSProgramFragment, "rs_program_fragment")  \
610307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSProgramVertex, "rs_program_vertex")      \
620307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSProgramRaster, "rs_program_raster")      \
630307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSProgramStore, "rs_program_store")        \
64b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    ENUM_RS_OBJECT_DATA_TYPE(RSFont, "rs_font")                         \
65b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    RS_OBJECT_DATA_TYPE_RANGE(RSElement, RSFont)
660307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
670307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changenum RSTypeClass {
680307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define ENUM_RS_DATA_TYPE_CLASS(x)  RS_TC_ ## x,
690307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  RS_DATA_TYPE_CLASS_ENUMS
700307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#undef ENUM_RS_DATA_TYPE_CLASS
710307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  RS_TC_Max
720307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
730307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
740307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changenum RSDataType {
750307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define ENUM_PRIMITIVE_DATA_TYPE(x, name, bits) RS_DT_ ## x,
76b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define PRIMITIVE_DATA_TYPE_RANGE(x, y) \
77b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    RS_DT_FirstPrimitiveType = RS_DT_ ## x, \
78b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    RS_DT_LastPrimitiveType = RS_DT_ ## y,
790307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  PRIMITIVE_DATA_TYPE_ENUMS
800307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#undef ENUM_PRIMITIVE_DATA_TYPE
81b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef PRIMITIVE_DATA_TYPE_RANGE
82b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
83b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define ENUM_RS_MATRIX_DATA_TYPE(x, name, dim) RS_DT_ ## x,
84b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define RS_MATRIX_DATA_TYPE_RANGE(x, y) \
85b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang      RS_DT_FirstMatrixType = RS_DT_ ## x,  \
86b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang      RS_DT_LastMatrixType = RS_DT_ ## y,
87b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  RS_MATRIX_DATA_TYPE_ENUMS
88b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef ENUM_RS_MATRIX_DATA_TYPE
89b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef RS_MATRIX_DATA_TYPE_RANGE
90b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
91b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define ENUM_RS_OBJECT_DATA_TYPE(x, name) RS_DT_ ## x,
92b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#define RS_OBJECT_DATA_TYPE_RANGE(x, y) \
93b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    RS_DT_FirstRSObjectType = RS_DT_ ## x,  \
94b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang    RS_DT_LastRSObjectType = RS_DT_ ## y,
95b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang  RS_OBJECT_DATA_TYPE_ENUMS
960307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#undef ENUM_RS_OBJECT_DATA_TYPE
97b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang#undef RS_OBJECT_DATA_TYPE_RANGE
98b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang
990307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  RS_DT_USER_DEFINED
1000307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1010307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1020307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// Forward declaration
1030307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changunion RSType;
1040307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1050307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// NOTE: Current design need to keep struct RSTypeBase as a 4-byte integer for
1060307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang//       efficient decoding process (see DecodeTypeMetadata).
1070307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changstruct RSTypeBase {
1080307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  /* enum RSTypeClass tc; */
1090307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  // tc is encoded in b[0].
1100307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  union {
1110307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    // FIXME: handle big-endianess case
1120307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    unsigned bits;  // NOTE: Little-endian is assumed.
1130307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    unsigned char b[4];
1140307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  };
1150307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1160307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1170307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changstruct RSPrimitiveType {
1180307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSTypeBase base;
1190307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  /* enum RSDataType dt; */
1200307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  // dt is encoded in base.b[1]
1210307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1220307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1230307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changstruct RSPointerType {
1240307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSTypeBase base;
1250307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  const union RSType *pointee;
1260307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1270307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1280307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changstruct RSVectorType {
1290307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSPrimitiveType base;  // base type of vec must be in primitive type
1300307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  /* unsigned char vsize; */
1310307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  // vsize is encoded in base.b[2]
1320307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1330307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
134a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang// RSMatrixType is actually a specialize class of RSPrimitiveType whose value of
135a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang// dt (data type) can only be RS_DT_RSMatrix2x2, RS_DT_RSMatrix3x3 and
136a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang// RS_DT_RSMatrix4x4.
1370307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changstruct RSMatrixType {
1380307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSTypeBase base;
1390307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1400307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1410307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changstruct RSConstantArrayType {
1420307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSTypeBase base;
1430307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  const union RSType *element_type;
1440307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  /* unsigned esize; */
1450307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  // esize is encoded in base.bits{8-31} in little-endian way. This implicates
1460307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  // the number of elements in any constant array type should never exceed 2^24.
1470307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1480307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1490307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changstruct RSRecordField {
150e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines  const char *name;  // field name
1510307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  const union RSType *type;
1520307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1530307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1540307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changstruct RSRecordType {
1550307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSTypeBase base;
1560307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  const char *name;  // type name
1570307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  /* unsigned num_fields; */
1580307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  // num_fields is encoded in base.bits{16-31} in little-endian way. This
1590307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  // implicates the number of fields defined in any record type should never
1600307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  // exceed 2^16.
1610307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1620307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSRecordField field[1];
1630307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1640307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1650307eaa71dc1d05582347cacd9209ac1e6100102Zonr Changunion RSType {
1660307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSTypeBase base;
1670307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSPrimitiveType prim;
1680307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSPointerType pointer;
1690307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSVectorType vec;
1700307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSConstantArrayType ca;
1710307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang  struct RSRecordType rec;
1720307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang};
1730307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1740307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_GET_TYPE_BASE(R)               (&((R)->base))
1750307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CAST_TO_PRIMITIVE_TYPE(R)      (&((R)->prim))
1760307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CAST_TO_POINTER_TYPE(R)        (&((R)->pointer))
1770307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CAST_TO_VECTOR_TYPE(R)         (&((R)->vec))
1780307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CAST_TO_CONSTANT_ARRAY_TYPE(R) (&((R)->ca))
1790307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CAST_TO_RECORD_TYPE(R)         (&((R)->rec))
1800307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1810307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// RSType
1820307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_TYPE_GET_CLASS(R)  RS_GET_TYPE_BASE(R)->b[0]
1830307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_TYPE_SET_CLASS(R, V) RS_TYPE_GET_CLASS(R) = (V)
1840307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1850307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// RSPrimitiveType
1860307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R)  \
1870307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CAST_TO_PRIMITIVE_TYPE(R)->base.b[1]
1880307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_PRIMITIVE_TYPE_SET_DATA_TYPE(R, V) \
1890307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R) = (V)
1900307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1910307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// RSPointerType
1920307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_POINTER_TYPE_GET_POINTEE_TYPE(R) \
1930307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CAST_TO_POINTER_TYPE(R)->pointee
1940307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_POINTER_TYPE_SET_POINTEE_TYPE(R, V) \
1950307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_POINTER_TYPE_GET_POINTEE_TYPE(R) = (V)
1960307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
1970307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// RSVectorType
1980307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_VECTOR_TYPE_GET_ELEMENT_TYPE(R) \
1990307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R)
2000307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_VECTOR_TYPE_SET_ELEMENT_TYPE(R, V) \
2010307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_VECTOR_TYPE_GET_ELEMENT_TYPE(R) = (V)
2020307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
2030307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_VECTOR_TYPE_GET_VECTOR_SIZE(R) \
2040307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CAST_TO_VECTOR_TYPE(R)->base.base.b[2]
2050307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_VECTOR_TYPE_SET_VECTOR_SIZE(R, V) \
2060307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_VECTOR_TYPE_GET_VECTOR_SIZE(R) = (V)
2070307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
2080307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// RSMatrixType
209a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang#define RS_MATRIX_TYPE_GET_DATA_TYPE(R) RS_PRIMITIVE_TYPE_GET_DATA_TYPE(R)
210a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang#define RS_MATRIX_TYPE_SET_DATA_TYPE(R, V)  \
211a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang    RS_MATRIX_TYPE_GET_DATA_TYPE(R) = (V)
2120307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
2130307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// RSConstantArrayType
2140307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(R) \
2150307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->element_type
2160307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_TYPE(R, V) \
2170307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_TYPE(R) = (V)
2180307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
2190307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CONSTANT_ARRAY_TYPE_GET_ELEMENT_SIZE(R)  \
2200307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    (RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits & 0x00ffffff)
2210307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_CONSTANT_ARRAY_TYPE_SET_ELEMENT_SIZE(R, V) \
2220307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits =  \
2230307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ((RS_CAST_TO_CONSTANT_ARRAY_TYPE(R)->base.bits & 0x000000ff) |  \
2240307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang     ((V & 0xffffff) << 8))
2250307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
2260307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang// RSRecordType
2270307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_RECORD_TYPE_GET_NAME(R)  RS_CAST_TO_RECORD_TYPE(R)->name
2280307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_RECORD_TYPE_SET_NAME(R, V) RS_RECORD_TYPE_GET_NAME(R) = (V)
2290307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
2300307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_RECORD_TYPE_GET_NUM_FIELDS(R)  \
2310307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ((RS_CAST_TO_RECORD_TYPE(R)->base.bits & 0xffff0000) >> 16)
2320307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_RECORD_TYPE_SET_NUM_FIELDS(R, V) \
2330307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CAST_TO_RECORD_TYPE(R)->base.bits =  \
2340307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    ((RS_CAST_TO_RECORD_TYPE(R)->base.bits & 0x0000ffff) | ((V & 0xffff) << 16))
2350307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
2360307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_RECORD_TYPE_GET_FIELD_NAME(R, I) \
2370307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CAST_TO_RECORD_TYPE(R)->field[(I)].name
2380307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_RECORD_TYPE_SET_FIELD_NAME(R, I, V) \
2390307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_RECORD_TYPE_GET_FIELD_NAME(R, I) = (V)
2400307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
2410307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_RECORD_TYPE_GET_FIELD_TYPE(R, I) \
2420307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_CAST_TO_RECORD_TYPE(R)->field[(I)].type
2430307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang#define RS_RECORD_TYPE_SET_FIELD_TYPE(R, I, V) \
2440307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang    RS_RECORD_TYPE_GET_FIELD_TYPE(R, I) = (V)
2450307eaa71dc1d05582347cacd9209ac1e6100102Zonr Chang
246e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _COMPILE_SLANG_SLANG_RS_TYPE_SPEC_H_  NOLINT
247