diff options
author | jtg <jtg> | 1999-08-19 00:55:39 +0000 |
---|---|---|
committer | jtg <jtg> | 1999-08-19 00:55:39 +0000 |
commit | afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1c (patch) | |
tree | 59d65b4da12fb5379224cf5f6b808fde91523c7f /src/mesa/x86/3dnow.c | |
parent | f2544d4920ce168bec9cd94d774b7ea5103a3d74 (diff) |
Initial revision
Diffstat (limited to 'src/mesa/x86/3dnow.c')
-rw-r--r-- | src/mesa/x86/3dnow.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/src/mesa/x86/3dnow.c b/src/mesa/x86/3dnow.c new file mode 100644 index 00000000000..f91a90b33f1 --- /dev/null +++ b/src/mesa/x86/3dnow.c @@ -0,0 +1,168 @@ +/* $Id: 3dnow.c,v 1.1 1999/08/19 00:55:42 jtg Exp $ */ + +/* + * Mesa 3-D graphics library + * Version: 3.1 + * + * Copyright (C) 1999 Brian Paul All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +/* + * 3DNow! optimizations contributed by + * Holger Waechtler <[email protected]> + */ +#if defined(USE_3DNOW_ASM) +#include "3dnow.h" + +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#include "context.h" +#include "types.h" +#include "xform.h" + +#ifdef DEBUG +#include "debug_xform.h" +#endif + + + + +#define XFORM_ARGS GLvector4f *to_vec, \ + const GLmatrix *mat, \ + const GLvector4f *from_vec, \ + const GLubyte *mask, \ + const GLubyte flag + + + +#define DECLARE_XFORM_GROUP(pfx, v, masked) \ + extern void gl_##pfx##_transform_points##v##_general_##masked(XFORM_ARGS); \ + extern void gl_##pfx##_transform_points##v##_identity_##masked(XFORM_ARGS); \ + extern void gl_##pfx##_transform_points##v##_3d_no_rot_##masked(XFORM_ARGS); \ + extern void gl_##pfx##_transform_points##v##_perspective_##masked(XFORM_ARGS);\ + extern void gl_##pfx##_transform_points##v##_2d_##masked(XFORM_ARGS); \ + extern void gl_##pfx##_transform_points##v##_2d_no_rot_##masked(XFORM_ARGS); \ + extern void gl_##pfx##_transform_points##v##_3d_##masked(XFORM_ARGS); + + + +#define ASSIGN_XFORM_GROUP( pfx, cma, vsize, masked ) \ + gl_transform_tab[cma][vsize][MATRIX_GENERAL] \ + = gl_##pfx##_transform_points##vsize##_general_##masked; \ + gl_transform_tab[cma][vsize][MATRIX_IDENTITY] \ + = gl_##pfx##_transform_points##vsize##_identity_##masked; \ + gl_transform_tab[cma][vsize][MATRIX_3D_NO_ROT] \ + = gl_##pfx##_transform_points##vsize##_3d_no_rot_##masked; \ + gl_transform_tab[cma][vsize][MATRIX_PERSPECTIVE] \ + = gl_##pfx##_transform_points##vsize##_perspective_##masked; \ + gl_transform_tab[cma][vsize][MATRIX_2D] \ + = gl_##pfx##_transform_points##vsize##_2d_##masked; \ + gl_transform_tab[cma][vsize][MATRIX_2D_NO_ROT] \ + = gl_##pfx##_transform_points##vsize##_2d_no_rot_##masked; \ + gl_transform_tab[cma][vsize][MATRIX_3D] \ + = gl_##pfx##_transform_points##vsize##_3d_##masked; + + + + +#define NORM_ARGS const GLmatrix *mat, \ + GLfloat scale, \ + const GLvector3f *in, \ + const GLfloat *lengths, \ + const GLubyte mask[], \ + GLvector3f *dest + + + +#define DECLARE_NORM_GROUP(pfx, masked) \ + extern void gl_##pfx##_rescale_normals_##masked## (NORM_ARGS); \ + extern void gl_##pfx##_normalize_normals_##masked## (NORM_ARGS); \ + extern void gl_##pfx##_transform_normals_##masked## (NORM_ARGS); \ + extern void gl_##pfx##_transform_normals_no_rot_##masked## (NORM_ARGS); \ + extern void gl_##pfx##_transform_rescale_normals_##masked## (NORM_ARGS); \ + extern void gl_##pfx##_transform_rescale_normals_no_rot_##masked## (NORM_ARGS); \ + extern void gl_##pfx##_transform_normalize_normals_##masked## (NORM_ARGS); \ + extern void gl_##pfx##_transform_normalize_normals_no_rot_##masked## (NORM_ARGS); + + + +#define ASSIGN_NORM_GROUP( pfx, cma, masked ) \ + gl_normal_tab[NORM_RESCALE][cma] = \ + gl_##pfx##_rescale_normals_##masked##; \ + gl_normal_tab[NORM_NORMALIZE][cma] = \ + gl_##pfx##_normalize_normals_##masked##; \ + gl_normal_tab[NORM_TRANSFORM][cma] = \ + gl_##pfx##_transform_normals_##masked##; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT][cma] = \ + gl_##pfx##_transform_normals_no_rot_##masked##; \ + gl_normal_tab[NORM_TRANSFORM | NORM_RESCALE][cma] = \ + gl_##pfx##_transform_rescale_normals_##masked##; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_RESCALE][cma] = \ + gl_##pfx##_transform_rescale_normals_no_rot_##masked##; \ + gl_normal_tab[NORM_TRANSFORM | NORM_NORMALIZE][cma] = \ + gl_##pfx##_transform_normalize_normals_##masked##; \ + gl_normal_tab[NORM_TRANSFORM_NO_ROT | NORM_NORMALIZE][cma] = \ + gl_##pfx##_transform_normalize_normals_no_rot_##masked##; + + + + +void gl_init_3dnow_asm_transforms (void) +{ + DECLARE_XFORM_GROUP( 3dnow, 1, raw ) + DECLARE_XFORM_GROUP( 3dnow, 2, raw ) + DECLARE_XFORM_GROUP( 3dnow, 3, raw ) + DECLARE_XFORM_GROUP( 3dnow, 4, raw ) + + DECLARE_XFORM_GROUP( 3dnow, 1, masked ) + DECLARE_XFORM_GROUP( 3dnow, 2, masked ) + DECLARE_XFORM_GROUP( 3dnow, 3, masked ) + DECLARE_XFORM_GROUP( 3dnow, 4, masked ) + + DECLARE_NORM_GROUP( 3dnow, raw ) +/* DECLARE_NORM_GROUP( 3dnow, masked ) +*/ + + ASSIGN_XFORM_GROUP( 3dnow, 0, 1, raw ) + ASSIGN_XFORM_GROUP( 3dnow, 0, 2, raw ) + ASSIGN_XFORM_GROUP( 3dnow, 0, 3, raw ) + ASSIGN_XFORM_GROUP( 3dnow, 0, 4, raw ) + + ASSIGN_XFORM_GROUP( 3dnow, CULL_MASK_ACTIVE, 1, masked ) + ASSIGN_XFORM_GROUP( 3dnow, CULL_MASK_ACTIVE, 2, masked ) + ASSIGN_XFORM_GROUP( 3dnow, CULL_MASK_ACTIVE, 3, masked ) + ASSIGN_XFORM_GROUP( 3dnow, CULL_MASK_ACTIVE, 4, masked ) + + ASSIGN_NORM_GROUP( 3dnow, 0, raw ) +/* ASSIGN_NORM_GROUP( 3dnow, CULL_MASK_ACTIVE, masked ) +*/ + +#ifdef DEBUG + gl_test_all_transform_functions("3Dnow!"); + gl_test_all_normal_transform_functions("3Dnow!"); +#endif +} + +#endif + |