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

📄 ffb_vb.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
字号:
/* $XFree86: xc/lib/GL/mesa/src/drv/ffb/ffb_vb.c,v 1.4 2002/02/22 21:32:59 dawes Exp $ * * GLX Hardware Device Driver for Sun Creator/Creator3D * Copyright (C) 2000, 2001 David S. Miller * * 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 * DAVID MILLER, OR ANY OTHER CONTRIBUTORS 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. * * *    David S. Miller <davem@redhat.com> */#include "ffb_xmesa.h"#include "ffb_context.h"#include "ffb_vb.h"#include "imports.h"#include "tnl/t_context.h"#include "swrast_setup/swrast_setup.h"#include "math/m_translate.h"#undef VB_DEBUGstatic void ffb_copy_pv_oneside(GLcontext *ctx, GLuint edst, GLuint esrc){	ffbContextPtr fmesa = FFB_CONTEXT(ctx);	ffb_vertex *dst = &fmesa->verts[edst];	ffb_vertex *src = &fmesa->verts[esrc];#ifdef VB_DEBUG	fprintf(stderr, "ffb_copy_pv_oneside: edst(%d) esrc(%d)\n", edst, esrc);#endif	dst->color[0].alpha = src->color[0].alpha;	dst->color[0].red   = src->color[0].red;	dst->color[0].green = src->color[0].green;	dst->color[0].blue  = src->color[0].blue;}static void ffb_copy_pv_twoside(GLcontext *ctx, GLuint edst, GLuint esrc){	ffbContextPtr fmesa = FFB_CONTEXT(ctx);	ffb_vertex *dst = &fmesa->verts[edst];	ffb_vertex *src = &fmesa->verts[esrc];#ifdef VB_DEBUG	fprintf(stderr, "ffb_copy_pv_twoside: edst(%d) esrc(%d)\n", edst, esrc);#endif	dst->color[0].alpha = src->color[0].alpha;	dst->color[0].red   = src->color[0].red;	dst->color[0].green = src->color[0].green;	dst->color[0].blue  = src->color[0].blue;	dst->color[1].alpha = src->color[1].alpha;	dst->color[1].red   = src->color[1].red;	dst->color[1].green = src->color[1].green;	dst->color[1].blue  = src->color[1].blue;}#define FFB_VB_RGBA_BIT		0x01#define FFB_VB_XYZ_BIT		0x02#define FFB_VB_TWOSIDE_BIT	0x04#define FFB_VB_MAX		0x08typedef void (*ffb_emit_func)(GLcontext *, GLuint, GLuint);static struct { 	ffb_emit_func	emit;	tnl_interp_func	interp;} setup_tab[FFB_VB_MAX];#define IND	(FFB_VB_XYZ_BIT)#define TAG(x)	x##_w#include "ffb_vbtmp.h"#define IND	(FFB_VB_RGBA_BIT)#define TAG(x)	x##_g#include "ffb_vbtmp.h"#define IND	(FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT)#define TAG(x)	x##_wg#include "ffb_vbtmp.h"#define IND	(FFB_VB_TWOSIDE_BIT)#define TAG(x)	x##_t#include "ffb_vbtmp.h"#define IND	(FFB_VB_XYZ_BIT | FFB_VB_TWOSIDE_BIT)#define TAG(x)	x##_wt#include "ffb_vbtmp.h"#define IND	(FFB_VB_RGBA_BIT | FFB_VB_TWOSIDE_BIT)#define TAG(x)	x##_gt#include "ffb_vbtmp.h"#define IND	(FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT | FFB_VB_TWOSIDE_BIT)#define TAG(x)	x##_wgt#include "ffb_vbtmp.h"static void init_setup_tab( void ){	init_w();	init_g();	init_wg();	init_t();	init_wt();	init_gt();	init_wgt();}#ifdef VB_DEBUGstatic void ffbPrintSetupFlags(char *msg, GLuint flags){   fprintf(stderr, "%s(%x): %s%s%s\n",	   msg,	   (int)flags,	   (flags & FFB_VB_XYZ_BIT)     ? " xyz," : "", 	   (flags & FFB_VB_RGBA_BIT)    ? " rgba," : "",	   (flags & FFB_VB_TWOSIDE_BIT) ? " twoside," : "");}#endifstatic void ffbDDBuildVertices(GLcontext *ctx, GLuint start, GLuint count, 			       GLuint newinputs){	ffbContextPtr fmesa = FFB_CONTEXT(ctx);	newinputs |= fmesa->setupnewinputs;	fmesa->setupnewinputs = 0;	if (!newinputs)		return;	if (newinputs & VERT_BIT_POS) {		setup_tab[fmesa->setupindex].emit(ctx, start, count);	} else {		GLuint ind = 0;		if (newinputs & VERT_BIT_COLOR0)			ind |= (FFB_VB_RGBA_BIT | FFB_VB_TWOSIDE_BIT);		ind &= fmesa->setupindex;		if (ind)			setup_tab[ind].emit(ctx, start, count);	}}void ffbChooseVertexState( GLcontext *ctx ){ 	TNLcontext *tnl = TNL_CONTEXT(ctx);	ffbContextPtr fmesa = FFB_CONTEXT(ctx);	int ind = FFB_VB_XYZ_BIT | FFB_VB_RGBA_BIT;	if (ctx->_TriangleCaps & DD_TRI_LIGHT_TWOSIDE)		ind |= FFB_VB_TWOSIDE_BIT;#ifdef VB_DEBUG	ffbPrintSetupFlags("ffb: full setup function", ind);#endif	fmesa->setupindex = ind;	tnl->Driver.Render.BuildVertices = ffbDDBuildVertices;	tnl->Driver.Render.Interp = setup_tab[ind].interp;	if (ind & FFB_VB_TWOSIDE_BIT)		tnl->Driver.Render.CopyPV = ffb_copy_pv_twoside;	else		tnl->Driver.Render.CopyPV = ffb_copy_pv_oneside;}void ffbInitVB( GLcontext *ctx ){	ffbContextPtr fmesa = FFB_CONTEXT(ctx);	GLuint size = TNL_CONTEXT(ctx)->vb.Size;	fmesa->verts = (ffb_vertex *)ALIGN_MALLOC(size * sizeof(ffb_vertex), 32);	{		static int firsttime = 1;		if (firsttime) {			init_setup_tab();			firsttime = 0;		}	}}void ffbFreeVB( GLcontext *ctx ){	ffbContextPtr fmesa = FFB_CONTEXT(ctx);	if (fmesa->verts) {		ALIGN_FREE(fmesa->verts);		fmesa->verts = 0;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -