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

📄 via_tris.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   }   if (setupIndex != vmesa->setupIndex) {      vmesa->vertexSize = _tnl_install_attrs( ctx, 					       vmesa->vertex_attrs, 					       vmesa->vertex_attr_count,					       vmesa->ViewportMatrix.m, 0 );      vmesa->vertexSize >>= 2;      vmesa->setupIndex = setupIndex;      vmesa->regCmdB &= ~HC_HVPMSK_MASK;      vmesa->regCmdB |= regCmdB;      if (vmesa->ptexHack) 	 vmesa->hwVertexSize = vmesa->vertexSize - 1;      else	 vmesa->hwVertexSize = vmesa->vertexSize;   }}/* Check if projective texture coordinates are used and if we can fake * them. Fallback to swrast if we can't. Returns GL_TRUE if projective * texture coordinates must be faked, GL_FALSE otherwise. */static GLboolean viaCheckPTexHack( GLcontext *ctx ){   TNLcontext *tnl = TNL_CONTEXT(ctx);   struct vertex_buffer *VB = &tnl->vb;   DECLARE_RENDERINPUTS(index_bitset);   GLboolean fallback = GL_FALSE;   GLboolean ptexHack = GL_FALSE;   RENDERINPUTS_COPY( index_bitset, tnl->render_inputs_bitset );   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX0 ) && VB->TexCoordPtr[0]->size == 4) {      if (!RENDERINPUTS_TEST_RANGE( index_bitset, _TNL_ATTRIB_TEX1, _TNL_LAST_TEX ))	 ptexHack = GL_TRUE;       else	 fallback = GL_TRUE;   }   if (RENDERINPUTS_TEST( index_bitset, _TNL_ATTRIB_TEX1 ) && VB->TexCoordPtr[1]->size == 4)      fallback = GL_TRUE;   FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_PROJ_TEXTURE, fallback);   return ptexHack;}/**********************************************************************//*                 High level hooks for t_vb_render.c                 *//**********************************************************************/static void viaRenderStart(GLcontext *ctx){   struct via_context *vmesa = VIA_CONTEXT(ctx);   TNLcontext *tnl = TNL_CONTEXT(ctx);   struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;   {      GLboolean ptexHack = viaCheckPTexHack( ctx );      if (ptexHack != vmesa->ptexHack) {	 vmesa->ptexHack = ptexHack;	 vmesa->newRenderState |= _VIA_NEW_RENDERSTATE;      }   }   if (vmesa->newState) {      vmesa->newRenderState |= vmesa->newState;      viaValidateState( ctx );   }   if (vmesa->Fallback) {      tnl->Driver.Render.Start(ctx);      return;   }   if (vmesa->newRenderState) {      viaChooseVertexState(ctx);      viaChooseRenderState(ctx);      vmesa->newRenderState = 0;   }   /* Important:    */   VB->AttribPtr[VERT_ATTRIB_POS] = VB->NdcPtr;}static void viaRenderFinish(GLcontext *ctx){   VIA_FINISH_PRIM(VIA_CONTEXT(ctx));}/* System to flush dma and emit state changes based on the rasterized * primitive. */void viaRasterPrimitive(GLcontext *ctx,			GLenum glprim,			GLenum hwprim){   struct via_context *vmesa = VIA_CONTEXT(ctx);   GLuint regCmdB;   RING_VARS;   if (VIA_DEBUG & DEBUG_PRIMS)       fprintf(stderr, "%s: %s/%s/%s\n", 	      __FUNCTION__, _mesa_lookup_enum_by_nr(glprim),	      _mesa_lookup_enum_by_nr(hwprim),	      _mesa_lookup_enum_by_nr(ctx->Light.ShadeModel));   assert (!vmesa->newState);   vmesa->renderPrimitive = glprim;   if (hwprim != vmesa->hwPrimitive ||       ctx->Light.ShadeModel != vmesa->hwShadeModel) {      VIA_FINISH_PRIM(vmesa);      /* Ensure no wrapping inside this function  */          viaCheckDma( vmesa, 1024 );	      if (vmesa->newEmitState) {	 viaEmitState(vmesa);      }             vmesa->regCmdA_End = HC_ACMD_HCmdA;      if (ctx->Light.ShadeModel == GL_SMOOTH) {	 vmesa->regCmdA_End |= HC_HShading_Gouraud;      }            vmesa->hwShadeModel = ctx->Light.ShadeModel;      regCmdB = vmesa->regCmdB;      switch (hwprim) {      case GL_POINTS:	 vmesa->regCmdA_End |= HC_HPMType_Point | HC_HVCycle_Full;	 vmesa->regCmdA_End |= HC_HShading_Gouraud; /* always Gouraud 						       shade points?!? */	 break;      case GL_LINES:	 vmesa->regCmdA_End |= HC_HPMType_Line | HC_HVCycle_Full;         regCmdB |= HC_HLPrst_MASK;	 if (ctx->Light.ShadeModel == GL_FLAT)            vmesa->regCmdA_End |= HC_HShading_FlatB; 	 break;      case GL_LINE_LOOP:      case GL_LINE_STRIP:	 vmesa->regCmdA_End |= HC_HPMType_Line | HC_HVCycle_AFP |	    HC_HVCycle_AB | HC_HVCycle_NewB;	 regCmdB |= HC_HVCycle_AB | HC_HVCycle_NewB | HC_HLPrst_MASK;	 if (ctx->Light.ShadeModel == GL_FLAT)            vmesa->regCmdA_End |= HC_HShading_FlatB; 	 break;      case GL_TRIANGLES:	 vmesa->regCmdA_End |= HC_HPMType_Tri | HC_HVCycle_Full;	 if (ctx->Light.ShadeModel == GL_FLAT)            vmesa->regCmdA_End |= HC_HShading_FlatC; 	 break;      case GL_TRIANGLE_STRIP:	 vmesa->regCmdA_End |= HC_HPMType_Tri | HC_HVCycle_AFP |	    HC_HVCycle_AC | HC_HVCycle_BB | HC_HVCycle_NewC;	 regCmdB |= HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC;	 if (ctx->Light.ShadeModel == GL_FLAT)            vmesa->regCmdA_End |= HC_HShading_FlatC; 	 break;      case GL_TRIANGLE_FAN:	 vmesa->regCmdA_End |= HC_HPMType_Tri | HC_HVCycle_AFP |	    HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC;	 regCmdB |= HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC;	 if (ctx->Light.ShadeModel == GL_FLAT)            vmesa->regCmdA_End |= HC_HShading_FlatC; 	 break;      case GL_QUADS:	 abort();	 return;      case GL_QUAD_STRIP:	 abort();	 return;      case GL_POLYGON:	 vmesa->regCmdA_End |= HC_HPMType_Tri | HC_HVCycle_AFP |	    HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC;	 regCmdB |= HC_HVCycle_AA | HC_HVCycle_BC | HC_HVCycle_NewC;	 if (ctx->Light.ShadeModel == GL_FLAT)            vmesa->regCmdA_End |= HC_HShading_FlatC; 	 break;                                default:	 abort();	 return;      }    /*     assert((vmesa->dmaLow & 0x4) == 0); */      if (vmesa->dmaCliprectAddr == ~0) {	 if (VIA_DEBUG & DEBUG_DMA) 	    fprintf(stderr, "reserve cliprect space at %x\n", vmesa->dmaLow);	 vmesa->dmaCliprectAddr = vmesa->dmaLow;	 BEGIN_RING(8);	 OUT_RING( HC_HEADER2 );    	 OUT_RING( (HC_ParaType_NotTex << 16) );	 OUT_RING( 0xCCCCCCCC );	 OUT_RING( 0xCCCCCCCC );	 OUT_RING( 0xCCCCCCCC );	 OUT_RING( 0xCCCCCCCC );	 OUT_RING( 0xCCCCCCCC );	 OUT_RING( 0xCCCCCCCC );	 ADVANCE_RING();      }      assert(vmesa->dmaLastPrim == 0);      BEGIN_RING(8);      OUT_RING( HC_HEADER2 );          OUT_RING( (HC_ParaType_NotTex << 16) );      OUT_RING( 0xCCCCCCCC );      OUT_RING( 0xDDDDDDDD );      OUT_RING( HC_HEADER2 );          OUT_RING( (HC_ParaType_CmdVdata << 16) );      OUT_RING( regCmdB );      OUT_RING( vmesa->regCmdA_End );      ADVANCE_RING();      vmesa->hwPrimitive = hwprim;              vmesa->dmaLastPrim = vmesa->dmaLow;   }   else {      assert(!vmesa->newEmitState);   }}/* Callback for mesa: */static void viaRenderPrimitive( GLcontext *ctx, GLuint prim ){   viaRasterPrimitive( ctx, prim, hwPrim[prim] );}void viaFinishPrimitive(struct via_context *vmesa){   if (VIA_DEBUG & (DEBUG_DMA|DEBUG_PRIMS))       fprintf(stderr, "%s\n", __FUNCTION__);   if (!vmesa->dmaLastPrim || vmesa->dmaCliprectAddr == ~0) {      assert(0);   }   else if (vmesa->dmaLow != vmesa->dmaLastPrim) {      GLuint cmdA = (vmesa->regCmdA_End | HC_HPLEND_MASK | 		     HC_HPMValidN_MASK | HC_HE3Fire_MASK);       RING_VARS;      vmesa->dmaLastPrim = 0;      /* KW: modified 0x1 to 0x4 below:       */      if ((vmesa->dmaLow & 0x4) || !vmesa->useAgp) {	 BEGIN_RING_NOCHECK( 1 );	 OUT_RING( cmdA );	 ADVANCE_RING();      }         else {      	 BEGIN_RING_NOCHECK( 2 );	 OUT_RING( cmdA );	 OUT_RING( cmdA );	 ADVANCE_RING();      }         if (vmesa->dmaLow > VIA_DMA_HIGHWATER)	 viaFlushDma( vmesa );   }   else {      if (VIA_DEBUG & (DEBUG_DMA|DEBUG_PRIMS)) 	 fprintf(stderr, "remove empty primitive\n");      /* Remove the primitive header:       */      vmesa->dmaLastPrim = 0;      vmesa->dmaLow -= 8 * sizeof(GLuint);      /* Maybe remove the cliprect as well:       */      if (vmesa->dmaCliprectAddr == vmesa->dmaLow - 8 * sizeof(GLuint)) {	 vmesa->dmaLow -= 8 * sizeof(GLuint);	 vmesa->dmaCliprectAddr = ~0;      }   }   vmesa->renderPrimitive = GL_POLYGON + 1;   vmesa->hwPrimitive = GL_POLYGON + 1;   vmesa->dmaLastPrim = 0;}/**********************************************************************//*           Transition to/from hardware rasterization.               *//**********************************************************************/void viaFallback(struct via_context *vmesa, GLuint bit, GLboolean mode){    GLcontext *ctx = vmesa->glCtx;    TNLcontext *tnl = TNL_CONTEXT(ctx);    GLuint oldfallback = vmesa->Fallback;        if (mode) {        vmesa->Fallback |= bit;        if (oldfallback == 0) {	    VIA_FLUSH_DMA(vmesa); 	    if (VIA_DEBUG & DEBUG_FALLBACKS) 	       fprintf(stderr, "ENTER FALLBACK %x\n", bit);            _swsetup_Wakeup(ctx);            vmesa->renderIndex = ~0;        }    }    else {        vmesa->Fallback &= ~bit;        if (oldfallback == bit) {	    _swrast_flush( ctx ); 	    if (VIA_DEBUG & DEBUG_FALLBACKS) 	       fprintf(stderr, "LEAVE FALLBACK %x\n", bit);	    tnl->Driver.Render.Start = viaRenderStart;            tnl->Driver.Render.PrimitiveNotify = viaRenderPrimitive;            tnl->Driver.Render.Finish = viaRenderFinish;	    tnl->Driver.Render.BuildVertices = _tnl_build_vertices;	    tnl->Driver.Render.CopyPV = _tnl_copy_pv;	    tnl->Driver.Render.Interp = _tnl_interp;    	    tnl->Driver.Render.ResetLineStipple = viaResetLineStipple;	    _tnl_invalidate_vertex_state( ctx, ~0 );	    _tnl_invalidate_vertices( ctx, ~0 );	    _tnl_install_attrs( ctx, 				vmesa->vertex_attrs, 				vmesa->vertex_attr_count,				vmesa->ViewportMatrix.m, 0 );             vmesa->newState |= (_VIA_NEW_RENDERSTATE|_VIA_NEW_VERTEX);        }    }    }static void viaRunPipeline( GLcontext *ctx ){   struct via_context *vmesa = VIA_CONTEXT(ctx);   if (vmesa->newState) {      vmesa->newRenderState |= vmesa->newState;      viaValidateState( ctx );   }   _tnl_run_pipeline( ctx );}/**********************************************************************//*                            Initialization.                         *//**********************************************************************/void viaInitTriFuncs(GLcontext *ctx){    struct via_context *vmesa = VIA_CONTEXT(ctx);    TNLcontext *tnl = TNL_CONTEXT(ctx);    static int firsttime = 1;    if (firsttime) {        init_rast_tab();        firsttime = 0;    }    tnl->Driver.RunPipeline = viaRunPipeline;    tnl->Driver.Render.Start = viaRenderStart;    tnl->Driver.Render.Finish = viaRenderFinish;    tnl->Driver.Render.PrimitiveNotify = viaRenderPrimitive;    tnl->Driver.Render.ResetLineStipple = viaResetLineStipple;    tnl->Driver.Render.BuildVertices = _tnl_build_vertices;    tnl->Driver.Render.CopyPV = _tnl_copy_pv;    tnl->Driver.Render.Interp = _tnl_interp;    _tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12, 			(6 + 2*ctx->Const.MaxTextureUnits) * sizeof(GLfloat) );       vmesa->verts = (GLubyte *)tnl->clipspace.vertex_buf;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -