1 #ifndef MSP_GL_DATATYPE_H_
2 #define MSP_GL_DATATYPE_H_
4 #include <msp/linal/matrix.h>
5 #include <msp/linal/vector.h>
11 Identifies a data type.
13 The values are bitfields laid as follows:
15 __hm addd ccrr _bfg ssss ssss
16 ││ │ │ │ │ │││ └╴Size (bytes)
17 ││ │ │ │ │ ││└──────────╴Signed flag
18 ││ │ │ │ │ │└───────────╴Floating-point flag
19 ││ │ │ │ │ └────────────╴Boolean flag
20 ││ │ │ │ └───────────────╴Vector or matrix rows minus one
21 ││ │ │ └─────────────────╴Matrix columns minus one
22 ││ │ └────────────────────╴Image dimensions (4 = cube)
23 ││ └───────────────────────╴Image array flag
24 │└─────────────────────────╴Sampled image flag
25 └──────────────────────────╴Shadow sampler flag
27 This information is presented for internal documentation purposes only; it is
28 inadvisable for applications to rely on it.
35 UNSIGNED_BYTE = 0x001,
37 UNSIGNED_SHORT = 0x002,
57 FLOAT_MAT2x3 = 0x6318,
58 FLOAT_MAT3x2 = 0x9318,
59 FLOAT_MAT2x4 = 0x7320,
60 FLOAT_MAT4x2 = 0xD320,
61 FLOAT_MAT3x4 = 0xB330,
62 FLOAT_MAT4x3 = 0xE330,
67 DOUBLE_MAT2x3 = 0x6330,
68 DOUBLE_MAT3x2 = 0x7330,
69 DOUBLE_MAT2x4 = 0x7340,
70 DOUBLE_MAT4x2 = 0xD340,
71 DOUBLE_MAT3x4 = 0xB360,
72 DOUBLE_MAT4x3 = 0xE360,
78 IMAGE_1D_ARRAY = 0x90304,
79 IMAGE_2D_ARRAY = 0xA0304,
80 IMAGE_CUBE_ARRAY = 0xC0304,
81 SAMPLER_1D = 0x110304,
82 SAMPLER_2D = 0x120304,
83 SAMPLER_3D = 0x130304,
84 SAMPLER_CUBE = 0x140304,
85 SAMPLER_1D_ARRAY = 0x190304,
86 SAMPLER_2D_ARRAY = 0x1A0304,
87 SAMPLER_CUBE_ARRAY = 0x1C0304,
88 SAMPLER_1D_SHADOW = 0x310304,
89 SAMPLER_2D_SHADOW = 0x320304,
90 SAMPLER_CUBE_SHADOW = 0x340304,
91 SAMPLER_1D_ARRAY_SHADOW = 0x390304,
92 SAMPLER_2D_ARRAY_SHADOW = 0x3A0304,
93 SAMPLER_CUBE_ARRAY_SHADOW = 0x3C0304
96 inline std::size_t get_type_size(DataType t) { return t&0xFF; }
97 inline bool is_float(DataType t) { return t&0x200; }
98 inline bool is_matrix(DataType t) { return t&0xC000; }
99 inline bool is_vector(DataType t) { return !is_matrix(t) && (t&0x3000); }
100 inline bool is_image(DataType t) { return t&0x70000; }
102 inline DataType get_matrix_column_type(DataType t)
104 unsigned cols = ((t&0xC000)>>14)+1;
105 return static_cast<DataType>((t&~0xC0FF) | (get_type_size(t)/cols));
108 inline DataType get_element_type(DataType t)
110 unsigned elems = (((t&0xC000)>>14)+1)*(((t&0x3000)>>12)+1);
111 return static_cast<DataType>((t&~0xC0FF) | (get_type_size(t)/elems));
114 template<typename T> struct TypeTraits;
115 template<> struct TypeTraits<bool> { static const DataType type = BOOL; };
116 template<> struct TypeTraits<char> { static const DataType type = BYTE; };
117 template<> struct TypeTraits<unsigned char> { static const DataType type = UNSIGNED_BYTE; };
118 template<> struct TypeTraits<short> { static const DataType type = SHORT; };
119 template<> struct TypeTraits<unsigned short> { static const DataType type = UNSIGNED_SHORT; };
120 template<> struct TypeTraits<int> { static const DataType type = INT; };
121 template<> struct TypeTraits<unsigned> { static const DataType type = UNSIGNED_INT; };
122 template<> struct TypeTraits<float> { static const DataType type = FLOAT; };
123 template<> struct TypeTraits<double> { static const DataType type = DOUBLE; };
125 template<typename T, unsigned N>
126 struct TypeTraits<LinAl::Vector<T, N>>
128 static const DataType type = static_cast<DataType>((TypeTraits<T>::type&0xF00) | ((TypeTraits<T>::type&0xFF)*N) | ((N-1)<<12));
131 template<typename T, unsigned N, unsigned M>
132 struct TypeTraits<LinAl::Matrix<T, N, M>>
134 static const DataType type = static_cast<DataType>((TypeTraits<T>::type&0xF00) | ((TypeTraits<T>::type&0xFF)*N*M) | ((N-1)<<12) | ((M-1)<<14));
137 void require_type(DataType);
142 #include "datatype_backend.h"