X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcore%2Fdatatype.h;h=d2739c49b6f7471ad3fed90c5e12de0ec27f4911;hp=2d783f6142cdc1dadfb0e8acb5411ddaa41c4221;hb=HEAD;hpb=7aaec9a70b8d7733429bec043f8e33e02956f266 diff --git a/source/core/datatype.h b/source/core/datatype.h index 2d783f61..29789907 100644 --- a/source/core/datatype.h +++ b/source/core/datatype.h @@ -1,27 +1,148 @@ #ifndef MSP_GL_DATATYPE_H_ #define MSP_GL_DATATYPE_H_ -#include "gl.h" -#include +#include +#include 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((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((t&~0xC0FF) | (get_type_size(t)/elems)); +} + +template struct TypeTraits; +template<> struct TypeTraits { static const DataType type = BOOL; }; +template<> struct TypeTraits { static const DataType type = BYTE; }; +template<> struct TypeTraits { static const DataType type = UNSIGNED_BYTE; }; +template<> struct TypeTraits { static const DataType type = SHORT; }; +template<> struct TypeTraits { static const DataType type = UNSIGNED_SHORT; }; +template<> struct TypeTraits { static const DataType type = INT; }; +template<> struct TypeTraits { static const DataType type = UNSIGNED_INT; }; +template<> struct TypeTraits { static const DataType type = FLOAT; }; +template<> struct TypeTraits { static const DataType type = DOUBLE; }; + +template +struct TypeTraits> +{ + static const DataType type = static_cast((TypeTraits::type&0xF00) | ((TypeTraits::type&0xFF)*N) | ((N-1)<<12)); }; -unsigned get_type_size(DataType); +template +struct TypeTraits> +{ + static const DataType type = static_cast((TypeTraits::type&0xF00) | ((TypeTraits::type&0xFF)*N*M) | ((N-1)<<12) | ((M-1)<<14)); +}; + +void require_type(DataType); } // namespace GL } // namespace Msp +#include "datatype_backend.h" + #endif