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