summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mapi/glapi/gen/ARB_direct_state_access.xml4
-rw-r--r--src/mesa/main/genmipmap.c71
-rw-r--r--src/mesa/main/genmipmap.h6
-rw-r--r--src/mesa/main/tests/dispatch_sanity.cpp1
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 }
};