From e364ddece3997d66572fd81788a00073fc53e42c Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Tue, 30 Apr 2019 17:52:01 +0200 Subject: [PATCH] mesa: add EXT_dsa glMultiTexGen* functions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák --- .../glapi/gen/EXT_direct_state_access.xml | 63 +++ src/mapi/glapi/gen/static_data.py | 9 + src/mesa/main/tests/dispatch_sanity.cpp | 30 +- src/mesa/main/texgen.c | 359 +++++++++++------- src/mesa/main/texgen.h | 18 + 5 files changed, 334 insertions(+), 145 deletions(-) diff --git a/src/mapi/glapi/gen/EXT_direct_state_access.xml b/src/mapi/glapi/gen/EXT_direct_state_access.xml index 0cb4a47ef57..d6e61b2661d 100644 --- a/src/mapi/glapi/gen/EXT_direct_state_access.xml +++ b/src/mapi/glapi/gen/EXT_direct_state_access.xml @@ -570,6 +570,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mapi/glapi/gen/static_data.py b/src/mapi/glapi/gen/static_data.py index a74de70897a..4c54bf50a9e 100644 --- a/src/mapi/glapi/gen/static_data.py +++ b/src/mapi/glapi/gen/static_data.py @@ -1541,6 +1541,15 @@ offsets = { "CopyMultiTexSubImage1DEXT": 1505, "CopyMultiTexSubImage2DEXT": 1506, "CopyMultiTexSubImage3DEXT": 1507, + "MultiTexGendEXT": 1508, + "MultiTexGendvEXT": 1509, + "MultiTexGenfEXT": 1510, + "MultiTexGenfvEXT": 1511, + "MultiTexGeniEXT": 1512, + "MultiTexGenivEXT": 1513, + "GetMultiTexGendvEXT": 1514, + "GetMultiTexGenfvEXT": 1515, + "GetMultiTexGenivEXT": 1516, } functions = [ diff --git a/src/mesa/main/tests/dispatch_sanity.cpp b/src/mesa/main/tests/dispatch_sanity.cpp index 3653597bb2e..d1bc68b020b 100644 --- a/src/mesa/main/tests/dispatch_sanity.cpp +++ b/src/mesa/main/tests/dispatch_sanity.cpp @@ -1057,21 +1057,21 @@ const struct function common_desktop_functions_possible[] = { /* GL_EXT_direct_state_access - GL 1.2.1 */ { "glBindMultiTextureEXT", 12, -1 }, //{ "glMultiTexCoordPointerEXT", 12, -1 }, - //{ "glMultiTexEnvfEXT", 12, -1 }, - //{ "glMultiTexEnvfvEXT", 12, -1 }, - //{ "glMultiTexEnviEXT", 12, -1 }, - //{ "glMultiTexEnvivEXT", 12, -1 }, - //{ "glMultiTexGendEXT", 12, -1 }, - //{ "glMultiTexGendvEXT", 12, -1 }, - //{ "glMultiTexGenfEXT", 12, -1 }, - //{ "glMultiTexGenfvEXT", 12, -1 }, - //{ "glMultiTexGeniEXT", 12, -1 }, - //{ "glMultiTexGenivEXT", 12, -1 }, - //{ "glGetMultiTexEnvfvEXT", 12, -1 }, - //{ "glGetMultiTexEnvivEXT", 12, -1 }, - //{ "glGetMultiTexGendvEXT", 12, -1 }, - //{ "glGetMultiTexGenfvEXT", 12, -1 }, - //{ "glGetMultiTexGenivEXT", 12, -1 }, + { "glMultiTexEnvfEXT", 12, -1 }, + { "glMultiTexEnvfvEXT", 12, -1 }, + { "glMultiTexEnviEXT", 12, -1 }, + { "glMultiTexEnvivEXT", 12, -1 }, + { "glMultiTexGendEXT", 12, -1 }, + { "glMultiTexGendvEXT", 12, -1 }, + { "glMultiTexGenfEXT", 12, -1 }, + { "glMultiTexGenfvEXT", 12, -1 }, + { "glMultiTexGeniEXT", 12, -1 }, + { "glMultiTexGenivEXT", 12, -1 }, + { "glGetMultiTexEnvfvEXT", 12, -1 }, + { "glGetMultiTexEnvivEXT", 12, -1 }, + { "glGetMultiTexGendvEXT", 12, -1 }, + { "glGetMultiTexGenfvEXT", 12, -1 }, + { "glGetMultiTexGenivEXT", 12, -1 }, { "glMultiTexParameterfEXT", 12, -1 }, { "glMultiTexParameterfvEXT", 12, -1 }, { "glMultiTexParameteriEXT", 12, -1 }, diff --git a/src/mesa/main/texgen.c b/src/mesa/main/texgen.c index 96d0228d8ca..f878324df98 100644 --- a/src/mesa/main/texgen.c +++ b/src/mesa/main/texgen.c @@ -43,9 +43,16 @@ * Return texgen state for given coordinate */ static struct gl_texgen * -get_texgen(struct gl_context *ctx, struct gl_fixedfunc_texture_unit *texUnit, - GLenum coord) +get_texgen(struct gl_context *ctx, GLuint texunitIndex, GLenum coord, const char* caller) { + struct gl_fixedfunc_texture_unit* texUnit; + if (texunitIndex >= ctx->Const.MaxTextureCoordUnits) { + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unit=%d)", caller, texunitIndex); + return NULL; + } + + texUnit = _mesa_get_fixedfunc_tex_unit(ctx, texunitIndex); + if (ctx->API == API_OPENGLES) { return (coord == GL_TEXTURE_GEN_STR_OES) ? &texUnit->GenS : NULL; @@ -66,30 +73,17 @@ get_texgen(struct gl_context *ctx, struct gl_fixedfunc_texture_unit *texUnit, } -void GLAPIENTRY -_mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) +/* Helper for glTexGenfv and glMultiTexGenfvEXT functions */ +static void +texgenfv( GLuint texunitIndex, GLenum coord, GLenum pname, + const GLfloat *params, const char* caller ) { - struct gl_fixedfunc_texture_unit *texUnit; struct gl_texgen *texgen; GET_CURRENT_CONTEXT(ctx); - if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE)) - _mesa_debug(ctx, "glTexGen %s %s %.1f(%s)...\n", - _mesa_enum_to_string(coord), - _mesa_enum_to_string(pname), - *params, - _mesa_enum_to_string((GLenum) (GLint) *params)); - - if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glTexGen(current unit)"); - return; - } - - texUnit = _mesa_get_fixedfunc_tex_unit(ctx, ctx->Texture.CurrentUnit); - - texgen = get_texgen(ctx, texUnit, coord); + texgen = get_texgen(ctx, texunitIndex, coord, caller); if (!texgen) { - _mesa_error(ctx, GL_INVALID_ENUM, "glTexGen(coord)"); + _mesa_error(ctx, GL_INVALID_ENUM, "%s(coord)", caller); return; } @@ -183,9 +177,137 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) } +/* Helper for glGetTexGendv / glGetMultiTexGendvEXT */ +static void +gettexgendv( GLuint texunitIndex, GLenum coord, GLenum pname, + GLdouble *params, const char* caller) +{ + struct gl_texgen *texgen; + GET_CURRENT_CONTEXT(ctx); + + texgen = get_texgen(ctx, texunitIndex, coord, caller); + if (!texgen) { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(coord)", caller); + return; + } + + switch (pname) { + case GL_TEXTURE_GEN_MODE: + params[0] = ENUM_TO_DOUBLE(texgen->Mode); + break; + case GL_OBJECT_PLANE: + COPY_4V(params, texgen->ObjectPlane); + break; + case GL_EYE_PLANE: + COPY_4V(params, texgen->EyePlane); + break; + default: + _mesa_error( ctx, GL_INVALID_ENUM, "%s(pname)", caller ); + } +} + + +/* Helper for glGetTexGenfv / glGetMultiTexGenfvEXT */ +static void +gettexgenfv( GLenum texunitIndex, GLenum coord, GLenum pname, + GLfloat *params, const char* caller ) +{ + struct gl_texgen *texgen; + GET_CURRENT_CONTEXT(ctx); + + texgen = get_texgen(ctx, texunitIndex, coord, caller); + if (!texgen) { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(coord)", caller); + return; + } + + switch (pname) { + case GL_TEXTURE_GEN_MODE: + params[0] = ENUM_TO_FLOAT(texgen->Mode); + break; + case GL_OBJECT_PLANE: + if (ctx->API != API_OPENGL_COMPAT) { + _mesa_error( ctx, GL_INVALID_ENUM, "%s(param)", caller ); + return; + } + COPY_4V(params, texgen->ObjectPlane); + break; + case GL_EYE_PLANE: + if (ctx->API != API_OPENGL_COMPAT) { + _mesa_error( ctx, GL_INVALID_ENUM, "%s(param)", caller ); + return; + } + COPY_4V(params, texgen->EyePlane); + break; + default: + _mesa_error( ctx, GL_INVALID_ENUM, "%s(pname)", caller ); + } +} + + +/* Helper for glGetTexGeniv / glGetMultiTexGenivEXT */ +static void +gettexgeniv( GLenum texunitIndex, GLenum coord, GLenum pname, + GLint *params, const char* caller) +{ + struct gl_texgen *texgen; + GET_CURRENT_CONTEXT(ctx); + + texgen = get_texgen(ctx, texunitIndex, coord, caller); + if (!texgen) { + _mesa_error(ctx, GL_INVALID_ENUM, "%s(coord)", caller); + return; + } + + switch (pname) { + case GL_TEXTURE_GEN_MODE: + params[0] = texgen->Mode; + break; + case GL_OBJECT_PLANE: + if (ctx->API != API_OPENGL_COMPAT) { + _mesa_error( ctx, GL_INVALID_ENUM, "%s(param)" , caller); + return; + } + params[0] = (GLint) texgen->ObjectPlane[0]; + params[1] = (GLint) texgen->ObjectPlane[1]; + params[2] = (GLint) texgen->ObjectPlane[2]; + params[3] = (GLint) texgen->ObjectPlane[3]; + break; + case GL_EYE_PLANE: + if (ctx->API != API_OPENGL_COMPAT) { + _mesa_error( ctx, GL_INVALID_ENUM, "%s(param)" , caller); + return; + } + params[0] = (GLint) texgen->EyePlane[0]; + params[1] = (GLint) texgen->EyePlane[1]; + params[2] = (GLint) texgen->EyePlane[2]; + params[3] = (GLint) texgen->EyePlane[3]; + break; + default: + _mesa_error( ctx, GL_INVALID_ENUM, "%s(pname)" , caller); + } +} + + +void GLAPIENTRY +_mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params ) +{ + GET_CURRENT_CONTEXT(ctx); + texgenfv(ctx->Texture.CurrentUnit, coord, pname, params, "glTexGenfv"); +} + + +void GLAPIENTRY +_mesa_MultiTexGenfvEXT( GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params ) +{ + texgenfv(texunit - GL_TEXTURE0, coord, pname, params, "glMultiTexGenfvEXT"); +} + + void GLAPIENTRY _mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params ) { + GET_CURRENT_CONTEXT(ctx); GLfloat p[4]; p[0] = (GLfloat) params[0]; if (pname == GL_TEXTURE_GEN_MODE) { @@ -196,20 +318,46 @@ _mesa_TexGeniv(GLenum coord, GLenum pname, const GLint *params ) p[2] = (GLfloat) params[2]; p[3] = (GLfloat) params[3]; } - _mesa_TexGenfv(coord, pname, p); + texgenfv(ctx->Texture.CurrentUnit, coord, pname, p, "glTexGeniv"); +} + +void GLAPIENTRY +_mesa_MultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, const GLint *params ) +{ + GLfloat p[4]; + p[0] = (GLfloat) params[0]; + if (pname == GL_TEXTURE_GEN_MODE) { + p[1] = p[2] = p[3] = 0.0F; + } + else { + p[1] = (GLfloat) params[1]; + p[2] = (GLfloat) params[2]; + p[3] = (GLfloat) params[3]; + } + texgenfv(texunit - GL_TEXTURE0, coord, pname, p, "glMultiTexGenivEXT"); } void GLAPIENTRY _mesa_TexGend(GLenum coord, GLenum pname, GLdouble param ) { + GET_CURRENT_CONTEXT(ctx); GLfloat p[4]; p[0] = (GLfloat) param; p[1] = p[2] = p[3] = 0.0F; - _mesa_TexGenfv( coord, pname, p ); + texgenfv(ctx->Texture.CurrentUnit, coord, pname, p, "glTexGend"); } +void GLAPIENTRY +_mesa_MultiTexGendEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble param ) +{ + GLfloat p[4]; + p[0] = (GLfloat) param; + p[1] = p[2] = p[3] = 0.0F; + texgenfv(texunit - GL_TEXTURE0, coord, pname, p, "glMultiTexGendEXT"); +} + void GLAPIENTRY _es_GetTexGenfv(GLenum coord, GLenum pname, GLfloat *params) { @@ -249,6 +397,24 @@ _es_TexGenfv(GLenum coord, GLenum pname, const GLfloat *params) void GLAPIENTRY _mesa_TexGendv(GLenum coord, GLenum pname, const GLdouble *params ) +{ + GET_CURRENT_CONTEXT(ctx); + GLfloat p[4]; + p[0] = (GLfloat) params[0]; + if (pname == GL_TEXTURE_GEN_MODE) { + p[1] = p[2] = p[3] = 0.0F; + } + else { + p[1] = (GLfloat) params[1]; + p[2] = (GLfloat) params[2]; + p[3] = (GLfloat) params[3]; + } + texgenfv(ctx->Texture.CurrentUnit, coord, pname, p, "glTexGendv"); +} + + +void GLAPIENTRY +_mesa_MultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params ) { GLfloat p[4]; p[0] = (GLfloat) params[0]; @@ -260,17 +426,28 @@ _mesa_TexGendv(GLenum coord, GLenum pname, const GLdouble *params ) p[2] = (GLfloat) params[2]; p[3] = (GLfloat) params[3]; } - _mesa_TexGenfv( coord, pname, p ); + texgenfv(texunit - GL_TEXTURE0, coord, pname, p, "glMultiTexGendvEXT"); } void GLAPIENTRY _mesa_TexGenf( GLenum coord, GLenum pname, GLfloat param ) +{ + GET_CURRENT_CONTEXT(ctx); + GLfloat p[4]; + p[0] = param; + p[1] = p[2] = p[3] = 0.0F; + texgenfv(ctx->Texture.CurrentUnit, coord, pname, p, "glTexGenf"); +} + + +void GLAPIENTRY +_mesa_MultiTexGenfEXT( GLenum texunit, GLenum coord, GLenum pname, GLfloat param ) { GLfloat p[4]; p[0] = param; p[1] = p[2] = p[3] = 0.0F; - _mesa_TexGenfv(coord, pname, p); + texgenfv(texunit - GL_TEXTURE0, coord, pname, p, "glMultiTexGenfEXT"); } @@ -284,134 +461,56 @@ _mesa_TexGeni( GLenum coord, GLenum pname, GLint param ) } +void GLAPIENTRY +_mesa_MultiTexGeniEXT( GLenum texunit, GLenum coord, GLenum pname, GLint param ) +{ + GLint p[4]; + p[0] = param; + p[1] = p[2] = p[3] = 0; + _mesa_MultiTexGenivEXT( texunit, coord, pname, p ); +} + void GLAPIENTRY _mesa_GetTexGendv( GLenum coord, GLenum pname, GLdouble *params ) { - struct gl_fixedfunc_texture_unit *texUnit; - struct gl_texgen *texgen; GET_CURRENT_CONTEXT(ctx); + gettexgendv(ctx->Texture.CurrentUnit, coord, pname, params, "glGetTexGendv"); +} - if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGendv(current unit)"); - return; - } - - texUnit = _mesa_get_fixedfunc_tex_unit(ctx, ctx->Texture.CurrentUnit); - - texgen = get_texgen(ctx, texUnit, coord); - if (!texgen) { - _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexGendv(coord)"); - return; - } - switch (pname) { - case GL_TEXTURE_GEN_MODE: - params[0] = ENUM_TO_DOUBLE(texgen->Mode); - break; - case GL_OBJECT_PLANE: - COPY_4V(params, texgen->ObjectPlane); - break; - case GL_EYE_PLANE: - COPY_4V(params, texgen->EyePlane); - break; - default: - _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); - } +void GLAPIENTRY +_mesa_GetMultiTexGendvEXT( GLenum texunit, GLenum coord, GLenum pname, GLdouble *params ) +{ + gettexgendv(texunit - GL_TEXTURE0, coord, pname, params, "glGetMultiTexGendvEXT"); } - void GLAPIENTRY _mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ) { - struct gl_fixedfunc_texture_unit *texUnit; - struct gl_texgen *texgen; GET_CURRENT_CONTEXT(ctx); + gettexgenfv(ctx->Texture.CurrentUnit, coord, pname, params, "glGetTexGenfv"); +} - if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGenfv(current unit)"); - return; - } - - texUnit = _mesa_get_fixedfunc_tex_unit(ctx, ctx->Texture.CurrentUnit); - - texgen = get_texgen(ctx, texUnit, coord); - if (!texgen) { - _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexGenfv(coord)"); - return; - } - switch (pname) { - case GL_TEXTURE_GEN_MODE: - params[0] = ENUM_TO_FLOAT(texgen->Mode); - break; - case GL_OBJECT_PLANE: - if (ctx->API != API_OPENGL_COMPAT) { - _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(param)" ); - return; - } - COPY_4V(params, texgen->ObjectPlane); - break; - case GL_EYE_PLANE: - if (ctx->API != API_OPENGL_COMPAT) { - _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(param)" ); - return; - } - COPY_4V(params, texgen->EyePlane); - break; - default: - _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); - } +void GLAPIENTRY +_mesa_GetMultiTexGenfvEXT( GLenum texunit, GLenum coord, GLenum pname, GLfloat *params ) +{ + gettexgenfv(texunit - GL_TEXTURE0, coord, pname, params, "glGetMultiTexGenfvEXT"); } - void GLAPIENTRY _mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params ) { - struct gl_fixedfunc_texture_unit *texUnit; - struct gl_texgen *texgen; GET_CURRENT_CONTEXT(ctx); + gettexgeniv(ctx->Texture.CurrentUnit, coord, pname, params, "glGetTexGeniv"); +} - if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexGeniv(current unit)"); - return; - } - - texUnit = _mesa_get_fixedfunc_tex_unit(ctx, ctx->Texture.CurrentUnit); - - texgen = get_texgen(ctx, texUnit, coord); - if (!texgen) { - _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexGeniv(coord)"); - return; - } - switch (pname) { - case GL_TEXTURE_GEN_MODE: - params[0] = texgen->Mode; - break; - case GL_OBJECT_PLANE: - if (ctx->API != API_OPENGL_COMPAT) { - _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(param)" ); - return; - } - params[0] = (GLint) texgen->ObjectPlane[0]; - params[1] = (GLint) texgen->ObjectPlane[1]; - params[2] = (GLint) texgen->ObjectPlane[2]; - params[3] = (GLint) texgen->ObjectPlane[3]; - break; - case GL_EYE_PLANE: - if (ctx->API != API_OPENGL_COMPAT) { - _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(param)" ); - return; - } - params[0] = (GLint) texgen->EyePlane[0]; - params[1] = (GLint) texgen->EyePlane[1]; - params[2] = (GLint) texgen->EyePlane[2]; - params[3] = (GLint) texgen->EyePlane[3]; - break; - default: - _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); - } +void GLAPIENTRY +_mesa_GetMultiTexGenivEXT( GLenum texunit, GLenum coord, GLenum pname, GLint *params ) +{ + gettexgeniv(texunit - GL_TEXTURE0, coord, pname, params, "glGetTexGenivEXT"); } diff --git a/src/mesa/main/texgen.h b/src/mesa/main/texgen.h index 84adfc06182..ad36aca60df 100644 --- a/src/mesa/main/texgen.h +++ b/src/mesa/main/texgen.h @@ -51,6 +51,24 @@ _mesa_GetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ); void GLAPIENTRY _mesa_GetTexGeniv( GLenum coord, GLenum pname, GLint *params ); +void GLAPIENTRY +_mesa_MultiTexGenfvEXT( GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params ); +void GLAPIENTRY +_mesa_MultiTexGenivEXT(GLenum texunit, GLenum coord, GLenum pname, const GLint *params ); +void GLAPIENTRY +_mesa_MultiTexGendEXT(GLenum texunit, GLenum coord, GLenum pname, GLdouble param ); +void GLAPIENTRY +_mesa_MultiTexGendvEXT(GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params ); +void GLAPIENTRY +_mesa_MultiTexGenfEXT( GLenum texunit, GLenum coord, GLenum pname, GLfloat param ); +void GLAPIENTRY +_mesa_MultiTexGeniEXT( GLenum texunit, GLenum coord, GLenum pname, GLint param ); +void GLAPIENTRY +_mesa_GetMultiTexGendvEXT( GLenum texunit, GLenum coord, GLenum pname, GLdouble *params ); +void GLAPIENTRY +_mesa_GetMultiTexGenfvEXT( GLenum texunit, GLenum coord, GLenum pname, GLfloat *params ); +void GLAPIENTRY +_mesa_GetMultiTexGenivEXT( GLenum texunit, GLenum coord, GLenum pname, GLint *params ); extern void GLAPIENTRY _es_GetTexGenfv(GLenum coord, GLenum pname, GLfloat *params); -- 2.30.2