+#include <algorithm>
#include <stdexcept>
+#include <msp/gl/extensions/arb_gpu_shader_fp64.h>
#include <msp/gl/extensions/nv_half_float.h>
+#include <msp/gl/extensions/nv_non_square_matrices.h>
#include "datatype.h"
using namespace std;
+namespace {
+
+struct MappedType
+{
+ Msp::GL::DataType type;
+ GLenum gl_type;
+};
+
+// Make sure this is sorted!
+const MappedType type_map[] =
+{
+ { Msp::GL::UNSIGNED_BYTE, GL_UNSIGNED_BYTE },
+ { Msp::GL::UNSIGNED_SHORT, GL_UNSIGNED_SHORT },
+ { Msp::GL::UNSIGNED_INT, GL_UNSIGNED_INT },
+ { Msp::GL::BYTE, GL_BYTE },
+ { Msp::GL::SHORT, GL_SHORT },
+ { Msp::GL::INT, GL_INT },
+ { Msp::GL::HALF_FLOAT, GL_HALF_FLOAT },
+ { Msp::GL::FLOAT, GL_FLOAT },
+ { Msp::GL::DOUBLE, GL_DOUBLE },
+ { Msp::GL::BOOL, GL_BOOL },
+ { Msp::GL::INT_VEC2, GL_INT_VEC2 },
+ { Msp::GL::FLOAT_VEC2, GL_FLOAT_VEC2 },
+ { Msp::GL::BOOL_VEC2, GL_BOOL_VEC2 },
+ { Msp::GL::INT_VEC3, GL_INT_VEC3 },
+ { Msp::GL::FLOAT_VEC3, GL_FLOAT_VEC3 },
+ { Msp::GL::BOOL_VEC3, GL_BOOL_VEC3 },
+ { Msp::GL::INT_VEC4, GL_INT_VEC4 },
+ { Msp::GL::FLOAT_VEC4, GL_FLOAT_VEC4 },
+ { Msp::GL::BOOL_VEC4, GL_BOOL_VEC4 },
+ { Msp::GL::FLOAT_MAT2, GL_FLOAT_MAT2 },
+ { Msp::GL::DOUBLE_MAT2, GL_DOUBLE_MAT2 },
+ { Msp::GL::FLOAT_MAT3, GL_FLOAT_MAT3 },
+ { Msp::GL::DOUBLE_MAT3, GL_DOUBLE_MAT3 },
+ { Msp::GL::FLOAT_MAT4, GL_FLOAT_MAT4 },
+ { Msp::GL::DOUBLE_MAT4, GL_DOUBLE_MAT4 },
+ { Msp::GL::FLOAT_MAT2x3, GL_FLOAT_MAT2x3 },
+ { Msp::GL::DOUBLE_MAT2x3, GL_DOUBLE_MAT2x3 },
+ { Msp::GL::FLOAT_MAT3x2, GL_FLOAT_MAT3x2 },
+ { Msp::GL::DOUBLE_MAT3x2, GL_DOUBLE_MAT3x2 },
+ { Msp::GL::FLOAT_MAT2x4, GL_FLOAT_MAT2x4 },
+ { Msp::GL::DOUBLE_MAT2x4, GL_DOUBLE_MAT2x4 },
+ { Msp::GL::FLOAT_MAT4x2, GL_FLOAT_MAT4x2 },
+ { Msp::GL::DOUBLE_MAT4x2, GL_DOUBLE_MAT4x2 },
+ { Msp::GL::FLOAT_MAT3x4, GL_FLOAT_MAT3x4 },
+ { Msp::GL::DOUBLE_MAT3x4, GL_DOUBLE_MAT3x4 },
+ { Msp::GL::FLOAT_MAT4x3, GL_FLOAT_MAT4x3 },
+ { Msp::GL::DOUBLE_MAT4x3, GL_DOUBLE_MAT4x3 },
+ { Msp::GL::IMAGE_1D, GL_IMAGE_1D },
+ { Msp::GL::IMAGE_2D, GL_IMAGE_2D },
+ { Msp::GL::IMAGE_3D, GL_IMAGE_3D },
+ { Msp::GL::IMAGE_CUBE, GL_IMAGE_CUBE },
+ { Msp::GL::IMAGE_1D_ARRAY, GL_IMAGE_1D_ARRAY },
+ { Msp::GL::IMAGE_2D_ARRAY, GL_IMAGE_2D_ARRAY },
+ { Msp::GL::IMAGE_CUBE_ARRAY, GL_IMAGE_CUBE_MAP_ARRAY },
+ { Msp::GL::SAMPLER_1D, GL_SAMPLER_1D },
+ { Msp::GL::SAMPLER_2D, GL_SAMPLER_2D },
+ { Msp::GL::SAMPLER_3D, GL_SAMPLER_3D },
+ { Msp::GL::SAMPLER_CUBE, GL_SAMPLER_CUBE },
+ { Msp::GL::SAMPLER_1D_ARRAY, GL_SAMPLER_1D_ARRAY },
+ { Msp::GL::SAMPLER_2D_ARRAY, GL_SAMPLER_2D_ARRAY },
+ { Msp::GL::SAMPLER_CUBE_ARRAY, GL_SAMPLER_CUBE_MAP_ARRAY },
+ { Msp::GL::SAMPLER_1D_SHADOW, GL_SAMPLER_1D_SHADOW },
+ { Msp::GL::SAMPLER_2D_SHADOW, GL_SAMPLER_2D_SHADOW },
+ { Msp::GL::SAMPLER_CUBE_SHADOW, GL_SAMPLER_CUBE_SHADOW },
+ { Msp::GL::SAMPLER_1D_ARRAY_SHADOW, GL_SAMPLER_1D_ARRAY_SHADOW },
+ { Msp::GL::SAMPLER_2D_ARRAY_SHADOW, GL_SAMPLER_2D_ARRAY_SHADOW },
+ { Msp::GL::SAMPLER_CUBE_ARRAY_SHADOW, GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW }
+};
+const unsigned type_map_size = sizeof(type_map)/sizeof(MappedType);
+
+bool type_compare(const MappedType &mt, Msp::GL::DataType t)
+{ return mt.type<t; }
+
+}
+
namespace Msp {
namespace GL {
GLenum get_gl_type(DataType type)
{
- switch(type)
- {
- case BYTE: return GL_BYTE;
- case UNSIGNED_BYTE: return GL_UNSIGNED_BYTE;
- case SHORT: return GL_SHORT;
- case UNSIGNED_SHORT: return GL_UNSIGNED_SHORT;
- case INT: return GL_INT;
- case UNSIGNED_INT: return GL_UNSIGNED_INT;
- case FLOAT: return GL_FLOAT;
- case HALF_FLOAT: return GL_HALF_FLOAT;
- default: throw invalid_argument("get_gl_type");
- }
+ const MappedType *ptr = lower_bound(type_map, type_map+type_map_size, type, type_compare);
+ if(ptr->type!=type)
+ throw invalid_argument("get_gl_type");
+ return ptr->gl_type;
}
} // namespace GL
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
{
+ VOID = 0,
+ BOOL = 0x401,
BYTE = 0x101,
UNSIGNED_BYTE = 0x001,
SHORT = 0x102,
INT = 0x104,
UNSIGNED_INT = 0x004,
FLOAT = 0x304,
- HALF_FLOAT = 0x302
+ 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
};
inline unsigned get_type_size(DataType t)