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

📄 r300_swtcl.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
#define ALLOC_VERTS( n, size ) r300AllocDmaLowVerts( rmesa, n, size * 4 )#define LOCAL_VARS						\   r300ContextPtr rmesa = R300_CONTEXT(ctx);		\   const char *r300verts = (char *)rmesa->swtcl.verts;#define VERT(x) (r300Vertex *)(r300verts + ((x) * vertsize * sizeof(int)))#define VERTEX r300Vertex #define DO_DEBUG_VERTS (1 && (RADEON_DEBUG & DEBUG_VERTS))#define PRINT_VERTEX(x)#undef TAG#define TAG(x) r300_##x#include "tnl_dd/t_dd_triemit.h"/*********************************************************************** *          Macros for t_dd_tritmp.h to draw basic primitives          * ***********************************************************************/#define QUAD( a, b, c, d ) r300_quad( rmesa, a, b, c, d )#define TRI( a, b, c )     r300_triangle( rmesa, a, b, c )#define LINE( a, b )       r300_line( rmesa, a, b )#define POINT( a )         r300_point( rmesa, a )/*********************************************************************** *              Build render functions from dd templates               * ***********************************************************************/#define R300_TWOSIDE_BIT	0x01#define R300_UNFILLED_BIT	0x02#define R300_MAX_TRIFUNC	0x04static struct {   tnl_points_func	        points;   tnl_line_func		line;   tnl_triangle_func	triangle;   tnl_quad_func		quad;} rast_tab[R300_MAX_TRIFUNC];#define DO_FALLBACK  0#define DO_UNFILLED (IND & R300_UNFILLED_BIT)#define DO_TWOSIDE  (IND & R300_TWOSIDE_BIT)#define DO_FLAT      0#define DO_OFFSET     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 TAB rast_tab#define DEPTH_SCALE 1.0#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) (rmesa->swtcl.verts + (e*rmesa->swtcl.vertex_size*sizeof(int)))/* Only used to pull back colors into vertices (ie, we know color is * floating point). */#define R300_COLOR( dst, src )				\do {							\   UNCLAMPED_FLOAT_TO_UBYTE((dst)[0], (src)[2]);	\   UNCLAMPED_FLOAT_TO_UBYTE((dst)[1], (src)[1]);	\   UNCLAMPED_FLOAT_TO_UBYTE((dst)[2], (src)[0]);	\   UNCLAMPED_FLOAT_TO_UBYTE((dst)[3], (src)[3]);	\} while (0)#define VERT_SET_RGBA( v, c )    if (coloroffset) R300_COLOR( v->ub4[coloroffset], c )#define VERT_COPY_RGBA( v0, v1 ) if (coloroffset) v0->ui[coloroffset] = v1->ui[coloroffset]#define VERT_SAVE_RGBA( idx )    if (coloroffset) color[idx] = v[idx]->ui[coloroffset]#define VERT_RESTORE_RGBA( idx ) if (coloroffset) v[idx]->ui[coloroffset] = color[idx]#define R300_SPEC( dst, src )				\do {							\   UNCLAMPED_FLOAT_TO_UBYTE((dst)[0], (src)[2]);	\   UNCLAMPED_FLOAT_TO_UBYTE((dst)[1], (src)[1]);	\   UNCLAMPED_FLOAT_TO_UBYTE((dst)[2], (src)[0]);	\} while (0)#define VERT_SET_SPEC( v, c )    if (specoffset) R300_SPEC( v->ub4[specoffset], c )#define VERT_COPY_SPEC( v0, v1 ) if (specoffset) COPY_3V(v0->ub4[specoffset], v1->ub4[specoffset])#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]#undef LOCAL_VARS#undef TAG#undef INIT#define LOCAL_VARS(n)							\   r300ContextPtr rmesa = R300_CONTEXT(ctx);			\   GLuint color[n], spec[n];						\   GLuint coloroffset = rmesa->swtcl.coloroffset;	\   GLuint specoffset = rmesa->swtcl.specoffset;			\   (void) color; (void) spec; (void) coloroffset; (void) specoffset;/*********************************************************************** *                Helpers for rendering unfilled primitives            * ***********************************************************************/#define RASTERIZE(x) r300RasterPrimitive( ctx, reduced_prim[x] )#define RENDER_PRIMITIVE rmesa->swtcl.render_primitive#undef TAG#define TAG(x) x#include "tnl_dd/t_dd_unfilled.h"#undef IND/*********************************************************************** *                      Generate GL render functions                   * ***********************************************************************/#define IND (0)#define TAG(x) x#include "tnl_dd/t_dd_tritmp.h"#define IND (R300_TWOSIDE_BIT)#define TAG(x) x##_twoside#include "tnl_dd/t_dd_tritmp.h"#define IND (R300_UNFILLED_BIT)#define TAG(x) x##_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (R300_TWOSIDE_BIT|R300_UNFILLED_BIT)#define TAG(x) x##_twoside_unfilled#include "tnl_dd/t_dd_tritmp.h"static void init_rast_tab( void ){   init();   init_twoside();   init_unfilled();   init_twoside_unfilled();}/**********************************************************************//*               Render unclipped begin/end objects                   *//**********************************************************************/#define RENDER_POINTS( start, count )		\   for ( ; start < count ; start++)		\      r300_point( rmesa, VERT(start) )#define RENDER_LINE( v0, v1 ) \   r300_line( rmesa, VERT(v0), VERT(v1) )#define RENDER_TRI( v0, v1, v2 )  \   r300_triangle( rmesa, VERT(v0), VERT(v1), VERT(v2) )#define RENDER_QUAD( v0, v1, v2, v3 ) \   r300_quad( rmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )#define INIT(x) do {					\   r300RenderPrimitive( ctx, x );			\} while (0)#undef LOCAL_VARS#define LOCAL_VARS						\   r300ContextPtr rmesa = R300_CONTEXT(ctx);		\   const GLuint vertsize = rmesa->swtcl.vertex_size;		\   const char *r300verts = (char *)rmesa->swtcl.verts;		\   const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts;	\   const GLboolean stipple = ctx->Line.StippleFlag;		\   (void) elt; (void) stipple;#define RESET_STIPPLE	//if ( stipple ) r200ResetLineStipple( ctx );#define RESET_OCCLUSION#define PRESERVE_VB_DEFS#define ELT(x) (x)#define TAG(x) r300_##x##_verts#include "tnl/t_vb_rendertmp.h"#undef ELT#undef TAG#define TAG(x) r300_##x##_elts#define ELT(x) elt[x]#include "tnl/t_vb_rendertmp.h"/**********************************************************************//*                    Choose render functions                         *//**********************************************************************/static void r300ChooseRenderState( GLcontext *ctx ){	TNLcontext *tnl = TNL_CONTEXT(ctx);	r300ContextPtr rmesa = R300_CONTEXT(ctx);	GLuint index = 0;	GLuint flags = ctx->_TriangleCaps;	if (flags & DD_TRI_LIGHT_TWOSIDE) index |= R300_TWOSIDE_BIT;	if (flags & DD_TRI_UNFILLED)      index |= R300_UNFILLED_BIT;	if (index != rmesa->swtcl.RenderIndex) {		tnl->Driver.Render.Points = rast_tab[index].points;		tnl->Driver.Render.Line = rast_tab[index].line;		tnl->Driver.Render.ClippedLine = rast_tab[index].line;		tnl->Driver.Render.Triangle = rast_tab[index].triangle;		tnl->Driver.Render.Quad = rast_tab[index].quad;		if (index == 0) {			tnl->Driver.Render.PrimTabVerts = r300_render_tab_verts;			tnl->Driver.Render.PrimTabElts = r300_render_tab_elts;			tnl->Driver.Render.ClippedPolygon = r300_fast_clipped_poly;		} else {			tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts;			tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts;			tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;		}		rmesa->swtcl.RenderIndex = index;	}}static void r300RenderStart(GLcontext *ctx){        r300ContextPtr rmesa = R300_CONTEXT( ctx );	//	fprintf(stderr, "%s\n", __FUNCTION__);	r300ChooseRenderState(ctx);		r300SetVertexFormat(ctx);	r300UpdateShaders(rmesa);	r300UpdateShaderStates(rmesa);	r300EmitCacheFlush(rmesa);		if (rmesa->dma.flush != 0 && 	    rmesa->dma.flush != flush_last_swtcl_prim)		rmesa->dma.flush( rmesa );}static void r300RenderFinish(GLcontext *ctx){}static void r300RasterPrimitive( GLcontext *ctx, GLuint hwprim ){	r300ContextPtr rmesa = R300_CONTEXT(ctx);		if (rmesa->swtcl.hw_primitive != hwprim) {	        R300_NEWPRIM( rmesa );		rmesa->swtcl.hw_primitive = hwprim;	}}static void r300RenderPrimitive(GLcontext *ctx, GLenum prim){	r300ContextPtr rmesa = R300_CONTEXT(ctx);	rmesa->swtcl.render_primitive = prim;	if ((prim == GL_TRIANGLES) && (ctx->_TriangleCaps & DD_TRI_UNFILLED))	  return;	r300RasterPrimitive( ctx, reduced_prim[prim] );	//	fprintf(stderr, "%s\n", __FUNCTION__);	}static void r300ResetLineStipple(GLcontext *ctx){}void r300InitSwtcl(GLcontext *ctx){	TNLcontext *tnl = TNL_CONTEXT(ctx);	r300ContextPtr rmesa = R300_CONTEXT(ctx);	static int firsttime = 1;		if (firsttime) {		init_rast_tab();		firsttime = 0;	}		tnl->Driver.Render.Start = r300RenderStart;	tnl->Driver.Render.Finish = r300RenderFinish;	tnl->Driver.Render.PrimitiveNotify = r300RenderPrimitive;	tnl->Driver.Render.ResetLineStipple = r300ResetLineStipple;	tnl->Driver.Render.BuildVertices = _tnl_build_vertices;	tnl->Driver.Render.CopyPV = _tnl_copy_pv;	tnl->Driver.Render.Interp = _tnl_interp;		/* FIXME: what are these numbers? */	_tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12, 			    48 * sizeof(GLfloat) );		rmesa->swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;	rmesa->swtcl.RenderIndex = ~0;	rmesa->swtcl.render_primitive = GL_TRIANGLES;	rmesa->swtcl.hw_primitive = 0;		_tnl_invalidate_vertex_state( ctx, ~0 );	_tnl_invalidate_vertices( ctx, ~0 );	RENDERINPUTS_ZERO( rmesa->tnl_index_bitset );	_tnl_need_projected_coords( ctx, GL_FALSE );	r300ChooseRenderState(ctx);	_mesa_validate_all_lighting_tables( ctx ); 	tnl->Driver.NotifyMaterialChange = 	  _mesa_validate_all_lighting_tables;}void r300DestroySwtcl(GLcontext *ctx){}void r300EmitVertexAOS(r300ContextPtr rmesa, GLuint vertex_size, GLuint offset){	int cmd_reserved = 0;	int cmd_written = 0;	drm_radeon_cmd_header_t *cmd = NULL;	if (RADEON_DEBUG & DEBUG_VERTS)	  fprintf(stderr, "%s:  vertex_size %d, offset 0x%x \n",		  __FUNCTION__, vertex_size, offset);	start_packet3(CP_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, 2), 2);	e32(1);	e32(vertex_size | (vertex_size << 8));	e32(offset);}void r300EmitVbufPrim(r300ContextPtr rmesa, GLuint primitive, GLuint vertex_nr){	int cmd_reserved = 0;	int cmd_written = 0;	int type, num_verts;	drm_radeon_cmd_header_t *cmd = NULL;	type = r300PrimitiveType(rmesa, primitive);	num_verts = r300NumVerts(rmesa, vertex_nr, primitive);		start_packet3(CP_PACKET3(R300_PACKET3_3D_DRAW_VBUF_2, 0), 0);	e32(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (num_verts << 16) | type);}

⌨️ 快捷键说明

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