source: trunk/src/opengl/mesa/3dnow.c

Last change on this file was 3598, checked in by jeroen, 25 years ago

* empty log message *

File size: 7.9 KB
Line 
1/* $Id: 3dnow.c,v 1.3 2000-05-23 20:40:18 jeroen Exp $ */
2
3/*
4 * Mesa 3-D graphics library
5 * Version: 3.1
6 *
7 * Copyright (C) 1999 Brian Paul All Rights Reserved.
8 *
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
15 *
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 */
26
27
28/*
29 * 3DNow! optimizations contributed by
30 * Holger Waechtler <holger@akaflieg.extern.tu-berlin.de>
31 */
32#if defined(USE_3DNOW_ASM) && defined(USE_X86_ASM)
33#include "3dnow.h"
34
35#include "glheader.h"
36#include "types.h"
37#include "context.h"
38#include "xform.h"
39#include "vertices.h"
40
41#ifdef DEBUG_XFORM
42#include "debug_xform.h"
43#endif
44
45
46
47
48#define XFORM_ARGS GLvector4f *to_vec, \
49 const GLmatrix *mat, \
50 const GLvector4f *from_vec, \
51 const GLubyte *mask, \
52 const GLubyte flag
53
54
55
56#define DECLARE_XFORM_GROUP(pfx, v, masked) \
57 extern void _ASMAPI gl##pfx##_transform_points##v##_general_##masked(XFORM_ARGS); \
58 extern void _ASMAPI gl##pfx##_transform_points##v##_identity_##masked(XFORM_ARGS); \
59 extern void _ASMAPI gl##pfx##_transform_points##v##_3d_no_rot_##masked(XFORM_ARGS); \
60 extern void _ASMAPI gl##pfx##_transform_points##v##_perspective_##masked(XFORM_ARGS);\
61 extern void _ASMAPI gl##pfx##_transform_points##v##_2d_##masked(XFORM_ARGS); \
62 extern void _ASMAPI gl##pfx##_transform_points##v##_2d_no_rot_##masked(XFORM_ARGS); \
63 extern void _ASMAPI gl##pfx##_transform_points##v##_3d_##masked(XFORM_ARGS);
64
65
66
67#define ASSIGN_XFORM_GROUP( pfx, cma, vsize, masked ) \
68 gl_transform_tab[cma][vsize][MATRIX_GENERAL] \
69 = gl##pfx##_transform_points##vsize##_general_##masked; \
70 gl_transform_tab[cma][vsize][MATRIX_IDENTITY] \
71 = gl##pfx##_transform_points##vsize##_identity_##masked; \
72 gl_transform_tab[cma][vsize][MATRIX_3D_NO_ROT] \
73 = gl##pfx##_transform_points##vsize##_3d_no_rot_##masked; \
74 gl_transform_tab[cma][vsize][MATRIX_PERSPECTIVE] \
75 = gl##pfx##_transform_points##vsize##_perspective_##masked; \
76 gl_transform_tab[cma][vsize][MATRIX_2D] \
77 = gl##pfx##_transform_points##vsize##_2d_##masked; \
78 gl_transform_tab[cma][vsize][MATRIX_2D_NO_ROT] \
79 = gl##pfx##_transform_points##vsize##_2d_no_rot_##masked; \
80 gl_transform_tab[cma][vsize][MATRIX_3D] \
81 = gl##pfx##_transform_points##vsize##_3d_##masked;
82
83
84
85
86#define NORM_ARGS const GLmatrix *mat, \
87 GLfloat scale, \
88 const GLvector3f *in, \
89 const GLfloat *lengths, \
90 const GLubyte mask[], \
91 GLvector3f *dest
92
93
94
95#define DECLARE_NORM_GROUP(pfx, masked) \
96 extern void _ASMAPI gl##pfx##_rescale_normals_##masked## (NORM_ARGS); \
97 extern void _ASMAPI gl##pfx##_normalize_normals_##masked## (NORM_ARGS); \
98 extern void _ASMAPI gl##pfx##_transform_normals_##masked## (NORM_ARGS); \
99 extern void _ASMAPI gl##pfx##_transform_normals_no_rot_##masked## (NORM_ARGS); \
100 extern void _ASMAPI gl##pfx##_transform_rescale_normals_##masked## (NORM_ARGS); \
101 extern void _ASMAPI gl##pfx##_transform_rescale_normals_no_rot_##masked## (NORM_ARGS); \
102 extern void _ASMAPI gl##pfx##_transform_normalize_normals_##masked## (NORM_ARGS); \
103 extern void _ASMAPI gl##pfx##_transform_normalize_normals_no_rot_##masked## (NORM_ARGS);
104
105
106
107#define ASSIGN_NORM_GROUP( pfx, cma, masked ) \
108 gl_normal_tab[NORM_RESCALE][cma] = \
109 gl##pfx##_rescale_normals_##masked##; \
110 gl_normal_tab[NORM_NORMALIZE][cma] = \
111 gl##pfx##_normalize_normals_##masked##; \
112 gl_normal_tab[NORM_TRANSFORM][cma] = \
113 gl##pfx##_transform_normals_##masked##; \
114 gl_normal_tab[NORM_TRANSFORM_NO_ROT][cma] = \
115 gl##pfx##_transform_normals_no_rot_##masked##; \
116 gl_normal_tab[NORM_TRANSFORM | NORM_RESCALE][cma] = \
117 gl##pfx##_transform_rescale_normals_##masked##; \
118 gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_RESCALE][cma] = \
119 gl##pfx##_transform_rescale_normals_no_rot_##masked##; \
120 gl_normal_tab[NORM_TRANSFORM | NORM_NORMALIZE][cma] = \
121 gl##pfx##_transform_normalize_normals_##masked##; \
122 gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE][cma] = \
123 gl##pfx##_transform_normalize_normals_no_rot_##masked##;
124
125
126extern void _ASMAPI gl_3dnow_project_vertices( GLfloat *first,
127 GLfloat *last,
128 const GLfloat *m,
129 GLuint stride );
130
131extern void _ASMAPI gl_3dnow_project_clipped_vertices( GLfloat *first,
132 GLfloat *last,
133 const GLfloat *m,
134 GLuint stride,
135 const GLubyte *clipmask );
136
137extern void _ASMAPI gl_v16_3dnow_general_xform( GLfloat *first_vert,
138 const GLfloat *m,
139 const GLfloat *src,
140 GLuint src_stride,
141 GLuint count );
142
143void gl_init_3dnow_asm_transforms (void)
144{
145 DECLARE_XFORM_GROUP( _3dnow, 1, raw )
146 DECLARE_XFORM_GROUP( _3dnow, 2, raw )
147 DECLARE_XFORM_GROUP( _3dnow, 3, raw )
148 DECLARE_XFORM_GROUP( _3dnow, 4, raw )
149
150 DECLARE_XFORM_GROUP( _3dnow, 1, masked )
151 DECLARE_XFORM_GROUP( _3dnow, 2, masked )
152 DECLARE_XFORM_GROUP( _3dnow, 3, masked )
153 DECLARE_XFORM_GROUP( _3dnow, 4, masked )
154
155 DECLARE_NORM_GROUP( _3dnow, raw )
156/* DECLARE_NORM_GROUP( _3dnow, masked )
157*/
158
159 ASSIGN_XFORM_GROUP( _3dnow, 0, 1, raw )
160 ASSIGN_XFORM_GROUP( _3dnow, 0, 2, raw )
161 ASSIGN_XFORM_GROUP( _3dnow, 0, 3, raw )
162 ASSIGN_XFORM_GROUP( _3dnow, 0, 4, raw )
163
164 ASSIGN_XFORM_GROUP( _3dnow, CULL_MASK_ACTIVE, 1, masked )
165 ASSIGN_XFORM_GROUP( _3dnow, CULL_MASK_ACTIVE, 2, masked )
166 ASSIGN_XFORM_GROUP( _3dnow, CULL_MASK_ACTIVE, 3, masked )
167 ASSIGN_XFORM_GROUP( _3dnow, CULL_MASK_ACTIVE, 4, masked )
168
169 ASSIGN_NORM_GROUP( _3dnow, 0, raw )
170/* ASSIGN_NORM_GROUP( _3dnow, CULL_MASK_ACTIVE, masked )
171*/
172
173#ifdef DEBUG_XFORM
174 gl_test_all_transform_functions("3Dnow!");
175 gl_test_all_normal_transform_functions("3Dnow!");
176#endif
177
178 /* Hook in some stuff for vertices.c.
179 */
180 gl_xform_points3_v16_general = gl_v16_3dnow_general_xform;
181 gl_project_v16 = gl_3dnow_project_vertices;
182 gl_project_clipped_v16 = gl_3dnow_project_clipped_vertices;
183}
184
185#endif
186
Note: See TracBrowser for help on using the repository browser.