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

📄 mgatris.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -