mesa: consolidate internal glTexImage1/2/3D code

The functions for handling 1D, 2D and 3D texture images were nearly
identical.  This folds them all together.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Brian Paul 2012-06-05 16:32:23 -06:00
parent 3a62e8bcac
commit 8f5fffe75d
10 changed files with 73 additions and 343 deletions

View file

@ -91,9 +91,7 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
/* Texture functions */
driver->ChooseTextureFormat = _mesa_choose_tex_format;
driver->TexImage1D = _mesa_store_teximage1d;
driver->TexImage2D = _mesa_store_teximage2d;
driver->TexImage3D = _mesa_store_teximage3d;
driver->TexImage = _mesa_store_teximage;
driver->TexSubImage1D = _mesa_store_texsubimage1d;
driver->TexSubImage2D = _mesa_store_texsubimage2d;
driver->TexSubImage3D = _mesa_store_texsubimage3d;

View file

@ -203,13 +203,12 @@ try_pbo_upload(struct gl_context *ctx,
static void
intelTexImage(struct gl_context * ctx,
GLint dims,
GLuint dims,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *unpack,
GLsizei imageSize)
const struct gl_pixelstore_attrib *unpack)
{
DBG("%s target %s level %d %dx%dx%d\n", __FUNCTION__,
_mesa_lookup_enum_by_nr(texImage->TexObject->Target),
@ -226,52 +225,9 @@ intelTexImage(struct gl_context * ctx,
DBG("%s: upload image %dx%dx%d pixels %p\n",
__FUNCTION__, width, height, depth, pixels);
_mesa_store_teximage3d(ctx, texImage, internalFormat,
width, height, depth, 0,
format, type, pixels, unpack);
}
static void
intelTexImage3D(struct gl_context * ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth,
GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *unpack)
{
intelTexImage(ctx, 3, texImage,
internalFormat, width, height, depth,
format, type, pixels, unpack, 0);
}
static void
intelTexImage2D(struct gl_context * ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *unpack)
{
intelTexImage(ctx, 2, texImage,
internalFormat, width, height, 1,
format, type, pixels, unpack, 0);
}
static void
intelTexImage1D(struct gl_context * ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *unpack)
{
intelTexImage(ctx, 1, texImage,
internalFormat, width, 1, 1,
format, type, pixels, unpack, 0);
_mesa_store_teximage(ctx, dims, texImage, internalFormat,
width, height, depth, 0,
format, type, pixels, unpack);
}
@ -398,9 +354,7 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
void
intelInitTextureImageFuncs(struct dd_function_table *functions)
{
functions->TexImage1D = intelTexImage1D;
functions->TexImage2D = intelTexImage2D;
functions->TexImage3D = intelTexImage3D;
functions->TexImage = intelTexImage;
#if FEATURE_OES_EGL_image
functions->EGLImageTargetTexture2D = intel_image_target_texture_2d;

View file

@ -540,41 +540,16 @@ nouveau_teximage(struct gl_context *ctx, GLint dims,
context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
}
static void
nouveau_teximage_1d(struct gl_context *ctx,
struct gl_texture_image *ti,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing)
{
nouveau_teximage(ctx, 1, ti, internalFormat,
width, 1, 1, border, 0, format, type, pixels,
packing, GL_FALSE);
}
static void
nouveau_teximage_2d(struct gl_context *ctx,
struct gl_texture_image *ti,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing)
nouveau_teximage_123d(struct gl_context *ctx, GLuint dims,
struct gl_texture_image *ti,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing)
{
nouveau_teximage(ctx, 2, ti, internalFormat,
width, height, 1, border, 0, format, type, pixels,
packing, GL_FALSE);
}
static void
nouveau_teximage_3d(struct gl_context *ctx,
struct gl_texture_image *ti,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing)
{
nouveau_teximage(ctx, 3, ti, internalFormat,
nouveau_teximage(ctx, dims, ti, internalFormat,
width, height, depth, border, 0, format, type, pixels,
packing, GL_FALSE);
}
@ -756,9 +731,7 @@ nouveau_texture_functions_init(struct dd_function_table *functions)
functions->NewTextureImage = nouveau_teximage_new;
functions->FreeTextureImageBuffer = nouveau_teximage_free;
functions->ChooseTextureFormat = nouveau_choose_tex_format;
functions->TexImage1D = nouveau_teximage_1d;
functions->TexImage2D = nouveau_teximage_2d;
functions->TexImage3D = nouveau_teximage_3d;
functions->TexImage = nouveau_teximage_123d;
functions->TexSubImage1D = nouveau_texsubimage_1d;
functions->TexSubImage2D = nouveau_texsubimage_2d;
functions->TexSubImage3D = nouveau_texsubimage_3d;

View file

@ -586,39 +586,14 @@ static void radeon_teximage(
const struct gl_pixelstore_attrib *packing,
int compressed)
{
_mesa_store_teximage3d(ctx, texImage, internalFormat,
width, height, depth, 0,
format, type, pixels,
packing);
_mesa_store_teximage(ctx, dims, texImage, internalFormat,
width, height, depth, 0,
format, type, pixels,
packing);
}
static void
radeonTexImage1D(struct gl_context * ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const GLvoid * pixels,
const struct gl_pixelstore_attrib *packing)
{
radeon_teximage(ctx, 1, texImage, internalFormat, width, 1, 1,
0, format, type, pixels, packing, 0);
}
static void
radeonTexImage2D(struct gl_context * ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const GLvoid * pixels,
const struct gl_pixelstore_attrib *packing)
{
radeon_teximage(ctx, 2, texImage, internalFormat, width, height, 1,
0, format, type, pixels, packing, 0);
}
static void
radeonTexImage3D(struct gl_context * ctx,
radeonTexImage(struct gl_context * ctx, GLuint dims,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth,
@ -626,7 +601,7 @@ radeonTexImage3D(struct gl_context * ctx,
GLenum format, GLenum type, const GLvoid * pixels,
const struct gl_pixelstore_attrib *packing)
{
radeon_teximage(ctx, 3, texImage, internalFormat, width, height, depth,
radeon_teximage(ctx, dims, texImage, internalFormat, width, height, depth,
0, format, type, pixels, packing, 0);
}
@ -750,9 +725,7 @@ radeon_init_common_texture_funcs(radeonContextPtr radeon,
functions->ChooseTextureFormat = radeonChooseTextureFormat_mesa;
functions->TexImage1D = radeonTexImage1D;
functions->TexImage2D = radeonTexImage2D;
functions->TexImage3D = radeonTexImage3D;
functions->TexImage = radeonTexImage;
functions->CopyTexSubImage2D = radeonCopyTexSubImage2D;

View file

@ -198,43 +198,21 @@ struct dd_function_table {
GLenum srcFormat, GLenum srcType );
/**
* Called by glTexImage1D(). Simply copy the source texture data into the
* destination texture memory. The gl_texture_image fields, etc. will be
* fully initialized.
* The parameters are the same as glTexImage1D(), plus:
* Called by glTexImage[123]D() and glCopyTexImage[12]D()
* Allocate texture memory and copy the user's image to the buffer.
* The gl_texture_image fields, etc. will be fully initialized.
* The parameters are the same as glTexImage3D(), plus:
* \param dims 1, 2, or 3 indicating glTexImage1/2/3D()
* \param packing describes how to unpack the source data.
* \param texImage is the destination texture image.
*/
void (*TexImage1D)(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing);
void (*TexImage)(struct gl_context *ctx, GLuint dims,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing);
/**
* Called by glTexImage2D().
*
* \sa dd_function_table::TexImage1D.
*/
void (*TexImage2D)(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing);
/**
* Called by glTexImage3D().
*
* \sa dd_function_table::TexImage1D.
*/
void (*TexImage3D)(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing);
/**
* Called by glTexSubImage1D(). Replace a subset of the target texture

View file

@ -2606,26 +2606,9 @@ teximage(struct gl_context *ctx, GLuint dims,
border, internalFormat, texFormat);
/* Give the texture to the driver. <pixels> may be null. */
ASSERT(ctx->Driver.TexImage3D);
switch (dims) {
case 1:
ctx->Driver.TexImage1D(ctx, texImage, internalFormat,
width, border, format,
type, pixels, unpack);
break;
case 2:
ctx->Driver.TexImage2D(ctx, texImage, internalFormat,
width, height, border, format,
type, pixels, unpack);
break;
case 3:
ctx->Driver.TexImage3D(ctx, texImage, internalFormat,
width, height, depth, border, format,
type, pixels, unpack);
break;
default:
_mesa_problem(ctx, "invalid dims=%u in teximage()", dims);
}
ctx->Driver.TexImage(ctx, dims, texImage, internalFormat,
width, height, depth, border, format,
type, pixels, unpack);
check_gen_mipmap(ctx, target, texObj, level);
@ -2968,16 +2951,9 @@ copyteximage(struct gl_context *ctx, GLuint dims,
border, internalFormat, texFormat);
/* Allocate texture memory (no pixel data yet) */
if (dims == 1) {
ctx->Driver.TexImage1D(ctx, texImage, internalFormat,
width, border, GL_NONE, GL_NONE, NULL,
&ctx->Unpack);
}
else {
ctx->Driver.TexImage2D(ctx, texImage, internalFormat,
width, height, border, GL_NONE, GL_NONE,
NULL, &ctx->Unpack);
}
ctx->Driver.TexImage(ctx, dims, texImage, internalFormat,
width, height, 1, border, GL_NONE, GL_NONE,
NULL, &ctx->Unpack);
if (_mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY,
&width, &height)) {

View file

@ -807,30 +807,10 @@ _mesa_get_fallback_texture(struct gl_context *ctx, gl_texture_index tex)
0, /* border */
GL_RGBA, texFormat);
switch (dims) {
case 0:
break;
case 1:
ctx->Driver.TexImage1D(ctx, texImage, GL_RGBA,
width, 0,
GL_RGBA, GL_UNSIGNED_BYTE, texel,
&ctx->DefaultPacking);
break;
case 2:
ctx->Driver.TexImage2D(ctx, texImage, GL_RGBA,
width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, texel,
&ctx->DefaultPacking);
break;
case 3:
ctx->Driver.TexImage3D(ctx, texImage, GL_RGBA,
width, height, depth, 0,
GL_RGBA, GL_UNSIGNED_BYTE, texel,
&ctx->DefaultPacking);
break;
default:
_mesa_problem(ctx, "bad dims in _mesa_get_fallback_texture()");
}
ctx->Driver.TexImage(ctx, dims, texImage, GL_RGBA,
width, height, depth, 0,
GL_RGBA, GL_UNSIGNED_BYTE, texel,
&ctx->DefaultPacking);
}
_mesa_test_texobj_completeness(ctx, texObj);

View file

@ -4261,89 +4261,37 @@ store_texsubimage(struct gl_context *ctx,
/**
* This is the fallback for Driver.TexImage1D().
* Fallback code for ctx->Driver.TexImage().
* Basically, allocate storage for the texture image, then copy the
* user's image into it.
*/
void
_mesa_store_teximage1d(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing)
_mesa_store_teximage(struct gl_context *ctx,
GLuint dims,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing)
{
if (width == 0)
return;
assert(dims == 1 || dims == 2 || dims == 3);
/* allocate storage for texture data */
if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
width, 1, 1)) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
return;
}
store_texsubimage(ctx, texImage,
0, 0, 0, width, 1, 1,
format, type, pixels, packing, "glTexImage1D");
}
/**
* This is the fallback for Driver.TexImage2D().
*/
void
_mesa_store_teximage2d(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing)
{
if (width == 0 || height == 0)
return;
/* allocate storage for texture data */
if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
width, height, 1)) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
return;
}
store_texsubimage(ctx, texImage,
0, 0, 0, width, height, 1,
format, type, pixels, packing, "glTexImage2D");
}
/**
* This is the fallback for Driver.TexImage3D().
*/
void
_mesa_store_teximage3d(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *packing)
{
if (width == 0 || height == 0 || depth == 0)
return;
/* allocate storage for texture data */
if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat,
width, height, depth)) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims);
return;
}
store_texsubimage(ctx, texImage,
0, 0, 0, width, height, depth,
format, type, pixels, packing, "glTexImage3D");
format, type, pixels, packing, "glTexImage");
}
/*
* This is the fallback for Driver.TexSubImage1D().
*/

View file

@ -90,30 +90,13 @@ _mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
GLbitfield transferOps);
extern void
_mesa_store_teximage1d(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing);
extern void
_mesa_store_teximage2d(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing);
extern void
_mesa_store_teximage3d(struct gl_context *ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing);
_mesa_store_teximage(struct gl_context *ctx,
GLuint dims,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const GLvoid *pixels,
const struct gl_pixelstore_attrib *packing);
extern void

View file

@ -530,48 +530,17 @@ prep_teximage(struct gl_context *ctx, struct gl_texture_image *texImage,
static void
st_TexImage3D(struct gl_context * ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth,
GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *unpack)
st_TexImage(struct gl_context * ctx, GLuint dims,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint depth, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *unpack)
{
prep_teximage(ctx, texImage, internalFormat, width, height, depth, border,
format, type);
_mesa_store_teximage3d(ctx, texImage, internalFormat, width, height, depth,
border, format, type, pixels, unpack);
}
static void
st_TexImage2D(struct gl_context * ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint height, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *unpack)
{
prep_teximage(ctx, texImage, internalFormat, width, height, 1, border,
format, type);
_mesa_store_teximage2d(ctx, texImage, internalFormat, width, height,
border, format, type, pixels, unpack);
}
static void
st_TexImage1D(struct gl_context * ctx,
struct gl_texture_image *texImage,
GLint internalFormat,
GLint width, GLint border,
GLenum format, GLenum type, const void *pixels,
const struct gl_pixelstore_attrib *unpack)
{
prep_teximage(ctx, texImage, internalFormat, width, 1, 1, border,
format, type);
_mesa_store_teximage1d(ctx, texImage, internalFormat, width,
border, format, type, pixels, unpack);
_mesa_store_teximage(ctx, dims, texImage, internalFormat, width, height, depth,
border, format, type, pixels, unpack);
}
@ -1427,9 +1396,7 @@ void
st_init_texture_functions(struct dd_function_table *functions)
{
functions->ChooseTextureFormat = st_ChooseTextureFormat;
functions->TexImage1D = st_TexImage1D;
functions->TexImage2D = st_TexImage2D;
functions->TexImage3D = st_TexImage3D;
functions->TexImage = st_TexImage;
functions->TexSubImage1D = _mesa_store_texsubimage1d;
functions->TexSubImage2D = _mesa_store_texsubimage2d;
functions->TexSubImage3D = _mesa_store_texsubimage3d;