📄 savagetris.c
字号:
savageContextPtr imesa = SAVAGE_CONTEXT(ctx); \ GLuint color[n], spec[n]; \ GLuint coloroffset = \ ((imesa->skip & SAVAGE_SKIP_W) ? 3 : 4); \ GLboolean specoffset = \ ((imesa->skip & SAVAGE_SKIP_C1) ? 0 : coloroffset+1); \ (void) color; (void) spec; (void) coloroffset; (void) specoffset;/*********************************************************************** * Helpers for rendering unfilled primitives * ***********************************************************************/#define RASTERIZE(x) if (imesa->raster_primitive != reduced_prim[x]) \ savageRasterPrimitive( ctx, x )#define RENDER_PRIMITIVE imesa->render_primitive#define IND SAVAGE_FALLBACK_BIT#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 (SAVAGE_OFFSET_BIT)#define TAG(x) x##_offset#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_TWOSIDE_BIT)#define TAG(x) x##_twoside#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_TWOSIDE_BIT|SAVAGE_OFFSET_BIT)#define TAG(x) x##_twoside_offset#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_UNFILLED_BIT)#define TAG(x) x##_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_OFFSET_BIT|SAVAGE_UNFILLED_BIT)#define TAG(x) x##_offset_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_TWOSIDE_BIT|SAVAGE_UNFILLED_BIT)#define TAG(x) x##_twoside_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_TWOSIDE_BIT|SAVAGE_OFFSET_BIT|SAVAGE_UNFILLED_BIT)#define TAG(x) x##_twoside_offset_unfilled#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_FALLBACK_BIT)#define TAG(x) x##_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_OFFSET_BIT|SAVAGE_FALLBACK_BIT)#define TAG(x) x##_offset_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_TWOSIDE_BIT|SAVAGE_FALLBACK_BIT)#define TAG(x) x##_twoside_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_TWOSIDE_BIT|SAVAGE_OFFSET_BIT|SAVAGE_FALLBACK_BIT)#define TAG(x) x##_twoside_offset_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_UNFILLED_BIT|SAVAGE_FALLBACK_BIT)#define TAG(x) x##_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_OFFSET_BIT|SAVAGE_UNFILLED_BIT|SAVAGE_FALLBACK_BIT)#define TAG(x) x##_offset_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_TWOSIDE_BIT|SAVAGE_UNFILLED_BIT|SAVAGE_FALLBACK_BIT)#define TAG(x) x##_twoside_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (SAVAGE_TWOSIDE_BIT|SAVAGE_OFFSET_BIT|SAVAGE_UNFILLED_BIT| \ SAVAGE_FALLBACK_BIT)#define TAG(x) x##_twoside_offset_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"static void init_rast_tab( void ){ init(); init_offset(); init_twoside(); init_twoside_offset(); init_unfilled(); init_offset_unfilled(); init_twoside_unfilled(); init_twoside_offset_unfilled(); init_fallback(); init_offset_fallback(); init_twoside_fallback(); init_twoside_offset_fallback(); init_unfilled_fallback(); init_offset_unfilled_fallback(); init_twoside_unfilled_fallback(); init_twoside_offset_unfilled_fallback();}/*********************************************************************** * Rasterization fallback helpers * ***********************************************************************//* This code is hit only when a mix of accelerated and unaccelerated * primitives are being drawn, and only for the unaccelerated * primitives. */static voidsavage_fallback_tri( savageContextPtr imesa, savageVertexPtr v0, savageVertexPtr v1, savageVertexPtr v2 ){ GLcontext *ctx = imesa->glCtx; SWvertex v[3]; FLUSH_BATCH(imesa); WAIT_IDLE_EMPTY(imesa); _swsetup_Translate( ctx, v0, &v[0] ); _swsetup_Translate( ctx, v1, &v[1] ); _swsetup_Translate( ctx, v2, &v[2] ); _swrast_Triangle( ctx, &v[0], &v[1], &v[2] );}static voidsavage_fallback_line( savageContextPtr imesa, savageVertexPtr v0, savageVertexPtr v1 ){ GLcontext *ctx = imesa->glCtx; SWvertex v[2]; FLUSH_BATCH(imesa); WAIT_IDLE_EMPTY(imesa); _swsetup_Translate( ctx, v0, &v[0] ); _swsetup_Translate( ctx, v1, &v[1] ); _swrast_Line( ctx, &v[0], &v[1] );}static voidsavage_fallback_point( savageContextPtr imesa, savageVertexPtr v0 ){ GLcontext *ctx = imesa->glCtx; SWvertex v[1]; FLUSH_BATCH(imesa); WAIT_IDLE_EMPTY(imesa); _swsetup_Translate( ctx, v0, &v[0] ); _swrast_Point( ctx, &v[0] );}/**********************************************************************//* Render unclipped begin/end objects *//**********************************************************************/#define VERT(x) (savageVertexPtr)(savageVerts + (x * vertsize * sizeof(int)))#define RENDER_POINTS( start, count ) \ for ( ; start < count ; start++) \ savage_draw_point( imesa, VERT(start) )#define RENDER_LINE( v0, v1 ) \ savage_draw_line( imesa, VERT(v0), VERT(v1) )#define RENDER_TRI( v0, v1, v2 ) \ savage_draw_triangle( imesa, VERT(v0), VERT(v1), VERT(v2) )#define RENDER_QUAD( v0, v1, v2, v3 ) \ savage_draw_quad( imesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )#define INIT(x) do { \ if (0) fprintf(stderr, "%s\n", __FUNCTION__); \ savageRenderPrimitive( ctx, x ); \ /*SAVAGE_CONTEXT(ctx)->render_primitive = x;*/ \} while (0)#undef LOCAL_VARS#define LOCAL_VARS \ savageContextPtr imesa = SAVAGE_CONTEXT(ctx); \ const GLuint vertsize = imesa->vertex_size; \ const char *savageVerts = (char *)imesa->verts; \ const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \ (void) elt;#define RESET_STIPPLE#define RESET_OCCLUSION#define PRESERVE_VB_DEFS#define ELT(x) (x)#define TAG(x) savage_##x##_verts#include "tnl/t_vb_rendertmp.h"#undef ELT#undef TAG#define TAG(x) savage_##x##_elts#define ELT(x) elt[x]#include "tnl/t_vb_rendertmp.h"/**********************************************************************//* Render clipped primitives *//**********************************************************************/static void savageRenderClippedPoly( GLcontext *ctx, const GLuint *elts, GLuint n ){ TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; /* Render the new vertices as an unclipped polygon. */ { GLuint *tmp = VB->Elts; VB->Elts = (GLuint *)elts; tnl->Driver.Render.PrimTabElts[GL_POLYGON]( ctx, 0, n, PRIM_BEGIN|PRIM_END ); VB->Elts = tmp; }}static void savageRenderClippedLine( GLcontext *ctx, GLuint ii, GLuint jj ){ TNLcontext *tnl = TNL_CONTEXT(ctx); tnl->Driver.Render.Line( ctx, ii, jj );}/*static void savageFastRenderClippedPoly( GLcontext *ctx, const GLuint *elts, GLuint n ){ r128ContextPtr rmesa = R128_CONTEXT( ctx ); GLuint vertsize = rmesa->vertex_size; GLuint *vb = r128AllocDmaLow( rmesa, (n-2) * 3 * 4 * vertsize ); GLubyte *r128verts = (GLubyte *)rmesa->verts; const GLuint shift = rmesa->vertex_stride_shift; const GLuint *start = (const GLuint *)VERT(elts[0]); int i,j; rmesa->num_verts += (n-2) * 3; for (i = 2 ; i < n ; i++) { COPY_DWORDS( j, vb, vertsize, (r128VertexPtr) start ); COPY_DWORDS( j, vb, vertsize, (r128VertexPtr) VERT(elts[i-1]) ); COPY_DWORDS( j, vb, vertsize, (r128VertexPtr) VERT(elts[i]) ); }}*//**********************************************************************//* Choose render functions *//**********************************************************************/#define _SAVAGE_NEW_RENDER_STATE (_DD_NEW_LINE_STIPPLE | \ _DD_NEW_LINE_SMOOTH | \ _DD_NEW_POINT_SMOOTH | \ _DD_NEW_TRI_STIPPLE | \ _DD_NEW_TRI_SMOOTH | \ _DD_NEW_TRI_UNFILLED | \ _DD_NEW_TRI_LIGHT_TWOSIDE | \ _DD_NEW_TRI_OFFSET) \/* original driver didn't have DD_POINT_SMOOTH. really needed? */#define POINT_FALLBACK (DD_POINT_SMOOTH)#define LINE_FALLBACK (DD_LINE_STIPPLE|DD_LINE_SMOOTH)#define TRI_FALLBACK (DD_TRI_STIPPLE|DD_TRI_SMOOTH)#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK)#define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET|DD_TRI_UNFILLED)static void savageChooseRenderState(GLcontext *ctx){ savageContextPtr imesa = SAVAGE_CONTEXT(ctx); GLuint flags = ctx->_TriangleCaps; GLuint index = 0; /* Hook in fallback functions for the ptex hack. Do this first, so * that a real fallback will overwrite them with the respective * savage_fallback_... function. */ if (imesa->ptexHack) { /* Do textures make sense with points? */ imesa->draw_point = savage_ptex_point; imesa->draw_line = savage_ptex_line; imesa->draw_tri = savage_ptex_tri; index |= SAVAGE_FALLBACK_BIT; } else { imesa->draw_point = savage_draw_point; imesa->draw_line = savage_draw_line; imesa->draw_tri = savage_draw_triangle; } if (flags & (ANY_RASTER_FLAGS|ANY_FALLBACK_FLAGS)) { if (flags & ANY_RASTER_FLAGS) { if (flags & DD_TRI_LIGHT_TWOSIDE) index |= SAVAGE_TWOSIDE_BIT; if (flags & DD_TRI_OFFSET) index |= SAVAGE_OFFSET_BIT; if (flags & DD_TRI_UNFILLED) index |= SAVAGE_UNFILLED_BIT; } /* Hook in fallbacks for specific primitives. */ if (flags & ANY_FALLBACK_FLAGS) { if (flags & POINT_FALLBACK) imesa->draw_point = savage_fallback_point; if (flags & LINE_FALLBACK) imesa->draw_line = savage_fallback_line; if (flags & TRI_FALLBACK) imesa->draw_tri = savage_fallback_tri; index |= SAVAGE_FALLBACK_BIT; if (SAVAGE_DEBUG & DEBUG_FALLBACKS) { fprintf (stderr, "Per-primitive fallback, TriangleCaps=0x%x\n", ctx->_TriangleCaps); } } } if (index != imesa->RenderIndex) { TNLcontext *tnl = TNL_CONTEXT(ctx); tnl->Driver.Render.Points = rast_tab[index].points; tnl->Driver.Render.Line = 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 = savage_render_tab_verts; tnl->Driver.Render.PrimTabElts = savage_render_tab_elts; tnl->Driver.Render.ClippedLine = rast_tab[index].line; tnl->Driver.Render.ClippedPolygon = savageRenderClippedPoly/*r128FastRenderClippedPoly*/; } else { tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; tnl->Driver.Render.ClippedLine = savageRenderClippedLine; tnl->Driver.Render.ClippedPolygon = savageRenderClippedPoly; } imesa->RenderIndex = index; }}/**********************************************************************//* Validate state at pipeline start *//**********************************************************************/static void savageRunPipeline( GLcontext *ctx ){ savageContextPtr imesa = SAVAGE_CONTEXT(ctx); if (imesa->no_rast) FALLBACK(ctx, SAVAGE_FALLBACK_NORAST, GL_TRUE); if (imesa->new_state) savageDDUpdateHwState( ctx ); if (!imesa->Fallback) { if (imesa->new_gl_state & _SAVAGE_NEW_RENDER_STATE) savageChooseRenderState( ctx ); /* choose the correct primitive type for tnl rendering */ if (imesa->savageScreen->chipset < S3_SAVAGE4 && (ctx->_TriangleCaps & DD_FLATSHADE)) { if (imesa->HwPrim != SAVAGE_PRIM_TRILIST_201) savageFlushVertices(imesa); imesa->HwPrim = SAVAGE_PRIM_TRILIST_201; } else { if (imesa->HwPrim != SAVAGE_PRIM_TRILIST) savageFlushVertices(imesa); imesa->HwPrim = SAVAGE_PRIM_TRILIST; } imesa->new_gl_state = 0; } _tnl_run_pipeline( ctx ); if (imesa->no_rast) FALLBACK(ctx, SAVAGE_FALLBACK_NORAST, GL_FALSE);}/**********************************************************************//* High level hooks for t_vb_render.c *//**********************************************************************//* This is called when Mesa switches between rendering triangle * primitives (such as GL_POLYGON, GL_QUADS, GL_TRIANGLE_STRIP, etc), * and lines, points and bitmaps. * * As the r128 uses triangles to render lines and points, it is * necessary to turn off hardware culling when rendering these * primitives. */static void savageRasterPrimitive( GLcontext *ctx, GLuint prim ){ savageContextPtr imesa = SAVAGE_CONTEXT( ctx ); /* Update culling */ if (imesa->raster_primitive != prim) { imesa->raster_primitive = prim; imesa->new_state |= SAVAGE_NEW_CULL; savageDDUpdateHwState (ctx); }#if 0 if (ctx->Polygon.StippleFlag && mmesa->haveHwStipple) { mmesa->dirty |= MGA_UPLOAD_CONTEXT; mmesa->setup.dwgctl &= ~(0xf<<20); if (mmesa->raster_primitive == GL_TRIANGLES) mmesa->setup.dwgctl |= mmesa->poly_stipple; }#endif}static void savageRenderPrimitive( GLcontext *ctx, GLenum prim ){ savageContextPtr imesa = SAVAGE_CONTEXT(ctx); GLuint rprim = reduced_prim[prim]; imesa->render_primitive = prim; if (rprim == GL_TRIANGLES && (ctx->_TriangleCaps & DD_TRI_UNFILLED)) return; if (imesa->raster_primitive != rprim) { savageRasterPrimitive( ctx, rprim ); }}/* Check if projective texture coordinates are used and if we can fake * them. Fallback to swrast we can't. Returns GL_TRUE if projective * texture coordinates must be faked, GL_FALSE otherwise.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -