]> git.tdb.fi Git - libs/gl.git/commitdiff
Add data types for vectors, matrices, images and samplers
authorMikko Rasa <tdb@tdb.fi>
Tue, 30 Mar 2021 13:49:21 +0000 (16:49 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 30 Mar 2021 14:29:53 +0000 (17:29 +0300)
extensions/arb_gpu_shader_fp64.glext [new file with mode: 0644]
source/core/datatype.cpp
source/core/datatype.h

diff --git a/extensions/arb_gpu_shader_fp64.glext b/extensions/arb_gpu_shader_fp64.glext
new file mode 100644 (file)
index 0000000..98cdb23
--- /dev/null
@@ -0,0 +1 @@
+extension ARB_gpu_shader_fp64
index 7488a68bd4e7334c217877dda705575828cf65b1..c43b8f44315432847e8d93ba55776ebb434d770f 100644 (file)
@@ -1,26 +1,97 @@
+#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
index a343e8cf2be517399130f8f40fe0f57f644cbb00..92529a18fc256535eb92e85bd0ae93252c1c11a9 100644 (file)
@@ -6,8 +6,28 @@
 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,
@@ -15,7 +35,59 @@ enum DataType
        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)