Work in glGetTexImage() to return GL_COLOR_INDEX images.
Prototype code for GL_SGIX_depth_texture / more flexible teximage code.
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
/* $Id: extensions.c,v 1.45 2001/01/24 04:56:20 brianp Exp $ */
|
||||
/* $Id: extensions.c,v 1.46 2001/02/17 00:15:39 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.5
|
||||
*
|
||||
* Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -84,7 +84,7 @@ static struct {
|
||||
{ ON, "GL_EXT_shared_texture_palette", F(EXT_shared_texture_palette) },
|
||||
{ ON, "GL_EXT_stencil_wrap", F(EXT_stencil_wrap) },
|
||||
{ ON, "GL_EXT_texture3D", F(EXT_texture3D) },
|
||||
{ OFF, "GL_EXT_texture_compression_s3tc", F(EXT_texture_compression_s3tc) },
|
||||
{ OFF, "GL_EXT_texture_compression_s3tc", F(EXT_texture_compression_s3tc)},
|
||||
{ ON, "GL_EXT_texture_env_add", F(EXT_texture_env_add) },
|
||||
{ OFF, "GL_EXT_texture_env_combine", F(EXT_texture_env_combine) },
|
||||
{ OFF, "GL_EXT_texture_env_dot3", F(EXT_texture_env_dot3) },
|
||||
@@ -103,6 +103,7 @@ static struct {
|
||||
{ ON, "GL_SGI_color_table", F(SGI_color_table) },
|
||||
{ ON, "GL_SGIS_pixel_texture", F(SGIS_pixel_texture) },
|
||||
{ ON, "GL_SGIS_texture_edge_clamp", F(SGIS_texture_edge_clamp) },
|
||||
{ OFF, "GL_SGIX_depth_texture", F(SGIX_depth_texture) },
|
||||
{ ON, "GL_SGIX_pixel_texture", F(SGIX_pixel_texture) },
|
||||
{ OFF, "GL_3DFX_texture_compression_FXT1", F(_3DFX_texture_compression_FXT1) }
|
||||
};
|
||||
@@ -124,6 +125,7 @@ _mesa_enable_sw_extensions(GLcontext *ctx)
|
||||
gl_extensions_enable(ctx, "GL_HP_occlusion_test");
|
||||
gl_extensions_enable(ctx, "GL_NV_blend_square");
|
||||
gl_extensions_enable(ctx, "GL_MESA_sprite_point");
|
||||
gl_extensions_enable(ctx, "GL_SGIX_depth_texture");
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: mtypes.h,v 1.18 2001/02/06 21:42:48 brianp Exp $ */
|
||||
/* $Id: mtypes.h,v 1.19 2001/02/17 00:15:39 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -788,6 +788,7 @@ struct gl_texture_image {
|
||||
GLubyte IntensityBits; /* color resolution. */
|
||||
GLubyte LuminanceBits;
|
||||
GLubyte IndexBits;
|
||||
GLubyte DepthBits;
|
||||
GLuint Border; /* 0 or 1 */
|
||||
GLuint Width; /* = 2^WidthLog2 + 2*Border */
|
||||
GLuint Height; /* = 2^HeightLog2 + 2*Border */
|
||||
@@ -1221,6 +1222,7 @@ struct gl_extensions {
|
||||
GLboolean SGI_color_table;
|
||||
GLboolean SGIS_pixel_texture;
|
||||
GLboolean SGIS_texture_edge_clamp;
|
||||
GLboolean SGIX_depth_texture;
|
||||
GLboolean SGIX_pixel_texture;
|
||||
GLboolean _3DFX_texture_compression_FXT1;
|
||||
};
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: teximage.c,v 1.75 2001/02/07 18:59:45 brianp Exp $ */
|
||||
/* $Id: teximage.c,v 1.76 2001/02/17 00:15:39 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -210,12 +210,94 @@ _mesa_base_tex_format( GLcontext *ctx, GLint format )
|
||||
case GL_COLOR_INDEX12_EXT:
|
||||
case GL_COLOR_INDEX16_EXT:
|
||||
return GL_COLOR_INDEX;
|
||||
case GL_DEPTH_COMPONENT:
|
||||
case GL_DEPTH_COMPONENT16_SGIX:
|
||||
case GL_DEPTH_COMPONENT24_SGIX:
|
||||
case GL_DEPTH_COMPONENT32_SGIX:
|
||||
if (ctx->Extensions.SGIX_depth_texture)
|
||||
return GL_DEPTH_COMPONENT;
|
||||
else
|
||||
return -1;
|
||||
default:
|
||||
return -1; /* error */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Test if the given image format is a color/rgba format. That is,
|
||||
* not color index, depth, stencil, etc.
|
||||
*/
|
||||
static GLboolean
|
||||
is_color_format(GLenum format)
|
||||
{
|
||||
switch (format) {
|
||||
case GL_ALPHA:
|
||||
case GL_ALPHA4:
|
||||
case GL_ALPHA8:
|
||||
case GL_ALPHA12:
|
||||
case GL_ALPHA16:
|
||||
case 1:
|
||||
case GL_LUMINANCE:
|
||||
case GL_LUMINANCE4:
|
||||
case GL_LUMINANCE8:
|
||||
case GL_LUMINANCE12:
|
||||
case GL_LUMINANCE16:
|
||||
case 2:
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
case GL_LUMINANCE4_ALPHA4:
|
||||
case GL_LUMINANCE6_ALPHA2:
|
||||
case GL_LUMINANCE8_ALPHA8:
|
||||
case GL_LUMINANCE12_ALPHA4:
|
||||
case GL_LUMINANCE12_ALPHA12:
|
||||
case GL_LUMINANCE16_ALPHA16:
|
||||
case GL_INTENSITY:
|
||||
case GL_INTENSITY4:
|
||||
case GL_INTENSITY8:
|
||||
case GL_INTENSITY12:
|
||||
case GL_INTENSITY16:
|
||||
case 3:
|
||||
case GL_RGB:
|
||||
case GL_R3_G3_B2:
|
||||
case GL_RGB4:
|
||||
case GL_RGB5:
|
||||
case GL_RGB8:
|
||||
case GL_RGB10:
|
||||
case GL_RGB12:
|
||||
case GL_RGB16:
|
||||
case 4:
|
||||
case GL_RGBA:
|
||||
case GL_RGBA2:
|
||||
case GL_RGBA4:
|
||||
case GL_RGB5_A1:
|
||||
case GL_RGBA8:
|
||||
case GL_RGB10_A2:
|
||||
case GL_RGBA12:
|
||||
case GL_RGBA16:
|
||||
return GL_TRUE;
|
||||
default:
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static GLboolean
|
||||
is_index_format(GLenum format)
|
||||
{
|
||||
switch (format) {
|
||||
case GL_COLOR_INDEX:
|
||||
case GL_COLOR_INDEX1_EXT:
|
||||
case GL_COLOR_INDEX2_EXT:
|
||||
case GL_COLOR_INDEX4_EXT:
|
||||
case GL_COLOR_INDEX8_EXT:
|
||||
case GL_COLOR_INDEX12_EXT:
|
||||
case GL_COLOR_INDEX16_EXT:
|
||||
return GL_TRUE;
|
||||
default:
|
||||
return GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return GL_TRUE if internalFormat is a compressed format, return GL_FALSE
|
||||
@@ -476,6 +558,7 @@ clear_teximage_fields(struct gl_texture_image *img)
|
||||
{
|
||||
ASSERT(img);
|
||||
img->Format = 0;
|
||||
img->Type = 0;
|
||||
img->IntFormat = 0;
|
||||
img->RedBits = 0;
|
||||
img->GreenBits = 0;
|
||||
@@ -1028,11 +1111,22 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
return;
|
||||
}
|
||||
|
||||
if (_mesa_components_in_format(format) <= 0) {
|
||||
if (_mesa_components_in_format(format) <= 0 ||
|
||||
format == GL_STENCIL_INDEX) {
|
||||
gl_error( ctx, GL_INVALID_ENUM, "glGetTexImage(format)" );
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ctx->Extensions.EXT_paletted_texture && is_index_format(format)) {
|
||||
gl_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
|
||||
}
|
||||
|
||||
if (!ctx->Extensions.SGIX_depth_texture && format == GL_DEPTH_COMPONENT) {
|
||||
gl_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)");
|
||||
}
|
||||
|
||||
/* XXX what if format/type doesn't match texture format/type? */
|
||||
|
||||
if (!pixels)
|
||||
return;
|
||||
|
||||
@@ -1057,7 +1151,8 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
if (ctx->NewState & _NEW_PIXEL)
|
||||
gl_update_state(ctx);
|
||||
|
||||
if (ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) {
|
||||
if (is_color_format(format) &&
|
||||
ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) {
|
||||
/* convert texture image to GL_RGBA, GL_FLOAT */
|
||||
GLint width = texImage->Width;
|
||||
GLint height = texImage->Height;
|
||||
@@ -1132,7 +1227,7 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
FREE(convImage);
|
||||
}
|
||||
else {
|
||||
/* no convolution */
|
||||
/* no convolution, or non-rgba image */
|
||||
GLint width = texImage->Width;
|
||||
GLint height = texImage->Height;
|
||||
GLint depth = texImage->Depth;
|
||||
@@ -1141,10 +1236,41 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
for (row = 0; row < height; row++) {
|
||||
/* compute destination address in client memory */
|
||||
GLvoid *dest = _mesa_image_address( &ctx->Unpack, pixels,
|
||||
width, height, format, type, img, row, 0);
|
||||
width, height, format, type,
|
||||
img, row, 0);
|
||||
assert(dest);
|
||||
|
||||
{
|
||||
if (format == GL_COLOR_INDEX) {
|
||||
GLuint indexRow[MAX_WIDTH];
|
||||
GLint col;
|
||||
for (col = 0; col < width; col++) {
|
||||
GLchan rgba[1];
|
||||
/* XXX this won't really work yet */
|
||||
/*need (*texImage->FetchRawTexel)() */
|
||||
(*texImage->FetchTexel)(ctx, texObj, texImage,
|
||||
col, row, img, rgba);
|
||||
indexRow[col] = rgba[0];
|
||||
}
|
||||
_mesa_pack_index_span(ctx, width, type, dest,
|
||||
indexRow, &ctx->Pack,
|
||||
ctx->_ImageTransferState);
|
||||
}
|
||||
else if (format == GL_DEPTH_COMPONENT) {
|
||||
/* XXX finish this */
|
||||
GLfloat depthRow[MAX_WIDTH];
|
||||
GLint col;
|
||||
for (col = 0; col < width; col++) {
|
||||
GLchan rgba[1];
|
||||
/* XXX this won't really work yet */
|
||||
/*need (*texImage->FetchRawTexel)() */
|
||||
(*texImage->FetchTexel)(ctx, texObj, texImage,
|
||||
col, row, img, rgba);
|
||||
depthRow[col] = (GLfloat) rgba[0];
|
||||
}
|
||||
_mesa_pack_depth_span(ctx, width, dest, type,
|
||||
depthRow, &ctx->Pack);
|
||||
}
|
||||
else {
|
||||
/* general case: convert row to RGBA format */
|
||||
GLchan rgba[MAX_WIDTH][4];
|
||||
GLint col;
|
||||
@@ -1152,7 +1278,6 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
|
||||
(*texImage->FetchTexel)(ctx, texObj, texImage,
|
||||
col, row, img, rgba[col]);
|
||||
}
|
||||
|
||||
_mesa_pack_rgba_span( ctx, width, (const GLchan (*)[4])rgba,
|
||||
format, type, dest, &ctx->Pack,
|
||||
ctx->_ImageTransferState );
|
||||
@@ -1176,7 +1301,9 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
||||
|
||||
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
|
||||
if (is_color_format(internalFormat)) {
|
||||
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
|
||||
}
|
||||
|
||||
if (target == GL_TEXTURE_1D) {
|
||||
struct gl_texture_unit *texUnit;
|
||||
@@ -1231,7 +1358,8 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
|
||||
|
||||
/* one of these has to be non-zero! */
|
||||
ASSERT(texImage->RedBits || texImage->IndexBits || texImage->AlphaBits ||
|
||||
texImage->LuminanceBits || texImage->IntensityBits);
|
||||
texImage->LuminanceBits || texImage->IntensityBits ||
|
||||
texImage->DepthBits);
|
||||
ASSERT(texImage->FetchTexel);
|
||||
|
||||
/* state update */
|
||||
@@ -1279,7 +1407,10 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
||||
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,&postConvHeight);
|
||||
if (is_color_format(internalFormat)) {
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,
|
||||
&postConvHeight);
|
||||
}
|
||||
|
||||
if (target == GL_TEXTURE_2D ||
|
||||
(ctx->Extensions.ARB_texture_cube_map &&
|
||||
@@ -1339,7 +1470,8 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
|
||||
|
||||
/* one of these has to be non-zero! */
|
||||
ASSERT(texImage->RedBits || texImage->IndexBits || texImage->AlphaBits ||
|
||||
texImage->LuminanceBits || texImage->IntensityBits);
|
||||
texImage->LuminanceBits || texImage->IntensityBits ||
|
||||
texImage->DepthBits);
|
||||
ASSERT(texImage->FetchTexel);
|
||||
|
||||
/* state update */
|
||||
@@ -1443,7 +1575,8 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
|
||||
|
||||
/* one of these has to be non-zero! */
|
||||
ASSERT(texImage->RedBits || texImage->IndexBits || texImage->AlphaBits ||
|
||||
texImage->LuminanceBits || texImage->IntensityBits);
|
||||
texImage->LuminanceBits || texImage->IntensityBits ||
|
||||
texImage->DepthBits);
|
||||
ASSERT(texImage->FetchTexel);
|
||||
|
||||
/* state update */
|
||||
@@ -1504,7 +1637,10 @@ _mesa_TexSubImage1D( GLenum target, GLint level,
|
||||
struct gl_texture_object *texObj;
|
||||
struct gl_texture_image *texImage;
|
||||
|
||||
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
|
||||
/* XXX should test internal format */
|
||||
if (is_color_format(format)) {
|
||||
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
|
||||
}
|
||||
|
||||
if (subtexture_error_check(ctx, 1, target, level, xoffset, 0, 0,
|
||||
postConvWidth, 1, 1, format, type)) {
|
||||
@@ -1542,7 +1678,11 @@ _mesa_TexSubImage2D( GLenum target, GLint level,
|
||||
struct gl_texture_object *texObj;
|
||||
struct gl_texture_image *texImage;
|
||||
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,&postConvHeight);
|
||||
/* XXX should test internal format */
|
||||
if (is_color_format(format)) {
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,
|
||||
&postConvHeight);
|
||||
}
|
||||
|
||||
if (subtexture_error_check(ctx, 2, target, level, xoffset, yoffset, 0,
|
||||
postConvWidth, postConvHeight, 1, format, type)) {
|
||||
@@ -1663,7 +1803,9 @@ _mesa_CopyTexImage1D( GLenum target, GLint level,
|
||||
if (ctx->NewState & _NEW_PIXEL)
|
||||
gl_update_state(ctx);
|
||||
|
||||
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
|
||||
if (is_color_format(internalFormat)) {
|
||||
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
|
||||
}
|
||||
|
||||
if (copytexture_error_check(ctx, 1, target, level, internalFormat,
|
||||
postConvWidth, 1, border))
|
||||
@@ -1706,7 +1848,10 @@ _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,
|
||||
if (ctx->NewState & _NEW_PIXEL)
|
||||
gl_update_state(ctx);
|
||||
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,&postConvHeight);
|
||||
if (is_color_format(internalFormat)) {
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,
|
||||
&postConvHeight);
|
||||
}
|
||||
|
||||
if (copytexture_error_check(ctx, 2, target, level, internalFormat,
|
||||
postConvWidth, postConvHeight, border))
|
||||
@@ -1748,6 +1893,7 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level,
|
||||
if (ctx->NewState & _NEW_PIXEL)
|
||||
gl_update_state(ctx);
|
||||
|
||||
/* XXX should test internal format */
|
||||
_mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL);
|
||||
|
||||
if (copytexsubimage_error_check(ctx, 1, target, level,
|
||||
@@ -1798,7 +1944,8 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint level,
|
||||
if (ctx->NewState & _NEW_PIXEL)
|
||||
gl_update_state(ctx);
|
||||
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,&postConvHeight);
|
||||
/* XXX should test internal format */
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, &postConvHeight);
|
||||
|
||||
if (copytexsubimage_error_check(ctx, 2, target, level, xoffset, yoffset, 0,
|
||||
postConvWidth, postConvHeight))
|
||||
@@ -1848,7 +1995,8 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level,
|
||||
if (ctx->NewState & _NEW_PIXEL)
|
||||
gl_update_state(ctx);
|
||||
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth,&postConvHeight);
|
||||
/* XXX should test internal format */
|
||||
_mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, &postConvHeight);
|
||||
|
||||
if (copytexsubimage_error_check(ctx, 3, target, level, xoffset, yoffset,
|
||||
zoffset, postConvWidth, postConvHeight))
|
||||
|
@@ -1,10 +1,10 @@
|
||||
/* $Id: texstate.c,v 1.30 2001/02/06 21:42:48 brianp Exp $ */
|
||||
/* $Id: texstate.c,v 1.31 2001/02/17 00:15:39 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 3.5
|
||||
*
|
||||
* Copyright (C) 1999-2000 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -921,6 +921,15 @@ _mesa_GetTexLevelParameteriv( GLenum target, GLint level,
|
||||
case GL_TEXTURE_INDEX_SIZE_EXT:
|
||||
*params = img->IndexBits;
|
||||
return;
|
||||
case GL_DEPTH_BITS:
|
||||
/* XXX this isn't in the GL_SGIX_depth_texture spec
|
||||
* but seems appropriate.
|
||||
*/
|
||||
if (ctx->Extensions.SGIX_depth_texture)
|
||||
*params = img->DepthBits;
|
||||
else
|
||||
gl_error(ctx, GL_INVALID_ENUM, "glGetTexLevelParameter[if]v(pname)");
|
||||
return;
|
||||
|
||||
/* GL_ARB_texture_compression */
|
||||
case GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* $Id: texstore.c,v 1.4 2001/02/07 19:02:23 brianp Exp $ */
|
||||
/* $Id: texstore.c,v 1.5 2001/02/17 00:15:39 brianp Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -150,6 +150,13 @@ fetch_1d_texel(GLcontext *ctx,
|
||||
rgba[BCOMP] = texel[2];
|
||||
rgba[ACOMP] = texel[3];
|
||||
return;
|
||||
case GL_DEPTH_COMPONENT:
|
||||
{
|
||||
const GLfloat *data = (const GLfloat *) img->Data;
|
||||
GLfloat *texel = (GLfloat *) rgba;
|
||||
*texel = data[i];
|
||||
return;
|
||||
}
|
||||
default:
|
||||
gl_problem(NULL, "Bad format in fetch_1d_texel");
|
||||
return;
|
||||
@@ -210,6 +217,13 @@ fetch_2d_texel(GLcontext *ctx,
|
||||
rgba[BCOMP] = texel[2];
|
||||
rgba[ACOMP] = texel[3];
|
||||
return;
|
||||
case GL_DEPTH_COMPONENT:
|
||||
{
|
||||
const GLfloat *data = (const GLfloat *) img->Data;
|
||||
GLfloat *texel = (GLfloat *) rgba;
|
||||
*texel = data[width * j + i];
|
||||
return;
|
||||
}
|
||||
default:
|
||||
gl_problem(NULL, "Bad format in fetch_2d_texel");
|
||||
}
|
||||
@@ -273,6 +287,13 @@ fetch_3d_texel(GLcontext *ctx,
|
||||
rgba[BCOMP] = texel[2];
|
||||
rgba[ACOMP] = texel[3];
|
||||
return;
|
||||
case GL_DEPTH_COMPONENT:
|
||||
{
|
||||
const GLfloat *data = (const GLfloat *) img->Data;
|
||||
GLfloat *texel = (GLfloat *) rgba;
|
||||
*texel = data[rectarea * k + width * j + i];
|
||||
return;
|
||||
}
|
||||
default:
|
||||
gl_problem(NULL, "Bad format in fetch_3d_texel");
|
||||
}
|
||||
@@ -298,6 +319,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_LUMINANCE:
|
||||
texImage->RedBits = 0;
|
||||
@@ -307,6 +329,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 8 * sizeof(GLchan);
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_LUMINANCE_ALPHA:
|
||||
texImage->RedBits = 0;
|
||||
@@ -316,6 +339,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 8 * sizeof(GLchan);
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_INTENSITY:
|
||||
texImage->RedBits = 0;
|
||||
@@ -325,6 +349,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 8 * sizeof(GLchan);
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_RED:
|
||||
texImage->RedBits = 8 * sizeof(GLchan);
|
||||
@@ -334,6 +359,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_GREEN:
|
||||
texImage->RedBits = 0;
|
||||
@@ -343,6 +369,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_BLUE:
|
||||
texImage->RedBits = 0;
|
||||
@@ -352,6 +379,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_RGB:
|
||||
case GL_BGR:
|
||||
@@ -362,6 +390,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_RGBA:
|
||||
case GL_BGRA:
|
||||
@@ -373,6 +402,7 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_COLOR_INDEX:
|
||||
texImage->RedBits = 0;
|
||||
@@ -382,6 +412,17 @@ set_teximage_component_sizes( struct gl_texture_image *texImage )
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 8 * sizeof(GLchan);
|
||||
texImage->DepthBits = 0;
|
||||
break;
|
||||
case GL_DEPTH_COMPONENT:
|
||||
texImage->RedBits = 0;
|
||||
texImage->GreenBits = 0;
|
||||
texImage->BlueBits = 0;
|
||||
texImage->AlphaBits = 0;
|
||||
texImage->IntensityBits = 0;
|
||||
texImage->LuminanceBits = 0;
|
||||
texImage->IndexBits = 0;
|
||||
texImage->DepthBits = 8 * sizeof(GLfloat);
|
||||
break;
|
||||
default:
|
||||
gl_problem(NULL, "unexpected format in set_teximage_component_sizes");
|
||||
@@ -456,6 +497,11 @@ components_in_intformat( GLint format )
|
||||
case GL_COLOR_INDEX12_EXT:
|
||||
case GL_COLOR_INDEX16_EXT:
|
||||
return 1;
|
||||
case GL_DEPTH_COMPONENT:
|
||||
case GL_DEPTH_COMPONENT16_SGIX:
|
||||
case GL_DEPTH_COMPONENT24_SGIX:
|
||||
case GL_DEPTH_COMPONENT32_SGIX:
|
||||
return 1;
|
||||
default:
|
||||
return -1; /* error */
|
||||
}
|
||||
@@ -516,8 +562,7 @@ _mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
||||
texComponents = components_in_intformat(texFormat);
|
||||
|
||||
/* try common 2D texture cases first */
|
||||
if (!ctx->_ImageTransferState && dimensions == 2
|
||||
&& srcType == CHAN_TYPE) {
|
||||
if (!ctx->_ImageTransferState && dimensions == 2 && srcType == CHAN_TYPE) {
|
||||
|
||||
if (srcFormat == texFormat) {
|
||||
/* This will cover the common GL_RGB, GL_RGBA, GL_ALPHA,
|
||||
@@ -593,6 +638,31 @@ _mesa_transfer_teximage(GLcontext *ctx, GLuint dimensions,
|
||||
dest += dstImageStride;
|
||||
}
|
||||
}
|
||||
else if (texFormat == GL_DEPTH_COMPONENT) {
|
||||
/* Depth texture (shadow maps) */
|
||||
const GLenum texType = GL_FLOAT;
|
||||
GLint img, row;
|
||||
GLfloat *dest = (GLfloat *) texAddr + dstZoffset * dstImageStride
|
||||
+ dstYoffset * dstRowStride
|
||||
+ dstXoffset * texComponents;
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLfloat *destRow = dest;
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
const GLvoid *src = _mesa_image_address(srcPacking,
|
||||
srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
|
||||
(void) src;
|
||||
(void) texType;
|
||||
/* XXX destRow: GLfloat vs. GLdepth? */
|
||||
/*
|
||||
_mesa_unpack_depth_span(ctx, srcWidth, texType, destRow,
|
||||
srcType, src, srcPacking,
|
||||
ctx->_ImageTransferState);
|
||||
*/
|
||||
destRow += dstRowStride;
|
||||
}
|
||||
dest += dstImageStride;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* regular, color texture */
|
||||
if ((dimensions == 1 && ctx->Pixel.Convolution1DEnabled) ||
|
||||
@@ -713,6 +783,7 @@ _mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
const GLint components = components_in_intformat(internalFormat);
|
||||
GLint compSize;
|
||||
GLint postConvWidth = width;
|
||||
|
||||
if (ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) {
|
||||
@@ -721,13 +792,19 @@ _mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level,
|
||||
|
||||
/* setup the teximage struct's fields */
|
||||
texImage->Format = (GLenum) _mesa_base_tex_format(ctx, internalFormat);
|
||||
texImage->Type = CHAN_TYPE; /* usually GL_UNSIGNED_BYTE */
|
||||
if (format == GL_DEPTH_COMPONENT) {
|
||||
texImage->Type = GL_FLOAT; /* XXX or GL_UNSIGNED_INT? */
|
||||
compSize = sizeof(GLfloat);
|
||||
}
|
||||
else {
|
||||
texImage->Type = CHAN_TYPE; /* usually GL_UNSIGNED_BYTE */
|
||||
compSize = sizeof(CHAN_TYPE);
|
||||
}
|
||||
texImage->FetchTexel = fetch_1d_texel;
|
||||
set_teximage_component_sizes(texImage);
|
||||
|
||||
/* allocate memory */
|
||||
texImage->Data = (GLchan *) MALLOC(postConvWidth
|
||||
* components * sizeof(GLchan));
|
||||
texImage->Data = (GLchan *) MALLOC(postConvWidth * components * compSize);
|
||||
if (!texImage->Data)
|
||||
return; /* out of memory */
|
||||
|
||||
@@ -757,6 +834,7 @@ _mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
const GLint components = components_in_intformat(internalFormat);
|
||||
GLint compSize;
|
||||
GLint postConvWidth = width, postConvHeight = height;
|
||||
|
||||
if (ctx->_ImageTransferState & IMAGE_CONVOLUTION_BIT) {
|
||||
@@ -766,13 +844,20 @@ _mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level,
|
||||
|
||||
/* setup the teximage struct's fields */
|
||||
texImage->Format = (GLenum) _mesa_base_tex_format(ctx, internalFormat);
|
||||
texImage->Type = CHAN_TYPE; /* usually GL_UNSIGNED_BYTE */
|
||||
if (format == GL_DEPTH_COMPONENT) {
|
||||
texImage->Type = GL_FLOAT; /* XXX or GL_UNSIGNED_INT? */
|
||||
compSize = sizeof(GLfloat);
|
||||
}
|
||||
else {
|
||||
texImage->Type = CHAN_TYPE; /* usually GL_UNSIGNED_BYTE */
|
||||
compSize = sizeof(CHAN_TYPE);
|
||||
}
|
||||
texImage->FetchTexel = fetch_2d_texel;
|
||||
set_teximage_component_sizes(texImage);
|
||||
|
||||
/* allocate memory */
|
||||
texImage->Data = (GLchan *) MALLOC(postConvWidth * postConvHeight
|
||||
* components * sizeof(GLchan));
|
||||
* components * compSize);
|
||||
if (!texImage->Data)
|
||||
return; /* out of memory */
|
||||
|
||||
@@ -803,16 +888,24 @@ _mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
const GLint components = components_in_intformat(internalFormat);
|
||||
GLint compSize;
|
||||
|
||||
/* setup the teximage struct's fields */
|
||||
texImage->Format = (GLenum) _mesa_base_tex_format(ctx, internalFormat);
|
||||
texImage->Type = CHAN_TYPE; /* usually GL_UNSIGNED_BYTE */
|
||||
if (format == GL_DEPTH_COMPONENT) {
|
||||
texImage->Type = GL_FLOAT; /* XXX or GL_UNSIGNED_INT? */
|
||||
compSize = sizeof(GLfloat);
|
||||
}
|
||||
else {
|
||||
texImage->Type = CHAN_TYPE; /* usually GL_UNSIGNED_BYTE */
|
||||
compSize = sizeof(CHAN_TYPE);
|
||||
}
|
||||
texImage->FetchTexel = fetch_3d_texel;
|
||||
set_teximage_component_sizes(texImage);
|
||||
|
||||
/* allocate memory */
|
||||
texImage->Data = (GLchan *) MALLOC(width * height * depth
|
||||
* components * sizeof(GLchan));
|
||||
* components * compSize);
|
||||
if (!texImage->Data)
|
||||
return; /* out of memory */
|
||||
|
||||
@@ -861,10 +954,11 @@ _mesa_store_texsubimage2d(GLcontext *ctx, GLenum target, GLint level,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
const GLint components = components_in_intformat(texImage->IntFormat);
|
||||
const GLint compSize = _mesa_sizeof_type(texImage->Type);
|
||||
_mesa_transfer_teximage(ctx, 2, texImage->Format, texImage->Data,
|
||||
width, height, 1, /* src size */
|
||||
xoffset, yoffset, 0, /* dest offsets */
|
||||
texImage->Width * components * sizeof(GLchan),
|
||||
texImage->Width * components * compSize,
|
||||
0, /* dstImageStride */
|
||||
format, type, pixels, packing);
|
||||
}
|
||||
@@ -883,12 +977,13 @@ _mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
const GLint components = components_in_intformat(texImage->IntFormat);
|
||||
const GLint compSize = _mesa_sizeof_type(texImage->Type);
|
||||
_mesa_transfer_teximage(ctx, 3, texImage->Format, texImage->Data,
|
||||
width, height, depth, /* src size */
|
||||
xoffset, yoffset, xoffset, /* dest offsets */
|
||||
texImage->Width * components * sizeof(GLchan),
|
||||
texImage->Width * components * compSize,
|
||||
texImage->Width * texImage->Height * components
|
||||
* sizeof(GLchan),
|
||||
* compSize,
|
||||
format, type, pixels, packing);
|
||||
}
|
||||
|
||||
@@ -963,6 +1058,7 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
|
||||
struct gl_texture_unit *texUnit;
|
||||
struct gl_texture_object *texObj;
|
||||
struct gl_texture_image *texImage;
|
||||
GLint compSize;
|
||||
|
||||
(void) format;
|
||||
(void) type;
|
||||
@@ -978,7 +1074,14 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
|
||||
*/
|
||||
/* setup the teximage struct's fields */
|
||||
texImage->Format = (GLenum) _mesa_base_tex_format(ctx, internalFormat);
|
||||
texImage->Type = CHAN_TYPE; /* usually GL_UNSIGNED_BYTE */
|
||||
if (format == GL_DEPTH_COMPONENT) {
|
||||
texImage->Type = GL_FLOAT; /* XXX or GL_UNSIGNED_INT? */
|
||||
compSize = sizeof(GLfloat);
|
||||
}
|
||||
else {
|
||||
texImage->Type = CHAN_TYPE; /* usually GL_UNSIGNED_BYTE */
|
||||
compSize = sizeof(CHAN_TYPE);
|
||||
}
|
||||
set_teximage_component_sizes(texImage);
|
||||
|
||||
return GL_TRUE;
|
||||
|
Reference in New Issue
Block a user