summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoland Scheidegger <sroland@vmware.com>2011-04-14 23:36:51 +0200
committerRoland Scheidegger <sroland@vmware.com>2011-05-20 01:43:40 +0200
commitbe0a2f62f3a5bc6f05c3c7c6b674f2688aee031d (patch)
tree8642e9aa4dff67c48ec7de1f6d2dee032e320386
parent339544f4bbef9be1b4b3465f28482b9699a99692 (diff)
mesa: handle some srgb cases in the fast path in _mesa_get_teximage
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).
-rw-r--r--src/mesa/main/texgetimage.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
index 467baa20af..b23317c46a 100644
--- a/src/mesa/main/texgetimage.c
+++ b/src/mesa/main/texgetimage.c
@@ -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;