@@ -45,172 +45,6 @@ bytes_per_pixel(GLenum datatype, GLuint comps) | |||
} | |||
static void | |||
mesa_format_to_type_and_comps(const struct gl_texture_format *format, | |||
GLenum *datatype, GLuint *comps) | |||
{ | |||
switch (format->MesaFormat) { | |||
case MESA_FORMAT_RGBA8888: | |||
case MESA_FORMAT_RGBA8888_REV: | |||
case MESA_FORMAT_ARGB8888: | |||
case MESA_FORMAT_ARGB8888_REV: | |||
*datatype = CHAN_TYPE; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_RGB888: | |||
case MESA_FORMAT_BGR888: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_RGB565: | |||
case MESA_FORMAT_RGB565_REV: | |||
*datatype = GL_UNSIGNED_SHORT_5_6_5; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_ARGB4444: | |||
case MESA_FORMAT_ARGB4444_REV: | |||
*datatype = GL_UNSIGNED_SHORT_4_4_4_4; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_ARGB1555: | |||
case MESA_FORMAT_ARGB1555_REV: | |||
*datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_AL88: | |||
case MESA_FORMAT_AL88_REV: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_RGB332: | |||
*datatype = GL_UNSIGNED_BYTE_3_3_2; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_A8: | |||
case MESA_FORMAT_L8: | |||
case MESA_FORMAT_I8: | |||
case MESA_FORMAT_CI8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_YCBCR: | |||
case MESA_FORMAT_YCBCR_REV: | |||
*datatype = GL_UNSIGNED_SHORT; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_Z24_S8: | |||
*datatype = GL_UNSIGNED_INT; | |||
*comps = 1; /* XXX OK? */ | |||
return; | |||
case MESA_FORMAT_Z16: | |||
*datatype = GL_UNSIGNED_SHORT; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_Z32: | |||
*datatype = GL_UNSIGNED_INT; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_SRGB8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_SRGBA8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_SL8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_SLA8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_RGB_FXT1: | |||
case MESA_FORMAT_RGBA_FXT1: | |||
case MESA_FORMAT_RGB_DXT1: | |||
case MESA_FORMAT_RGBA_DXT1: | |||
case MESA_FORMAT_RGBA_DXT3: | |||
case MESA_FORMAT_RGBA_DXT5: | |||
/* XXX generate error instead? */ | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 0; | |||
return; | |||
case MESA_FORMAT_RGBA: | |||
*datatype = CHAN_TYPE; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_RGB: | |||
*datatype = CHAN_TYPE; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_LUMINANCE_ALPHA: | |||
*datatype = CHAN_TYPE; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_ALPHA: | |||
case MESA_FORMAT_LUMINANCE: | |||
case MESA_FORMAT_INTENSITY: | |||
*datatype = CHAN_TYPE; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_RGBA_FLOAT32: | |||
*datatype = GL_FLOAT; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_RGBA_FLOAT16: | |||
*datatype = GL_HALF_FLOAT_ARB; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_RGB_FLOAT32: | |||
*datatype = GL_FLOAT; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_RGB_FLOAT16: | |||
*datatype = GL_HALF_FLOAT_ARB; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32: | |||
*datatype = GL_FLOAT; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16: | |||
*datatype = GL_HALF_FLOAT_ARB; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_ALPHA_FLOAT32: | |||
case MESA_FORMAT_LUMINANCE_FLOAT32: | |||
case MESA_FORMAT_INTENSITY_FLOAT32: | |||
*datatype = GL_FLOAT; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_ALPHA_FLOAT16: | |||
case MESA_FORMAT_LUMINANCE_FLOAT16: | |||
case MESA_FORMAT_INTENSITY_FLOAT16: | |||
*datatype = GL_HALF_FLOAT_ARB; | |||
*comps = 1; | |||
return; | |||
default: | |||
_mesa_problem(NULL, "bad texture format in mesa_format_to_type_and_comps"); | |||
*datatype = 0; | |||
*comps = 1; | |||
} | |||
} | |||
/** | |||
* Average together two rows of a source image to produce a single new | |||
* row in the dest image. It's legal for the two source rows to point | |||
@@ -1085,7 +919,7 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target, | |||
convertFormat = srcImage->TexFormat; | |||
} | |||
mesa_format_to_type_and_comps(convertFormat, &datatype, &comps); | |||
_mesa_format_to_type_and_comps(convertFormat, &datatype, &comps); | |||
for (level = texObj->BaseLevel; level < texObj->MaxLevel | |||
&& level < maxLevels - 1; level++) { |
@@ -1569,3 +1569,174 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, | |||
_mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()"); | |||
return NULL; | |||
} | |||
/** | |||
* Return datatype and number of components per texel for the | |||
* given gl_texture_format. | |||
*/ | |||
void | |||
_mesa_format_to_type_and_comps(const struct gl_texture_format *format, | |||
GLenum *datatype, GLuint *comps) | |||
{ | |||
switch (format->MesaFormat) { | |||
case MESA_FORMAT_RGBA8888: | |||
case MESA_FORMAT_RGBA8888_REV: | |||
case MESA_FORMAT_ARGB8888: | |||
case MESA_FORMAT_ARGB8888_REV: | |||
*datatype = CHAN_TYPE; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_RGB888: | |||
case MESA_FORMAT_BGR888: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_RGB565: | |||
case MESA_FORMAT_RGB565_REV: | |||
*datatype = GL_UNSIGNED_SHORT_5_6_5; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_ARGB4444: | |||
case MESA_FORMAT_ARGB4444_REV: | |||
*datatype = GL_UNSIGNED_SHORT_4_4_4_4; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_ARGB1555: | |||
case MESA_FORMAT_ARGB1555_REV: | |||
*datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_AL88: | |||
case MESA_FORMAT_AL88_REV: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_RGB332: | |||
*datatype = GL_UNSIGNED_BYTE_3_3_2; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_A8: | |||
case MESA_FORMAT_L8: | |||
case MESA_FORMAT_I8: | |||
case MESA_FORMAT_CI8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_YCBCR: | |||
case MESA_FORMAT_YCBCR_REV: | |||
*datatype = GL_UNSIGNED_SHORT; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_Z24_S8: | |||
*datatype = GL_UNSIGNED_INT; | |||
*comps = 1; /* XXX OK? */ | |||
return; | |||
case MESA_FORMAT_Z16: | |||
*datatype = GL_UNSIGNED_SHORT; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_Z32: | |||
*datatype = GL_UNSIGNED_INT; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_SRGB8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_SRGBA8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_SL8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_SLA8: | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_RGB_FXT1: | |||
case MESA_FORMAT_RGBA_FXT1: | |||
case MESA_FORMAT_RGB_DXT1: | |||
case MESA_FORMAT_RGBA_DXT1: | |||
case MESA_FORMAT_RGBA_DXT3: | |||
case MESA_FORMAT_RGBA_DXT5: | |||
/* XXX generate error instead? */ | |||
*datatype = GL_UNSIGNED_BYTE; | |||
*comps = 0; | |||
return; | |||
case MESA_FORMAT_RGBA: | |||
*datatype = CHAN_TYPE; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_RGB: | |||
*datatype = CHAN_TYPE; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_LUMINANCE_ALPHA: | |||
*datatype = CHAN_TYPE; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_ALPHA: | |||
case MESA_FORMAT_LUMINANCE: | |||
case MESA_FORMAT_INTENSITY: | |||
*datatype = CHAN_TYPE; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_RGBA_FLOAT32: | |||
*datatype = GL_FLOAT; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_RGBA_FLOAT16: | |||
*datatype = GL_HALF_FLOAT_ARB; | |||
*comps = 4; | |||
return; | |||
case MESA_FORMAT_RGB_FLOAT32: | |||
*datatype = GL_FLOAT; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_RGB_FLOAT16: | |||
*datatype = GL_HALF_FLOAT_ARB; | |||
*comps = 3; | |||
return; | |||
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32: | |||
*datatype = GL_FLOAT; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16: | |||
*datatype = GL_HALF_FLOAT_ARB; | |||
*comps = 2; | |||
return; | |||
case MESA_FORMAT_ALPHA_FLOAT32: | |||
case MESA_FORMAT_LUMINANCE_FLOAT32: | |||
case MESA_FORMAT_INTENSITY_FLOAT32: | |||
*datatype = GL_FLOAT; | |||
*comps = 1; | |||
return; | |||
case MESA_FORMAT_ALPHA_FLOAT16: | |||
case MESA_FORMAT_LUMINANCE_FLOAT16: | |||
case MESA_FORMAT_INTENSITY_FLOAT16: | |||
*datatype = GL_HALF_FLOAT_ARB; | |||
*comps = 1; | |||
return; | |||
default: | |||
_mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps"); | |||
*datatype = 0; | |||
*comps = 1; | |||
} | |||
} |
@@ -239,4 +239,10 @@ extern const struct gl_texture_format * | |||
_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat, | |||
GLenum format, GLenum type ); | |||
extern void | |||
_mesa_format_to_type_and_comps(const struct gl_texture_format *format, | |||
GLenum *datatype, GLuint *comps); | |||
#endif |