X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=glsize.hpp;h=257d59913e46d0b5f4b7c8cd9e69eec3792f7594;hb=daf82af9d5f270c87434cc1142f32a6407703781;hp=cff66d24b25c89c7861ad44bedacff143394f023;hpb=9525989ae9c55ca3ddd8991454ad84d023cb30c3;p=apitrace diff --git a/glsize.hpp b/glsize.hpp index cff66d2..257d599 100644 --- a/glsize.hpp +++ b/glsize.hpp @@ -34,6 +34,8 @@ #define _GL_SIZE_HPP_ +#include + #include "os.hpp" #include "glimports.hpp" @@ -61,11 +63,217 @@ __gl_type_size(GLenum type) case GL_DOUBLE: return 8; default: - OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, type); + OS::DebugMessage("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, type); return 0; } } +static inline void +__gl_uniform_size(GLenum type, GLenum &elemType, GLint &numElems) { + switch (type) { + case GL_FLOAT: + elemType = GL_FLOAT; + numElems = 1; + break; + case GL_FLOAT_VEC2: + elemType = GL_FLOAT; + numElems = 2; + break; + case GL_FLOAT_VEC3: + elemType = GL_FLOAT; + numElems = 3; + break; + case GL_FLOAT_VEC4: + elemType = GL_FLOAT; + numElems = 4; + break; + case GL_DOUBLE: + elemType = GL_DOUBLE; + numElems = 1; + break; + case GL_DOUBLE_VEC2: + elemType = GL_DOUBLE; + numElems = 2; + break; + case GL_DOUBLE_VEC3: + elemType = GL_DOUBLE; + numElems = 3; + break; + case GL_DOUBLE_VEC4: + elemType = GL_DOUBLE; + numElems = 4; + break; + case GL_INT: + elemType = GL_INT; + numElems = 1; + break; + case GL_INT_VEC2: + elemType = GL_INT; + numElems = 2; + break; + case GL_INT_VEC3: + elemType = GL_INT; + numElems = 3; + break; + case GL_INT_VEC4: + elemType = GL_INT; + numElems = 4; + break; + case GL_UNSIGNED_INT: + elemType = GL_UNSIGNED_INT; + numElems = 1; + break; + case GL_UNSIGNED_INT_VEC2: + elemType = GL_UNSIGNED_INT; + numElems = 2; + break; + case GL_UNSIGNED_INT_VEC3: + elemType = GL_UNSIGNED_INT; + numElems = 3; + break; + case GL_UNSIGNED_INT_VEC4: + elemType = GL_UNSIGNED_INT; + numElems = 4; + break; + case GL_BOOL: + elemType = GL_BOOL; + numElems = 1; + break; + case GL_BOOL_VEC2: + elemType = GL_BOOL; + numElems = 2; + break; + case GL_BOOL_VEC3: + elemType = GL_BOOL; + numElems = 3; + break; + case GL_BOOL_VEC4: + elemType = GL_BOOL; + numElems = 4; + break; + case GL_FLOAT_MAT2: + elemType = GL_FLOAT; + numElems = 2*2; + break; + case GL_FLOAT_MAT3: + elemType = GL_FLOAT; + numElems = 3*3; + break; + case GL_FLOAT_MAT4: + elemType = GL_FLOAT; + numElems = 4*4; + break; + case GL_FLOAT_MAT2x3: + elemType = GL_FLOAT; + numElems = 2*3; + break; + case GL_FLOAT_MAT2x4: + elemType = GL_FLOAT; + numElems = 2*4; + break; + case GL_FLOAT_MAT3x2: + elemType = GL_FLOAT; + numElems = 3*2; + break; + case GL_FLOAT_MAT3x4: + elemType = GL_FLOAT; + numElems = 3*4; + break; + case GL_FLOAT_MAT4x2: + elemType = GL_FLOAT; + numElems = 4*2; + break; + case GL_FLOAT_MAT4x3: + elemType = GL_FLOAT; + numElems = 4*3; + break; + case GL_DOUBLE_MAT2: + elemType = GL_DOUBLE; + numElems = 2*2; + break; + case GL_DOUBLE_MAT3: + elemType = GL_DOUBLE; + numElems = 3*3; + break; + case GL_DOUBLE_MAT4: + elemType = GL_DOUBLE; + numElems = 4*4; + break; + case GL_DOUBLE_MAT2x3: + elemType = GL_DOUBLE; + numElems = 2*3; + break; + case GL_DOUBLE_MAT2x4: + elemType = GL_DOUBLE; + numElems = 2*4; + break; + case GL_DOUBLE_MAT3x2: + elemType = GL_DOUBLE; + numElems = 3*2; + break; + case GL_DOUBLE_MAT3x4: + elemType = GL_DOUBLE; + numElems = 3*4; + break; + case GL_DOUBLE_MAT4x2: + elemType = GL_DOUBLE; + numElems = 4*2; + break; + case GL_DOUBLE_MAT4x3: + elemType = GL_DOUBLE; + numElems = 4*3; + break; + case GL_SAMPLER_1D: + case GL_SAMPLER_2D: + case GL_SAMPLER_3D: + case GL_SAMPLER_CUBE: + case GL_SAMPLER_1D_SHADOW: + case GL_SAMPLER_2D_SHADOW: + case GL_SAMPLER_1D_ARRAY: + case GL_SAMPLER_2D_ARRAY: + case GL_SAMPLER_CUBE_MAP_ARRAY: + case GL_SAMPLER_1D_ARRAY_SHADOW: + case GL_SAMPLER_2D_ARRAY_SHADOW: + case GL_SAMPLER_2D_MULTISAMPLE: + case GL_SAMPLER_2D_MULTISAMPLE_ARRAY: + case GL_SAMPLER_CUBE_SHADOW: + case GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW: + case GL_SAMPLER_BUFFER: + case GL_SAMPLER_2D_RECT: + case GL_SAMPLER_2D_RECT_SHADOW: + case GL_INT_SAMPLER_1D: + case GL_INT_SAMPLER_2D: + case GL_INT_SAMPLER_3D: + case GL_INT_SAMPLER_CUBE: + case GL_INT_SAMPLER_1D_ARRAY: + case GL_INT_SAMPLER_2D_ARRAY: + case GL_INT_SAMPLER_CUBE_MAP_ARRAY: + case GL_INT_SAMPLER_2D_MULTISAMPLE: + case GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: + case GL_INT_SAMPLER_BUFFER: + case GL_INT_SAMPLER_2D_RECT: + case GL_UNSIGNED_INT_SAMPLER_1D: + case GL_UNSIGNED_INT_SAMPLER_2D: + case GL_UNSIGNED_INT_SAMPLER_3D: + case GL_UNSIGNED_INT_SAMPLER_CUBE: + case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: + case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: + case GL_UNSIGNED_INT_SAMPLER_BUFFER: + case GL_UNSIGNED_INT_SAMPLER_2D_RECT: + elemType = GL_INT; + numElems = 1; + break; + default: + OS::DebugMessage("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, type); + elemType = GL_NONE; + numElems = 0; + return; + } +} + static inline size_t __glArrayPointer_size(GLint size, GLenum type, GLsizei stride, GLsizei maxIndex) { @@ -85,6 +293,8 @@ __glArrayPointer_size(GLint size, GLenum type, GLsizei stride, GLsizei maxIndex) #define __glFogCoordPointer_size(type, stride, maxIndex) __glArrayPointer_size(1, type, stride, maxIndex) #define __glSecondaryColorPointer_size(size, type, stride, maxIndex) __glArrayPointer_size(size, type, stride, maxIndex) #define __glVertexAttribPointer_size(size, type, normalized, stride, maxIndex) __glArrayPointer_size(size, type, stride, maxIndex) +#define __glVertexAttribPointerARB_size(size, type, normalized, stride, maxIndex) __glArrayPointer_size(size, type, stride, maxIndex) +#define __glVertexAttribPointerNV_size(size, type, stride, maxIndex) __glArrayPointer_size(size, type, stride, maxIndex) static inline GLuint __glDrawArrays_maxindex(GLint first, GLsizei count) @@ -148,7 +358,7 @@ __glDrawElementsBaseVertex_maxindex(GLsizei count, GLenum type, const GLvoid *in } } } else { - OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, type); + OS::DebugMessage("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, type); } if (__element_array_buffer) { @@ -179,32 +389,44 @@ __glDrawElementsBaseVertex_maxindex(GLsizei count, GLenum type, const GLvoid *in static inline GLuint __glDrawArraysIndirect_maxindex(const GLvoid *indirect) { - OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); + OS::DebugMessage("apitrace: warning: %s: unsupported\n", __FUNCTION__); return 0; } static inline GLuint __glDrawElementsIndirect_maxindex(GLenum type, const GLvoid *indirect) { - OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); + OS::DebugMessage("apitrace: warning: %s: unsupported\n", __FUNCTION__); return 0; } static inline GLuint __glMultiDrawArrays_maxindex(const GLint *first, const GLsizei *count, GLsizei primcount) { - OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); - return 0; + GLuint maxindex = 0; + for (GLsizei prim = 0; prim < primcount; ++prim) { + GLuint maxindex_prim = __glDrawArrays_maxindex(first[prim], count[prim]); + maxindex = std::max(maxindex, maxindex_prim); + } + return maxindex; } static inline GLuint __glMultiDrawElements_maxindex(const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount) { - OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); - return 0; + GLuint maxindex = 0; + for (GLsizei prim = 0; prim < primcount; ++prim) { + GLuint maxindex_prim = __glDrawElements_maxindex(count[prim], type, indices[prim]); + maxindex = std::max(maxindex, maxindex_prim); + } + return maxindex; } static inline GLuint __glMultiDrawElementsBaseVertex_maxindex(const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint * basevertex) { - OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); - return 0; + GLuint maxindex = 0; + for (GLsizei prim = 0; prim < primcount; ++prim) { + GLuint maxindex_prim = __glDrawElementsBaseVertex_maxindex(count[prim], type, indices[prim], basevertex[prim]); + maxindex = std::max(maxindex, maxindex_prim); + } + return maxindex; } #define __glMultiDrawArraysEXT_maxindex __glMultiDrawArrays_maxindex @@ -234,51 +456,83 @@ __glCallLists_size(GLsizei n, GLenum type) static inline size_t -__glMap1d_size(GLenum pname) +__glMap1d_size(GLenum target, GLint stride, GLint order) { - switch (pname) { + if (order < 1) { + return 0; + } + + GLint channels; + switch (target) { case GL_MAP1_INDEX: case GL_MAP1_TEXTURE_COORD_1: - return 1; + channels = 1; + break; case GL_MAP1_TEXTURE_COORD_2: - return 2; + channels = 2; + break; case GL_MAP1_NORMAL: case GL_MAP1_TEXTURE_COORD_3: case GL_MAP1_VERTEX_3: - return 3; + channels = 3; + break; case GL_MAP1_COLOR_4: case GL_MAP1_TEXTURE_COORD_4: case GL_MAP1_VERTEX_4: - return 4; + channels = 4; + break; default: - OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname); - return 1; + OS::DebugMessage("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, target); + return 0; + } + + if (stride < channels) { + return 0; } + + return channels + stride * (order - 1); } #define __glMap1f_size __glMap1d_size static inline size_t -__glMap2d_size(GLenum pname) +__glMap2d_size(GLenum target, GLint ustride, GLint uorder, GLint vstride, GLint vorder) { - switch (pname) { + if (uorder < 1 || vorder < 1) { + return 0; + } + + GLint channels; + switch (target) { case GL_MAP2_INDEX: case GL_MAP2_TEXTURE_COORD_1: - return 1; + channels = 1; + break; case GL_MAP2_TEXTURE_COORD_2: - return 2; + channels = 2; + break; case GL_MAP2_NORMAL: case GL_MAP2_TEXTURE_COORD_3: case GL_MAP2_VERTEX_3: - return 3; + channels = 3; + break; case GL_MAP2_COLOR_4: case GL_MAP2_TEXTURE_COORD_4: case GL_MAP2_VERTEX_4: - return 4; + channels = 4; + break; default: - OS::DebugMessage("warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname); - return 1; + OS::DebugMessage("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, target); + return 0; } + + if (ustride < channels || vstride < channels) { + return 0; + } + + return channels + + ustride * (uorder - 1) + + vstride * (vorder - 1); } #define __glMap2f_size __glMap2d_size @@ -288,6 +542,11 @@ __glMap2d_size(GLenum pname) #define __glGetFloatv_size __glGetBooleanv_size #define __glGetIntegerv_size __glGetBooleanv_size #define __glGetInteger64v_size __glGetBooleanv_size +#define __glGetBooleani_v_size __gl_param_size +#define __glGetDoublei_v_size __glGetBooleanv_size +#define __glGetFloati_v_size __glGetBooleanv_size +#define __glGetIntegeri_v_size __glGetBooleani_v_size +#define __glGetInteger64i_v_size __glGetBooleani_v_size #define __glGetLightfv_size __glLightfv_size #define __glGetLightiv_size __glLightfv_size @@ -351,15 +610,23 @@ __gl_format_channels(GLenum format) { case GL_DEPTH_STENCIL: case GL_LUMINANCE_ALPHA: case GL_RG: + case GL_HILO_NV: + case GL_DSDT_NV: return 2; case GL_RGB: case GL_BGR: + case GL_DSDT_MAG_NV: return 3; case GL_RGBA: case GL_BGRA: + case GL_ABGR_EXT: + case GL_CMYK_EXT: + case GL_DSDT_MAG_VIB_NV: return 4; + case GL_CMYKA_EXT: + return 5; default: - OS::DebugMessage("warning: %s: unexpected format GLenum 0x%04X\n", __FUNCTION__, format); + OS::DebugMessage("apitrace: warning: %s: unexpected format GLenum 0x%04X\n", __FUNCTION__, format); return 0; } } @@ -373,7 +640,7 @@ _is_pot(X x) { template static inline X _align(X x, Y y) { - return (x + (y - 1)) & (y - 1); + return (x + (y - 1)) & ~(y - 1); } static inline size_t @@ -428,7 +695,7 @@ __gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsiz bits_per_pixel = 64; break; default: - OS::DebugMessage("warning: %s: unexpected type GLenum 0x%04X\n", __FUNCTION__, type); + OS::DebugMessage("apitrace: warning: %s: unexpected type GLenum 0x%04X\n", __FUNCTION__, type); bits_per_pixel = 0; break; } @@ -483,6 +750,10 @@ __gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsiz #define __glGetTexParameteriv_size __gl_param_size #define __glGetTexLevelParameterfv_size __gl_param_size #define __glGetTexLevelParameteriv_size __gl_param_size +#define __glTexParameterIiv_size __gl_param_size +#define __glTexParameterIuiv_size __gl_param_size +#define __glGetTexParameterIiv_size __gl_param_size +#define __glGetTexParameterIuiv_size __gl_param_size #define __glTexEnvfv_size __gl_param_size #define __glTexEnviv_size __gl_param_size @@ -526,10 +797,33 @@ __gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsiz #define __glMultiTexSubImage1DEXT_size __glTexSubImage1D_size #define __glDrawPixels_size(format, type, width, height) __glTexImage2D_size(format, type, width, height) +#define __glConvolutionFilter1D_size(format, type, width) __glTexImage1D_size(format, type, width) +#define __glConvolutionFilter2D_size(format, type, width, height) __glTexImage2D_size(format, type, width, height) +#define __glColorTable_size(format, type, width) __glTexImage1D_size(format, type, width) +#define __glColorSubTable_size(format, type, count) __glColorTable_size(format, type, count) #define __glBitmap_size(width, height) __glTexImage2D_size(GL_COLOR_INDEX, GL_BITMAP, width, height) #define __glPolygonStipple_size() __glBitmap_size(32, 32) +static inline size_t +__glClearBuffer_size(GLenum buffer) +{ + switch (buffer) { + case GL_COLOR: + case GL_FRONT: + case GL_BACK: + case GL_LEFT: + case GL_RIGHT: + case GL_FRONT_AND_BACK: + return 4; + case GL_DEPTH: + case GL_STENCIL: + return 1; + default: + OS::DebugMessage("apitrace: warning: %s: unexpected buffer GLenum 0x%04X\n", __FUNCTION__, buffer); + return 0; + } +} /* * 0 terminated integer/float attribute list.