mesa: initial support for unnormalized integer texture formats
As defined by GL_EXT_texture_integer.
This commit is contained in:
@@ -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;
|
||||
|
@@ -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 */
|
||||
/* ---- ---- ---- ---- ---- ---- ---- ---- */
|
||||
/**
|
||||
|
@@ -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 ||
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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,
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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 */
|
||||
}
|
||||
|
||||
|
@@ -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 },
|
||||
|
Reference in New Issue
Block a user