1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included 14 * in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 26/* 27 * Matrix/vertex/vector transformation stuff 28 * 29 * 30 * NOTES: 31 * 1. 4x4 transformation matrices are stored in memory in column major order. 32 * 2. Points/vertices are to be thought of as column vectors. 33 * 3. Transformation of a point p by a matrix M is: p' = M * p 34 */ 35 36#include "c99_math.h" 37#include "main/glheader.h" 38#include "main/macros.h" 39 40#include "m_eval.h" 41#include "m_matrix.h" 42#include "m_translate.h" 43#include "m_xform.h" 44 45 46#ifdef DEBUG_MATH 47#include "m_debug.h" 48#endif 49 50#ifdef USE_X86_ASM 51#include "x86/common_x86_asm.h" 52#endif 53 54#ifdef USE_X86_64_ASM 55#include "x86-64/x86-64.h" 56#endif 57 58#ifdef USE_SPARC_ASM 59#include "sparc/sparc.h" 60#endif 61 62clip_func _mesa_clip_tab[5]; 63clip_func _mesa_clip_np_tab[5]; 64dotprod_func _mesa_dotprod_tab[5]; 65vec_copy_func _mesa_copy_tab[0x10]; 66normal_func _mesa_normal_tab[0xf]; 67transform_func *_mesa_transform_tab[5]; 68 69 70/* Raw data format used for: 71 * - Object-to-eye transform prior to culling, although this too 72 * could be culled under some circumstances. 73 * - Eye-to-clip transform (via the function above). 74 * - Cliptesting 75 * - And everything else too, if culling happens to be disabled. 76 * 77 * GH: It's used for everything now, as clipping/culling is done 78 * elsewhere (most often by the driver itself). 79 */ 80#define TAG(x) x 81#define TAG2(x,y) x##y 82#define STRIDE_LOOP for ( i = 0 ; i < count ; i++, STRIDE_F(from, stride) ) 83#define LOOP for ( i = 0 ; i < n ; i++ ) 84#define ARGS 85#include "m_xform_tmp.h" 86#include "m_clip_tmp.h" 87#include "m_norm_tmp.h" 88#include "m_dotprod_tmp.h" 89#include "m_copy_tmp.h" 90#undef TAG 91#undef TAG2 92#undef LOOP 93#undef ARGS 94 95 96/* 97 * This is called only once. It initializes several tables with pointers 98 * to optimized transformation functions. This is where we can test for 99 * AMD 3Dnow! capability, Intel SSE, etc. and hook in the right code. 100 */ 101void 102_math_init_transformation( void ) 103{ 104 init_c_transformations(); 105 init_c_norm_transform(); 106 init_c_cliptest(); 107 init_copy0(); 108 init_dotprod(); 109 110#ifdef DEBUG_MATH 111 _math_test_all_transform_functions( "default" ); 112 _math_test_all_normal_transform_functions( "default" ); 113 _math_test_all_cliptest_functions( "default" ); 114#endif 115 116#ifdef USE_X86_ASM 117 _mesa_init_all_x86_transform_asm(); 118#elif defined( USE_SPARC_ASM ) 119 _mesa_init_all_sparc_transform_asm(); 120#elif defined( USE_X86_64_ASM ) 121 _mesa_init_all_x86_64_transform_asm(); 122#endif 123} 124