mesa texstore: handle signed/unsigned integer clamping

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Jordan Justen
2012-06-25 14:16:11 -07:00
parent 7208505d30
commit b3dd048cbb
+75 -20
View File
@@ -3200,6 +3200,7 @@ _mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
srcPacking);
const GLuint *src = tempImage;
GLint img, row;
GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
@@ -3207,8 +3208,14 @@ _mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
for (row = 0; row < srcHeight; row++) {
GLbyte *dstTexel = (GLbyte *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLbyte) src[i];
if (is_unsigned) {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLbyte) MIN2(src[i], 0x7f);
}
} else {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLbyte) CLAMP((GLint) src[i], -0x80, 0x7f);
}
}
dstRow += dstRowStride;
src += srcWidth * components;
@@ -3270,6 +3277,7 @@ _mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
srcPacking);
const GLuint *src = tempImage;
GLint img, row;
GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
@@ -3277,8 +3285,14 @@ _mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
for (row = 0; row < srcHeight; row++) {
GLshort *dstTexel = (GLshort *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLint) src[i];
if (is_unsigned) {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLshort) MIN2(src[i], 0x7fff);
}
} else {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLshort)CLAMP((GLint) src[i], -0x8000, 0x7fff);
}
}
dstRow += dstRowStride;
src += srcWidth * components;
@@ -3340,6 +3354,7 @@ _mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
srcPacking);
const GLuint *src = tempImage;
GLint img, row;
GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
@@ -3347,8 +3362,14 @@ _mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
for (row = 0; row < srcHeight; row++) {
GLint *dstTexel = (GLint *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLint) src[i];
if (is_unsigned) {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLint) MIN2(src[i], 0x7fffffff);
}
} else {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLint) src[i];
}
}
dstRow += dstRowStride;
src += srcWidth * components;
@@ -3407,6 +3428,7 @@ _mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
srcFormat, srcType, srcAddr, srcPacking);
const GLuint *src = tempImage;
GLint img, row;
GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
@@ -3414,8 +3436,14 @@ _mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
for (row = 0; row < srcHeight; row++) {
GLubyte *dstTexel = (GLubyte *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff);
if (is_unsigned) {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLubyte) MIN2(src[i], 0xff);
}
} else {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLubyte) CLAMP((GLint) src[i], 0, 0xff);
}
}
dstRow += dstRowStride;
src += srcWidth * components;
@@ -3474,6 +3502,7 @@ _mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
srcFormat, srcType, srcAddr, srcPacking);
const GLuint *src = tempImage;
GLint img, row;
GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
@@ -3481,8 +3510,14 @@ _mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
for (row = 0; row < srcHeight; row++) {
GLushort *dstTexel = (GLushort *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff);
if (is_unsigned) {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLushort) MIN2(src[i], 0xffff);
}
} else {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLushort) CLAMP((GLint) src[i], 0, 0xffff);
}
}
dstRow += dstRowStride;
src += srcWidth * components;
@@ -3540,6 +3575,7 @@ _mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr, srcPacking);
const GLuint *src = tempImage;
GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
GLint img, row;
if (!tempImage)
return GL_FALSE;
@@ -3548,8 +3584,14 @@ _mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
for (row = 0; row < srcHeight; row++) {
GLuint *dstTexel = (GLuint *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = src[i];
if (is_unsigned) {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = src[i];
}
} else {
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = MAX2((GLint) src[i], 0);
}
}
dstRow += dstRowStride;
src += srcWidth * components;
@@ -3867,6 +3909,7 @@ _mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS)
srcPacking);
const GLuint *src = tempImage;
GLint img, row, col;
GLboolean is_unsigned = _mesa_is_type_unsigned(srcType);
if (!tempImage)
return GL_FALSE;
for (img = 0; img < srcDepth; img++) {
@@ -3874,14 +3917,26 @@ _mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS)
for (row = 0; row < srcHeight; row++) {
GLuint *dstUI = (GLuint *) dstRow;
for (col = 0; col < srcWidth; col++) {
GLushort a,r,g,b;
r = src[RCOMP];
g = src[GCOMP];
b = src[BCOMP];
a = src[ACOMP];
dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
src += 4;
if (is_unsigned) {
for (col = 0; col < srcWidth; col++) {
GLushort a,r,g,b;
r = MIN2(src[RCOMP], 0x3ff);
g = MIN2(src[GCOMP], 0x3ff);
b = MIN2(src[BCOMP], 0x3ff);
a = MIN2(src[ACOMP], 0x003);
dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
src += 4;
}
} else {
for (col = 0; col < srcWidth; col++) {
GLushort a,r,g,b;
r = CLAMP((GLint) src[RCOMP], 0, 0x3ff);
g = CLAMP((GLint) src[GCOMP], 0, 0x3ff);
b = CLAMP((GLint) src[BCOMP], 0, 0x3ff);
a = CLAMP((GLint) src[ACOMP], 0, 0x003);
dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b);
src += 4;
}
}
dstRow += dstRowStride;
}