mesa: initial support for unnormalized integer texture formats

As defined by GL_EXT_texture_integer.
This commit is contained in:
Brian Paul
2010-07-05 20:07:07 -06:00
parent e54164b4e3
commit abd5627a6a
9 changed files with 1140 additions and 133 deletions

View File

@@ -48,7 +48,7 @@ struct gl_format_info
/**
* Logical data type: one of GL_UNSIGNED_NORMALIZED, GL_SIGNED_NORMALED,
* GL_UNSIGNED_INT, GL_SIGNED_INT, GL_FLOAT.
* GL_UNSIGNED_INT, GL_INT, GL_FLOAT.
*/
GLenum DataType;
@@ -628,6 +628,66 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
0, 16, 0, 0, 0,
1, 1, 2
},
/* unnormalized signed int formats */
{
MESA_FORMAT_RGBA_INT8,
"MESA_FORMAT_RGBA_INT8",
GL_RGBA,
GL_INT,
8, 8, 8, 8,
0, 0, 0, 0, 0,
1, 1, 4
},
{
MESA_FORMAT_RGBA_INT16,
"MESA_FORMAT_RGBA_INT16",
GL_RGBA,
GL_INT,
16, 16, 16, 16,
0, 0, 0, 0, 0,
1, 1, 8
},
{
MESA_FORMAT_RGBA_INT32,
"MESA_FORMAT_RGBA_INT32",
GL_RGBA,
GL_INT,
32, 32, 32, 32,
0, 0, 0, 0, 0,
1, 1, 16
},
/* unnormalized unsigned int formats */
{
MESA_FORMAT_RGBA_UINT8,
"MESA_FORMAT_RGBA_UINT8",
GL_RGBA,
GL_UNSIGNED_INT,
8, 8, 8, 8,
0, 0, 0, 0, 0,
1, 1, 4
},
{
MESA_FORMAT_RGBA_UINT16,
"MESA_FORMAT_RGBA_UINT16",
GL_RGBA,
GL_UNSIGNED_INT,
16, 16, 16, 16,
0, 0, 0, 0, 0,
1, 1, 8
},
{
MESA_FORMAT_RGBA_UINT32,
"MESA_FORMAT_RGBA_UINT32",
GL_RGBA,
GL_UNSIGNED_INT,
32, 32, 32, 32,
0, 0, 0, 0, 0,
1, 1, 16
},
{
MESA_FORMAT_DUDV8,
"MESA_FORMAT_DUDV8",
@@ -1230,6 +1290,36 @@ _mesa_format_to_type_and_comps(gl_format format,
*comps = 1;
return;
case MESA_FORMAT_RGBA_INT8:
*datatype = GL_BYTE;
*comps = 4;
return;
case MESA_FORMAT_RGBA_INT16:
*datatype = GL_SHORT;
*comps = 4;
return;
case MESA_FORMAT_RGBA_INT32:
*datatype = GL_INT;
*comps = 4;
return;
/**
* \name Non-normalized unsigned integer formats.
*/
case MESA_FORMAT_RGBA_UINT8:
*datatype = GL_UNSIGNED_BYTE;
*comps = 4;
return;
case MESA_FORMAT_RGBA_UINT16:
*datatype = GL_UNSIGNED_SHORT;
*comps = 4;
return;
case MESA_FORMAT_RGBA_UINT32:
*datatype = GL_UNSIGNED_INT;
*comps = 4;
return;
default:
_mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps");
*datatype = 0;

View File

@@ -130,6 +130,22 @@ typedef enum
MESA_FORMAT_INTENSITY_FLOAT16,
/*@}*/
/**
* \name Non-normalized signed integer formats.
* XXX Note: these are just stand-ins for some better hardware
* formats TBD such as BGRA or ARGB.
*/
MESA_FORMAT_RGBA_INT8,
MESA_FORMAT_RGBA_INT16,
MESA_FORMAT_RGBA_INT32,
/**
* \name Non-normalized unsigned integer formats.
*/
MESA_FORMAT_RGBA_UINT8,
MESA_FORMAT_RGBA_UINT16,
MESA_FORMAT_RGBA_UINT32,
/* msb <------ TEXEL BITS -----------> lsb */
/* ---- ---- ---- ---- ---- ---- ---- ---- */
/**

View File

@@ -274,17 +274,25 @@ _mesa_components_in_format( GLenum format )
case GL_STENCIL_INDEX:
case GL_DEPTH_COMPONENT:
case GL_RED:
case GL_RED_INTEGER_EXT:
case GL_GREEN:
case GL_GREEN_INTEGER_EXT:
case GL_BLUE:
case GL_BLUE_INTEGER_EXT:
case GL_ALPHA:
case GL_ALPHA_INTEGER_EXT:
case GL_LUMINANCE:
case GL_LUMINANCE_INTEGER_EXT:
case GL_INTENSITY:
return 1;
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE_ALPHA_INTEGER_EXT:
return 2;
case GL_RGB:
case GL_RGB_INTEGER_EXT:
return 3;
case GL_RGBA:
case GL_RGBA_INTEGER_EXT:
return 4;
case GL_BGR:
return 3;
@@ -523,6 +531,28 @@ _mesa_is_legal_format_and_type( GLcontext *ctx, GLenum format, GLenum type )
default:
return GL_FALSE;
}
case GL_RED_INTEGER_EXT:
case GL_GREEN_INTEGER_EXT:
case GL_BLUE_INTEGER_EXT:
case GL_ALPHA_INTEGER_EXT:
case GL_RGB_INTEGER_EXT:
case GL_RGBA_INTEGER_EXT:
case GL_BGR_INTEGER_EXT:
case GL_BGRA_INTEGER_EXT:
case GL_LUMINANCE_INTEGER_EXT:
case GL_LUMINANCE_ALPHA_INTEGER_EXT:
switch (type) {
case GL_BYTE:
case GL_UNSIGNED_BYTE:
case GL_SHORT:
case GL_UNSIGNED_SHORT:
case GL_INT:
case GL_UNSIGNED_INT:
return ctx->Extensions.EXT_texture_integer;
default:
return GL_FALSE;
}
default:
; /* fall-through */
}
@@ -776,6 +806,30 @@ _mesa_is_dudv_format(GLenum format)
}
/**
* Test if the given format is an integer (non-normalized) format.
*/
GLboolean
_mesa_is_integer_format(GLenum format)
{
switch (format) {
case GL_RED_INTEGER_EXT:
case GL_GREEN_INTEGER_EXT:
case GL_BLUE_INTEGER_EXT:
case GL_ALPHA_INTEGER_EXT:
case GL_RGB_INTEGER_EXT:
case GL_RGBA_INTEGER_EXT:
case GL_BGR_INTEGER_EXT:
case GL_BGRA_INTEGER_EXT:
case GL_LUMINANCE_INTEGER_EXT:
case GL_LUMINANCE_ALPHA_INTEGER_EXT:
return GL_TRUE;
default:
return GL_FALSE;
}
}
/**
* Test if an image format is a supported compressed format.
* \param format the internal format token provided by the user.
@@ -3275,6 +3329,8 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLint redIndex, greenIndex, blueIndex, alphaIndex;
GLint stride;
GLint rComp, bComp, gComp, aComp;
GLboolean intFormat;
GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */
ASSERT(srcFormat == GL_RED ||
srcFormat == GL_GREEN ||
@@ -3289,7 +3345,17 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
srcFormat == GL_BGRA ||
srcFormat == GL_ABGR_EXT ||
srcFormat == GL_DU8DV8_ATI ||
srcFormat == GL_DUDV_ATI);
srcFormat == GL_DUDV_ATI ||
srcFormat == GL_RED_INTEGER_EXT ||
srcFormat == GL_GREEN_INTEGER_EXT ||
srcFormat == GL_BLUE_INTEGER_EXT ||
srcFormat == GL_ALPHA_INTEGER_EXT ||
srcFormat == GL_RGB_INTEGER_EXT ||
srcFormat == GL_RGBA_INTEGER_EXT ||
srcFormat == GL_BGR_INTEGER_EXT ||
srcFormat == GL_BGRA_INTEGER_EXT ||
srcFormat == GL_LUMINANCE_INTEGER_EXT ||
srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
ASSERT(srcType == GL_UNSIGNED_BYTE ||
srcType == GL_BYTE ||
@@ -3316,31 +3382,37 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
switch (srcFormat) {
case GL_RED:
case GL_RED_INTEGER_EXT:
redIndex = 0;
greenIndex = blueIndex = alphaIndex = -1;
stride = 1;
break;
case GL_GREEN:
case GL_GREEN_INTEGER_EXT:
greenIndex = 0;
redIndex = blueIndex = alphaIndex = -1;
stride = 1;
break;
case GL_BLUE:
case GL_BLUE_INTEGER_EXT:
blueIndex = 0;
redIndex = greenIndex = alphaIndex = -1;
stride = 1;
break;
case GL_ALPHA:
case GL_ALPHA_INTEGER_EXT:
redIndex = greenIndex = blueIndex = -1;
alphaIndex = 0;
stride = 1;
break;
case GL_LUMINANCE:
case GL_LUMINANCE_INTEGER_EXT:
redIndex = greenIndex = blueIndex = 0;
alphaIndex = -1;
stride = 1;
break;
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE_ALPHA_INTEGER_EXT:
redIndex = greenIndex = blueIndex = 0;
alphaIndex = 1;
stride = 2;
@@ -3350,6 +3422,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
stride = 1;
break;
case GL_RGB:
case GL_RGB_INTEGER:
redIndex = 0;
greenIndex = 1;
blueIndex = 2;
@@ -3372,6 +3445,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
stride = 3;
break;
case GL_RGBA:
case GL_RGBA_INTEGER:
redIndex = 0;
greenIndex = 1;
blueIndex = 2;
@@ -3418,14 +3492,22 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
return;
}
intFormat = _mesa_is_integer_format(srcFormat);
#define PROCESS(INDEX, CHANNEL, DEFAULT, TYPE, CONVERSION) \
#define PROCESS(INDEX, CHANNEL, DEFAULT, DEFAULT_INT, TYPE, CONVERSION) \
if ((INDEX) < 0) { \
GLuint i; \
if (intFormat) { \
for (i = 0; i < n; i++) { \
rgba[i][CHANNEL] = DEFAULT_INT; \
} \
} \
else { \
for (i = 0; i < n; i++) { \
rgba[i][CHANNEL] = DEFAULT; \
} \
} \
} \
else if (swapBytes) { \
const TYPE *s = (const TYPE *) src; \
GLuint i; \
@@ -3437,6 +3519,9 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
else if (sizeof(TYPE) == 4) { \
SWAP4BYTE(value); \
} \
if (intFormat) \
rgba[i][CHANNEL] = (GLfloat) value; \
else \
rgba[i][CHANNEL] = (GLfloat) CONVERSION(value); \
s += stride; \
} \
@@ -3444,70 +3529,83 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
else { \
const TYPE *s = (const TYPE *) src; \
GLuint i; \
if (intFormat) { \
for (i = 0; i < n; i++) { \
rgba[i][CHANNEL] = (GLfloat) s[INDEX]; \
s += stride; \
} \
} \
else { \
for (i = 0; i < n; i++) { \
rgba[i][CHANNEL] = (GLfloat) CONVERSION(s[INDEX]); \
s += stride; \
} \
} \
}
switch (srcType) {
case GL_UNSIGNED_BYTE:
PROCESS(redIndex, RCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLubyte, UBYTE_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLubyte, UBYTE_TO_FLOAT);
PROCESS(redIndex, RCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, 0, GLubyte, UBYTE_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT);
break;
case GL_BYTE:
PROCESS(redIndex, RCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLbyte, BYTE_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLbyte, BYTE_TO_FLOAT);
PROCESS(redIndex, RCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, 0, GLbyte, BYTE_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOAT);
break;
case GL_UNSIGNED_SHORT:
PROCESS(redIndex, RCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLushort, USHORT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLushort, USHORT_TO_FLOAT);
PROCESS(redIndex, RCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, 0, GLushort, USHORT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT);
break;
case GL_SHORT:
PROCESS(redIndex, RCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLshort, SHORT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLshort, SHORT_TO_FLOAT);
PROCESS(redIndex, RCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, 0, GLshort, SHORT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOAT);
break;
case GL_UNSIGNED_INT:
PROCESS(redIndex, RCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLuint, UINT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLuint, UINT_TO_FLOAT);
PROCESS(redIndex, RCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, 0, GLuint, UINT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT);
break;
case GL_INT:
PROCESS(redIndex, RCOMP, 0.0F, GLint, INT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, GLint, INT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, GLint, INT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, GLint, INT_TO_FLOAT);
PROCESS(redIndex, RCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
PROCESS(greenIndex, GCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
PROCESS(blueIndex, BCOMP, 0.0F, 0, GLint, INT_TO_FLOAT);
PROCESS(alphaIndex, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT);
break;
case GL_FLOAT:
PROCESS(redIndex, RCOMP, 0.0F, GLfloat, (GLfloat));
PROCESS(greenIndex, GCOMP, 0.0F, GLfloat, (GLfloat));
PROCESS(blueIndex, BCOMP, 0.0F, GLfloat, (GLfloat));
PROCESS(alphaIndex, ACOMP, 1.0F, GLfloat, (GLfloat));
PROCESS(redIndex, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
PROCESS(greenIndex, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
PROCESS(blueIndex, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
PROCESS(alphaIndex, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
break;
case GL_HALF_FLOAT_ARB:
PROCESS(redIndex, RCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
PROCESS(greenIndex, GCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
PROCESS(blueIndex, BCOMP, 0.0F, GLhalfARB, _mesa_half_to_float);
PROCESS(alphaIndex, ACOMP, 1.0F, GLhalfARB, _mesa_half_to_float);
PROCESS(redIndex, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
PROCESS(greenIndex, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
PROCESS(blueIndex, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
PROCESS(alphaIndex, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float);
break;
case GL_UNSIGNED_BYTE_3_3_2:
{
const GLubyte *ubsrc = (const GLubyte *) src;
GLuint i;
if (!intFormat) {
rs = 1.0F / 7.0F;
gs = 1.0F / 7.0F;
bs = 1.0F / 3.0F;
}
for (i = 0; i < n; i ++) {
GLubyte p = ubsrc[i];
rgba[i][rComp] = ((p >> 5) ) * (1.0F / 7.0F);
rgba[i][gComp] = ((p >> 2) & 0x7) * (1.0F / 7.0F);
rgba[i][bComp] = ((p ) & 0x3) * (1.0F / 3.0F);
rgba[i][rComp] = ((p >> 5) ) * rs;
rgba[i][gComp] = ((p >> 2) & 0x7) * gs;
rgba[i][bComp] = ((p ) & 0x3) * bs;
rgba[i][aComp] = 1.0F;
}
}
@@ -3516,25 +3614,35 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
{
const GLubyte *ubsrc = (const GLubyte *) src;
GLuint i;
if (!intFormat) {
rs = 1.0F / 7.0F;
gs = 1.0F / 7.0F;
bs = 1.0F / 3.0F;
}
for (i = 0; i < n; i ++) {
GLubyte p = ubsrc[i];
rgba[i][rComp] = ((p ) & 0x7) * (1.0F / 7.0F);
rgba[i][gComp] = ((p >> 3) & 0x7) * (1.0F / 7.0F);
rgba[i][bComp] = ((p >> 6) ) * (1.0F / 3.0F);
rgba[i][rComp] = ((p ) & 0x7) * rs;
rgba[i][gComp] = ((p >> 3) & 0x7) * gs;
rgba[i][bComp] = ((p >> 6) ) * bs;
rgba[i][aComp] = 1.0F;
}
}
break;
case GL_UNSIGNED_SHORT_5_6_5:
if (!intFormat) {
rs = 1.0F / 31.0F;
gs = 1.0F / 63.0F;
bs = 1.0F / 31.0F;
}
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 5) & 0x3f) * (1.0F / 63.0F);
rgba[i][bComp] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][rComp] = ((p >> 11) ) * rs;
rgba[i][gComp] = ((p >> 5) & 0x3f) * gs;
rgba[i][bComp] = ((p ) & 0x1f) * bs;
rgba[i][aComp] = 1.0F;
}
}
@@ -3543,23 +3651,28 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 5) & 0x3f) * (1.0F / 63.0F);
rgba[i][bComp] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][rComp] = ((p >> 11) ) * rs;
rgba[i][gComp] = ((p >> 5) & 0x3f) * gs;
rgba[i][bComp] = ((p ) & 0x1f) * bs;
rgba[i][aComp] = 1.0F;
}
}
break;
case GL_UNSIGNED_SHORT_5_6_5_REV:
if (!intFormat) {
rs = 1.0F / 31.0F;
gs = 1.0F / 63.0F;
bs = 1.0F / 31.0F;
}
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 5) & 0x3f) * (1.0F / 63.0F);
rgba[i][bComp] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][rComp] = ((p ) & 0x1f) * rs;
rgba[i][gComp] = ((p >> 5) & 0x3f) * gs;
rgba[i][bComp] = ((p >> 11) ) * bs;
rgba[i][aComp] = 1.0F;
}
}
@@ -3568,24 +3681,27 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 5) & 0x3f) * (1.0F / 63.0F);
rgba[i][bComp] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][rComp] = ((p ) & 0x1f) * rs;
rgba[i][gComp] = ((p >> 5) & 0x3f) * gs;
rgba[i][bComp] = ((p >> 11) ) * bs;
rgba[i][aComp] = 1.0F;
}
}
break;
case GL_UNSIGNED_SHORT_4_4_4_4:
if (!intFormat) {
rs = gs = bs = as = 1.0F / 15.0F;
}
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F);
rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F);
rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F);
rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F);
rgba[i][rComp] = ((p >> 12) ) * rs;
rgba[i][gComp] = ((p >> 8) & 0xf) * gs;
rgba[i][bComp] = ((p >> 4) & 0xf) * bs;
rgba[i][aComp] = ((p ) & 0xf) * as;
}
}
else {
@@ -3593,24 +3709,27 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p >> 12) ) * (1.0F / 15.0F);
rgba[i][gComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F);
rgba[i][bComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F);
rgba[i][aComp] = ((p ) & 0xf) * (1.0F / 15.0F);
rgba[i][rComp] = ((p >> 12) ) * rs;
rgba[i][gComp] = ((p >> 8) & 0xf) * gs;
rgba[i][bComp] = ((p >> 4) & 0xf) * bs;
rgba[i][aComp] = ((p ) & 0xf) * as;
}
}
break;
case GL_UNSIGNED_SHORT_4_4_4_4_REV:
if (!intFormat) {
rs = gs = bs = as = 1.0F / 15.0F;
}
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F);
rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F);
rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F);
rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F);
rgba[i][rComp] = ((p ) & 0xf) * rs;
rgba[i][gComp] = ((p >> 4) & 0xf) * gs;
rgba[i][bComp] = ((p >> 8) & 0xf) * bs;
rgba[i][aComp] = ((p >> 12) ) * as;
}
}
else {
@@ -3618,24 +3737,27 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p ) & 0xf) * (1.0F / 15.0F);
rgba[i][gComp] = ((p >> 4) & 0xf) * (1.0F / 15.0F);
rgba[i][bComp] = ((p >> 8) & 0xf) * (1.0F / 15.0F);
rgba[i][aComp] = ((p >> 12) ) * (1.0F / 15.0F);
rgba[i][rComp] = ((p ) & 0xf) * rs;
rgba[i][gComp] = ((p >> 4) & 0xf) * gs;
rgba[i][bComp] = ((p >> 8) & 0xf) * bs;
rgba[i][aComp] = ((p >> 12) ) * as;
}
}
break;
case GL_UNSIGNED_SHORT_5_5_5_1:
if (!intFormat) {
rs = gs = bs = 1.0F / 31.0F;
}
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F);
rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F);
rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F);
rgba[i][rComp] = ((p >> 11) ) * rs;
rgba[i][gComp] = ((p >> 6) & 0x1f) * gs;
rgba[i][bComp] = ((p >> 1) & 0x1f) * bs;
rgba[i][aComp] = ((p ) & 0x1) * as;
}
}
else {
@@ -3643,24 +3765,27 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p >> 11) ) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 6) & 0x1f) * (1.0F / 31.0F);
rgba[i][bComp] = ((p >> 1) & 0x1f) * (1.0F / 31.0F);
rgba[i][aComp] = ((p ) & 0x1) * (1.0F / 1.0F);
rgba[i][rComp] = ((p >> 11) ) * rs;
rgba[i][gComp] = ((p >> 6) & 0x1f) * gs;
rgba[i][bComp] = ((p >> 1) & 0x1f) * bs;
rgba[i][aComp] = ((p ) & 0x1) * as;
}
}
break;
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
if (!intFormat) {
rs = gs = bs = 1.0F / 31.0F;
}
if (swapBytes) {
const GLushort *ussrc = (const GLushort *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
SWAP2BYTE(p);
rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F);
rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F);
rgba[i][rComp] = ((p ) & 0x1f) * rs;
rgba[i][gComp] = ((p >> 5) & 0x1f) * gs;
rgba[i][bComp] = ((p >> 10) & 0x1f) * bs;
rgba[i][aComp] = ((p >> 15) ) * as;
}
}
else {
@@ -3668,10 +3793,10 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLuint i;
for (i = 0; i < n; i ++) {
GLushort p = ussrc[i];
rgba[i][rComp] = ((p ) & 0x1f) * (1.0F / 31.0F);
rgba[i][gComp] = ((p >> 5) & 0x1f) * (1.0F / 31.0F);
rgba[i][bComp] = ((p >> 10) & 0x1f) * (1.0F / 31.0F);
rgba[i][aComp] = ((p >> 15) ) * (1.0F / 1.0F);
rgba[i][rComp] = ((p ) & 0x1f) * rs;
rgba[i][gComp] = ((p >> 5) & 0x1f) * gs;
rgba[i][bComp] = ((p >> 10) & 0x1f) * bs;
rgba[i][aComp] = ((p >> 15) ) * as;
}
}
break;
@@ -3679,6 +3804,16 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
if (swapBytes) {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
if (intFormat) {
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = (GLfloat) ((p ) & 0xff);
rgba[i][gComp] = (GLfloat) ((p >> 8) & 0xff);
rgba[i][bComp] = (GLfloat) ((p >> 16) & 0xff);
rgba[i][aComp] = (GLfloat) ((p >> 24) );
}
}
else {
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff);
@@ -3687,9 +3822,20 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) );
}
}
}
else {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
if (intFormat) {
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = (GLfloat) ((p >> 24) );
rgba[i][gComp] = (GLfloat) ((p >> 16) & 0xff);
rgba[i][bComp] = (GLfloat) ((p >> 8) & 0xff);
rgba[i][aComp] = (GLfloat) ((p ) & 0xff);
}
}
else {
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) );
@@ -3698,11 +3844,22 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff);
}
}
}
break;
case GL_UNSIGNED_INT_8_8_8_8_REV:
if (swapBytes) {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
if (intFormat) {
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = (GLfloat) ((p >> 24) );
rgba[i][gComp] = (GLfloat) ((p >> 16) & 0xff);
rgba[i][bComp] = (GLfloat) ((p >> 8) & 0xff);
rgba[i][aComp] = (GLfloat) ((p ) & 0xff);
}
}
else {
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = UBYTE_TO_FLOAT((p >> 24) );
@@ -3711,9 +3868,20 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
rgba[i][aComp] = UBYTE_TO_FLOAT((p ) & 0xff);
}
}
}
else {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
if (intFormat) {
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = (GLfloat) ((p ) & 0xff);
rgba[i][gComp] = (GLfloat) ((p >> 8) & 0xff);
rgba[i][bComp] = (GLfloat) ((p >> 16) & 0xff);
rgba[i][aComp] = (GLfloat) ((p >> 24) );
}
}
else {
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = UBYTE_TO_FLOAT((p ) & 0xff);
@@ -3722,18 +3890,25 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
rgba[i][aComp] = UBYTE_TO_FLOAT((p >> 24) );
}
}
}
break;
case GL_UNSIGNED_INT_10_10_10_2:
if (!intFormat) {
rs = 1.0F / 1023.0F;
gs = 1.0F / 1023.0F;
bs = 1.0F / 1023.0F;
as = 1.0F / 3.0F;
}
if (swapBytes) {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
SWAP4BYTE(p);
rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F);
rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F);
rgba[i][rComp] = ((p >> 22) ) * rs;
rgba[i][gComp] = ((p >> 12) & 0x3ff) * gs;
rgba[i][bComp] = ((p >> 2) & 0x3ff) * bs;
rgba[i][aComp] = ((p ) & 0x3 ) * as;
}
}
else {
@@ -3741,24 +3916,30 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = ((p >> 22) ) * (1.0F / 1023.0F);
rgba[i][gComp] = ((p >> 12) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][bComp] = ((p >> 2) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][aComp] = ((p ) & 0x3 ) * (1.0F / 3.0F);
rgba[i][rComp] = ((p >> 22) ) * rs;
rgba[i][gComp] = ((p >> 12) & 0x3ff) * gs;
rgba[i][bComp] = ((p >> 2) & 0x3ff) * bs;
rgba[i][aComp] = ((p ) & 0x3 ) * as;
}
}
break;
case GL_UNSIGNED_INT_2_10_10_10_REV:
if (!intFormat) {
rs = 1.0F / 1023.0F;
gs = 1.0F / 1023.0F;
bs = 1.0F / 1023.0F;
as = 1.0F / 3.0F;
}
if (swapBytes) {
const GLuint *uisrc = (const GLuint *) src;
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
SWAP4BYTE(p);
rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F);
rgba[i][rComp] = ((p ) & 0x3ff) * rs;
rgba[i][gComp] = ((p >> 10) & 0x3ff) * gs;
rgba[i][bComp] = ((p >> 20) & 0x3ff) * bs;
rgba[i][aComp] = ((p >> 30) ) * as;
}
}
else {
@@ -3766,10 +3947,10 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
GLuint i;
for (i = 0; i < n; i ++) {
GLuint p = uisrc[i];
rgba[i][rComp] = ((p ) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][gComp] = ((p >> 10) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][bComp] = ((p >> 20) & 0x3ff) * (1.0F / 1023.0F);
rgba[i][aComp] = ((p >> 30) ) * (1.0F / 3.0F);
rgba[i][rComp] = ((p ) & 0x3ff) * rs;
rgba[i][gComp] = ((p >> 10) & 0x3ff) * gs;
rgba[i][bComp] = ((p >> 20) & 0x3ff) * bs;
rgba[i][aComp] = ((p >> 30) ) * as;
}
}
break;
@@ -4161,6 +4342,16 @@ _mesa_unpack_color_span_float( GLcontext *ctx,
srcFormat == GL_RGBA ||
srcFormat == GL_BGRA ||
srcFormat == GL_ABGR_EXT ||
srcFormat == GL_RED_INTEGER_EXT ||
srcFormat == GL_GREEN_INTEGER_EXT ||
srcFormat == GL_BLUE_INTEGER_EXT ||
srcFormat == GL_ALPHA_INTEGER_EXT ||
srcFormat == GL_RGB_INTEGER_EXT ||
srcFormat == GL_RGBA_INTEGER_EXT ||
srcFormat == GL_BGR_INTEGER_EXT ||
srcFormat == GL_BGRA_INTEGER_EXT ||
srcFormat == GL_LUMINANCE_INTEGER_EXT ||
srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT ||
srcFormat == GL_COLOR_INDEX);
ASSERT(srcType == GL_BITMAP ||

View File

@@ -78,6 +78,9 @@ _mesa_is_depth_or_stencil_format(GLenum format);
extern GLboolean
_mesa_is_dudv_format(GLenum format);
extern GLboolean
_mesa_is_integer_format(GLenum format);
extern GLboolean
_mesa_is_compressed_format(GLcontext *ctx, GLenum format);

View File

@@ -552,6 +552,54 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
fetch_texel_3d_f_intensity_f16,
store_texel_intensity_f16
},
/* non-normalized, signed int */
{
MESA_FORMAT_RGBA_INT8,
fetch_texel_1d_rgba_int8,
fetch_texel_2d_rgba_int8,
fetch_texel_3d_rgba_int8,
store_texel_rgba_int8
},
{
MESA_FORMAT_RGBA_INT16,
fetch_texel_1d_rgba_int16,
fetch_texel_2d_rgba_int16,
fetch_texel_3d_rgba_int16,
store_texel_rgba_int16
},
{
MESA_FORMAT_RGBA_INT32,
fetch_texel_1d_rgba_int32,
fetch_texel_2d_rgba_int32,
fetch_texel_3d_rgba_int32,
store_texel_rgba_int32
},
/* non-normalized, unsigned int */
{
MESA_FORMAT_RGBA_UINT8,
fetch_texel_1d_rgba_uint8,
fetch_texel_2d_rgba_uint8,
fetch_texel_3d_rgba_uint8,
store_texel_rgba_uint8
},
{
MESA_FORMAT_RGBA_UINT16,
fetch_texel_1d_rgba_uint16,
fetch_texel_2d_rgba_uint16,
fetch_texel_3d_rgba_uint16,
store_texel_rgba_uint16
},
{
MESA_FORMAT_RGBA_UINT32,
fetch_texel_1d_rgba_uint32,
fetch_texel_2d_rgba_uint32,
fetch_texel_3d_rgba_uint32,
store_texel_rgba_uint32
},
/* dudv */
{
MESA_FORMAT_DUDV8,
fetch_texel_1d_dudv8,
@@ -559,6 +607,8 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
fetch_texel_3d_dudv8,
NULL
},
/* signed, normalized */
{
MESA_FORMAT_SIGNED_R8,
fetch_texel_1d_signed_r8,

View File

@@ -1195,6 +1195,174 @@ static void store_texel_sla8(struct gl_texture_image *texImage,
#endif
/* MESA_FORMAT_RGBA_INT8 **************************************************/
static void
FETCH(rgba_int8)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 4);
texel[RCOMP] = (GLfloat) src[0];
texel[GCOMP] = (GLfloat) src[1];
texel[BCOMP] = (GLfloat) src[2];
texel[ACOMP] = (GLfloat) src[3];
}
#if DIM == 3
static void
store_texel_rgba_int8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLbyte *rgba = (const GLbyte *) texel;
GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 4);
dst[0] = rgba[RCOMP];
dst[1] = rgba[GCOMP];
dst[2] = rgba[BCOMP];
dst[3] = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_RGBA_INT16 **************************************************/
static void
FETCH(rgba_int16)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLshort *src = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
texel[RCOMP] = (GLfloat) src[0];
texel[GCOMP] = (GLfloat) src[1];
texel[BCOMP] = (GLfloat) src[2];
texel[ACOMP] = (GLfloat) src[3];
}
#if DIM == 3
static void
store_texel_rgba_int16(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLshort *rgba = (const GLshort *) texel;
GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
dst[0] = rgba[RCOMP];
dst[1] = rgba[GCOMP];
dst[2] = rgba[BCOMP];
dst[3] = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_RGBA_INT32 **************************************************/
static void
FETCH(rgba_int32)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLint *src = TEXEL_ADDR(GLint, texImage, i, j, k, 4);
texel[RCOMP] = (GLfloat) src[0];
texel[GCOMP] = (GLfloat) src[1];
texel[BCOMP] = (GLfloat) src[2];
texel[ACOMP] = (GLfloat) src[3];
}
#if DIM == 3
static void
store_texel_rgba_int32(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLint *rgba = (const GLint *) texel;
GLint *dst = TEXEL_ADDR(GLint, texImage, i, j, k, 4);
dst[0] = rgba[RCOMP];
dst[1] = rgba[GCOMP];
dst[2] = rgba[BCOMP];
dst[3] = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_RGBA_UINT8 **************************************************/
static void
FETCH(rgba_uint8)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 4);
texel[RCOMP] = (GLfloat) src[0];
texel[GCOMP] = (GLfloat) src[1];
texel[BCOMP] = (GLfloat) src[2];
texel[ACOMP] = (GLfloat) src[3];
}
#if DIM == 3
static void
store_texel_rgba_uint8(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLubyte *rgba = (const GLubyte *) texel;
GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 4);
dst[0] = rgba[RCOMP];
dst[1] = rgba[GCOMP];
dst[2] = rgba[BCOMP];
dst[3] = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_RGBA_UINT16 **************************************************/
static void
FETCH(rgba_uint16)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
texel[RCOMP] = (GLfloat) src[0];
texel[GCOMP] = (GLfloat) src[1];
texel[BCOMP] = (GLfloat) src[2];
texel[ACOMP] = (GLfloat) src[3];
}
#if DIM == 3
static void
store_texel_rgba_uint16(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLushort *rgba = (const GLushort *) texel;
GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
dst[0] = rgba[RCOMP];
dst[1] = rgba[GCOMP];
dst[2] = rgba[BCOMP];
dst[3] = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_RGBA_UINT32 **************************************************/
static void
FETCH(rgba_uint32)(const struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, GLfloat *texel )
{
const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 4);
texel[RCOMP] = (GLfloat) src[0];
texel[GCOMP] = (GLfloat) src[1];
texel[BCOMP] = (GLfloat) src[2];
texel[ACOMP] = (GLfloat) src[3];
}
#if DIM == 3
static void
store_texel_rgba_uint32(struct gl_texture_image *texImage,
GLint i, GLint j, GLint k, const void *texel)
{
const GLuint *rgba = (const GLuint *) texel;
GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 4);
dst[0] = rgba[RCOMP];
dst[1] = rgba[GCOMP];
dst[2] = rgba[BCOMP];
dst[3] = rgba[ACOMP];
}
#endif
/* MESA_FORMAT_DUDV8 ********************************************************/
/* this format by definition produces 0,0,0,1 as rgba values,

View File

@@ -382,6 +382,53 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
}
#endif /* FEATURE_EXT_texture_sRGB */
if (ctx->Extensions.EXT_texture_integer) {
switch (internalFormat) {
case GL_RGBA32UI_EXT:
case GL_RGB32UI_EXT:
case GL_ALPHA32UI_EXT:
case GL_INTENSITY32UI_EXT:
case GL_LUMINANCE32UI_EXT:
case GL_LUMINANCE_ALPHA32UI_EXT:
return MESA_FORMAT_RGBA_UINT32;
case GL_RGBA16UI_EXT:
case GL_RGB16UI_EXT:
case GL_ALPHA16UI_EXT:
case GL_INTENSITY16UI_EXT:
case GL_LUMINANCE16UI_EXT:
case GL_LUMINANCE_ALPHA16UI_EXT:
return MESA_FORMAT_RGBA_UINT16;
case GL_RGBA8UI_EXT:
case GL_RGB8UI_EXT:
case GL_ALPHA8UI_EXT:
case GL_INTENSITY8UI_EXT:
case GL_LUMINANCE8UI_EXT:
case GL_LUMINANCE_ALPHA8UI_EXT:
return MESA_FORMAT_RGBA_UINT8;
case GL_RGBA32I_EXT:
case GL_RGB32I_EXT:
case GL_ALPHA32I_EXT:
case GL_INTENSITY32I_EXT:
case GL_LUMINANCE32I_EXT:
case GL_LUMINANCE_ALPHA32I_EXT:
return MESA_FORMAT_RGBA_INT32;
case GL_RGBA16I_EXT:
case GL_RGB16I_EXT:
case GL_ALPHA16I_EXT:
case GL_INTENSITY16I_EXT:
case GL_LUMINANCE16I_EXT:
case GL_LUMINANCE_ALPHA16I_EXT:
return MESA_FORMAT_RGBA_INT16;
case GL_RGBA8I_EXT:
case GL_RGB8I_EXT:
case GL_ALPHA8I_EXT:
case GL_INTENSITY8I_EXT:
case GL_LUMINANCE8I_EXT:
case GL_LUMINANCE_ALPHA8I_EXT:
return MESA_FORMAT_RGBA_INT8;
}
}
_mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
return MESA_FORMAT_NONE;
}

View File

@@ -351,9 +351,57 @@ _mesa_base_tex_format( GLcontext *ctx, GLint internalFormat )
; /* fallthrough */
}
}
#endif /* FEATURE_EXT_texture_sRGB */
if (ctx->Extensions.EXT_texture_integer) {
switch (internalFormat) {
case GL_RGBA8UI_EXT:
case GL_RGBA16UI_EXT:
case GL_RGBA32UI_EXT:
case GL_RGBA8I_EXT:
case GL_RGBA16I_EXT:
case GL_RGBA32I_EXT:
return GL_RGBA;
case GL_RGB8UI_EXT:
case GL_RGB16UI_EXT:
case GL_RGB32UI_EXT:
case GL_RGB8I_EXT:
case GL_RGB16I_EXT:
case GL_RGB32I_EXT:
return GL_RGB;
case GL_ALPHA8UI_EXT:
case GL_ALPHA16UI_EXT:
case GL_ALPHA32UI_EXT:
case GL_ALPHA8I_EXT:
case GL_ALPHA16I_EXT:
case GL_ALPHA32I_EXT:
return GL_ALPHA;
case GL_INTENSITY8UI_EXT:
case GL_INTENSITY16UI_EXT:
case GL_INTENSITY32UI_EXT:
case GL_INTENSITY8I_EXT:
case GL_INTENSITY16I_EXT:
case GL_INTENSITY32I_EXT:
return GL_INTENSITY;
case GL_LUMINANCE8UI_EXT:
case GL_LUMINANCE16UI_EXT:
case GL_LUMINANCE32UI_EXT:
case GL_LUMINANCE8I_EXT:
case GL_LUMINANCE16I_EXT:
case GL_LUMINANCE32I_EXT:
return GL_LUMINANCE;
case GL_LUMINANCE_ALPHA8UI_EXT:
case GL_LUMINANCE_ALPHA16UI_EXT:
case GL_LUMINANCE_ALPHA32UI_EXT:
case GL_LUMINANCE_ALPHA8I_EXT:
case GL_LUMINANCE_ALPHA16I_EXT:
case GL_LUMINANCE_ALPHA32I_EXT:
return GL_LUMINANCE_ALPHA;
default:
; /* fallthrough */
}
}
return -1; /* error */
}

View File

@@ -3278,6 +3278,392 @@ _mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
}
/* non-normalized, signed int8 */
static GLboolean
_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
{
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
const GLint components = _mesa_components_in_format(baseFormat);
ASSERT(dstFormat == MESA_FORMAT_RGBA_INT8);
ASSERT(baseInternalFormat == GL_RGBA ||
baseInternalFormat == GL_RGB ||
baseInternalFormat == GL_ALPHA ||
baseInternalFormat == GL_LUMINANCE ||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
baseInternalFormat == GL_INTENSITY);
ASSERT(texelBytes == components * sizeof(GLbyte));
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_BYTE) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = make_temp_float_image(ctx, dims,
baseInternalFormat,
baseFormat,
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr,
srcPacking);
const GLfloat *src = tempImage;
GLint img, row;
if (!tempImage)
return GL_FALSE;
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLbyte *dstTexel = (GLbyte *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLbyte) src[i];
}
dstRow += dstRowStride;
src += srcWidth * components;
}
}
free((void *) tempImage);
}
return GL_TRUE;
}
/* non-normalized, signed int16 */
static GLboolean
_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
{
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
const GLint components = _mesa_components_in_format(baseFormat);
ASSERT(dstFormat == MESA_FORMAT_RGBA_INT16);
ASSERT(baseInternalFormat == GL_RGBA ||
baseInternalFormat == GL_RGB ||
baseInternalFormat == GL_ALPHA ||
baseInternalFormat == GL_LUMINANCE ||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
baseInternalFormat == GL_INTENSITY);
ASSERT(texelBytes == components * sizeof(GLshort));
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_INT) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = make_temp_float_image(ctx, dims,
baseInternalFormat,
baseFormat,
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr,
srcPacking);
const GLfloat *src = tempImage;
GLint img, row;
if (!tempImage)
return GL_FALSE;
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLshort *dstTexel = (GLshort *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLint) src[i];
}
dstRow += dstRowStride;
src += srcWidth * components;
}
}
free((void *) tempImage);
}
return GL_TRUE;
}
/* non-normalized, signed int32 */
static GLboolean
_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
{
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
const GLint components = _mesa_components_in_format(baseFormat);
ASSERT(dstFormat == MESA_FORMAT_RGBA_INT32);
ASSERT(baseInternalFormat == GL_RGBA ||
baseInternalFormat == GL_RGB ||
baseInternalFormat == GL_ALPHA ||
baseInternalFormat == GL_LUMINANCE ||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
baseInternalFormat == GL_INTENSITY);
ASSERT(texelBytes == components * sizeof(GLint));
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_INT) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = make_temp_float_image(ctx, dims,
baseInternalFormat,
baseFormat,
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr,
srcPacking);
const GLfloat *src = tempImage;
GLint img, row;
if (!tempImage)
return GL_FALSE;
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLint *dstTexel = (GLint *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLint) src[i];
}
dstRow += dstRowStride;
src += srcWidth * components;
}
}
free((void *) tempImage);
}
return GL_TRUE;
}
/* non-normalized, unsigned int8 */
static GLboolean
_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
{
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
const GLint components = _mesa_components_in_format(baseFormat);
ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT8);
ASSERT(baseInternalFormat == GL_RGBA ||
baseInternalFormat == GL_RGB ||
baseInternalFormat == GL_ALPHA ||
baseInternalFormat == GL_LUMINANCE ||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
baseInternalFormat == GL_INTENSITY);
ASSERT(texelBytes == components * sizeof(GLubyte));
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_UNSIGNED_BYTE) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = make_temp_float_image(ctx, dims,
baseInternalFormat,
baseFormat,
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr,
srcPacking);
const GLfloat *src = tempImage;
GLint img, row;
if (!tempImage)
return GL_FALSE;
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLubyte *dstTexel = (GLubyte *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLubyte) src[i];
}
dstRow += dstRowStride;
src += srcWidth * components;
}
}
free((void *) tempImage);
}
return GL_TRUE;
}
/* non-normalized, unsigned int16 */
static GLboolean
_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
{
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
const GLint components = _mesa_components_in_format(baseFormat);
ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT16);
ASSERT(baseInternalFormat == GL_RGBA ||
baseInternalFormat == GL_RGB ||
baseInternalFormat == GL_ALPHA ||
baseInternalFormat == GL_LUMINANCE ||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
baseInternalFormat == GL_INTENSITY);
ASSERT(texelBytes == components * sizeof(GLushort));
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_UNSIGNED_SHORT) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = make_temp_float_image(ctx, dims,
baseInternalFormat,
baseFormat,
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr,
srcPacking);
const GLfloat *src = tempImage;
GLint img, row;
if (!tempImage)
return GL_FALSE;
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLushort *dstTexel = (GLushort *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLushort) src[i];
}
dstRow += dstRowStride;
src += srcWidth * components;
}
}
free((void *) tempImage);
}
return GL_TRUE;
}
/* non-normalized, unsigned int32 */
static GLboolean
_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
{
const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
const GLint components = _mesa_components_in_format(baseFormat);
ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT32);
ASSERT(baseInternalFormat == GL_RGBA ||
baseInternalFormat == GL_RGB ||
baseInternalFormat == GL_ALPHA ||
baseInternalFormat == GL_LUMINANCE ||
baseInternalFormat == GL_LUMINANCE_ALPHA ||
baseInternalFormat == GL_INTENSITY);
ASSERT(texelBytes == components * sizeof(GLuint));
if (!ctx->_ImageTransferState &&
!srcPacking->SwapBytes &&
baseInternalFormat == srcFormat &&
srcType == GL_UNSIGNED_INT) {
/* simple memcpy path */
memcpy_texture(ctx, dims,
dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
dstRowStride,
dstImageOffsets,
srcWidth, srcHeight, srcDepth, srcFormat, srcType,
srcAddr, srcPacking);
}
else {
/* general path */
const GLfloat *tempImage = make_temp_float_image(ctx, dims,
baseInternalFormat,
baseFormat,
srcWidth, srcHeight, srcDepth,
srcFormat, srcType, srcAddr,
srcPacking);
const GLfloat *src = tempImage;
GLint img, row;
if (!tempImage)
return GL_FALSE;
_mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight);
for (img = 0; img < srcDepth; img++) {
GLubyte *dstRow = (GLubyte *) dstAddr
+ dstImageOffsets[dstZoffset + img] * texelBytes
+ dstYoffset * dstRowStride
+ dstXoffset * texelBytes;
for (row = 0; row < srcHeight; row++) {
GLuint *dstTexel = (GLuint *) dstRow;
GLint i;
for (i = 0; i < srcWidth * components; i++) {
dstTexel[i] = (GLuint) src[i];
}
dstRow += dstRowStride;
src += srcWidth * components;
}
}
free((void *) tempImage);
}
return GL_TRUE;
}
#if FEATURE_EXT_texture_sRGB
static GLboolean
_mesa_texstore_srgb8(TEXSTORE_PARAMS)
@@ -3472,6 +3858,14 @@ texstore_funcs[MESA_FORMAT_COUNT] =
{ MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
{ MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 },
{ MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 },
{ MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 },
{ MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 },
{ MESA_FORMAT_RGBA_INT32, _mesa_texstore_rgba_int32 },
{ MESA_FORMAT_RGBA_UINT8, _mesa_texstore_rgba_uint8 },
{ MESA_FORMAT_RGBA_UINT16, _mesa_texstore_rgba_uint16 },
{ MESA_FORMAT_RGBA_UINT32, _mesa_texstore_rgba_uint32 },
{ MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 },
{ MESA_FORMAT_SIGNED_R8, _mesa_texstore_signed_r8 },