a little more work on GL_SGIS_generate_mipmap

This commit is contained in:
Brian Paul 2001-05-22 21:49:03 +00:00
parent 6b1e4ea5a5
commit 8bd0693101
1 changed files with 192 additions and 5 deletions

View File

@ -1,4 +1,4 @@
/* $Id: texstore.c,v 1.25 2001/05/21 16:41:03 brianp Exp $ */
/* $Id: texstore.c,v 1.26 2001/05/22 21:49:03 brianp Exp $ */
/*
* Mesa 3-D graphics library
@ -1011,9 +1011,194 @@ do_row(const struct gl_texture_format *format, GLint dstWidth,
}
return;
case MESA_FORMAT_DEPTH_COMPONENT:
/* XXX do hardware texture formats */
{
GLuint i, j;
const GLfloat *rowA = (const GLfloat *) srcRowA;
const GLfloat *rowB = (const GLfloat *) srcRowB;
GLfloat *dst = (GLfloat *) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
dst[i] = (rowA[j] + rowA[j+1] + rowB[j] + rowB[j+1]) * 0.25F;
}
}
return;
/* Begin hardware formats */
case MESA_FORMAT_RGBA8888:
case MESA_FORMAT_ARGB8888:
{
GLuint i, j;
const GLubyte (*rowA)[4] = (const GLubyte (*)[4]) srcRowA;
const GLubyte (*rowB)[4] = (const GLubyte (*)[4]) srcRowB;
GLubyte (*dst)[4] = (GLubyte (*)[4]) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
dst[i][0] = (rowA[j][0] + rowA[j+1][0] +
rowB[j][0] + rowB[j+1][0]) >> 2;
dst[i][1] = (rowA[j][1] + rowA[j+1][1] +
rowB[j][1] + rowB[j+1][1]) >> 2;
dst[i][2] = (rowA[j][2] + rowA[j+1][2] +
rowB[j][2] + rowB[j+1][2]) >> 2;
dst[i][3] = (rowA[j][3] + rowA[j+1][3] +
rowB[j][3] + rowB[j+1][3]) >> 2;
}
}
return;
case MESA_FORMAT_RGB888:
{
GLuint i, j;
const GLubyte (*rowA)[3] = (const GLubyte (*)[3]) srcRowA;
const GLubyte (*rowB)[3] = (const GLubyte (*)[3]) srcRowB;
GLubyte (*dst)[3] = (GLubyte (*)[3]) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
dst[i][0] = (rowA[j][0] + rowA[j+1][0] +
rowB[j][0] + rowB[j+1][0]) >> 2;
dst[i][1] = (rowA[j][1] + rowA[j+1][1] +
rowB[j][1] + rowB[j+1][1]) >> 2;
dst[i][2] = (rowA[j][2] + rowA[j+1][2] +
rowB[j][2] + rowB[j+1][2]) >> 2;
}
}
return;
case MESA_FORMAT_RGB565:
{
GLuint i, j;
const GLushort *rowA = (const GLushort *) srcRowA;
const GLushort *rowB = (const GLushort *) srcRowB;
GLushort *dst = (GLushort *) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
const GLint rowAr0 = rowA[j] & 0x1f;
const GLint rowAr1 = rowA[j+1] & 0x1f;
const GLint rowBr0 = rowB[j] & 0x1f;
const GLint rowBr1 = rowB[j+1] & 0x1f;
const GLint rowAg0 = (rowA[j] >> 5) & 0x3f;
const GLint rowAg1 = (rowA[j+1] >> 5) & 0x3f;
const GLint rowBg0 = (rowB[j] >> 5) & 0x3f;
const GLint rowBg1 = (rowB[j+1] >> 5) & 0x3f;
const GLint rowAb0 = (rowA[j] >> 11) & 0x1f;
const GLint rowAb1 = (rowA[j+1] >> 11) & 0x1f;
const GLint rowBb0 = (rowB[j] >> 11) & 0x1f;
const GLint rowBb1 = (rowB[j+1] >> 11) & 0x1f;
const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 4;
const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 4;
const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 4;
dst[i] = (blue << 11) | (green << 5) | red;
}
}
return;
case MESA_FORMAT_ARGB4444:
{
GLuint i, j;
const GLushort *rowA = (const GLushort *) srcRowA;
const GLushort *rowB = (const GLushort *) srcRowB;
GLushort *dst = (GLushort *) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
const GLint rowAr0 = rowA[j] & 0xf;
const GLint rowAr1 = rowA[j+1] & 0xf;
const GLint rowBr0 = rowB[j] & 0xf;
const GLint rowBr1 = rowB[j+1] & 0xf;
const GLint rowAg0 = (rowA[j] >> 4) & 0xf;
const GLint rowAg1 = (rowA[j+1] >> 4) & 0xf;
const GLint rowBg0 = (rowB[j] >> 4) & 0xf;
const GLint rowBg1 = (rowB[j+1] >> 4) & 0xf;
const GLint rowAb0 = (rowA[j] >> 8) & 0xf;
const GLint rowAb1 = (rowA[j+1] >> 8) & 0xf;
const GLint rowBb0 = (rowB[j] >> 8) & 0xf;
const GLint rowBb1 = (rowB[j+1] >> 8) & 0xf;
const GLint rowAa0 = (rowA[j] >> 12) & 0xf;
const GLint rowAa1 = (rowA[j+1] >> 12) & 0xf;
const GLint rowBa0 = (rowB[j] >> 12) & 0xf;
const GLint rowBa1 = (rowB[j+1] >> 12) & 0xf;
const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 4;
const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 4;
const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 4;
const GLint alpha = (rowAa0 + rowAa1 + rowBa0 + rowBa1) >> 4;
dst[i] = (alpha << 12) | (blue << 8) | (green << 4) | red;
}
}
return;
case MESA_FORMAT_ARGB1555:
{
GLuint i, j;
const GLushort *rowA = (const GLushort *) srcRowA;
const GLushort *rowB = (const GLushort *) srcRowB;
GLushort *dst = (GLushort *) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
const GLint rowAr0 = rowA[j] & 0x1f;
const GLint rowAr1 = rowA[j+1] & 0x1f;
const GLint rowBr0 = rowB[j] & 0x1f;
const GLint rowBr1 = rowB[j+1] & 0xf;
const GLint rowAg0 = (rowA[j] >> 5) & 0x1f;
const GLint rowAg1 = (rowA[j+1] >> 5) & 0x1f;
const GLint rowBg0 = (rowB[j] >> 5) & 0x1f;
const GLint rowBg1 = (rowB[j+1] >> 5) & 0x1f;
const GLint rowAb0 = (rowA[j] >> 10) & 0x1f;
const GLint rowAb1 = (rowA[j+1] >> 10) & 0x1f;
const GLint rowBb0 = (rowB[j] >> 10) & 0x1f;
const GLint rowBb1 = (rowB[j+1] >> 10) & 0x1f;
const GLint rowAa0 = (rowA[j] >> 15) & 0x1;
const GLint rowAa1 = (rowA[j+1] >> 15) & 0x1;
const GLint rowBa0 = (rowB[j] >> 15) & 0x1;
const GLint rowBa1 = (rowB[j+1] >> 15) & 0x1;
const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 4;
const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 4;
const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 4;
const GLint alpha = (rowAa0 + rowAa1 + rowBa0 + rowBa1) >> 4;
dst[i] = (alpha << 15) | (blue << 10) | (green << 5) | red;
}
}
return;
case MESA_FORMAT_AL88:
{
GLuint i, j;
const GLubyte (*rowA)[2] = (const GLubyte (*)[2]) srcRowA;
const GLubyte (*rowB)[2] = (const GLubyte (*)[2]) srcRowB;
GLubyte (*dst)[2] = (GLubyte (*)[2]) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
dst[i][0] = (rowA[j][0] + rowA[j+1][0] +
rowB[j][0] + rowB[j+1][0]) >> 2;
dst[i][1] = (rowA[j][1] + rowA[j+1][1] +
rowB[j][1] + rowB[j+1][1]) >> 2;
}
}
return;
case MESA_FORMAT_RGB332:
{
GLuint i, j;
const GLubyte *rowA = (const GLubyte *) srcRowA;
const GLubyte *rowB = (const GLubyte *) srcRowB;
GLubyte *dst = (GLubyte *) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
const GLint rowAr0 = rowA[j] & 0x3;
const GLint rowAr1 = rowA[j+1] & 0x3;
const GLint rowBr0 = rowB[j] & 0x3;
const GLint rowBr1 = rowB[j+1] & 0x3;
const GLint rowAg0 = (rowA[j] >> 2) & 0x7;
const GLint rowAg1 = (rowA[j+1] >> 2) & 0x7;
const GLint rowBg0 = (rowB[j] >> 2) & 0x7;
const GLint rowBg1 = (rowB[j+1] >> 2) & 0x7;
const GLint rowAb0 = (rowA[j] >> 5) & 0x7;
const GLint rowAb1 = (rowA[j+1] >> 5) & 0x7;
const GLint rowBb0 = (rowB[j] >> 5) & 0x7;
const GLint rowBb1 = (rowB[j+1] >> 5) & 0x7;
const GLint red = (rowAr0 + rowAr1 + rowBr0 + rowBr1) >> 4;
const GLint green = (rowAg0 + rowAg1 + rowBg0 + rowBg1) >> 4;
const GLint blue = (rowAb0 + rowAb1 + rowBb0 + rowBb1) >> 4;
dst[i] = (blue << 5) | (green << 2) | red;
}
}
return;
case MESA_FORMAT_A8:
case MESA_FORMAT_L8:
case MESA_FORMAT_I8:
case MESA_FORMAT_CI8:
{
GLuint i, j;
const GLubyte *rowA = (const GLubyte *) srcRowA;
const GLubyte *rowB = (const GLubyte *) srcRowB;
GLubyte *dst = (GLubyte *) dstRow;
for (i = j = 0; i < dstWidth; i++, j+=2) {
dst[i] = (rowA[j] + rowA[j+1] + rowB[j] + rowB[j+1]) >> 2;
}
}
return;
default:
_mesa_problem(NULL, "bad format in do_row()");
}
@ -1076,6 +1261,7 @@ make_2d_mipmap(const struct gl_texture_format *format, GLint border,
dst += dstRowStride;
}
/* This is ugly but probably won't be used much */
if (border > 0) {
/* fill in dest border */
/* lower-left border pixel */
@ -1200,7 +1386,8 @@ _mesa_generate_mipmap(GLcontext *ctx,
return;
}
for (level = texObj->BaseLevel; level < texObj->MaxLevel; level++) {
for (level = texObj->BaseLevel; level < texObj->MaxLevel
&& level < ctx->Const.MaxTextureLevels; level++) {
/* generate level+1 from level */
const struct gl_texture_image *srcImage;
struct gl_texture_image *dstImage;