diff options
Diffstat (limited to 'xc/extras/Mesa/src/vertices.c')
-rw-r--r-- | xc/extras/Mesa/src/vertices.c | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/xc/extras/Mesa/src/vertices.c b/xc/extras/Mesa/src/vertices.c new file mode 100644 index 000000000..b451ec6e9 --- /dev/null +++ b/xc/extras/Mesa/src/vertices.c @@ -0,0 +1,202 @@ +/* $Id: vertices.c,v 1.1.1.1 2000/01/06 13:27:09 faith 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. + */ + +#ifndef XFree86Server +#include <stdio.h> +#else +#include "GL/xf86glx.h" +#endif +#include "types.h" +#include "vertices.h" + +#if defined(USE_X86_ASM) +#include "X86/common_x86asm.h" +#endif + +/* The start of a bunch of vertex oriented geometry routines. These + * are expected to support the production of driver-specific fast paths + * for CVA and eventually normal processing. + * + * These have been taken from fxfastpath.c, and are now also used in + * the mga driver. + * + * These should grow to include: + * - choice of 8/16 dword vertices + * - ?? + * - use of portable assembly layouts. + * + * More tentatively: + * - more (all?) matrix types + * - more (?) vertex sizes + * + * -- Keith Whitwell. + */ + +/* The inline 3dnow code seems to give problems with some peoples + * compiler/binutils. + */ +/* #undef USE_3DNOW_ASM */ + + +#if defined(USE_X86_ASM) && defined(__GNUC__) + + +#endif + + +static void transform_v16(GLfloat *f, + const GLfloat *m, + const GLfloat *obj, + GLuint obj_stride, + GLuint count ) +{ + GLuint i; + + for (i = 0 ; i < count ; i++, STRIDE_F(obj, obj_stride), f+=16) + { + const GLfloat ox = obj[0], oy = obj[1], oz = obj[2]; + f[0] = m[0] * ox + m[4] * oy + m[8] * oz + m[12]; + f[1] = m[1] * ox + m[5] * oy + m[9] * oz + m[13]; + f[2] = m[2] * ox + m[6] * oy + m[10] * oz + m[14]; + f[3] = m[3] * ox + m[7] * oy + m[11] * oz + m[15]; + } +} + +/* Project all vertices upto but not including last. Guarenteed to be + * at least one such vertex. + */ +static void project_verts(GLfloat *first, + GLfloat *last, + const GLfloat *m, + GLuint stride ) +{ + const GLfloat sx = m[0], sy = m[5], sz = m[10]; + const GLfloat tx = m[12], ty = m[13], tz = m[14]; + GLfloat *f; + + for ( f = first ; f != last ; STRIDE_F(f,stride)) + { + const GLfloat oow = 1.0F / f[3]; + f[0] = sx * f[0] * oow + tx; + f[1] = sy * f[1] * oow + ty; + f[2] = sz * f[2] * oow + tz; + f[3] = oow; + } +} + +static void project_clipped_verts(GLfloat *first, + GLfloat *last, + const GLfloat *m, + GLuint stride, + const GLubyte *clipmask ) +{ + const GLfloat sx = m[0], sy = m[5], sz = m[10]; + const GLfloat tx = m[12], ty = m[13], tz = m[14]; + GLfloat *f; + + for ( f = first ; f != last ; STRIDE_F(f,stride), clipmask++) + { + if (!*clipmask) { + const GLfloat oow = 1.0F / f[3]; + f[0] = sx * f[0] * oow + tx; + f[1] = sy * f[1] * oow + ty; + f[2] = sz * f[2] * oow + tz; + f[3] = oow; + } + } +} + + + + +static void cliptest_v16( GLfloat *first, + GLfloat *last, + GLubyte *p_clipOr, + GLubyte *p_clipAnd, + GLubyte *clipmask ) +{ + GLubyte clipAnd = (GLubyte) ~0; + GLubyte clipOr = 0; + GLfloat *f = first; + static int i; + i = 0; + + for ( ; f != last ; f+=16, clipmask++, i++) + { + const GLfloat cx = f[0]; + const GLfloat cy = f[1]; + const GLfloat cz = f[2]; + const GLfloat cw = f[3]; + GLubyte mask = 0; + + if (cx > cw) mask |= CLIP_RIGHT_BIT; + if (cx < -cw) mask |= CLIP_LEFT_BIT; + if (cy > cw) mask |= CLIP_TOP_BIT; + if (cy < -cw) mask |= CLIP_BOTTOM_BIT; + if (cz > cw) mask |= CLIP_FAR_BIT; + if (cz < -cw) mask |= CLIP_NEAR_BIT; + + *clipmask = mask; + clipAnd &= mask; + clipOr |= mask; + } + + (*p_clipOr) |= clipOr; + (*p_clipAnd) &= clipAnd; +} + + + +GLenum gl_reduce_prim[GL_POLYGON+1] = { + GL_POINTS, + GL_LINES, + GL_LINES, + GL_LINES, + GL_TRIANGLES, + GL_TRIANGLES, + GL_TRIANGLES, + GL_TRIANGLES, + GL_TRIANGLES, + GL_TRIANGLES, +}; + +gl_transform_func gl_xform_points3_v16_general = transform_v16; +gl_cliptest_func gl_cliptest_points4_v16 = cliptest_v16; +gl_project_clipped_func gl_project_clipped_v16 = project_clipped_verts; +gl_project_func gl_project_v16 = project_verts; + +void gl_init_vertices() +{ +} + + + + + + + + + |