mesa: reimplement IROUND(), add F_TO_I()
[mesa.git] / src / mesa / main / texformat.c
index ee9552bc0d9d87feb86308e127ec6e45ad807608..5fdc2ab1f7957e69bdca1085b36868822c8c82e1 100644 (file)
@@ -118,6 +118,8 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
         break;
       case GL_R3_G3_B2:
         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB332);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_RGB565_REV);
         RETURN_IF_SUPPORTED(MESA_FORMAT_RGB888);
         RETURN_IF_SUPPORTED(MESA_FORMAT_XRGB8888);
         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB8888);
@@ -321,6 +323,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint 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:
@@ -332,6 +335,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:
@@ -343,6 +347,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:
@@ -354,6 +359,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:
@@ -700,6 +706,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->VersionMajor >= 3 ||
+       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);
@@ -763,12 +775,12 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
 
       case GL_RG:
       case GL_RG8:
-        RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
         break;
 
       case GL_COMPRESSED_RG:
         RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2);
-        RETURN_IF_SUPPORTED(MESA_FORMAT_RG88);
+        RETURN_IF_SUPPORTED(MESA_FORMAT_GR88);
         break;
 
       case GL_RG16:
@@ -784,21 +796,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:
@@ -806,7 +828,9 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
-   if (ctx->Extensions.ARB_texture_rg && ctx->Extensions.EXT_texture_integer) {
+   if (ctx->VersionMajor >= 3 ||
+       (ctx->Extensions.ARB_texture_rg &&
+        ctx->Extensions.EXT_texture_integer)) {
       switch (internalFormat) {
       case GL_R8UI:
          RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
@@ -849,6 +873,15 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
+   if (ctx->Extensions.ARB_texture_rgb10_a2ui) {
+      switch (internalFormat) {
+      case GL_RGB10_A2UI:
+         RETURN_IF_SUPPORTED(MESA_FORMAT_ARGB2101010_UINT);
+         break;
+      default:
+         break;
+      }
+   }
    /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0).
     */
    if (ctx->API != API_OPENGL) {
@@ -910,6 +943,16 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
+   if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
+      switch (internalFormat) {
+         case GL_ETC1_RGB8_OES:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_ETC1_RGB8);
+            break;
+         default:
+            ; /* fallthrough */
+      }
+   }
+
    _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
                  _mesa_lookup_enum_by_nr(internalFormat));
    return MESA_FORMAT_NONE;