]> git.cworth.org Git - apitrace/commitdiff
Handle more TexImage format types in size computation.
authorJosé Fonseca <jfonseca@vmware.com>
Sun, 21 Nov 2010 00:38:30 +0000 (00:38 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Sun, 21 Nov 2010 00:38:30 +0000 (00:38 +0000)
glhelpers.hpp

index 757c334f642fe9eea8d5e946eec0374161d9868a..cfd9545993aae289123b3066a4e26b18db6dda84 100644 (file)
 
 static inline size_t
 __gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth, GLint border) {
-   size_t bits_per_channel;
-   switch (type) {
-   case GL_UNSIGNED_BYTE:
-      bits_per_channel = 8;
+   size_t num_channels;
+   switch (format) {
+   case GL_COLOR_INDEX:
+   case GL_RED:
+   case GL_GREEN:
+   case GL_BLUE:
+   case GL_ALPHA:
+   case GL_INTENSITY:
+   case GL_DEPTH_COMPONENT:
+   case GL_STENCIL_INDEX:
+      num_channels = 1;
+      break;
+   case GL_LUMINANCE_ALPHA:
+      num_channels = 2;
+      break;
+   case GL_RGB:
+   case GL_BGR:
+      num_channels = 3;
+      break;
+   case GL_RGBA:
+   case GL_BGRA:
+      num_channels = 4;
       break;
    default:
       assert(0);
-      bits_per_channel = 0;
+      num_channels = 0;
       break;
    }
 
    size_t bits_per_pixel;
-   switch (format) {
-   case GL_RGB:
-      bits_per_pixel = bits_per_channel * 3;
+   switch (type) {
+   case GL_BITMAP:
+      bits_per_pixel = 1;
+      break;
+   case GL_BYTE:
+   case GL_UNSIGNED_BYTE:
+      bits_per_pixel = 8 * num_channels;
+      break;
+   case GL_SHORT:
+   case GL_UNSIGNED_SHORT:
+      bits_per_pixel = 16 * num_channels;
+      break;
+   case GL_INT:
+   case GL_UNSIGNED_INT:
+   case GL_FLOAT:
+      bits_per_pixel = 32 * num_channels;
+      break;
+   case GL_UNSIGNED_BYTE_3_3_2:
+   case GL_UNSIGNED_BYTE_2_3_3_REV:
+   case GL_UNSIGNED_SHORT_5_6_5:
+   case GL_UNSIGNED_SHORT_5_6_5_REV:
+      bits_per_pixel = 8;
+      break;
+   case GL_UNSIGNED_SHORT_4_4_4_4:
+   case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+   case GL_UNSIGNED_SHORT_5_5_5_1:
+   case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+      bits_per_pixel = 16;
+      break;
+   case GL_UNSIGNED_INT_8_8_8_8:
+   case GL_UNSIGNED_INT_8_8_8_8_REV:
+   case GL_UNSIGNED_INT_10_10_10_2:
+   case GL_UNSIGNED_INT_2_10_10_10_REV:
+      bits_per_pixel = 32;
       break;
    default:
       assert(0);
@@ -53,6 +102,8 @@ __gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsiz
       break;
    }
 
+   /* FIXME: consider glPixelStore settings */
+
    size_t row_stride = (width*bits_per_pixel + 7)/8;
 
    size_t slice_stride = height*row_stride;