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

📄 brw_clip_tri.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
		  brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_uw(sizeof(short)));		  brw_ADD(p, c->reg.nr_verts, c->reg.nr_verts, brw_imm_ud(1));		  brw_MOV(p, get_addr_reg(vtxOut), brw_imm_uw(0) );	       }	       brw_ENDIF(p, next_test);	       	    }	    prev_test = brw_ELSE(p, prev_test);	    {	       /* *outlist_ptr++ = vtxPrev;		* nr_verts++;		*/	       brw_MOV(p, deref_1uw(outlist_ptr, 0), get_addr_reg(vtxPrev));	       brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_uw(sizeof(short)));	       brw_ADD(p, c->reg.nr_verts, c->reg.nr_verts, brw_imm_ud(1));	       /* IS_NEGATIVE(next)		*/	       brw_set_conditionalmod(p, BRW_CONDITIONAL_L);	       brw_DP4(p, vec4(c->reg.dp), deref_4f(vtx, c->offset[VERT_RESULT_HPOS]), c->reg.plane_equation);	       next_test = brw_IF(p, BRW_EXECUTE_1);	       {		  /* Going out of bounds.  Avoid division by zero as we		   * know dp != dpPrev from DIFFERENT_SIGNS, above.		   */		  brw_ADD(p, c->reg.t, c->reg.dp, negate(c->reg.dpPrev));		  brw_math_invert(p, c->reg.t, c->reg.t);		  brw_MUL(p, c->reg.t, c->reg.t, c->reg.dp);		  /* If (vtxOut == 0) vtxOut = vtx		   */		  brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_EQ, get_addr_reg(vtxOut), brw_imm_uw(0) );		  brw_MOV(p, get_addr_reg(vtxOut), get_addr_reg(vtx) );		  brw_set_predicate_control(p, BRW_PREDICATE_NONE);		  brw_clip_interp_vertex(c, vtxOut, vtx, vtxPrev, c->reg.t, GL_TRUE);		  		  /* *outlist_ptr++ = vtxOut;		   * nr_verts++; 		   * vtxOut = 0;		   */		  brw_MOV(p, deref_1uw(outlist_ptr, 0), get_addr_reg(vtxOut));		  brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_uw(sizeof(short)));		  brw_ADD(p, c->reg.nr_verts, c->reg.nr_verts, brw_imm_ud(1));		  brw_MOV(p, get_addr_reg(vtxOut), brw_imm_uw(0) );	       } 	       	       brw_ENDIF(p, next_test);	    }	    brw_ENDIF(p, prev_test);	    	    /* vtxPrev = vtx;	     * inlist_ptr++;	     */	    brw_MOV(p, get_addr_reg(vtxPrev), get_addr_reg(vtx));	    brw_ADD(p, get_addr_reg(inlist_ptr), get_addr_reg(inlist_ptr), brw_imm_uw(sizeof(short)));	    /* while (--loopcount != 0)	     */	    brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);	    brw_ADD(p, c->reg.loopcount, c->reg.loopcount, brw_imm_d(-1));	 } 	 brw_WHILE(p, vertex_loop);	 /* vtxPrev = *(outlist_ptr-1)  OR: outlist[nr_verts-1]	  * inlist = outlist	  * inlist_ptr = &inlist[0]	  * outlist_ptr = &outlist[0]	  */	 brw_ADD(p, get_addr_reg(outlist_ptr), get_addr_reg(outlist_ptr), brw_imm_w(-2));	 brw_MOV(p, get_addr_reg(vtxPrev), deref_1uw(outlist_ptr, 0));	 brw_MOV(p, brw_vec8_grf(c->reg.inlist.nr, 0), brw_vec8_grf(c->reg.outlist.nr, 0));	 brw_MOV(p, get_addr_reg(inlist_ptr), brw_address(c->reg.inlist));	 brw_MOV(p, get_addr_reg(outlist_ptr), brw_address(c->reg.outlist));      }      brw_ENDIF(p, plane_active);            /* plane_ptr++;       */      brw_ADD(p, get_addr_reg(plane_ptr), get_addr_reg(plane_ptr), brw_clip_plane_stride(c));      /* nr_verts >= 3        */      brw_CMP(p,	      vec1(brw_null_reg()),	      BRW_CONDITIONAL_GE,	      c->reg.nr_verts,	      brw_imm_ud(3));         /* && (planemask>>=1) != 0       */      brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);      brw_SHR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud(1));   }   brw_WHILE(p, plane_loop);}void brw_clip_tri_emit_polygon(struct brw_clip_compile *c){   struct brw_compile *p = &c->func;   struct brw_instruction *loop, *if_insn;   /* for (loopcount = nr_verts-2; loopcount > 0; loopcount--)    */   brw_set_conditionalmod(p, BRW_CONDITIONAL_G);   brw_ADD(p,	   c->reg.loopcount,	   c->reg.nr_verts,	   brw_imm_d(-2));   if_insn = brw_IF(p, BRW_EXECUTE_1);   {      struct brw_indirect v0 = brw_indirect(0, 0);      struct brw_indirect vptr = brw_indirect(1, 0);      brw_MOV(p, get_addr_reg(vptr), brw_address(c->reg.inlist));      brw_MOV(p, get_addr_reg(v0), deref_1uw(vptr, 0));      brw_clip_emit_vue(c, v0, 1, 0, ((_3DPRIM_TRIFAN << 2) | R02_PRIM_START));            brw_ADD(p, get_addr_reg(vptr), get_addr_reg(vptr), brw_imm_uw(2));      brw_MOV(p, get_addr_reg(v0), deref_1uw(vptr, 0));      loop = brw_DO(p, BRW_EXECUTE_1);      {	 brw_clip_emit_vue(c, v0, 1, 0, (_3DPRIM_TRIFAN << 2));  	 brw_ADD(p, get_addr_reg(vptr), get_addr_reg(vptr), brw_imm_uw(2));	 brw_MOV(p, get_addr_reg(v0), deref_1uw(vptr, 0));	 brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);	 brw_ADD(p, c->reg.loopcount, c->reg.loopcount, brw_imm_d(-1));      }      brw_WHILE(p, loop);      brw_clip_emit_vue(c, v0, 0, 1, ((_3DPRIM_TRIFAN << 2) | R02_PRIM_END));   }   brw_ENDIF(p, if_insn);}static void do_clip_tri( struct brw_clip_compile *c ){   brw_clip_init_planes(c);   brw_clip_tri(c);}static void maybe_do_clip_tri( struct brw_clip_compile *c ){   struct brw_compile *p = &c->func;   struct brw_instruction *do_clip;   brw_CMP(p, vec1(brw_null_reg()), BRW_CONDITIONAL_NZ, c->reg.planemask, brw_imm_ud(0));   do_clip = brw_IF(p, BRW_EXECUTE_1);   {      do_clip_tri(c);   }   brw_ENDIF(p, do_clip);}static void brw_clip_test( struct brw_clip_compile *c ){    struct brw_reg t = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);    struct brw_reg t1 = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);    struct brw_reg t2 = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);    struct brw_reg t3 = retype(get_tmp(c), BRW_REGISTER_TYPE_UD);    struct brw_reg v0 = get_tmp(c);    struct brw_reg v1 = get_tmp(c);    struct brw_reg v2 = get_tmp(c);    struct brw_indirect vt0 = brw_indirect(0, 0);    struct brw_indirect vt1 = brw_indirect(1, 0);    struct brw_indirect vt2 = brw_indirect(2, 0);    struct brw_compile *p = &c->func;    brw_MOV(p, get_addr_reg(vt0), brw_address(c->reg.vertex[0]));    brw_MOV(p, get_addr_reg(vt1), brw_address(c->reg.vertex[1]));    brw_MOV(p, get_addr_reg(vt2), brw_address(c->reg.vertex[2]));    brw_MOV(p, v0, deref_4f(vt0, c->offset[VERT_RESULT_HPOS]));    brw_MOV(p, v1, deref_4f(vt1, c->offset[VERT_RESULT_HPOS]));    brw_MOV(p, v2, deref_4f(vt2, c->offset[VERT_RESULT_HPOS]));    /* test nearz, xmin, ymin plane */    brw_CMP(p, t1, BRW_CONDITIONAL_LE, negate(v0), get_element(v0, 3));     brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_CMP(p, t2, BRW_CONDITIONAL_LE, negate(v1), get_element(v1, 3));     brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_CMP(p, t3, BRW_CONDITIONAL_LE, negate(v2), get_element(v2, 3));     brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_XOR(p, t, t1, t2);    brw_XOR(p, t1, t2, t3);    brw_OR(p, t, t, t1);    brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ, 	    get_element(t, 0), brw_imm_ud(0));    brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<5)));    brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ, 	    get_element(t, 1), brw_imm_ud(0));    brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<3)));    brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ, 	    get_element(t, 2), brw_imm_ud(0));    brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<1)));    brw_set_predicate_control(p, BRW_PREDICATE_NONE);    /* test farz, xmax, ymax plane */    brw_CMP(p, t1, BRW_CONDITIONAL_L, v0, get_element(v0, 3));     brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_CMP(p, t2, BRW_CONDITIONAL_L, v1, get_element(v1, 3));     brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_CMP(p, t3, BRW_CONDITIONAL_L, v2, get_element(v2, 3));     brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_XOR(p, t, t1, t2);    brw_XOR(p, t1, t2, t3);    brw_OR(p, t, t, t1);    brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ, 	    get_element(t, 0), brw_imm_ud(0));    brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<4)));    brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ, 	    get_element(t, 1), brw_imm_ud(0));    brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<2)));    brw_set_predicate_control(p, BRW_PREDICATE_NONE);    brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_NZ, 	    get_element(t, 2), brw_imm_ud(0));    brw_OR(p, c->reg.planemask, c->reg.planemask, brw_imm_ud((1<<0)));    brw_set_predicate_control(p, BRW_PREDICATE_NONE);    release_tmps(c);}void brw_emit_tri_clip( struct brw_clip_compile *c ){   struct brw_instruction *neg_rhw;   struct brw_compile *p = &c->func;   brw_clip_tri_alloc_regs(c, 3 + c->key.nr_userclip + 6);   brw_clip_tri_init_vertices(c);   brw_clip_init_clipmask(c);   /* if -ve rhw workaround bit is set,       do cliptest */   if (!(BRW_IS_GM45(p->brw) || BRW_IS_G4X(p->brw))) {      brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);      brw_AND(p, brw_null_reg(), get_element_ud(c->reg.R0, 2),               brw_imm_ud(1<<20));      neg_rhw = brw_IF(p, BRW_EXECUTE_1);       {         brw_clip_test(c);      }      brw_ENDIF(p, neg_rhw);   }   /* Can't push into do_clip_tri because with polygon (or quad)    * flatshading, need to apply the flatshade here because we don't    * respect the PV when converting to trifan for emit:    */   if (c->key.do_flat_shading)       brw_clip_tri_flat_shade(c);          if (c->key.clip_mode == BRW_CLIPMODE_NORMAL)      do_clip_tri(c);   else       maybe_do_clip_tri(c);         brw_clip_tri_emit_polygon(c);   /* Send an empty message to kill the thread:    */   brw_clip_kill_thread(c);}

⌨️ 快捷键说明

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