#define MSP_GL_DATATYPE_H_
#include "gl.h"
-#include <msp/gl/extensions/nv_half_float.h>
namespace Msp {
namespace GL {
+/**
+Identifies a data type. The values are bitfields laid as follows:
+
+__ds addd ccrr _bfg ssss ssss
+ ││ │ │ │ │ │││ └╴Size (bytes)
+ ││ │ │ │ │ ││└──────────╴Signed flag
+ ││ │ │ │ │ │└───────────╴Floating-point flag
+ ││ │ │ │ │ └────────────╴Boolean flag
+ ││ │ │ │ └───────────────╴Vector or matrix rows minus one
+ ││ │ │ └─────────────────╴Matrix columns minus one
+ ││ │ └────────────────────╴Image dimensions (4 = cube)
+ ││ └───────────────────────╴Image array flag
+ │└─────────────────────────╴Sampled image flag
+ └──────────────────────────╴Shadow sampler flag
+
+This information is presented for internal documentation purposes only; it is
+inadvisable for programs to rely on it.
+*/
enum DataType
{
- BYTE = GL_BYTE,
- UNSIGNED_BYTE = GL_UNSIGNED_BYTE,
- SHORT = GL_SHORT,
- UNSIGNED_SHORT = GL_UNSIGNED_SHORT,
- INT = GL_INT,
- UNSIGNED_INT = GL_UNSIGNED_INT,
- FLOAT = GL_FLOAT,
- HALF_FLOAT = GL_HALF_FLOAT
+ VOID = 0,
+ BOOL = 0x401,
+ BYTE = 0x101,
+ UNSIGNED_BYTE = 0x001,
+ SHORT = 0x102,
+ UNSIGNED_SHORT = 0x002,
+ INT = 0x104,
+ UNSIGNED_INT = 0x004,
+ FLOAT = 0x304,
+ HALF_FLOAT = 0x302,
+ DOUBLE = 0x308,
+
+ FLOAT_VEC2 = 0x1308,
+ FLOAT_VEC3 = 0x230C,
+ FLOAT_VEC4 = 0x3310,
+ INT_VEC2 = 0x1108,
+ INT_VEC3 = 0x210C,
+ INT_VEC4 = 0x3110,
+ BOOL_VEC2 = 0x1402,
+ BOOL_VEC3 = 0x2403,
+ BOOL_VEC4 = 0x3404,
+
+ FLOAT_MAT2 = 0x5310,
+ FLOAT_MAT3 = 0xA324,
+ FLOAT_MAT4 = 0xF340,
+ FLOAT_MAT2x3 = 0x6318,
+ FLOAT_MAT3x2 = 0x9318,
+ FLOAT_MAT2x4 = 0x7320,
+ FLOAT_MAT4x2 = 0xD320,
+ FLOAT_MAT3x4 = 0xB330,
+ FLOAT_MAT4x3 = 0xE330,
+
+ DOUBLE_MAT2 = 0x5320,
+ DOUBLE_MAT3 = 0xA348,
+ DOUBLE_MAT4 = 0xF380,
+ DOUBLE_MAT2x3 = 0x6330,
+ DOUBLE_MAT3x2 = 0x7330,
+ DOUBLE_MAT2x4 = 0x7340,
+ DOUBLE_MAT4x2 = 0xD340,
+ DOUBLE_MAT3x4 = 0xB360,
+ DOUBLE_MAT4x3 = 0xE360,
+
+ IMAGE_1D = 0x10304,
+ IMAGE_2D = 0x20304,
+ IMAGE_3D = 0x30304,
+ IMAGE_CUBE = 0x40304,
+ IMAGE_1D_ARRAY = 0x90304,
+ IMAGE_2D_ARRAY = 0xA0304,
+ IMAGE_CUBE_ARRAY = 0xC0304,
+ SAMPLER_1D = 0x110304,
+ SAMPLER_2D = 0x120304,
+ SAMPLER_3D = 0x130304,
+ SAMPLER_CUBE = 0x140304,
+ SAMPLER_1D_ARRAY = 0x190304,
+ SAMPLER_2D_ARRAY = 0x1A0304,
+ SAMPLER_CUBE_ARRAY = 0x1C0304,
+ SAMPLER_1D_SHADOW = 0x310304,
+ SAMPLER_2D_SHADOW = 0x320304,
+ SAMPLER_CUBE_SHADOW = 0x340304,
+ SAMPLER_1D_ARRAY_SHADOW = 0x390304,
+ SAMPLER_2D_ARRAY_SHADOW = 0x3A0304,
+ SAMPLER_CUBE_ARRAY_SHADOW = 0x3C0304
};
-unsigned get_type_size(DataType);
+inline unsigned get_type_size(DataType t) { return t&0xFF; }
+inline bool is_matrix(DataType t) { return t&0xC000; }
+inline bool is_vector(DataType t) { return !is_matrix(t) && (t&0x3000); }
+inline bool is_image(DataType t) { return t&0x70000; }
+
+GLenum get_gl_type(DataType);
+DataType from_gl_type(GLenum);
+
+void require_type(DataType);
} // namespace GL
} // namespace Msp