mesa: handle some srgb cases in the fast path in _mesa_get_teximage
authorRoland Scheidegger <sroland@vmware.com>
Thu, 14 Apr 2011 21:36:51 +0000 (23:36 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Thu, 19 May 2011 23:43:40 +0000 (01:43 +0200)
Previously, always did unorm8->float/nonlinear-to-linear conversion (using
lookup table), then convert back to nonlinear (using the expensive math
func pow among others), and finally convert back to int (assuming caller
wants unorm8), because the float texture fetch function is used for getting
the actual texel values. This should probably all be changed at some point,
but for now simply enable the memcpy path also for srgb formats (but if for
instance swizzling is required, still the whole conversion will be done).

src/mesa/main/texgetimage.c

index 467baa20af4980934d5a087015a87e94098f6e0d..b23317c46a06d79058ca371f07e6efa4f8e0a27c 100644 (file)
@@ -418,21 +418,24 @@ get_tex_memcpy(struct gl_context *ctx, GLenum format, GLenum type, GLvoid *pixel
         texObj->Target == GL_TEXTURE_RECTANGLE ||
         (texObj->Target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X &&
          texObj->Target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))) {
-      if (texImage->TexFormat == MESA_FORMAT_ARGB8888 &&
+      if ((texImage->TexFormat == MESA_FORMAT_ARGB8888 ||
+             texImage->TexFormat == MESA_FORMAT_SARGB8) &&
           format == GL_BGRA &&
-          type == GL_UNSIGNED_BYTE &&
+          (type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_INT_8_8_8_8_REV) &&
           !ctx->Pack.SwapBytes &&
           _mesa_little_endian()) {
          memCopy = GL_TRUE;
       }
-      else if (texImage->TexFormat == MESA_FORMAT_AL88 &&
+      else if ((texImage->TexFormat == MESA_FORMAT_AL88 ||
+                  texImage->TexFormat == MESA_FORMAT_SLA8) &&
                format == GL_LUMINANCE_ALPHA &&
                type == GL_UNSIGNED_BYTE &&
                !ctx->Pack.SwapBytes &&
                _mesa_little_endian()) {
          memCopy = GL_TRUE;
       }
-      else if (texImage->TexFormat == MESA_FORMAT_L8 &&
+      else if ((texImage->TexFormat == MESA_FORMAT_L8 ||
+                  texImage->TexFormat == MESA_FORMAT_SL8) &&
                format == GL_LUMINANCE &&
                type == GL_UNSIGNED_BYTE) {
          memCopy = GL_TRUE;