st/mesa: refactor guess_and_alloc_texture() code
[mesa.git] / src / mesa / main / image.c
index 98f7581e187c0bdca33f1deecdb8ee218ca51126..63936132f98bd3e1cacd3de54037f6cbc9516a29 100644 (file)
 
 #include "glheader.h"
 #include "colormac.h"
-#include "enums.h"
 #include "image.h"
 #include "imports.h"
 #include "macros.h"
+#include "mfeatures.h"
+#include "mtypes.h"
 
 
 /**
@@ -67,6 +68,7 @@ _mesa_type_is_packed(GLenum type)
    switch (type) {
    case GL_UNSIGNED_BYTE_3_3_2:
    case GL_UNSIGNED_BYTE_2_3_3_REV:
+   case MESA_UNSIGNED_BYTE_4_4:
    case GL_UNSIGNED_SHORT_5_6_5:
    case GL_UNSIGNED_SHORT_5_6_5_REV:
    case GL_UNSIGNED_SHORT_4_4_4_4:
@@ -155,6 +157,8 @@ _mesa_sizeof_type( GLenum type )
         return sizeof(GLdouble);
       case GL_HALF_FLOAT_ARB:
         return sizeof(GLhalfARB);
+      case GL_FIXED:
+        return sizeof(GLfixed);
       default:
          return -1;
    }
@@ -191,6 +195,8 @@ _mesa_sizeof_packed_type( GLenum type )
          return sizeof(GLubyte);
       case GL_UNSIGNED_BYTE_2_3_3_REV:
          return sizeof(GLubyte);
+      case MESA_UNSIGNED_BYTE_4_4:
+         return sizeof(GLubyte);
       case GL_UNSIGNED_SHORT_5_6_5:
          return sizeof(GLushort);
       case GL_UNSIGNED_SHORT_5_6_5_REV:
@@ -316,13 +322,15 @@ _mesa_bytes_per_pixel( GLenum format, GLenum type )
          return comps * sizeof(GLhalfARB);
       case GL_UNSIGNED_BYTE_3_3_2:
       case GL_UNSIGNED_BYTE_2_3_3_REV:
-         if (format == GL_RGB || format == GL_BGR)
+         if (format == GL_RGB || format == GL_BGR ||
+             format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
             return sizeof(GLubyte);
          else
             return -1;  /* error */
       case GL_UNSIGNED_SHORT_5_6_5:
       case GL_UNSIGNED_SHORT_5_6_5_REV:
-         if (format == GL_RGB || format == GL_BGR)
+         if (format == GL_RGB || format == GL_BGR ||
+             format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
             return sizeof(GLushort);
          else
             return -1;  /* error */
@@ -330,7 +338,8 @@ _mesa_bytes_per_pixel( GLenum format, GLenum type )
       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:
-         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
+         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
+             format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
             return sizeof(GLushort);
          else
             return -1;
@@ -338,7 +347,8 @@ _mesa_bytes_per_pixel( GLenum format, GLenum type )
       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:
-         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT)
+         if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
+             format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
             return sizeof(GLuint);
          else
             return -1;
@@ -369,7 +379,8 @@ _mesa_bytes_per_pixel( GLenum format, GLenum type )
  * otherwise.
  */
 GLboolean
-_mesa_is_legal_format_and_type( struct gl_context *ctx, GLenum format, GLenum type )
+_mesa_is_legal_format_and_type(const struct gl_context *ctx,
+                               GLenum format, GLenum type)
 {
    switch (format) {
       case GL_COLOR_INDEX:
@@ -519,14 +530,77 @@ _mesa_is_legal_format_and_type( struct gl_context *ctx, GLenum format, GLenum ty
             default:
                return GL_FALSE;
          }
+
+      /* integer-valued formats */
       case GL_RED_INTEGER_EXT:
       case GL_GREEN_INTEGER_EXT:
       case GL_BLUE_INTEGER_EXT:
       case GL_ALPHA_INTEGER_EXT:
+         switch (type) {
+            case GL_BYTE:
+            case GL_UNSIGNED_BYTE:
+            case GL_SHORT:
+            case GL_UNSIGNED_SHORT:
+            case GL_INT:
+            case GL_UNSIGNED_INT:
+               return ctx->Extensions.EXT_texture_integer;
+            default:
+               return GL_FALSE;
+         }
+
       case GL_RGB_INTEGER_EXT:
-      case GL_RGBA_INTEGER_EXT:
+         switch (type) {
+            case GL_BYTE:
+            case GL_UNSIGNED_BYTE:
+            case GL_SHORT:
+            case GL_UNSIGNED_SHORT:
+            case GL_INT:
+            case GL_UNSIGNED_INT:
+            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:
+               return ctx->Extensions.EXT_texture_integer;
+            default:
+               return GL_FALSE;
+         }
+
       case GL_BGR_INTEGER_EXT:
+         switch (type) {
+            case GL_BYTE:
+            case GL_UNSIGNED_BYTE:
+            case GL_SHORT:
+            case GL_UNSIGNED_SHORT:
+            case GL_INT:
+            case GL_UNSIGNED_INT:
+            /* NOTE: no packed formats w/ BGR format */
+               return ctx->Extensions.EXT_texture_integer;
+            default:
+               return GL_FALSE;
+         }
+
+      case GL_RGBA_INTEGER_EXT:
       case GL_BGRA_INTEGER_EXT:
+         switch (type) {
+            case GL_BYTE:
+            case GL_UNSIGNED_BYTE:
+            case GL_SHORT:
+            case GL_UNSIGNED_SHORT:
+            case GL_INT:
+            case GL_UNSIGNED_INT:
+            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:
+            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:
+               return ctx->Extensions.EXT_texture_integer;
+            default:
+               return GL_FALSE;
+         }
+
       case GL_LUMINANCE_INTEGER_EXT:
       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
          switch (type) {
@@ -1510,8 +1584,8 @@ _mesa_clip_drawpixels(const struct gl_context *ctx,
  * scissor box is ignored, and we use the bounds of the current readbuffer
  * surface.
  *
- * \return  GL_TRUE if image is ready for drawing or
- *          GL_FALSE if image was completely clipped away (draw nothing)
+ * \return  GL_TRUE if region to read is in bounds
+ *          GL_FALSE if region is completely out of bounds (nothing to read)
  */
 GLboolean
 _mesa_clip_readpixels(const struct gl_context *ctx,