diff options
-rw-r--r-- | src/mapi/glapi/gen/ARB_direct_state_access.xml | 4 | ||||
-rw-r--r-- | src/mesa/main/genmipmap.c | 71 | ||||
-rw-r--r-- | src/mesa/main/genmipmap.h | 6 | ||||
-rw-r--r-- | src/mesa/main/tests/dispatch_sanity.cpp | 1 |
4 files changed, 62 insertions, 20 deletions
diff --git a/src/mapi/glapi/gen/ARB_direct_state_access.xml b/src/mapi/glapi/gen/ARB_direct_state_access.xml index f1f38d29810..afc16ad97ed 100644 --- a/src/mapi/glapi/gen/ARB_direct_state_access.xml +++ b/src/mapi/glapi/gen/ARB_direct_state_access.xml @@ -179,6 +179,10 @@ <param name="param" type="const GLint *" /> </function> + <function name="GenerateTextureMipmap" offset="assign"> + <param name="texture" type="GLuint" /> + </function> + <function name="BindTextureUnit" offset="assign"> <param name="unit" type="GLuint" /> <param name="texture" type="GLuint" /> diff --git a/src/mesa/main/genmipmap.c b/src/mesa/main/genmipmap.c index a883332bac7..9aef090194e 100644 --- a/src/mesa/main/genmipmap.c +++ b/src/mesa/main/genmipmap.c @@ -36,21 +36,20 @@ #include "mtypes.h" #include "teximage.h" #include "texobj.h" - +#include "hash.h" /** - * Generate all the mipmap levels below the base level. - * Note: this GL function would be more useful if one could specify a - * cube face, a set of array slices, etc. + * Implements glGenerateMipmap and glGenerateTextureMipmap. + * Generates all the mipmap levels below the base level. */ -void GLAPIENTRY -_mesa_GenerateMipmap(GLenum target) +void +_mesa_generate_texture_mipmap(struct gl_context *ctx, + struct gl_texture_object *texObj, GLenum target, + bool dsa) { struct gl_texture_image *srcImage; - struct gl_texture_object *texObj; GLboolean error; - - GET_CURRENT_CONTEXT(ctx); + const char *suffix = dsa ? "Texture" : ""; FLUSH_VERTICES(ctx, 0); @@ -83,13 +82,11 @@ _mesa_GenerateMipmap(GLenum target) } if (error) { - _mesa_error(ctx, GL_INVALID_ENUM, "glGenerateMipmapEXT(target=%s)", - _mesa_lookup_enum_by_nr(target)); + _mesa_error(ctx, GL_INVALID_ENUM, "glGenerate%sMipmap(target=%s)", + suffix, _mesa_lookup_enum_by_nr(target)); return; } - texObj = _mesa_get_current_tex_object(ctx, target); - if (texObj->BaseLevel >= texObj->MaxLevel) { /* nothing to do */ return; @@ -98,7 +95,7 @@ _mesa_GenerateMipmap(GLenum target) if (texObj->Target == GL_TEXTURE_CUBE_MAP && !_mesa_cube_complete(texObj)) { _mesa_error(ctx, GL_INVALID_OPERATION, - "glGenerateMipmap(incomplete cube map)"); + "glGenerate%sMipmap(incomplete cube map)", suffix); return; } @@ -108,7 +105,7 @@ _mesa_GenerateMipmap(GLenum target) if (!srcImage) { _mesa_unlock_texture(ctx, texObj); _mesa_error(ctx, GL_INVALID_OPERATION, - "glGenerateMipmap(zero size base image)"); + "glGenerate%sMipmap(zero size base image)", suffix); return; } @@ -117,19 +114,53 @@ _mesa_GenerateMipmap(GLenum target) _mesa_is_stencil_format(srcImage->InternalFormat)) { _mesa_unlock_texture(ctx, texObj); _mesa_error(ctx, GL_INVALID_OPERATION, - "glGenerateMipmap(invalid internal format)"); + "glGenerate%sMipmap(invalid internal format)", suffix); return; } if (target == GL_TEXTURE_CUBE_MAP) { GLuint face; - for (face = 0; face < 6; face++) - ctx->Driver.GenerateMipmap(ctx, - GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + face, - texObj); + for (face = 0; face < 6; face++) { + ctx->Driver.GenerateMipmap(ctx, + GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + face, texObj); + } } else { ctx->Driver.GenerateMipmap(ctx, target, texObj); } _mesa_unlock_texture(ctx, texObj); } + +/** + * Generate all the mipmap levels below the base level. + * Note: this GL function would be more useful if one could specify a + * cube face, a set of array slices, etc. + */ +void GLAPIENTRY +_mesa_GenerateMipmap(GLenum target) +{ + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + + texObj = _mesa_get_current_tex_object(ctx, target); + if (!texObj) + return; + + _mesa_generate_texture_mipmap(ctx, texObj, target, false); +} + +/** + * Generate all the mipmap levels below the base level. + */ +void GLAPIENTRY +_mesa_GenerateTextureMipmap(GLuint texture) +{ + struct gl_texture_object *texObj; + GET_CURRENT_CONTEXT(ctx); + + texObj = _mesa_lookup_texture_err(ctx, texture, "glGenerateTextureMipmap"); + if (!texObj) + return; + + _mesa_generate_texture_mipmap(ctx, texObj, texObj->Target, true); +} diff --git a/src/mesa/main/genmipmap.h b/src/mesa/main/genmipmap.h index d546a8d7b8c..f4ef859511e 100644 --- a/src/mesa/main/genmipmap.h +++ b/src/mesa/main/genmipmap.h @@ -28,9 +28,15 @@ #include "glheader.h" +extern void +_mesa_generate_texture_mipmap(struct gl_context *ctx, + struct gl_texture_object *texObj, GLenum target, + bool dsa); extern void GLAPIENTRY _mesa_GenerateMipmap(GLenum target); +extern void GLAPIENTRY +_mesa_GenerateTextureMipmap(GLuint texture); #endif /* GENMIPMAP_H */ diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp index afdcbd0fbc3..0739025f1fb 100644 --- a/src/mesa/main/tests/dispatch_sanity.cpp +++ b/src/mesa/main/tests/dispatch_sanity.cpp @@ -983,6 +983,7 @@ const struct function gl_core_functions_possible[] = { { "glCompressedTextureSubImage1D", 45, -1 }, { "glCompressedTextureSubImage2D", 45, -1 }, { "glCompressedTextureSubImage3D", 45, -1 }, + { "glGenerateTextureMipmap", 45, -1 }, { NULL, 0, -1 } }; |