From e5881460cb0c2541fda9ff0b823d5ca1e0ecb986 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Tue, 30 Mar 2021 16:49:21 +0300 Subject: [PATCH] Add data types for vectors, matrices, images and samplers --- extensions/arb_gpu_shader_fp64.glext | 1 + source/core/datatype.cpp | 95 ++++++++++++++++++++++++---- source/core/datatype.h | 74 +++++++++++++++++++++- 3 files changed, 157 insertions(+), 13 deletions(-) create mode 100644 extensions/arb_gpu_shader_fp64.glext diff --git a/extensions/arb_gpu_shader_fp64.glext b/extensions/arb_gpu_shader_fp64.glext new file mode 100644 index 00000000..98cdb23a --- /dev/null +++ b/extensions/arb_gpu_shader_fp64.glext @@ -0,0 +1 @@ +extension ARB_gpu_shader_fp64 diff --git a/source/core/datatype.cpp b/source/core/datatype.cpp index 7488a68b..c43b8f44 100644 --- a/source/core/datatype.cpp +++ b/source/core/datatype.cpp @@ -1,26 +1,97 @@ +#include #include +#include #include +#include #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.typetype!=type) + throw invalid_argument("get_gl_type"); + return ptr->gl_type; } } // namespace GL diff --git a/source/core/datatype.h b/source/core/datatype.h index a343e8cf..92529a18 100644 --- a/source/core/datatype.h +++ b/source/core/datatype.h @@ -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) -- 2.43.0