1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 6.5 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Brian Paul 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Regarding GL_NV_texgen_reflection: 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Portions of this software may use or implement intellectual 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * property owned and licensed by NVIDIA Corporation. NVIDIA disclaims 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * any and all warranties with respect to such intellectual property, 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * including any use thereof or modifications thereto. 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/colormac.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "math/m_xform.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "t_context.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "t_pipeline.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*********************************************************************** 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Automatic texture coordinate generation (texgen) code. 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct texgen_stage_data; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*texgen_func)( struct gl_context *ctx, 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store, 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint unit); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct texgen_stage_data { 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Per-texunit derived state. 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint TexgenSize[MAX_TEXTURE_COORD_UNITS]; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texgen_func TexgenFunc[MAX_TEXTURE_COORD_UNITS]; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Temporary values used in texgen. 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*tmp_f)[3]; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *tmp_m; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Buffered outputs of the stage. 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f texcoord[MAX_TEXTURE_COORD_UNITS]; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TEXGEN_STAGE_DATA(stage) ((struct texgen_stage_data *)stage->privatePtr) 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint all_bits[5] = { 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC_SIZE_1, 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC_SIZE_2, 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC_SIZE_3, 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VEC_SIZE_4, 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define VEC_SIZE_FLAGS (VEC_SIZE_1|VEC_SIZE_2|VEC_SIZE_3|VEC_SIZE_4) 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TEXGEN_NEED_M (TEXGEN_SPHERE_MAP) 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TEXGEN_NEED_F (TEXGEN_SPHERE_MAP | \ 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TEXGEN_REFLECTION_MAP_NV) 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void build_m3( GLfloat f[][3], GLfloat m[], 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *normal, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *eye ) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint stride = eye->stride; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *coord = (GLfloat *)eye->start; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count = eye->count; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *norm = normal->start; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(norm,normal->stride)) { 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat u[3], two_nu, fx, fy, fz; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3V( u, coord ); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV( u ); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org two_nu = 2.0F * DOT3(norm,u); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fx = f[i][0] = u[0] - norm[0] * two_nu; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fy = f[i][1] = u[1] - norm[1] * two_nu; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fz = f[i][2] = u[2] - norm[2] * two_nu; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[i] = fx * fx + fy * fy + (fz + 1.0F) * (fz + 1.0F); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (m[i] != 0.0F) { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[i] = 0.5F * INV_SQRTF(m[i]); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void build_m2( GLfloat f[][3], GLfloat m[], 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *normal, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *eye ) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint stride = eye->stride; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *coord = eye->start; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count = eye->count; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *norm = normal->start; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++,STRIDE_F(coord,stride),STRIDE_F(norm,normal->stride)) { 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat u[3], two_nu, fx, fy, fz; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_2V( u, coord ); 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u[2] = 0; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV( u ); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org two_nu = 2.0F * DOT3(norm,u); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fx = f[i][0] = u[0] - norm[0] * two_nu; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fy = f[i][1] = u[1] - norm[1] * two_nu; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fz = f[i][2] = u[2] - norm[2] * two_nu; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[i] = fx * fx + fy * fy + (fz + 1.0F) * (fz + 1.0F); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (m[i] != 0.0F) { 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m[i] = 0.5F * INV_SQRTF(m[i]); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*build_m_func)( GLfloat f[][3], 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat m[], 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *normal, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *eye ); 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic build_m_func build_m_tab[5] = { 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_m2, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_m3, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_m3 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* This is unusual in that we respect the stride of the output vector 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (f). This allows us to pass in either a texcoord vector4f, or a 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * temporary vector3f. 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void build_f3( GLfloat *f, 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint fstride, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *normal, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *eye ) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint stride = eye->stride; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *coord = eye->start; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count = eye->count; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *norm = normal->start; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++) { 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat u[3], two_nu; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_3V( u, coord ); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV( u ); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org two_nu = 2.0F * DOT3(norm,u); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f[0] = u[0] - norm[0] * two_nu; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f[1] = u[1] - norm[1] * two_nu; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f[2] = u[2] - norm[2] * two_nu; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STRIDE_F(coord,stride); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STRIDE_F(f,fstride); 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STRIDE_F(norm, normal->stride); 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void build_f2( GLfloat *f, 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint fstride, 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *normal, 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *eye ) 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint stride = eye->stride; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *coord = eye->start; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count = eye->count; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *norm = normal->start; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++) { 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat u[3], two_nu; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_2V( u, coord ); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u[2] = 0; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NORMALIZE_3FV( u ); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org two_nu = 2.0F * DOT3(norm,u); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f[0] = u[0] - norm[0] * two_nu; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f[1] = u[1] - norm[1] * two_nu; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f[2] = u[2] - norm[2] * two_nu; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STRIDE_F(coord,stride); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STRIDE_F(f,fstride); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org STRIDE_F(norm, normal->stride); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef void (*build_f_func)( GLfloat *f, 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint fstride, 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *normal_vec, 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *eye ); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Just treat 4-vectors as 3-vectors. 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic build_f_func build_f_tab[5] = { 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_f2, 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_f3, 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_f3 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Special case texgen functions. 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void texgen_reflection_map_nv( struct gl_context *ctx, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store, 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint unit ) 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *out = &store->texcoord[unit]; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_f_tab[VB->EyePtr->size]( out->start, 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->stride, 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[_TNL_ATTRIB_NORMAL], 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->EyePtr ); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_3; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->count = VB->Count; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->size = MAX2(in->size, 3); 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (in->size == 4) 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_copy_tab[0x8]( out, in ); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void texgen_normal_map_nv( struct gl_context *ctx, 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store, 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint unit ) 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *out = &store->texcoord[unit]; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *normal = VB->AttribPtr[_TNL_ATTRIB_NORMAL]; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->start; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count = VB->Count; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *norm = normal->start; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][0] = norm[0]; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][1] = norm[1]; 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][2] = norm[2]; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_3; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->count = count; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->size = MAX2(in->size, 3); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (in->size == 4) 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_copy_tab[0x8]( out, in ); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void texgen_sphere_map( struct gl_context *ctx, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store, 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint unit ) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *out = &store->texcoord[unit]; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*texcoord)[4] = (GLfloat (*)[4]) out->start; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint count = VB->Count; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*f)[3] = store->tmp_f; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *m = store->tmp_m; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (build_m_tab[VB->EyePtr->size])( store->tmp_f, 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->tmp_m, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[_TNL_ATTRIB_NORMAL], 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->EyePtr ); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->size = MAX2(in->size,2); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++) { 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][0] = f[i][0] * m[i] + 0.5F; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][1] = f[i][1] * m[i] + 0.5F; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->count = count; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->flags |= (in->flags & VEC_SIZE_FLAGS) | VEC_SIZE_2; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (in->size > 2) 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_copy_tab[all_bits[in->size] & ~0x3]( out, in ); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void texgen( struct gl_context *ctx, 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store, 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint unit ) 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TNLcontext *tnl = TNL_CONTEXT(ctx); 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB = &tnl->vb; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *in = VB->AttribPtr[VERT_ATTRIB_TEX0 + unit]; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLvector4f *out = &store->texcoord[unit]; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *obj = VB->AttribPtr[_TNL_ATTRIB_POS]; 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *eye = VB->EyePtr; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvector4f *normal = VB->AttribPtr[_TNL_ATTRIB_NORMAL]; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *m = store->tmp_m; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint count = VB->Count; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*texcoord)[4] = (GLfloat (*)[4])out->data; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat (*f)[3] = store->tmp_f; 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint copy; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->_GenFlags & TEXGEN_NEED_M) { 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_m_tab[eye->size]( store->tmp_f, store->tmp_m, normal, eye ); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (texUnit->_GenFlags & TEXGEN_NEED_F) { 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org build_f_tab[eye->size]( (GLfloat *)store->tmp_f, 3, normal, eye ); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->size = MAX2(in->size, store->TexgenSize[unit]); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->flags |= (in->flags & VEC_SIZE_FLAGS) | texUnit->TexGenEnabled; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out->count = count; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org copy = (all_bits[in->size] & ~texUnit->TexGenEnabled); 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (copy) 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_copy_tab[copy]( out, in ); 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->TexGenEnabled & S_BIT) { 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (texUnit->GenS.Mode) { 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OBJECT_LINEAR: 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dotprod_tab[obj->size]( (GLfloat *)out->data, 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(out->data[0]), obj, 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->GenS.ObjectPlane ); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EYE_LINEAR: 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dotprod_tab[eye->size]( (GLfloat *)out->data, 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(out->data[0]), eye, 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->GenS.EyePlane ); 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SPHERE_MAP: 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][0] = f[i][0] * m[i] + 0.5F; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REFLECTION_MAP_NV: 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++) 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][0] = f[i][0]; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NORMAL_MAP_NV: { 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *norm = normal->start; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][0] = norm[0]; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Bad S texgen"); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->TexGenEnabled & T_BIT) { 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (texUnit->GenT.Mode) { 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OBJECT_LINEAR: 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dotprod_tab[obj->size]( &(out->data[0][1]), 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(out->data[0]), obj, 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->GenT.ObjectPlane ); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EYE_LINEAR: 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dotprod_tab[eye->size]( &(out->data[0][1]), 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(out->data[0]), eye, 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->GenT.EyePlane ); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SPHERE_MAP: 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][1] = f[i][1] * m[i] + 0.5F; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REFLECTION_MAP_NV: 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++) 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][1] = f[i][1]; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NORMAL_MAP_NV: { 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *norm = normal->start; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++, STRIDE_F(norm, normal->stride)) { 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][1] = norm[1]; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Bad T texgen"); 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->TexGenEnabled & R_BIT) { 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (texUnit->GenR.Mode) { 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OBJECT_LINEAR: 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dotprod_tab[obj->size]( &(out->data[0][2]), 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(out->data[0]), obj, 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->GenR.ObjectPlane ); 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EYE_LINEAR: 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dotprod_tab[eye->size]( &(out->data[0][2]), 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(out->data[0]), eye, 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->GenR.EyePlane ); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_REFLECTION_MAP_NV: 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++) 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][2] = f[i][2]; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NORMAL_MAP_NV: { 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *norm = normal->start; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i=0;i<count;i++,STRIDE_F(norm, normal->stride)) { 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texcoord[i][2] = norm[2]; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Bad R texgen"); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->TexGenEnabled & Q_BIT) { 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (texUnit->GenQ.Mode) { 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_OBJECT_LINEAR: 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dotprod_tab[obj->size]( &(out->data[0][3]), 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(out->data[0]), obj, 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->GenQ.ObjectPlane ); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_EYE_LINEAR: 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dotprod_tab[eye->size]( &(out->data[0][3]), 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(out->data[0]), eye, 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->GenQ.EyePlane ); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Bad Q texgen"); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean run_texgen_stage( struct gl_context *ctx, 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_pipeline_stage *stage ) 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Texture._TexGenEnabled || ctx->VertexProgram._Current) 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) { 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i]; 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->TexGenEnabled) { 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->TexgenFunc[i]( ctx, store, i ); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org VB->AttribPtr[VERT_ATTRIB_TEX0 + i] = &store->texcoord[i]; 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void validate_texgen_stage( struct gl_context *ctx, 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_pipeline_stage *stage ) 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Texture._TexGenEnabled || ctx->VertexProgram._Current) 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) { 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i]; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->TexGenEnabled) { 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint sz; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->TexGenEnabled & Q_BIT) 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sz = 4; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (texUnit->TexGenEnabled & R_BIT) 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sz = 3; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (texUnit->TexGenEnabled & T_BIT) 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sz = 2; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sz = 1; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->TexgenSize[i] = sz; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->TexgenFunc[i] = texgen; /* general solution */ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* look for special texgen cases */ 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->TexGenEnabled == (S_BIT|T_BIT|R_BIT)) { 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texUnit->_GenFlags == TEXGEN_REFLECTION_MAP_NV) { 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->TexgenFunc[i] = texgen_reflection_map_nv; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (texUnit->_GenFlags == TEXGEN_NORMAL_MAP_NV) { 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->TexgenFunc[i] = texgen_normal_map_nv; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (texUnit->TexGenEnabled == (S_BIT|T_BIT) && 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texUnit->_GenFlags == TEXGEN_SPHERE_MAP) { 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->TexgenFunc[i] = texgen_sphere_map; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Called the first time stage->run() is invoked. 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean alloc_texgen_data( struct gl_context *ctx, 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tnl_pipeline_stage *stage ) 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->privatePtr = CALLOC(sizeof(*store)); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store = TEXGEN_STAGE_DATA(stage); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!store) 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++) 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_alloc( &store->texcoord[i], 0, VB->Size, 32 ); 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->tmp_f = (GLfloat (*)[3]) MALLOC(VB->Size * sizeof(GLfloat) * 3); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store->tmp_m = (GLfloat *) MALLOC(VB->Size * sizeof(GLfloat)); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void free_texgen_data( struct tnl_pipeline_stage *stage ) 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct texgen_stage_data *store = TEXGEN_STAGE_DATA(stage); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (store) { 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0 ; i < MAX_TEXTURE_COORD_UNITS ; i++) 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (store->texcoord[i].data) 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_vector4f_free( &store->texcoord[i] ); 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (store->tmp_f) FREE( store->tmp_f ); 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (store->tmp_m) FREE( store->tmp_m ); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE( store ); 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stage->privatePtr = NULL; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct tnl_pipeline_stage _tnl_texgen_stage = 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "texgen", /* name */ 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, /* private data */ 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org alloc_texgen_data, /* destructor */ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free_texgen_data, /* destructor */ 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org validate_texgen_stage, /* check */ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org run_texgen_stage /* run -- initially set to alloc data */ 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 610