📄 mgatris.c
字号:
#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_FALLBACK_BIT)#define TAG(x) x##_twoside_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_OFFSET_BIT|MGA_FALLBACK_BIT)#define TAG(x) x##_twoside_offset_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_UNFILLED_BIT|MGA_FALLBACK_BIT)#define TAG(x) x##_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_OFFSET_BIT|MGA_UNFILLED_BIT|MGA_FALLBACK_BIT)#define TAG(x) x##_offset_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_UNFILLED_BIT|MGA_FALLBACK_BIT)#define TAG(x) x##_twoside_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_OFFSET_BIT|MGA_UNFILLED_BIT| \ MGA_FALLBACK_BIT)#define TAG(x) x##_twoside_offset_unfilled_fallback#include "tnl_dd/t_dd_tritmp.h"/* Mga doesn't support provoking-vertex flat-shading? */#define IND (MGA_FLAT_BIT)#define TAG(x) x##_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_OFFSET_BIT|MGA_FLAT_BIT)#define TAG(x) x##_offset_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_FLAT_BIT)#define TAG(x) x##_twoside_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_OFFSET_BIT|MGA_FLAT_BIT)#define TAG(x) x##_twoside_offset_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_UNFILLED_BIT|MGA_FLAT_BIT)#define TAG(x) x##_unfilled_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_OFFSET_BIT|MGA_UNFILLED_BIT|MGA_FLAT_BIT)#define TAG(x) x##_offset_unfilled_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_UNFILLED_BIT|MGA_FLAT_BIT)#define TAG(x) x##_twoside_unfilled_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_OFFSET_BIT|MGA_UNFILLED_BIT|MGA_FLAT_BIT)#define TAG(x) x##_twoside_offset_unfilled_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_FALLBACK_BIT|MGA_FLAT_BIT)#define TAG(x) x##_fallback_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_OFFSET_BIT|MGA_FALLBACK_BIT|MGA_FLAT_BIT)#define TAG(x) x##_offset_fallback_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_FALLBACK_BIT|MGA_FLAT_BIT)#define TAG(x) x##_twoside_fallback_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_OFFSET_BIT|MGA_FALLBACK_BIT|MGA_FLAT_BIT)#define TAG(x) x##_twoside_offset_fallback_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_UNFILLED_BIT|MGA_FALLBACK_BIT|MGA_FLAT_BIT)#define TAG(x) x##_unfilled_fallback_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_OFFSET_BIT|MGA_UNFILLED_BIT|MGA_FALLBACK_BIT|MGA_FLAT_BIT)#define TAG(x) x##_offset_unfilled_fallback_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_UNFILLED_BIT|MGA_FALLBACK_BIT|MGA_FLAT_BIT)#define TAG(x) x##_twoside_unfilled_fallback_flat#include "tnl_dd/t_dd_tritmp.h"#define IND (MGA_TWOSIDE_BIT|MGA_OFFSET_BIT|MGA_UNFILLED_BIT| \ MGA_FALLBACK_BIT|MGA_FLAT_BIT)#define TAG(x) x##_twoside_offset_unfilled_fallback_flat#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(); init_flat(); init_offset_flat(); init_twoside_flat(); init_twoside_offset_flat(); init_unfilled_flat(); init_offset_unfilled_flat(); init_twoside_unfilled_flat(); init_twoside_offset_unfilled_flat(); init_fallback_flat(); init_offset_fallback_flat(); init_twoside_fallback_flat(); init_twoside_offset_fallback_flat(); init_unfilled_fallback_flat(); init_offset_unfilled_fallback_flat(); init_twoside_unfilled_fallback_flat(); init_twoside_offset_unfilled_fallback_flat();}/**********************************************************************//* Render whole begin/end objects *//**********************************************************************/#define VERT(x) (mgaVertex *)(vertptr + ((x)*vertex_size*sizeof(int)))#define RENDER_POINTS( start, count ) \ for ( ; start < count ; start++) \ mga_draw_point( mmesa, VERT(ELT(start)) );#define RENDER_LINE( v0, v1 ) \ mga_draw_line( mmesa, VERT(v0), VERT(v1) )#define RENDER_TRI( v0, v1, v2 ) \ mga_draw_triangle( mmesa, VERT(v0), VERT(v1), VERT(v2) )#define RENDER_QUAD( v0, v1, v2, v3 ) \ mga_draw_quad( mmesa, VERT(v0), VERT(v1), VERT(v2), VERT(v3) )#define INIT(x) mgaRenderPrimitive( ctx, x )#undef LOCAL_VARS#define LOCAL_VARS \ mgaContextPtr mmesa = MGA_CONTEXT(ctx); \ GLubyte *vertptr = (GLubyte *)mmesa->verts; \ const GLuint vertex_size = mmesa->vertex_size; \ 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) mga_##x##_verts#include "tnl/t_vb_rendertmp.h"#undef ELT#undef TAG#define TAG(x) mga_##x##_elts#define ELT(x) elt[x]#include "tnl/t_vb_rendertmp.h"/**********************************************************************//* Render clipped primitives *//**********************************************************************/static void mgaRenderClippedPoly( GLcontext *ctx, const GLuint *elts, GLuint n ){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); struct vertex_buffer *VB = &tnl->vb; GLuint prim = mmesa->render_primitive; /* 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; } /* Restore the render primitive */ if (prim != GL_POLYGON) tnl->Driver.Render.PrimitiveNotify( ctx, prim );}static void mgaRenderClippedLine( GLcontext *ctx, GLuint ii, GLuint jj ){ TNLcontext *tnl = TNL_CONTEXT(ctx); tnl->Driver.Render.Line( ctx, ii, jj );}static void mgaFastRenderClippedPoly( GLcontext *ctx, const GLuint *elts, GLuint n ){ mgaContextPtr mmesa = MGA_CONTEXT( ctx ); GLuint vertex_size = mmesa->vertex_size; GLuint *vb = mgaAllocDmaLow( mmesa, (n-2) * 3 * 4 * vertex_size ); GLubyte *vertptr = (GLubyte *)mmesa->verts; const GLuint *start = (const GLuint *)VERT(elts[0]); int i,j; for (i = 2 ; i < n ; i++) { EMIT_VERT( j, vb, vertex_size, (mgaVertexPtr) VERT(elts[i-1]) ); EMIT_VERT( j, vb, vertex_size, (mgaVertexPtr) VERT(elts[i]) ); EMIT_VERT( j, vb, vertex_size, (mgaVertexPtr) start ); }}/**********************************************************************//* Choose render functions *//**********************************************************************/#define POINT_FALLBACK (DD_POINT_SMOOTH)#define LINE_FALLBACK (DD_LINE_SMOOTH | DD_LINE_STIPPLE)#define TRI_FALLBACK (DD_TRI_SMOOTH | DD_TRI_UNFILLED)#define ANY_FALLBACK_FLAGS (POINT_FALLBACK|LINE_FALLBACK|TRI_FALLBACK)#define ANY_RASTER_FLAGS (DD_FLATSHADE|DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET| \ DD_TRI_UNFILLED)void mgaChooseRenderState(GLcontext *ctx){ TNLcontext *tnl = TNL_CONTEXT(ctx); mgaContextPtr mmesa = MGA_CONTEXT(ctx); GLuint flags = ctx->_TriangleCaps; GLuint index = 0; if (flags & (ANY_FALLBACK_FLAGS|ANY_RASTER_FLAGS|DD_TRI_STIPPLE)) { if (flags & ANY_RASTER_FLAGS) { if (flags & DD_TRI_LIGHT_TWOSIDE) index |= MGA_TWOSIDE_BIT; if (flags & DD_TRI_OFFSET) index |= MGA_OFFSET_BIT; if (flags & DD_TRI_UNFILLED) index |= MGA_UNFILLED_BIT; if (flags & DD_FLATSHADE) index |= MGA_FLAT_BIT; } mmesa->draw_point = mga_draw_point; mmesa->draw_line = mga_draw_line; mmesa->draw_tri = mga_draw_triangle; /* Hook in fallbacks for specific primitives. */ if (flags & ANY_FALLBACK_FLAGS) { if (flags & POINT_FALLBACK) mmesa->draw_point = mga_fallback_point; if (flags & LINE_FALLBACK) mmesa->draw_line = mga_fallback_line; if (flags & TRI_FALLBACK) mmesa->draw_tri = mga_fallback_tri; index |= MGA_FALLBACK_BIT; } if ((flags & DD_TRI_STIPPLE) && !mmesa->haveHwStipple) { mmesa->draw_tri = mga_fallback_tri; index |= MGA_FALLBACK_BIT; } } if (mmesa->RenderIndex != index) { mmesa->RenderIndex = index; 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 = mga_render_tab_verts; tnl->Driver.Render.PrimTabElts = mga_render_tab_elts; tnl->Driver.Render.ClippedLine = line; /* from tritmp.h */ tnl->Driver.Render.ClippedPolygon = mgaFastRenderClippedPoly; } else { tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; tnl->Driver.Render.ClippedLine = mgaRenderClippedLine; tnl->Driver.Render.ClippedPolygon = mgaRenderClippedPoly; } }}/**********************************************************************//* Runtime render state and callbacks *//**********************************************************************/static GLenum reduced_prim[GL_POLYGON+1] = { GL_POINTS, GL_LINES, GL_LINES, GL_LINES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES, GL_TRIANGLES};/* Always called between RenderStart and RenderFinish --> We already * hold the lock. */void mgaRasterPrimitive( GLcontext *ctx, GLenum prim, GLuint hwprim ){ mgaContextPtr mmesa = MGA_CONTEXT( ctx ); FLUSH_BATCH( mmesa ); /* Update culling */ if (mmesa->raster_primitive != prim) mmesa->dirty |= MGA_UPLOAD_CONTEXT; mmesa->raster_primitive = prim;/* mmesa->hw_primitive = hwprim; */ mmesa->hw_primitive = MGA_WA_TRIANGLES; /* disable mgarender.c for now */ 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; }}/* Determine the rasterized primitive when not drawing unfilled * polygons. * * Used only for the default render stage which always decomposes * primitives to trianges/lines/points. For the accelerated stage, * which renders strips as strips, the equivalent calculations are * performed in mgarender.c. */static void mgaRenderPrimitive( GLcontext *ctx, GLenum prim ){ mgaContextPtr mmesa = MGA_CONTEXT(ctx); GLuint rprim = reduced_prim[prim]; mmesa->render_primitive = prim; if (rprim == GL_TRIANGLES && (ctx->_TriangleCaps & DD_TRI_UNFILLED)) return; if (mmesa->raster_primitive != rprim) { mgaRasterPrimitive( ctx, rprim, MGA_WA_TRIANGLES ); }}static void mgaRenderFinish( GLcontext *ctx ){ if (MGA_CONTEXT(ctx)->RenderIndex & MGA_FALLBACK_BIT) _swrast_flush( ctx );}/**********************************************************************//* Manage total rasterization fallbacks *//**********************************************************************/static const char * const fallbackStrings[] = { "Texture mode", "glDrawBuffer(GL_FRONT_AND_BACK)", "read buffer", "glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ZERO)", "glRenderMode(selection or feedback)", "No hardware stencil", "glDepthFunc( GL_NEVER )", "Mixing GL_CLAMP_TO_EDGE and GL_CLAMP", "rasterization fallback option"};static const char *getFallbackString(GLuint bit){ int i = 0; while (bit > 1) { i++; bit >>= 1; } return fallbackStrings[i];}void mgaFallback( GLcontext *ctx, GLuint bit, GLboolean mode ){ TNLcontext *tnl = TNL_CONTEXT(ctx); mgaContextPtr mmesa = MGA_CONTEXT(ctx); GLuint oldfallback = mmesa->Fallback; if (mode) { mmesa->Fallback |= bit; if (oldfallback == 0) { FLUSH_BATCH(mmesa); _swsetup_Wakeup( ctx ); mmesa->RenderIndex = ~0; if (MGA_DEBUG & DEBUG_VERBOSE_FALLBACK) { fprintf(stderr, "MGA begin rasterization fallback: 0x%x %s\n", bit, getFallbackString(bit)); } } } else { mmesa->Fallback &= ~bit; if (oldfallback == bit) { _swrast_flush( ctx ); tnl->Driver.Render.Start = mgaCheckTexSizes; tnl->Driver.Render.PrimitiveNotify = mgaRenderPrimitive; tnl->Driver.Render.Finish = mgaRenderFinish; tnl->Driver.Render.BuildVertices = mgaBuildVertices; mmesa->NewGLState |= (_MGA_NEW_RENDERSTATE | _MGA_NEW_RASTERSETUP); if (MGA_DEBUG & DEBUG_VERBOSE_FALLBACK) { fprintf(stderr, "MGA end rasterization fallback: 0x%x %s\n", bit, getFallbackString(bit)); } } }}void mgaDDInitTriFuncs( GLcontext *ctx ){ TNLcontext *tnl = TNL_CONTEXT(ctx); mgaContextPtr mmesa = MGA_CONTEXT(ctx); static int firsttime = 1; if (firsttime) { init_rast_tab(); firsttime = 0; } mmesa->RenderIndex = ~0; tnl->Driver.Render.Start = mgaCheckTexSizes; tnl->Driver.Render.Finish = mgaRenderFinish; tnl->Driver.Render.PrimitiveNotify = mgaRenderPrimitive; tnl->Driver.Render.ResetLineStipple = _swrast_ResetLineStipple; tnl->Driver.Render.BuildVertices = mgaBuildVertices; tnl->Driver.Render.Multipass = NULL;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -