+/* 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