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

📄 brw_sf_emit.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
   if (allocate)      alloc_regs(c);   invert_det(c);   copy_z_inv_w(c);   do_front_facing(c);   if (c->key.do_twoside_color)       do_twoside_color(c);   if (c->key.do_flat_shading)      do_flatshade_triangle(c);            for (i = 0; i < c->nr_setup_regs; i++)   {      /* Pair of incoming attributes:       */      struct brw_reg a0 = offset(c->vert[0], i);      struct brw_reg a1 = offset(c->vert[1], i);      struct brw_reg a2 = offset(c->vert[2], i);      GLushort pc, pc_persp, pc_linear;      GLboolean last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);      if (pc_persp)      {	 brw_set_predicate_control_flag_value(p, pc_persp);	 brw_MUL(p, a0, a0, c->inv_w[0]);	 brw_MUL(p, a1, a1, c->inv_w[1]);	 brw_MUL(p, a2, a2, c->inv_w[2]);      }                  /* Calculate coefficients for interpolated values:       */            if (pc_linear)      {	 brw_set_predicate_control_flag_value(p, pc_linear);	 brw_ADD(p, c->a1_sub_a0, a1, negate(a0));	 brw_ADD(p, c->a2_sub_a0, a2, negate(a0));	 /* calculate dA/dx	  */	 brw_MUL(p, brw_null_reg(), c->a1_sub_a0, c->dy2);	 brw_MAC(p, c->tmp, c->a2_sub_a0, negate(c->dy0));	 brw_MUL(p, c->m1Cx, c->tmp, c->inv_det);			 /* calculate dA/dy	  */	 brw_MUL(p, brw_null_reg(), c->a2_sub_a0, c->dx0);	 brw_MAC(p, c->tmp, c->a1_sub_a0, negate(c->dx2));	 brw_MUL(p, c->m2Cy, c->tmp, c->inv_det);      }      {	 brw_set_predicate_control_flag_value(p, pc); 	 /* start point for interpolation	  */	 brw_MOV(p, c->m3C0, a0);      	 /* Copy m0..m3 to URB.  m0 is implicitly copied from r0 in	  * the send instruction:	  */	 	 brw_urb_WRITE(p, 		       brw_null_reg(),		       0,		       brw_vec8_grf(0, 0), /* r0, will be copied to m0 */		       0, 	/* allocate */		       1,	/* used */		       4, 	/* msg len */		       0,	/* response len */		       last,	/* eot */		       last, 	/* writes complete */		       i*4,	/* offset */		       BRW_URB_SWIZZLE_TRANSPOSE); /* XXX: Swizzle control "SF to windower" */      }   }}void brw_emit_line_setup( struct brw_sf_compile *c, GLboolean allocate){   struct brw_compile *p = &c->func;   GLuint i;   c->nr_verts = 2;   if (allocate)      alloc_regs(c);   invert_det(c);   copy_z_inv_w(c);   if (c->key.do_flat_shading)      do_flatshade_line(c);   for (i = 0; i < c->nr_setup_regs; i++)   {      /* Pair of incoming attributes:       */      struct brw_reg a0 = offset(c->vert[0], i);      struct brw_reg a1 = offset(c->vert[1], i);      GLushort pc, pc_persp, pc_linear;      GLboolean last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);      if (pc_persp)      {	 brw_set_predicate_control_flag_value(p, pc_persp);	 brw_MUL(p, a0, a0, c->inv_w[0]);	 brw_MUL(p, a1, a1, c->inv_w[1]);      }      /* Calculate coefficients for position, color:       */      if (pc_linear) {	 brw_set_predicate_control_flag_value(p, pc_linear); 	 brw_ADD(p, c->a1_sub_a0, a1, negate(a0)); 	 brw_MUL(p, c->tmp, c->a1_sub_a0, c->dx0); 	 brw_MUL(p, c->m1Cx, c->tmp, c->inv_det);			 brw_MUL(p, c->tmp, c->a1_sub_a0, c->dy0);	 brw_MUL(p, c->m2Cy, c->tmp, c->inv_det);      }      {	 brw_set_predicate_control_flag_value(p, pc); 	 /* start point for interpolation	  */	 brw_MOV(p, c->m3C0, a0);	 /* Copy m0..m3 to URB. 	  */	 brw_urb_WRITE(p, 		       brw_null_reg(),		       0,		       brw_vec8_grf(0, 0),		       0, 	/* allocate */		       1, 	/* used */		       4, 	/* msg len */		       0,	/* response len */		       last, 	/* eot */		       last, 	/* writes complete */		       i*4,	/* urb destination offset */		       BRW_URB_SWIZZLE_TRANSPOSE);       }   } }void brw_emit_point_sprite_setup( struct brw_sf_compile *c, GLboolean allocate){   struct brw_compile *p = &c->func;   GLuint i;   c->nr_verts = 1;   if (allocate)      alloc_regs(c);   copy_z_inv_w(c);   for (i = 0; i < c->nr_setup_regs; i++)   {      struct brw_sf_point_tex *tex = &c->point_attrs[c->idx_to_attr[2*i]];      struct brw_reg a0 = offset(c->vert[0], i);      GLushort pc, pc_persp, pc_linear;      GLboolean last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);                  if (pc_persp)      {					  if (!tex->CoordReplace) {	      brw_set_predicate_control_flag_value(p, pc_persp);	      brw_MUL(p, a0, a0, c->inv_w[0]);	  }      }      if (tex->CoordReplace) {	  /* Caculate 1.0/PointWidth */	  brw_math(&c->func,		  c->tmp,		  BRW_MATH_FUNCTION_INV,		  BRW_MATH_SATURATE_NONE,		  0,		  c->dx0,		  BRW_MATH_DATA_SCALAR,		  BRW_MATH_PRECISION_FULL);	  if (c->key.SpriteOrigin == GL_LOWER_LEFT) {	   	brw_MUL(p, c->m1Cx, c->tmp, c->inv_w[0]);		brw_MOV(p, vec1(suboffset(c->m1Cx, 1)), brw_imm_f(0.0));	  	brw_MUL(p, c->m2Cy, c->tmp, negate(c->inv_w[0]));		brw_MOV(p, vec1(suboffset(c->m2Cy, 0)), brw_imm_f(0.0));	  } else {	   	brw_MUL(p, c->m1Cx, c->tmp, c->inv_w[0]);		brw_MOV(p, vec1(suboffset(c->m1Cx, 1)), brw_imm_f(0.0));	  	brw_MUL(p, c->m2Cy, c->tmp, c->inv_w[0]);		brw_MOV(p, vec1(suboffset(c->m2Cy, 0)), brw_imm_f(0.0));	  }      } else {	  brw_MOV(p, c->m1Cx, brw_imm_ud(0));	  brw_MOV(p, c->m2Cy, brw_imm_ud(0));      }      {	 brw_set_predicate_control_flag_value(p, pc); 	 if (tex->CoordReplace) {	     if (c->key.SpriteOrigin == GL_LOWER_LEFT) {		 brw_MUL(p, c->m3C0, c->inv_w[0], brw_imm_f(1.0));		 brw_MOV(p, vec1(suboffset(c->m3C0, 0)), brw_imm_f(0.0));	     }	     else		 brw_MOV(p, c->m3C0, brw_imm_f(0.0));	 } else {	 	brw_MOV(p, c->m3C0, a0); /* constant value */	 }	 /* Copy m0..m3 to URB. 	  */	 brw_urb_WRITE(p, 		       brw_null_reg(),		       0,		       brw_vec8_grf(0, 0),		       0, 	/* allocate */		       1,	/* used */		       4, 	/* msg len */		       0,	/* response len */		       last, 	/* eot */		       last, 	/* writes complete */		       i*4,	/* urb destination offset */		       BRW_URB_SWIZZLE_TRANSPOSE);      }   }}/* Points setup - several simplifications as all attributes are * constant across the face of the point (point sprites excluded!) */void brw_emit_point_setup( struct brw_sf_compile *c, GLboolean allocate){   struct brw_compile *p = &c->func;   GLuint i;   c->nr_verts = 1;      if (allocate)      alloc_regs(c);   copy_z_inv_w(c);   brw_MOV(p, c->m1Cx, brw_imm_ud(0)); /* zero - move out of loop */   brw_MOV(p, c->m2Cy, brw_imm_ud(0)); /* zero - move out of loop */   for (i = 0; i < c->nr_setup_regs; i++)   {      struct brw_reg a0 = offset(c->vert[0], i);      GLushort pc, pc_persp, pc_linear;      GLboolean last = calculate_masks(c, i, &pc, &pc_persp, &pc_linear);                  if (pc_persp)      {					 /* This seems odd as the values are all constant, but the	  * fragment shader will be expecting it:	  */	 brw_set_predicate_control_flag_value(p, pc_persp);	 brw_MUL(p, a0, a0, c->inv_w[0]);      }      /* The delta values are always zero, just send the starting       * coordinate.  Again, this is to fit in with the interpolation       * code in the fragment shader.       */      {	 brw_set_predicate_control_flag_value(p, pc); 	 brw_MOV(p, c->m3C0, a0); /* constant value */	 /* Copy m0..m3 to URB. 	  */	 brw_urb_WRITE(p, 		       brw_null_reg(),		       0,		       brw_vec8_grf(0, 0),		       0, 	/* allocate */		       1,	/* used */		       4, 	/* msg len */		       0,	/* response len */		       last, 	/* eot */		       last, 	/* writes complete */		       i*4,	/* urb destination offset */		       BRW_URB_SWIZZLE_TRANSPOSE);      }   }}void brw_emit_anyprim_setup( struct brw_sf_compile *c ){   struct brw_compile *p = &c->func;   struct brw_reg ip = brw_ip_reg();   struct brw_reg payload_prim = brw_uw1_reg(BRW_GENERAL_REGISTER_FILE, 1, 0);   struct brw_reg payload_attr = get_element_ud(brw_vec1_reg(BRW_GENERAL_REGISTER_FILE, 1, 0), 0);    struct brw_reg primmask;   struct brw_instruction *jmp;   struct brw_reg v1_null_ud = vec1(retype(brw_null_reg(), BRW_REGISTER_TYPE_UD));      GLuint saveflag;   c->nr_verts = 3;   alloc_regs(c);   primmask = retype(get_element(c->tmp, 0), BRW_REGISTER_TYPE_UD);   brw_MOV(p, primmask, brw_imm_ud(1));   brw_SHL(p, primmask, primmask, payload_prim);   brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);   brw_AND(p, v1_null_ud, primmask, brw_imm_ud((1<<_3DPRIM_TRILIST) |					       (1<<_3DPRIM_TRISTRIP) |					       (1<<_3DPRIM_TRIFAN) |					       (1<<_3DPRIM_TRISTRIP_REVERSE) |					       (1<<_3DPRIM_POLYGON) |					       (1<<_3DPRIM_RECTLIST) |					       (1<<_3DPRIM_TRIFAN_NOSTIPPLE)));   jmp = brw_JMPI(p, ip, ip, brw_imm_w(0));   {      saveflag = p->flag_value;      brw_push_insn_state(p);       brw_emit_tri_setup( c, GL_FALSE );      brw_pop_insn_state(p);      p->flag_value = saveflag;      /* note - thread killed in subroutine, so must       * restore the flag which is changed when building       * the subroutine. fix #13240       */   }   brw_land_fwd_jump(p, jmp);   brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);   brw_AND(p, v1_null_ud, primmask, brw_imm_ud((1<<_3DPRIM_LINELIST) |					       (1<<_3DPRIM_LINESTRIP) |					       (1<<_3DPRIM_LINELOOP) |					       (1<<_3DPRIM_LINESTRIP_CONT) |					       (1<<_3DPRIM_LINESTRIP_BF) |					       (1<<_3DPRIM_LINESTRIP_CONT_BF)));   jmp = brw_JMPI(p, ip, ip, brw_imm_w(0));   {      saveflag = p->flag_value;      brw_push_insn_state(p);       brw_emit_line_setup( c, GL_FALSE );      brw_pop_insn_state(p);      p->flag_value = saveflag;      /* note - thread killed in subroutine */   }   brw_land_fwd_jump(p, jmp);    brw_set_conditionalmod(p, BRW_CONDITIONAL_Z);   brw_AND(p, v1_null_ud, payload_attr, brw_imm_ud(1<<BRW_SPRITE_POINT_ENABLE));   jmp = brw_JMPI(p, ip, ip, brw_imm_w(0));   {      saveflag = p->flag_value;      brw_push_insn_state(p);       brw_emit_point_sprite_setup( c, GL_FALSE );      brw_pop_insn_state(p);      p->flag_value = saveflag;   }   brw_land_fwd_jump(p, jmp);    brw_emit_point_setup( c, GL_FALSE );}

⌨️ 快捷键说明

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