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

📄 savagetris.c

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