From 8f5fffe75d2f8ae7c7ee706b53379a25bc673ae4 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Tue, 5 Jun 2012 16:32:23 -0600 Subject: [PATCH] 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 --- src/mesa/drivers/common/driverfuncs.c | 4 +- src/mesa/drivers/dri/intel/intel_tex_image.c | 60 ++------------ .../drivers/dri/nouveau/nouveau_texture.c | 43 ++-------- src/mesa/drivers/dri/radeon/radeon_texture.c | 41 ++-------- src/mesa/main/dd.h | 44 +++-------- src/mesa/main/teximage.c | 36 ++------- src/mesa/main/texobj.c | 28 +------ src/mesa/main/texstore.c | 78 ++++--------------- src/mesa/main/texstore.h | 31 ++------ src/mesa/state_tracker/st_cb_texture.c | 51 +++--------- 10 files changed, 73 insertions(+), 343 deletions(-) diff --git a/src/mesa/drivers/common/driverfuncs.c b/src/mesa/drivers/common/driverfuncs.c index ca120578da9..54e5221b28b 100644 --- a/src/mesa/drivers/common/driverfuncs.c +++ b/src/mesa/drivers/common/driverfuncs.c @@ -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; diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index abd75c51d29..6e7e7018182 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -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; diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c index a2e96aa1684..e5ef3d3ff9f 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c @@ -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(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_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, 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; diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c index ccb9956a8e6..8df5484f557 100644 --- a/src/mesa/drivers/dri/radeon/radeon_texture.c +++ b/src/mesa/drivers/dri/radeon/radeon_texture.c @@ -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; diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h index 582eb5d492b..711143c5594 100644 --- a/src/mesa/main/dd.h +++ b/src/mesa/main/dd.h @@ -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 diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 694f6fa0010..5bb21cd80a8 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -2606,26 +2606,9 @@ teximage(struct gl_context *ctx, GLuint dims, border, internalFormat, texFormat); /* Give the texture to the driver. 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)) { diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index a471bad22b6..e0494c94028 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -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); diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index d368b1868f2..1aa79625287 100644 --- a/src/mesa/main/texstore.c +++ b/src/mesa/main/texstore.c @@ -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; - - /* 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"); -} + assert(dims == 1 || dims == 2 || dims == 3); - -/** - * 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(). */ diff --git a/src/mesa/main/texstore.h b/src/mesa/main/texstore.h index 85e33b0fe26..b4995fbc898 100644 --- a/src/mesa/main/texstore.h +++ b/src/mesa/main/texstore.h @@ -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 diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index b24f9a1ceff..3ab14a1bbd9 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -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; -- 2.30.2