Browse Source

move _mesa_format_to_type_and_comps() to texformat.c

tags/mesa_20090313
Brian 17 years ago
parent
commit
a217d0c7d0
3 changed files with 178 additions and 167 deletions
  1. 1
    167
      src/mesa/main/mipmap.c
  2. 171
    0
      src/mesa/main/texformat.c
  3. 6
    0
      src/mesa/main/texformat.h

+ 1
- 167
src/mesa/main/mipmap.c View File

@@ -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++) {

+ 171
- 0
src/mesa/main/texformat.c View File

@@ -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;
}
}

+ 6
- 0
src/mesa/main/texformat.h View File

@@ -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

Loading…
Cancel
Save