📄 via_tris.c
字号:
/* * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. * Copyright 2001-2003 S3 Graphics, Inc. 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, sub license, * 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 (including the * next paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS 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. */#include <stdio.h>#include <math.h>#include "glheader.h"#include "context.h"#include "mtypes.h"#include "macros.h"#include "colormac.h"#include "enums.h"#include "swrast/swrast.h"#include "swrast_setup/swrast_setup.h"#include "tnl/t_context.h"#include "tnl/t_pipeline.h"#include "via_context.h"#include "via_tris.h"#include "via_state.h"#include "via_span.h"#include "via_ioctl.h"#include "via_3d_reg.h"#include "via_tex.h"/*********************************************************************** * Emit primitives as inline vertices * ***********************************************************************/#define LINE_FALLBACK (0)#define POINT_FALLBACK (0)#define TRI_FALLBACK (0)#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK)#define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET|DD_TRI_UNFILLED)#if 0#define COPY_DWORDS(vb, vertsize, v) \do { \ via_sse_memcpy(vb, v, vertsize * 4); \ vb += vertsize; \} while (0)#else#if defined( USE_X86_ASM )#define COPY_DWORDS(vb, vertsize, v) \ do { \ int j; \ int __tmp; \ __asm__ __volatile__("rep ; movsl" \ : "=%c" (j), "=D" (vb), "=S" (__tmp) \ : "0" (vertsize), \ "D" ((long)vb), \ "S" ((long)v)); \ } while (0)#else#define COPY_DWORDS(vb, vertsize, v) \ do { \ int j; \ for (j = 0; j < vertsize; j++) \ vb[j] = ((GLuint *)v)[j]; \ vb += vertsize; \ } while (0)#endif#endifstatic void via_draw_triangle(struct via_context *vmesa, viaVertexPtr v0, viaVertexPtr v1, viaVertexPtr v2){ GLuint vertsize = vmesa->vertexSize; GLuint *vb = viaExtendPrimitive(vmesa, 3 * 4 * vertsize); COPY_DWORDS(vb, vertsize, v0); COPY_DWORDS(vb, vertsize, v1); COPY_DWORDS(vb, vertsize, v2);}static void via_draw_quad(struct via_context *vmesa, viaVertexPtr v0, viaVertexPtr v1, viaVertexPtr v2, viaVertexPtr v3){ GLuint vertsize = vmesa->vertexSize; GLuint *vb = viaExtendPrimitive(vmesa, 6 * 4 * vertsize); COPY_DWORDS(vb, vertsize, v0); COPY_DWORDS(vb, vertsize, v1); COPY_DWORDS(vb, vertsize, v3); COPY_DWORDS(vb, vertsize, v1); COPY_DWORDS(vb, vertsize, v2); COPY_DWORDS(vb, vertsize, v3);}static void via_draw_line(struct via_context *vmesa, viaVertexPtr v0, viaVertexPtr v1){ GLuint vertsize = vmesa->vertexSize; GLuint *vb = viaExtendPrimitive(vmesa, 2 * 4 * vertsize); COPY_DWORDS(vb, vertsize, v0); COPY_DWORDS(vb, vertsize, v1);}static void via_draw_point(struct via_context *vmesa, viaVertexPtr v0){ GLuint vertsize = vmesa->vertexSize; GLuint *vb = viaExtendPrimitive(vmesa, 4 * vertsize); COPY_DWORDS(vb, vertsize, v0);}/* Fallback drawing functions for the ptex hack. */#define PTEX_VERTEX( tmp, vertex_size, v) \do { \ GLuint j; \ GLfloat rhw = 1.0 / v->f[vertex_size]; \ for ( j = 0 ; j < vertex_size ; j++ ) \ tmp.f[j] = v->f[j]; \ tmp.f[3] *= v->f[vertex_size]; \ tmp.f[vertex_size-2] *= rhw; \ tmp.f[vertex_size-1] *= rhw; \} while (0)static void via_ptex_tri (struct via_context *vmesa, viaVertexPtr v0, viaVertexPtr v1, viaVertexPtr v2){ GLuint vertsize = vmesa->hwVertexSize; GLuint *vb = viaExtendPrimitive(vmesa, 3*4*vertsize); viaVertex tmp; PTEX_VERTEX(tmp, vertsize, v0); COPY_DWORDS(vb, vertsize, &tmp); PTEX_VERTEX(tmp, vertsize, v1); COPY_DWORDS(vb, vertsize, &tmp); PTEX_VERTEX(tmp, vertsize, v2); COPY_DWORDS(vb, vertsize, &tmp);}static void via_ptex_line (struct via_context *vmesa, viaVertexPtr v0, viaVertexPtr v1){ GLuint vertsize = vmesa->hwVertexSize; GLuint *vb = viaExtendPrimitive(vmesa, 2*4*vertsize); viaVertex tmp; PTEX_VERTEX(tmp, vertsize, v0); COPY_DWORDS(vb, vertsize, &tmp); PTEX_VERTEX(tmp, vertsize, v1); COPY_DWORDS(vb, vertsize, &tmp);}static void via_ptex_point (struct via_context *vmesa, viaVertexPtr v0){ GLuint vertsize = vmesa->hwVertexSize; GLuint *vb = viaExtendPrimitive(vmesa, 1*4*vertsize); viaVertex tmp; PTEX_VERTEX(tmp, vertsize, v0); COPY_DWORDS(vb, vertsize, &tmp);}/*********************************************************************** * Macros for via_dd_tritmp.h to draw basic primitives * ***********************************************************************/#define TRI(a, b, c) \ do { \ if (DO_FALLBACK) \ vmesa->drawTri(vmesa, a, b, c); \ else \ via_draw_triangle(vmesa, a, b, c); \ } while (0)#define QUAD(a, b, c, d) \ do { \ if (DO_FALLBACK) { \ vmesa->drawTri(vmesa, a, b, d); \ vmesa->drawTri(vmesa, b, c, d); \ } \ else \ via_draw_quad(vmesa, a, b, c, d); \ } while (0)#define LINE(v0, v1) \ do { \ if (DO_FALLBACK) \ vmesa->drawLine(vmesa, v0, v1); \ else \ via_draw_line(vmesa, v0, v1); \ } while (0)#define POINT(v0) \ do { \ if (DO_FALLBACK) \ vmesa->drawPoint(vmesa, v0); \ else \ via_draw_point(vmesa, v0); \ } while (0)/*********************************************************************** * Build render functions from dd templates * ***********************************************************************/#define VIA_OFFSET_BIT 0x01#define VIA_TWOSIDE_BIT 0x02#define VIA_UNFILLED_BIT 0x04#define VIA_FALLBACK_BIT 0x08#define VIA_MAX_TRIFUNC 0x10static struct { tnl_points_func points; tnl_line_func line; tnl_triangle_func triangle; tnl_quad_func quad;} rast_tab[VIA_MAX_TRIFUNC + 1];#define DO_FALLBACK (IND & VIA_FALLBACK_BIT)#define DO_OFFSET (IND & VIA_OFFSET_BIT)#define DO_UNFILLED (IND & VIA_UNFILLED_BIT)#define DO_TWOSIDE (IND & VIA_TWOSIDE_BIT)#define DO_FLAT 0#define DO_TRI 1#define DO_QUAD 1#define DO_LINE 1#define DO_POINTS 1#define DO_FULL_QUAD 1#define HAVE_RGBA 1#define HAVE_SPEC 1#define HAVE_BACK_COLORS 0#define HAVE_HW_FLATSHADE 1#define VERTEX viaVertex#define TAB rast_tab/* Only used to pull back colors into vertices (ie, we know color is * floating point). */#define VIA_COLOR(dst, src) \ do { \ dst[0] = src[2]; \ dst[1] = src[1]; \ dst[2] = src[0]; \ dst[3] = src[3]; \ } while (0)#define VIA_SPEC(dst, src) \ do { \ dst[0] = src[2]; \ dst[1] = src[1]; \ dst[2] = src[0]; \ } while (0)#define DEPTH_SCALE vmesa->polygon_offset_scale#define UNFILLED_TRI unfilled_tri#define UNFILLED_QUAD unfilled_quad#define VERT_X(_v) _v->v.x#define VERT_Y(_v) _v->v.y#define VERT_Z(_v) _v->v.z#define AREA_IS_CCW(a) (a > 0)#define GET_VERTEX(e) (vmesa->verts + (e * vmesa->vertexSize * sizeof(int)))#define VERT_SET_RGBA( v, c ) \do { \ via_color_t *color = (via_color_t *)&((v)->ui[coloroffset]); \ UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]); \ UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]); \ UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]); \ UNCLAMPED_FLOAT_TO_UBYTE(color->alpha, (c)[3]); \} while (0)#define VERT_COPY_RGBA( v0, v1 ) v0->ui[coloroffset] = v1->ui[coloroffset]#define VERT_SET_SPEC( v, c ) \do { \ if (specoffset) { \ via_color_t *color = (via_color_t *)&((v)->ui[specoffset]); \ UNCLAMPED_FLOAT_TO_UBYTE(color->red, (c)[0]); \ UNCLAMPED_FLOAT_TO_UBYTE(color->green, (c)[1]); \ UNCLAMPED_FLOAT_TO_UBYTE(color->blue, (c)[2]); \ } \} while (0)#define VERT_COPY_SPEC( v0, v1 ) \do { \ if (specoffset) { \ v0->ub4[specoffset][0] = v1->ub4[specoffset][0]; \ v0->ub4[specoffset][1] = v1->ub4[specoffset][1]; \ v0->ub4[specoffset][2] = v1->ub4[specoffset][2]; \ } \} while (0)#define VERT_SAVE_RGBA( idx ) color[idx] = v[idx]->ui[coloroffset]#define VERT_RESTORE_RGBA( idx ) v[idx]->ui[coloroffset] = color[idx]#define VERT_SAVE_SPEC( idx ) if (specoffset) spec[idx] = v[idx]->ui[specoffset]#define VERT_RESTORE_SPEC( idx ) if (specoffset) v[idx]->ui[specoffset] = spec[idx]#define LOCAL_VARS(n) \ struct via_context *vmesa = VIA_CONTEXT(ctx); \ GLuint color[n], spec[n]; \ GLuint coloroffset = vmesa->coloroffset; \ GLuint specoffset = vmesa->specoffset; \ (void)color; (void)spec; (void)coloroffset; (void)specoffset;/*********************************************************************** * Helpers for rendering unfilled primitives * ***********************************************************************/static const GLenum hwPrim[GL_POLYGON + 2] = { GL_POINTS, GL_LINES, GL_LINES, GL_LINES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_POLYGON+1};#define RASTERIZE(x) viaRasterPrimitive( ctx, x, hwPrim[x] )#define RENDER_PRIMITIVE vmesa->renderPrimitive#define TAG(x) x#define IND VIA_FALLBACK_BIT#include "tnl_dd/t_dd_unfilled.h"#undef IND#undef RASTERIZE/*********************************************************************** * Generate GL render functions * ***********************************************************************/#define RASTERIZE(x)#define IND (0)#define TAG(x) x#include "tnl_dd/t_dd_tritmp.h"#define IND (VIA_OFFSET_BIT)#define TAG(x) x##_offset#include "tnl_dd/t_dd_tritmp.h"#define IND (VIA_TWOSIDE_BIT)#define TAG(x) x##_twoside#include "tnl_dd/t_dd_tritmp.h"#define IND (VIA_TWOSIDE_BIT|VIA_OFFSET_BIT)#define TAG(x) x##_twoside_offset#include "tnl_dd/t_dd_tritmp.h"#define IND (VIA_UNFILLED_BIT)#define TAG(x) x##_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (VIA_OFFSET_BIT|VIA_UNFILLED_BIT)#define TAG(x) x##_offset_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (VIA_TWOSIDE_BIT|VIA_UNFILLED_BIT)#define TAG(x) x##_twoside_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (VIA_TWOSIDE_BIT|VIA_OFFSET_BIT|VIA_UNFILLED_BIT)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -