📄 r300_swtcl.c
字号:
#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 + -