--- .../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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev