[Mesa-dev] [PATCH 06/13] mesa: add support for glBindMultiTextureEXT
Timothy Arceri
tarceri at itsqueeze.com
Sat Sep 8 04:31:27 UTC 2018
---
.../glapi/gen/EXT_direct_state_access.xml | 9 +++-
src/mesa/main/tests/dispatch_sanity.cpp | 2 +-
src/mesa/main/texobj.c | 42 +++++++++++++++----
src/mesa/main/texobj.h | 3 ++
4 files changed, 45 insertions(+), 11 deletions(-)
diff --git a/src/mapi/glapi/gen/EXT_direct_state_access.xml b/src/mapi/glapi/gen/EXT_direct_state_access.xml
index 58adc9da29d..e344ac887d4 100644
--- a/src/mapi/glapi/gen/EXT_direct_state_access.xml
+++ b/src/mapi/glapi/gen/EXT_direct_state_access.xml
@@ -100,6 +100,13 @@
<param name="matrixMode" type="GLenum" />
</function>
-</category>
+ <!-- OpenGL 1.2.1 -->
+
+ <function name="BindMultiTextureEXT">
+ <param name="texunit" type="GLenum" />
+ <param name="target" type="GLenum" />
+ <param name="texture" type="GLuint" />
+ </function>
+</category>
</OpenGLAPI>
diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp
index e0ed7c17329..7c408e4d611 100644
--- a/src/mesa/main/tests/dispatch_sanity.cpp
+++ b/src/mesa/main/tests/dispatch_sanity.cpp
@@ -1056,7 +1056,7 @@ const struct function common_desktop_functions_possible[] = {
//{ "glTextureSubImage3DEXT", 10, -1 },
//{ "glCopyTextureSubImage3DEXT", 10, -1 },
/* GL_EXT_direct_state_access - GL 1.2.1 */
- //{ "glBindMultiTextureEXT", 10, -1 },
+ { "glBindMultiTextureEXT", 10, -1 },
//{ "glMultiTexCoordPointerEXT", 10, -1 },
//{ "glMultiTexEnvfEXT", 10, -1 },
//{ "glMultiTexEnvfvEXT", 10, -1 },
diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
index 5dc5cb8e1a9..4481b6eb440 100644
--- a/src/mesa/main/texobj.c
+++ b/src/mesa/main/texobj.c
@@ -1722,17 +1722,18 @@ _mesa_bind_texture(struct gl_context *ctx, GLenum target,
*
* \param target texture target.
* \param texName texture name.
+ * \param texunit texture unit.
*/
static ALWAYS_INLINE void
bind_texture(struct gl_context *ctx, GLenum target, GLuint texName,
- bool no_error)
+ GLenum texunit, bool no_error, const char *caller)
{
struct gl_texture_object *newTexObj = NULL;
int targetIndex;
targetIndex = _mesa_tex_target_to_index(ctx, target);
if (!no_error && targetIndex < 0) {
- _mesa_error(ctx, GL_INVALID_ENUM, "glBindTexture(target = %s)",
+ _mesa_error(ctx, GL_INVALID_ENUM, "%s(target = %s)", caller,
_mesa_enum_to_string(target));
return;
}
@@ -1754,8 +1755,8 @@ bind_texture(struct gl_context *ctx, GLenum target, GLuint texName,
/* The named texture object's target doesn't match the
* given target
*/
- _mesa_error( ctx, GL_INVALID_OPERATION,
- "glBindTexture(target mismatch)" );
+ _mesa_error(ctx, GL_INVALID_OPERATION,
+ "%s(target mismatch)", caller);
return;
}
if (newTexObj->Target == 0) {
@@ -1765,14 +1766,14 @@ bind_texture(struct gl_context *ctx, GLenum target, GLuint texName,
else {
if (!no_error && ctx->API == API_OPENGL_CORE) {
_mesa_error(ctx, GL_INVALID_OPERATION,
- "glBindTexture(non-gen name)");
+ "%s(non-gen name)", caller);
return;
}
/* if this is a new texture id, allocate a texture object now */
newTexObj = ctx->Driver.NewTextureObject(ctx, texName, target);
if (!newTexObj) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindTexture");
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
return;
}
@@ -1784,14 +1785,15 @@ bind_texture(struct gl_context *ctx, GLenum target, GLuint texName,
assert(newTexObj->Target == target);
assert(newTexObj->TargetIndex == targetIndex);
- bind_texture_object(ctx, ctx->Texture.CurrentUnit, newTexObj);
+ bind_texture_object(ctx, texunit, newTexObj);
}
void GLAPIENTRY
_mesa_BindTexture_no_error(GLenum target, GLuint texName)
{
GET_CURRENT_CONTEXT(ctx);
- bind_texture(ctx, target, texName, true);
+ bind_texture(ctx, target, texName, ctx->Texture.CurrentUnit, true,
+ "glBindTexture");
}
@@ -1804,7 +1806,29 @@ _mesa_BindTexture(GLenum target, GLuint texName)
_mesa_debug(ctx, "glBindTexture %s %d\n",
_mesa_enum_to_string(target), (GLint) texName);
- bind_texture(ctx, target, texName, false);
+ bind_texture(ctx, target, texName, ctx->Texture.CurrentUnit, false,
+ "glBindTexture");
+}
+
+
+void GLAPIENTRY
+_mesa_BindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture)
+{
+ GET_CURRENT_CONTEXT(ctx);
+
+ unsigned unit = texunit - GL_TEXTURE0;
+
+ if (texunit < GL_TEXTURE0 || unit >= _mesa_max_tex_unit(ctx)) {
+ _mesa_error(ctx, GL_INVALID_ENUM, "BindMultiTextureEXT(texunit=%s)",
+ _mesa_enum_to_string(texunit));
+ return;
+ }
+
+ if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
+ _mesa_debug(ctx, "glBindMultiTextureEXT %s %d\n",
+ _mesa_enum_to_string(texunit), (GLint) texture);
+
+ bind_texture(ctx, target, texture, unit, false, "glBindMultiTextureEXT");
}
diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h
index 743e6b73ddf..80e95d1f91a 100644
--- a/src/mesa/main/texobj.h
+++ b/src/mesa/main/texobj.h
@@ -208,6 +208,9 @@ _mesa_BindTexture_no_error(GLenum target, GLuint texture);
extern void GLAPIENTRY
_mesa_BindTexture( GLenum target, GLuint texture );
+void GLAPIENTRY
+_mesa_BindMultiTextureEXT(GLenum texunit, GLenum target, GLuint texture);
+
void GLAPIENTRY
_mesa_BindTextureUnit_no_error(GLuint unit, GLuint texture);
--
2.17.1
More information about the mesa-dev
mailing list