]> git.tdb.fi Git - libs/gl.git/blobdiff - source/core/datatype.h
Check the flat qualifier from the correct member
[libs/gl.git] / source / core / datatype.h
index 2d783f6142cdc1dadfb0e8acb5411ddaa41c4221..29789907cdb78ca9863c328251aa826419b72442 100644 (file)
 #ifndef MSP_GL_DATATYPE_H_
 #define MSP_GL_DATATYPE_H_
 
-#include "gl.h"
-#include <msp/gl/extensions/nv_half_float.h>
+#include <msp/linal/matrix.h>
+#include <msp/linal/vector.h>
 
 namespace Msp {
 namespace GL {
 
+/**
+Identifies a data type.
+
+The values are bitfields laid as follows:
+
+__hm 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 applications 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,
+       UINT_VEC2 = 0x1008,
+       UINT_VEC3 = 0x200C,
+       UINT_VEC4 = 0x3010,
+       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
+};
+
+inline std::size_t get_type_size(DataType t) { return t&0xFF; }
+inline bool is_float(DataType t) { return t&0x200; }
+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; }
+inline bool is_sampled_image(DataType t) { return t&0x100000; }
+
+inline DataType get_matrix_column_type(DataType t)
+{
+       unsigned cols = ((t&0xC000)>>14)+1;
+       return static_cast<DataType>((t&~0xC0FF) | (get_type_size(t)/cols));
+}
+
+inline DataType get_element_type(DataType t)
+{
+       unsigned elems = (((t&0xC000)>>14)+1)*(((t&0x3000)>>12)+1);
+       return static_cast<DataType>((t&~0xC0FF) | (get_type_size(t)/elems));
+}
+
+template<typename T> struct TypeTraits;
+template<> struct TypeTraits<bool> { static const DataType type = BOOL; };
+template<> struct TypeTraits<char> { static const DataType type = BYTE; };
+template<> struct TypeTraits<unsigned char> { static const DataType type = UNSIGNED_BYTE; };
+template<> struct TypeTraits<short> { static const DataType type = SHORT; };
+template<> struct TypeTraits<unsigned short> { static const DataType type = UNSIGNED_SHORT; };
+template<> struct TypeTraits<int> { static const DataType type = INT; };
+template<> struct TypeTraits<unsigned> { static const DataType type = UNSIGNED_INT; };
+template<> struct TypeTraits<float> { static const DataType type = FLOAT; };
+template<> struct TypeTraits<double> { static const DataType type = DOUBLE; };
+
+template<typename T, unsigned N>
+struct TypeTraits<LinAl::Vector<T, N>>
+{
+       static const DataType type = static_cast<DataType>((TypeTraits<T>::type&0xF00) | ((TypeTraits<T>::type&0xFF)*N) | ((N-1)<<12));
 };
 
-unsigned get_type_size(DataType);
+template<typename T, unsigned N, unsigned M>
+struct TypeTraits<LinAl::Matrix<T, N, M>>
+{
+       static const DataType type = static_cast<DataType>((TypeTraits<T>::type&0xF00) | ((TypeTraits<T>::type&0xFF)*N*M) | ((N-1)<<12) | ((M-1)<<14));
+};
+
+void require_type(DataType);
 
 } // namespace GL
 } // namespace Msp
 
+#include "datatype_backend.h"
+
 #endif