mesa: remove array size so the static assert can work
[mesa.git] / src / mesa / main / texformat.c
index 7e60541c38927b74f200b9fc2dc332ac037776d8..f0bc7fdb93b9bc06dbd8f895fa317347ce162291 100644 (file)
@@ -61,8 +61,8 @@
  * will typically override this function with a specialized version.
  */
 gl_format
-_mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
-                         GLenum format, GLenum type )
+_mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
+                        GLint internalFormat, GLenum format, GLenum type)
 {
    (void) format;
    (void) type;
@@ -236,21 +236,33 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
         RETURN_IF_SUPPORTED(MESA_FORMAT_I8);
         break;
       case GL_COMPRESSED_RGB_ARB:
-         if (ctx->Extensions.EXT_texture_compression_s3tc ||
-             ctx->Extensions.S3_s3tc)
-           RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
-         if (ctx->Extensions.TDFX_texture_compression_FXT1)
-           RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
+         /* We don't use texture compression for 1D and 1D array textures.
+          * For 1D textures, compressions doesn't buy us much.
+          * For 1D ARRAY textures, there's complicated issues with updating
+          * sub-regions on non-block boundaries with glCopyTexSubImage, among
+          * other issues.  FWIW, the GL_EXT_texture_array extension prohibits
+          * 1D ARRAY textures in S3TC format.
+          */
+         if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
+            if (ctx->Extensions.EXT_texture_compression_s3tc ||
+                ctx->Extensions.S3_s3tc)
+               RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
+            if (ctx->Extensions.TDFX_texture_compression_FXT1)
+               RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
+         }
         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
         RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
         break;
       case GL_COMPRESSED_RGBA_ARB:
-         if (ctx->Extensions.EXT_texture_compression_s3tc ||
-             ctx->Extensions.S3_s3tc)
-           RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
-         if (ctx->Extensions.TDFX_texture_compression_FXT1)
-           RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
+         /* We don't use texture compression for 1D and 1D array textures. */
+         if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
+            if (ctx->Extensions.EXT_texture_compression_s3tc ||
+                ctx->Extensions.S3_s3tc)
+               RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
+            if (ctx->Extensions.TDFX_texture_compression_FXT1)
+               RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
+         }
         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA8888);
         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
         break;
@@ -258,6 +270,16 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
          ; /* fallthrough */
    }
 
+   if (ctx->Extensions.ARB_ES2_compatibility) {
+      switch (internalFormat) {
+         case GL_RGB565:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
+            break;
+         default:
+         ; /* fallthrough */
+      }
+   }
+
    if (ctx->Extensions.MESA_ycbcr_texture) {
       if (internalFormat == GL_YCBCR_MESA) {
          if (type == GL_UNSIGNED_SHORT_8_8_MESA)
@@ -267,7 +289,6 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
-#if FEATURE_texture_fxt1
    if (ctx->Extensions.TDFX_texture_compression_FXT1) {
       switch (internalFormat) {
          case GL_COMPRESSED_RGB_FXT1_3DFX:
@@ -280,10 +301,10 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
             ; /* fallthrough */
       }
    }
-#endif
 
-#if FEATURE_texture_s3tc
-   if (ctx->Extensions.EXT_texture_compression_s3tc) {
+   if (ctx->Extensions.EXT_texture_compression_s3tc ||
+       (ctx->API == API_OPENGLES2 &&
+       ctx->Extensions.ANGLE_texture_compression_dxt)) {
       switch (internalFormat) {
          case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
            RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
@@ -316,13 +337,13 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
             ; /* fallthrough */
       }
    }
-#endif
 
    if (ctx->Extensions.ARB_texture_float) {
       switch (internalFormat) {
          case GL_ALPHA16F_ARB:
            RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT16);
            RETURN_IF_SUPPORTED(MESA_FORMAT_ALPHA_FLOAT32);
+           RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
            RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
            break;
          case GL_ALPHA32F_ARB:
@@ -334,6 +355,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
          case GL_LUMINANCE16F_ARB:
            RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT16);
            RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_FLOAT32);
+           RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
            RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
            break;
          case GL_LUMINANCE32F_ARB:
@@ -345,6 +367,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
          case GL_LUMINANCE_ALPHA16F_ARB:
            RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16);
            RETURN_IF_SUPPORTED(MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32);
+           RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
            RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
            break;
          case GL_LUMINANCE_ALPHA32F_ARB:
@@ -356,6 +379,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
          case GL_INTENSITY16F_ARB:
            RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT16);
            RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_FLOAT32);
+           RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
            RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
            break;
          case GL_INTENSITY32F_ARB:
@@ -529,7 +553,6 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
-#if FEATURE_EXT_texture_sRGB
    if (ctx->Extensions.EXT_texture_sRGB) {
       switch (internalFormat) {
          case GL_SRGB_EXT:
@@ -561,22 +584,17 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
            RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
            break;
          case GL_COMPRESSED_SRGB_EXT:
-#if FEATURE_texture_s3tc
             if (ctx->Extensions.EXT_texture_compression_s3tc)
               RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
-#endif
            RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB8);
            RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
            break;
          case GL_COMPRESSED_SRGB_ALPHA_EXT:
-#if FEATURE_texture_s3tc
             if (ctx->Extensions.EXT_texture_compression_s3tc)
               RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
-#endif
            RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA8);
            RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
            break;
-#if FEATURE_texture_s3tc
          case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
             if (ctx->Extensions.EXT_texture_compression_s3tc)
               RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
@@ -588,21 +606,23 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
            RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
             break;
          case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
-            if (ctx->Extensions.EXT_texture_compression_s3tc)
+            if (ctx->Extensions.EXT_texture_compression_s3tc ||
+               (ctx->API == API_OPENGLES2 &&
+                ctx->Extensions.ANGLE_texture_compression_dxt))
               RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3);
            RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
             break;
          case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
-            if (ctx->Extensions.EXT_texture_compression_s3tc)
+            if (ctx->Extensions.EXT_texture_compression_s3tc ||
+               (ctx->API == API_OPENGLES2 &&
+                ctx->Extensions.ANGLE_texture_compression_dxt))
               RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT5);
            RETURN_IF_SUPPORTED(MESA_FORMAT_SARGB8);
             break;
-#endif
          default:
             ; /* fallthrough */
       }
    }
-#endif /* FEATURE_EXT_texture_sRGB */
 
    if (ctx->Extensions.EXT_texture_integer) {
       switch (internalFormat) {
@@ -702,6 +722,12 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
          RETURN_IF_SUPPORTED(MESA_FORMAT_INTENSITY_INT32);
          RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_INT32);
          break;
+      }
+   }
+
+   if (ctx->Version >= 30 ||
+       ctx->Extensions.EXT_texture_integer) {
+      switch (internalFormat) {
       case GL_RGB8UI_EXT:
          RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
          RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
@@ -755,7 +781,8 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
         break;
 
       case GL_COMPRESSED_RED:
-        RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
+         if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
+            RETURN_IF_SUPPORTED(MESA_FORMAT_RED_RGTC1);
         RETURN_IF_SUPPORTED(MESA_FORMAT_R8);
         break;
 
@@ -769,7 +796,8 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
         break;
 
       case GL_COMPRESSED_RG:
-        RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
+         if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
+            RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
         RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
         break;
 
@@ -786,21 +814,31 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       switch (internalFormat) {
       case GL_R16F:
         RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
         RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
         break;
       case GL_R32F:
         RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
         break;
       case GL_RG16F:
         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
         break;
       case GL_RG32F:
         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
         RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
         break;
 
       default:
@@ -808,7 +846,9 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
-   if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.EXT_texture_integer) {
+   if (ctx->Version >= 30 ||
+       (ctx->Extensions.ARB_texture_rg &&
+        ctx->Extensions.EXT_texture_integer)) {
       switch (internalFormat) {
       case GL_R8UI:
          RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
@@ -855,6 +895,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       switch (internalFormat) {
       case GL_RGB10_A2UI:
          RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
+         RETURN_IF_SUPPORTED(MESA_FORMAT_ABGR2101010_UINT);
          break;
       default:
          break;
@@ -862,7 +903,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
    }
    /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
     */
-   if (ctx->API != API_OPENGL) {
+   if (_mesa_is_gles(ctx)) {
       switch (internalFormat) {
       case GL_BGRA:
         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);