X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fopengl%2Fdatatype_backend.cpp;fp=source%2Fbackends%2Fopengl%2Fdatatype_backend.cpp;h=9fd986ee10102e6fd3f1c0ab79cb4ecc07f01c68;hb=160e9eea29bd10034733d59507fa1bcca36be401;hp=0000000000000000000000000000000000000000;hpb=93448d16e72e38afbaecbccf6fdedd46d6a82a73;p=libs%2Fgl.git diff --git a/source/backends/opengl/datatype_backend.cpp b/source/backends/opengl/datatype_backend.cpp new file mode 100644 index 00000000..9fd986ee --- /dev/null +++ b/source/backends/opengl/datatype_backend.cpp @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include +#include "datatype.h" +#include "datatype_backend.h" +#include "gl.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; +} + +DataType from_gl_type(unsigned gl_type) +{ + for(unsigned i=0; i>12)&3)+1; + unsigned cols = ((type>>14)&4)+1; + if(rows>1 && cols>1 && rows!=cols) + static Require _req(NV_non_square_matrices); + if((type&0x200) && get_type_size(type)/(rows*cols)==8) + static Require _req(ARB_gpu_shader_fp64); +} + +} // namespace GL +} // namespace Msp