t_vb_texgen.c revision a2ea606377ed5679dc513eabcf2d398216b47d61
1cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/*
2cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Mesa 3-D graphics library
3a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol * Version:  6.5
4cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
5a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
7cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
8cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * copy of this software and associated documentation files (the "Software"),
9cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * to deal in the Software without restriction, including without limitation
10cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
12cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Software is furnished to do so, subject to the following conditions:
13cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
14cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * The above copyright notice and this permission notice shall be included
15cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * in all copies or substantial portions of the Software.
16cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
17cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell *
24cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Authors:
2505a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul *    Brian Paul
2605a4b37707d2c598ea68c05d07a3d65bcbf5a076Brian Paul *    Keith Whitwell <keith@tungstengraphics.com>
27cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
28cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
29ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul/*
30ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * Regarding GL_NV_texgen_reflection:
31ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul *
32ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * Portions of this software may use or implement intellectual
33ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * property owned and licensed by NVIDIA Corporation. NVIDIA disclaims
34ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * any and all warranties with respect to such intellectual property,
35ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul * including any use thereof or modifications thereto.
36ae7666385d6bb2885fce2590d4f07c6caa8b3260Brian Paul */
37cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
38cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "glheader.h"
39cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "colormac.h"
40cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "context.h"
41cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "macros.h"
423c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h"
43cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "mtypes.h"
44cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
45cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "math/m_xform.h"
46cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
47cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "t_context.h"
48cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "t_pipeline.h"
49cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
50cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
51cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/***********************************************************************
52cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Automatic texture coordinate generation (texgen) code.
53cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
54cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
55cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
56cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstruct texgen_stage_data;
57cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
58cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwelltypedef void (*texgen_func)( GLcontext *ctx,
59cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			     struct texgen_stage_data *store,
60cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			     GLuint unit);
61cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
62cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
63cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstruct texgen_stage_data {
64cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
65cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Per-texunit derived state.
66cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
67610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLuint TexgenSize[MAX_TEXTURE_COORD_UNITS];
68610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   texgen_func TexgenFunc[MAX_TEXTURE_COORD_UNITS];
69cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
70cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Temporary values used in texgen.
71cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
72cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat (*tmp_f)[3];
73cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *tmp_m;
74cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
75cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   /* Buffered outputs of the stage.
76cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell    */
77610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLvector4f texcoord[MAX_TEXTURE_COORD_UNITS];
78cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
79cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
80cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
81b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul#define TEXGEN_STAGE_DATA(stage) ((struct texgen_stage_data *)stage->privatePtr)
82cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
83cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
84cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
85cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic GLuint all_bits[5] = {
86cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   0,
87cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   VEC_SIZE_1,
88cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   VEC_SIZE_2,
89cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   VEC_SIZE_3,
90cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   VEC_SIZE_4,
91cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
92cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
93cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#define VEC_SIZE_FLAGS (VEC_SIZE_1|VEC_SIZE_2|VEC_SIZE_3|VEC_SIZE_4)
94cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
95ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell#define TEXGEN_NEED_M            (TEXGEN_SPHERE_MAP)
96ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell#define TEXGEN_NEED_F            (TEXGEN_SPHERE_MAP        | \
97ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell				  TEXGEN_REFLECTION_MAP_NV)
98ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell
99ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell
100ed39a43b8cb2e1cf69b097fc89365cde470ebf51Keith Whitwell
1015e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughesstatic void build_m3( GLfloat f[][3], GLfloat m[],
102bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul		      const GLvector4f *normal,
1035e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes		      const GLvector4f *eye )
104cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
105cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint stride = eye->stride;
106cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *coord = (GLfloat *)eye->start;
107cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint count = eye->count;
108cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   const GLfloat *norm = normal->start;
109cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
110cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
111908be619fdba608b057ae512834dcc7a76aa3224Keith Whitwell   for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(norm,normal->stride)) {
112cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      GLfloat u[3], two_nu, fx, fy, fz;
11322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      COPY_3V( u, coord );
114cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      NORMALIZE_3FV( u );
115cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      two_nu = 2.0F * DOT3(norm,u);
116cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      fx = f[i][0] = u[0] - norm[0] * two_nu;
117cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      fy = f[i][1] = u[1] - norm[1] * two_nu;
118cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      fz = f[i][2] = u[2] - norm[2] * two_nu;
119cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      m[i] = fx * fx + fy * fy + (fz + 1.0F) * (fz + 1.0F);
120cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      if (m[i] != 0.0F) {
121f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul	 m[i] = 0.5F * _mesa_inv_sqrtf(m[i]);
122cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
123cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
124cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
125cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
126cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
127cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1285e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughesstatic void build_m2( GLfloat f[][3], GLfloat m[],
129bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul		      const GLvector4f *normal,
1305e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes		      const GLvector4f *eye )
131cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
132cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint stride = eye->stride;
133cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *coord = eye->start;
134cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint count = eye->count;
135cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
136cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *norm = normal->start;
137cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
138cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
139908be619fdba608b057ae512834dcc7a76aa3224Keith Whitwell   for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(norm,normal->stride)) {
140cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      GLfloat u[3], two_nu, fx, fy, fz;
14122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      COPY_2V( u, coord );
142cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      u[2] = 0;
143cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      NORMALIZE_3FV( u );
144cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      two_nu = 2.0F * DOT3(norm,u);
145cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      fx = f[i][0] = u[0] - norm[0] * two_nu;
146cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      fy = f[i][1] = u[1] - norm[1] * two_nu;
147cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      fz = f[i][2] = u[2] - norm[2] * two_nu;
148cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      m[i] = fx * fx + fy * fy + (fz + 1.0F) * (fz + 1.0F);
149cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      if (m[i] != 0.0F) {
150f9b1e5241facc8cf255c258082d5cb5b04783e93Brian Paul	 m[i] = 0.5F * _mesa_inv_sqrtf(m[i]);
151cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
152cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
153cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
154cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
155cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
156cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1575e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughestypedef void (*build_m_func)( GLfloat f[][3],
1585e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes			      GLfloat m[],
159bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul			      const GLvector4f *normal,
1605e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes			      const GLvector4f *eye );
161cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
162cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
163cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic build_m_func build_m_tab[5] = {
164b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell   NULL,
165b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell   NULL,
166cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   build_m2,
167cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   build_m3,
168cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   build_m3
169cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
170cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
171cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
172cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* This is unusual in that we respect the stride of the output vector
173cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * (f).  This allows us to pass in either a texcoord vector4f, or a
17422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * temporary vector3f.
175cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
17622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic void build_f3( GLfloat *f,
177cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		      GLuint fstride,
178bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul		      const GLvector4f *normal,
179cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		      const GLvector4f *eye )
180cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
181cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint stride = eye->stride;
182cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *coord = eye->start;
183cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint count = eye->count;
184cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
185cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *norm = normal->start;
186cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
187cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
188cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   for (i=0;i<count;i++) {
189cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      GLfloat u[3], two_nu;
19022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      COPY_3V( u, coord );
191cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      NORMALIZE_3FV( u );
192cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      two_nu = 2.0F * DOT3(norm,u);
193cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      f[0] = u[0] - norm[0] * two_nu;
194cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      f[1] = u[1] - norm[1] * two_nu;
195cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      f[2] = u[2] - norm[2] * two_nu;
196cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      STRIDE_F(coord,stride);
19722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      STRIDE_F(f,fstride);
198cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      STRIDE_F(norm, normal->stride);
199cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
200cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
201cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
202cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
20322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic void build_f2( GLfloat *f,
204cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		      GLuint fstride,
205bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul		      const GLvector4f *normal,
206cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		      const GLvector4f *eye )
207cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
208cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint stride = eye->stride;
209cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *coord = eye->start;
210cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint count = eye->count;
211cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *norm = normal->start;
212cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
213cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
214cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   for (i=0;i<count;i++) {
215cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
216cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      GLfloat u[3], two_nu;
21722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      COPY_2V( u, coord );
218cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      u[2] = 0;
219cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      NORMALIZE_3FV( u );
220cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      two_nu = 2.0F * DOT3(norm,u);
221cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      f[0] = u[0] - norm[0] * two_nu;
222cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      f[1] = u[1] - norm[1] * two_nu;
223cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      f[2] = u[2] - norm[2] * two_nu;
224cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
225cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      STRIDE_F(coord,stride);
226cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      STRIDE_F(f,fstride);
227cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      STRIDE_F(norm, normal->stride);
228cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
229cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
230cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
231cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwelltypedef void (*build_f_func)( GLfloat *f,
232cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			      GLuint fstride,
233bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul			      const GLvector4f *normal_vec,
234cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			      const GLvector4f *eye );
235cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
236cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
237cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
23822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes/* Just treat 4-vectors as 3-vectors.
239cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
240cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic build_f_func build_f_tab[5] = {
241b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell   NULL,
242b97e478fe90f612041e27852eb8c95f45467bde8Keith Whitwell   NULL,
243cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   build_f2,
244cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   build_f3,
24522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   build_f3
246cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
247cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
248cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
2495fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell
250cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* Special case texgen functions.
251cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
252cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void texgen_reflection_map_nv( GLcontext *ctx,
253cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				      struct texgen_stage_data *store,
254cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				      GLuint unit )
255cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
256cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
257cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f *in = VB->TexCoordPtr[unit];
258cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f *out = &store->texcoord[unit];
259cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
260cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   build_f_tab[VB->EyePtr->size]( out->start,
261cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				  out->stride,
26222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				  VB->NormalPtr,
26322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				  VB->EyePtr );
26422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
2655fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_3;
2665fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->count = VB->Count;
2675fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->size = MAX2(in->size, 3);
2685fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   if (in->size == 4)
2695fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell      _mesa_copy_tab[0x8]( out, in );
270cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
271cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
272cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
273cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
274cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void texgen_normal_map_nv( GLcontext *ctx,
275cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				  struct texgen_stage_data *store,
276cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell				  GLuint unit )
277cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
278cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
279cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f *in = VB->TexCoordPtr[unit];
280cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f *out = &store->texcoord[unit];
281bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul   GLvector4f *normal = VB->NormalPtr;
282cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->start;
283cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint count = VB->Count;
284cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
285cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   const GLfloat *norm = normal->start;
286cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
287cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) {
288cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      texcoord[i][0] = norm[0];
289cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      texcoord[i][1] = norm[1];
290cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      texcoord[i][2] = norm[2];
291cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
292cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
293cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
2945fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_3;
2955fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->count = count;
2965fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->size = MAX2(in->size, 3);
2975fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   if (in->size == 4)
2985fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell      _mesa_copy_tab[0x8]( out, in );
299cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
300cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
301cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
302cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwellstatic void texgen_sphere_map( GLcontext *ctx,
303cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			       struct texgen_stage_data *store,
304cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			       GLuint unit )
305cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
306cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
307cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f *in = VB->TexCoordPtr[unit];
308cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f *out = &store->texcoord[unit];
309cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat (*texcoord)[4] = (GLfloat (*)[4]) out->start;
310cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint count = VB->Count;
311cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
312cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat (*f)[3] = store->tmp_f;
313cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat *m = store->tmp_m;
314cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
31522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   (build_m_tab[VB->EyePtr->size])( store->tmp_f,
31622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				    store->tmp_m,
31722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				    VB->NormalPtr,
31822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes				    VB->EyePtr );
319cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3205fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->size = MAX2(in->size,2);
3215fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell
322cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   for (i=0;i<count;i++) {
323cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      texcoord[i][0] = f[i][0] * m[i] + 0.5F;
324cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      texcoord[i][1] = f[i][1] * m[i] + 0.5F;
325cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
326cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3275fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->count = count;
3285fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_2;
3295fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   if (in->size > 2)
3305fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell      _mesa_copy_tab[all_bits[in->size] & ~0x3]( out, in );
331cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
332cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
333cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
334cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
33522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic void texgen( GLcontext *ctx,
336cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		    struct texgen_stage_data *store,
337cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		    GLuint unit )
338cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
339cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   TNLcontext *tnl = TNL_CONTEXT(ctx);
340cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct vertex_buffer *VB = &tnl->vb;
341cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f *in = VB->TexCoordPtr[unit];
342cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLvector4f *out = &store->texcoord[unit];
3432655e68504786b62a8463d04eaa74a953e5d2871Brian Paul   const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
344cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   const GLvector4f *obj = VB->ObjPtr;
345cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   const GLvector4f *eye = VB->EyePtr;
346bd1a9dacf6a45e6aa6954eeb490d55ebcc80ace8Brian Paul   const GLvector4f *normal = VB->NormalPtr;
3472655e68504786b62a8463d04eaa74a953e5d2871Brian Paul   const GLfloat *m = store->tmp_m;
3482655e68504786b62a8463d04eaa74a953e5d2871Brian Paul   const GLuint count = VB->Count;
349cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->data;
350cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLfloat (*f)[3] = store->tmp_f;
3515fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   GLuint copy;
352cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
353cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (texUnit->_GenFlags & TEXGEN_NEED_M) {
3542655e68504786b62a8463d04eaa74a953e5d2871Brian Paul      build_m_tab[eye->size]( store->tmp_f, store->tmp_m, normal, eye );
355cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   } else if (texUnit->_GenFlags & TEXGEN_NEED_F) {
3562655e68504786b62a8463d04eaa74a953e5d2871Brian Paul      build_f_tab[eye->size]( (GLfloat *)store->tmp_f, 3, normal, eye );
357cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
358cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
35922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
3605fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->size = MAX2(in->size, store->TexgenSize[unit]);
3615fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->flags |= (in->flags & VEC_SIZE_FLAGS) | texUnit->TexGenEnabled;
3625fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   out->count = count;
363cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
3645fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   copy = (all_bits[in->size] & ~texUnit->TexGenEnabled);
3655fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell   if (copy)
3665fff0c135da68f58914b926cb73c21d9a6620045Keith Whitwell      _mesa_copy_tab[copy]( out, in );
367cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
368cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (texUnit->TexGenEnabled & S_BIT) {
369cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      GLuint i;
370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      switch (texUnit->GenModeS) {
371cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_OBJECT_LINEAR:
3725e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes	 _mesa_dotprod_tab[obj->size]( (GLfloat *)out->data,
3735e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       sizeof(out->data[0]), obj,
3745e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       texUnit->ObjectPlaneS );
375cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
376cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_EYE_LINEAR:
3775e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes	 _mesa_dotprod_tab[eye->size]( (GLfloat *)out->data,
3785e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       sizeof(out->data[0]), eye,
3795e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       texUnit->EyePlaneS );
380cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
38122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      case GL_SPHERE_MAP:
3822655e68504786b62a8463d04eaa74a953e5d2871Brian Paul         for (i = 0; i < count; i++)
3832655e68504786b62a8463d04eaa74a953e5d2871Brian Paul            texcoord[i][0] = f[i][0] * m[i] + 0.5F;
384cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
38522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      case GL_REFLECTION_MAP_NV:
38622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 for (i=0;i<count;i++)
387cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	     texcoord[i][0] = f[i][0];
388cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
389cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_NORMAL_MAP_NV: {
390cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 const GLfloat *norm = normal->start;
391cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) {
392cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	     texcoord[i][0] = norm[0];
393cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 }
394cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
395cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
396cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      default:
39708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	 _mesa_problem(ctx, "Bad S texgen");
398cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
39922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   }
400cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
401cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (texUnit->TexGenEnabled & T_BIT) {
402cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      GLuint i;
403cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      switch (texUnit->GenModeT) {
404cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_OBJECT_LINEAR:
4055e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes	 _mesa_dotprod_tab[obj->size]( &(out->data[0][1]),
4065e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       sizeof(out->data[0]), obj,
4075e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       texUnit->ObjectPlaneT );
408cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
409cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_EYE_LINEAR:
4105e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes	 _mesa_dotprod_tab[eye->size]( &(out->data[0][1]),
4115e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       sizeof(out->data[0]), eye,
4125e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       texUnit->EyePlaneT );
41322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 break;
41422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      case GL_SPHERE_MAP:
4152655e68504786b62a8463d04eaa74a953e5d2871Brian Paul         for (i = 0; i < count; i++)
4162655e68504786b62a8463d04eaa74a953e5d2871Brian Paul            texcoord[i][1] = f[i][1] * m[i] + 0.5F;
41722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 break;
41822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      case GL_REFLECTION_MAP_NV:
41922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 for (i=0;i<count;i++)
4208fee8dfcaaf2dae5a8a022077f2d888b9943b5a2Daniel Borca	     texcoord[i][1] = f[i][1];
421cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
422cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_NORMAL_MAP_NV: {
423cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 const GLfloat *norm = normal->start;
424cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) {
425cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	     texcoord[i][1] = norm[1];
426cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 }
427cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
428cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
429cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      default:
43008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	 _mesa_problem(ctx, "Bad T texgen");
431cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
432cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
433cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
434cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (texUnit->TexGenEnabled & R_BIT) {
435cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      GLuint i;
436cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      switch (texUnit->GenModeR) {
437cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_OBJECT_LINEAR:
4385e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes	 _mesa_dotprod_tab[obj->size]( &(out->data[0][2]),
4395e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       sizeof(out->data[0]), obj,
4405e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       texUnit->ObjectPlaneR );
441cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
442cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_EYE_LINEAR:
4435e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes	 _mesa_dotprod_tab[eye->size]( &(out->data[0][2]),
4445e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       sizeof(out->data[0]), eye,
4455e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       texUnit->EyePlaneR );
446cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
44722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes      case GL_REFLECTION_MAP_NV:
44822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 for (i=0;i<count;i++)
449cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	     texcoord[i][2] = f[i][2];
450cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
451cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_NORMAL_MAP_NV: {
452cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 const GLfloat *norm = normal->start;
453cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 for (i=0;i<count;i++,STRIDE_F(norm, normal->stride)) {
454cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	     texcoord[i][2] = norm[2];
455cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 }
456cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
457cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
458cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      default:
45908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	 _mesa_problem(ctx, "Bad R texgen");
460cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
461cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
462cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
463cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (texUnit->TexGenEnabled & Q_BIT) {
464cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      switch (texUnit->GenModeQ) {
465cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_OBJECT_LINEAR:
4665e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes	 _mesa_dotprod_tab[obj->size]( &(out->data[0][3]),
4675e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       sizeof(out->data[0]), obj,
4685e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       texUnit->ObjectPlaneQ );
469cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
470cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      case GL_EYE_LINEAR:
4715e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes	 _mesa_dotprod_tab[eye->size]( &(out->data[0][3]),
4725e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       sizeof(out->data[0]), eye,
4735e23af22f708a66695c0e44e599c26f02d8d4dcdGareth Hughes				       texUnit->EyePlaneQ );
474cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 break;
475cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      default:
47608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	 _mesa_problem(ctx, "Bad Q texgen");
477cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
478cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
479cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
480cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
481cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
482cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
4836f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
48422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic GLboolean run_texgen_stage( GLcontext *ctx,
485ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell				   struct tnl_pipeline_stage *stage )
486cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
48722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
4886f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage);
489cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
490cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
491a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol   if (ctx->ShaderObjects.CurrentProgram != NULL)
492a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol      return GL_TRUE;
493a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol
4946f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   if (!ctx->Texture._TexGenEnabled || ctx->VertexProgram._Enabled)
4956f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      return GL_TRUE;
4966f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
4976f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) {
4986f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
4996f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
5006f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      if (texUnit->TexGenEnabled) {
5016f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
5026f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell	 store->TexgenFunc[i]( ctx, store, i );
503cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
504790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell	 VB->AttribPtr[VERT_ATTRIB_TEX0+i] =
505790734045b69c47b1525fbf9106a7ca5a8eb7416Keith Whitwell	    VB->TexCoordPtr[i] = &store->texcoord[i];
506cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
5076f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   }
508cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
509cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   return GL_TRUE;
510cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
511cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
512cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
5136f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwellstatic void validate_texgen_stage( GLcontext *ctx,
5146f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell				   struct tnl_pipeline_stage *stage )
515cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
516cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage);
517cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
518cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
519a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol   if (ctx->ShaderObjects.CurrentProgram != NULL)
520a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol      return;
521a2ea606377ed5679dc513eabcf2d398216b47d61Michal Krol
5226f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   if (!ctx->Texture._TexGenEnabled || ctx->VertexProgram._Enabled)
5236f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell      return;
5246f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell
52592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) {
526cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
527cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
528cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      if (texUnit->TexGenEnabled) {
529cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 GLuint sz;
530cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
531a4e65d69dc745a78fb3dbcbb0ee194e1b6877c5dBrian Paul	 if (texUnit->TexGenEnabled & Q_BIT)
532cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    sz = 4;
533a4e65d69dc745a78fb3dbcbb0ee194e1b6877c5dBrian Paul	 else if (texUnit->TexGenEnabled & R_BIT)
534cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    sz = 3;
535cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 else if (texUnit->TexGenEnabled & T_BIT)
536cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    sz = 2;
537cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 else
538cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    sz = 1;
53922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
540cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 store->TexgenSize[i] = sz;
5412655e68504786b62a8463d04eaa74a953e5d2871Brian Paul	 store->TexgenFunc[i] = texgen; /* general solution */
54222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
5432655e68504786b62a8463d04eaa74a953e5d2871Brian Paul         /* look for special texgen cases */
544cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 if (texUnit->TexGenEnabled == (S_BIT|T_BIT|R_BIT)) {
545cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    if (texUnit->_GenFlags == TEXGEN_REFLECTION_MAP_NV) {
546cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	       store->TexgenFunc[i] = texgen_reflection_map_nv;
547cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    }
548cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    else if (texUnit->_GenFlags == TEXGEN_NORMAL_MAP_NV) {
549cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	       store->TexgenFunc[i] = texgen_normal_map_nv;
550cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    }
551cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 }
552cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 else if (texUnit->TexGenEnabled == (S_BIT|T_BIT) &&
553cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell		  texUnit->_GenFlags == TEXGEN_SPHERE_MAP) {
554cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	    store->TexgenFunc[i] = texgen_sphere_map;
555cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell	 }
556cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      }
557cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
558cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
559cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
560cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
561cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
562cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
563cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
564cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* Called the first time stage->run() is invoked.
565cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */
56622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughesstatic GLboolean alloc_texgen_data( GLcontext *ctx,
567ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwell				    struct tnl_pipeline_stage *stage )
568cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
56922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
570cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct texgen_stage_data *store;
571cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
572cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
573b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul   stage->privatePtr = CALLOC(sizeof(*store));
574cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   store = TEXGEN_STAGE_DATA(stage);
575cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (!store)
576cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      return GL_FALSE;
577cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
57892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
57908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_vector4f_alloc( &store->texcoord[i], 0, VB->Size, 32 );
580cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
581cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   store->tmp_f = (GLfloat (*)[3]) MALLOC(VB->Size * sizeof(GLfloat) * 3);
582cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   store->tmp_m = (GLfloat *) MALLOC(VB->Size * sizeof(GLfloat));
583cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
5846f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   return GL_TRUE;
585cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
586cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
587cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
588ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellstatic void free_texgen_data( struct tnl_pipeline_stage *stage )
589cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
590cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{
591cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage);
592cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   GLuint i;
593cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
594cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   if (store) {
595610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul      for (i = 0 ; i < MAX_TEXTURE_COORD_UNITS ; i++)
59622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes	 if (store->texcoord[i].data)
59708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul	    _mesa_vector4f_free( &store->texcoord[i] );
598cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
59922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
600cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      if (store->tmp_f) FREE( store->tmp_f );
601cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      if (store->tmp_m) FREE( store->tmp_m );
602cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      FREE( store );
603b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul      stage->privatePtr = NULL;
604cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   }
605cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell}
606cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
607cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
60822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes
609ae0eaf93e092ac8e8b1c98f3e986de96940663faKeith Whitwellconst struct tnl_pipeline_stage _tnl_texgen_stage =
61022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes{
61186b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul   "texgen",			/* name */
61286b842790b720cd6b1499ce8edca8a4e9c8dc029Brian Paul   NULL,			/* private data */
6136f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   alloc_texgen_data,		/* destructor */
614cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   free_texgen_data,		/* destructor */
6156f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   validate_texgen_stage,		/* check */
6166f973f33679e034b7cb63806f1ddfabdbdd70123Keith Whitwell   run_texgen_stage		/* run -- initially set to alloc data */
617cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell};
618