⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 via_tris.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * 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 + -