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:
+75
-20
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user