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

📄 brw_wm_emit.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
	 brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_L, arg0[i], brw_imm_f(0));	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);	 brw_MOV(p, dst[i], arg1[i]);	 brw_set_saturate(p, 0);	 brw_set_predicate_control_flag_value(p, 0xff);      }   }}static void emit_max( struct brw_compile *p, 		      const struct brw_reg *dst,		      GLuint mask,		      const struct brw_reg *arg0,		      const struct brw_reg *arg1 ){   GLuint i;   for (i = 0; i < 4; i++) {      if (mask & (1<<i)) {		 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);	 brw_MOV(p, dst[i], arg0[i]);	 brw_set_saturate(p, 0);	 brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_L, arg0[i], arg1[i]);	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);	 brw_MOV(p, dst[i], arg1[i]);	 brw_set_saturate(p, 0);	 brw_set_predicate_control_flag_value(p, 0xff);      }   }}static void emit_min( struct brw_compile *p, 		      const struct brw_reg *dst,		      GLuint mask,		      const struct brw_reg *arg0,		      const struct brw_reg *arg1 ){   GLuint i;   for (i = 0; i < 4; i++) {      if (mask & (1<<i)) {		 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);	 brw_MOV(p, dst[i], arg1[i]);	 brw_set_saturate(p, 0);	 brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_L, arg0[i], arg1[i]);	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);	 brw_MOV(p, dst[i], arg0[i]);	 brw_set_saturate(p, 0);	 brw_set_predicate_control_flag_value(p, 0xff);      }   }}static void emit_dp3( struct brw_compile *p, 		      const struct brw_reg *dst,		      GLuint mask,		      const struct brw_reg *arg0,		      const struct brw_reg *arg1 ){   if (!(mask & WRITEMASK_XYZW))      return; /* Do not emit dead code*/   assert((mask & WRITEMASK_XYZW) == WRITEMASK_X);   brw_MUL(p, brw_null_reg(), arg0[0], arg1[0]);   brw_MAC(p, brw_null_reg(), arg0[1], arg1[1]);   brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);   brw_MAC(p, dst[0], arg0[2], arg1[2]);   brw_set_saturate(p, 0);}static void emit_dp4( struct brw_compile *p, 		      const struct brw_reg *dst,		      GLuint mask,		      const struct brw_reg *arg0,		      const struct brw_reg *arg1 ){   if (!(mask & WRITEMASK_XYZW))      return; /* Do not emit dead code*/   assert((mask & WRITEMASK_XYZW) == WRITEMASK_X);   brw_MUL(p, brw_null_reg(), arg0[0], arg1[0]);   brw_MAC(p, brw_null_reg(), arg0[1], arg1[1]);   brw_MAC(p, brw_null_reg(), arg0[2], arg1[2]);   brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);   brw_MAC(p, dst[0], arg0[3], arg1[3]);   brw_set_saturate(p, 0);}static void emit_dph( struct brw_compile *p, 		      const struct brw_reg *dst,		      GLuint mask,		      const struct brw_reg *arg0,		      const struct brw_reg *arg1 ){   if (!(mask & WRITEMASK_XYZW))      return; /* Do not emit dead code*/   assert((mask & WRITEMASK_XYZW) == WRITEMASK_X);   brw_MUL(p, brw_null_reg(), arg0[0], arg1[0]);   brw_MAC(p, brw_null_reg(), arg0[1], arg1[1]);   brw_MAC(p, dst[0], arg0[2], arg1[2]);   brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);   brw_ADD(p, dst[0], dst[0], arg1[3]);   brw_set_saturate(p, 0);}static void emit_xpd( struct brw_compile *p, 		      const struct brw_reg *dst,		      GLuint mask,		      const struct brw_reg *arg0,		      const struct brw_reg *arg1 ){   GLuint i;   assert(!(mask & WRITEMASK_W) == WRITEMASK_X);      for (i = 0 ; i < 3; i++) {      if (mask & (1<<i)) {	 GLuint i2 = (i+2)%3;	 GLuint i1 = (i+1)%3;	 brw_MUL(p, brw_null_reg(), negate(arg0[i2]), arg1[i1]);	 brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);	 brw_MAC(p, dst[i], arg0[i1], arg1[i2]);	 brw_set_saturate(p, 0);      }   }}static void emit_math1( struct brw_compile *p, 			GLuint function,			const struct brw_reg *dst,			GLuint mask,			const struct brw_reg *arg0 ){   if (!(mask & WRITEMASK_XYZW))      return; /* Do not emit dead code*/   //assert((mask & WRITEMASK_XYZW) == WRITEMASK_X ||   //	  function == BRW_MATH_FUNCTION_SINCOS);      brw_MOV(p, brw_message_reg(2), arg0[0]);   /* Send two messages to perform all 16 operations:    */   brw_math_16(p, 	       dst[0],	       function,	       (mask & SATURATE) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,	       2,	       brw_null_reg(),	       BRW_MATH_PRECISION_FULL);}static void emit_math2( struct brw_compile *p, 			GLuint function,			const struct brw_reg *dst,			GLuint mask,			const struct brw_reg *arg0,			const struct brw_reg *arg1){   if (!(mask & WRITEMASK_XYZW))      return; /* Do not emit dead code*/   assert((mask & WRITEMASK_XYZW) == WRITEMASK_X);   brw_push_insn_state(p);   brw_set_compression_control(p, BRW_COMPRESSION_NONE);   brw_MOV(p, brw_message_reg(2), arg0[0]);   brw_set_compression_control(p, BRW_COMPRESSION_2NDHALF);   brw_MOV(p, brw_message_reg(4), sechalf(arg0[0]));   brw_set_compression_control(p, BRW_COMPRESSION_NONE);   brw_MOV(p, brw_message_reg(3), arg1[0]);   brw_set_compression_control(p, BRW_COMPRESSION_2NDHALF);   brw_MOV(p, brw_message_reg(5), sechalf(arg1[0]));      /* Send two messages to perform all 16 operations:    */   brw_set_compression_control(p, BRW_COMPRESSION_NONE);   brw_math(p, 	    dst[0],	    function,	    (mask & SATURATE) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,	    2,	    brw_null_reg(),	    BRW_MATH_DATA_VECTOR,	    BRW_MATH_PRECISION_FULL);   brw_set_compression_control(p, BRW_COMPRESSION_2NDHALF);   brw_math(p, 	    offset(dst[0],1),	    function,	    (mask & SATURATE) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,	    4,	    brw_null_reg(),	    BRW_MATH_DATA_VECTOR,	    BRW_MATH_PRECISION_FULL);      brw_pop_insn_state(p);}		     static void emit_tex( struct brw_wm_compile *c,		      const struct brw_wm_instruction *inst,		      struct brw_reg *dst,		      GLuint dst_flags,		      struct brw_reg *arg ){   struct brw_compile *p = &c->func;   GLuint msgLength, responseLength;   GLboolean shadow = (c->key.shadowtex_mask & (1<<inst->tex_unit)) ? 1 : 0;   GLuint i, nr;   GLuint emit;   /* How many input regs are there?    */   switch (inst->tex_idx) {   case TEXTURE_1D_INDEX:      emit = WRITEMASK_X;      nr = 1;      break;   case TEXTURE_2D_INDEX:   case TEXTURE_RECT_INDEX:      emit = WRITEMASK_XY;      nr = 2;      break;   default:      emit = WRITEMASK_XYZ;      nr = 3;      break;   }   if (shadow) {      nr = 4;      emit |= WRITEMASK_W;   }   msgLength = 1;   for (i = 0; i < nr; i++) {      static const GLuint swz[4] = {0,1,2,2};      if (emit & (1<<i)) 	 brw_MOV(p, brw_message_reg(msgLength+1), arg[swz[i]]);      else	 brw_MOV(p, brw_message_reg(msgLength+1), brw_imm_f(0));      msgLength += 2;   }   responseLength = 8;		/* always */   brw_SAMPLE(p, 	      retype(vec16(dst[0]), BRW_REGISTER_TYPE_UW),	      1,	      retype(c->payload.depth[0].hw_reg, BRW_REGISTER_TYPE_UW),	      inst->tex_unit + MAX_DRAW_BUFFERS, /* surface */	      inst->tex_unit,	  /* sampler */	      inst->writemask,	      (shadow ? 	       BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_COMPARE : 	       BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE),	      responseLength,	      msgLength,	      0);	}static void emit_txb( struct brw_wm_compile *c,		      const struct brw_wm_instruction *inst,		      struct brw_reg *dst,		      GLuint dst_flags,		      struct brw_reg *arg ){   struct brw_compile *p = &c->func;   GLuint msgLength;   /* Shadow ignored for txb.    */   switch (inst->tex_idx) {   case TEXTURE_1D_INDEX:      brw_MOV(p, brw_message_reg(2), arg[0]);      brw_MOV(p, brw_message_reg(4), brw_imm_f(0));      brw_MOV(p, brw_message_reg(6), brw_imm_f(0));      break;   case TEXTURE_2D_INDEX:   case TEXTURE_RECT_INDEX:      brw_MOV(p, brw_message_reg(2), arg[0]);      brw_MOV(p, brw_message_reg(4), arg[1]);      brw_MOV(p, brw_message_reg(6), brw_imm_f(0));      break;   default:      brw_MOV(p, brw_message_reg(2), arg[0]);      brw_MOV(p, brw_message_reg(4), arg[1]);      brw_MOV(p, brw_message_reg(6), arg[2]);      break;   }   brw_MOV(p, brw_message_reg(8), arg[3]);   msgLength = 9;   brw_SAMPLE(p, 	      retype(vec16(dst[0]), BRW_REGISTER_TYPE_UW),	      1,	      retype(c->payload.depth[0].hw_reg, BRW_REGISTER_TYPE_UW),	      inst->tex_unit + MAX_DRAW_BUFFERS, /* surface */	      inst->tex_unit,	  /* sampler */	      inst->writemask,	      BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS,	      8,		/* responseLength */	      msgLength,	      0);	}static void emit_lit( struct brw_compile *p, 		      const struct brw_reg *dst,		      GLuint mask,		      const struct brw_reg *arg0 ){   assert((mask & WRITEMASK_XW) == 0);   if (mask & WRITEMASK_Y) {      brw_set_saturate(p, (mask & SATURATE) ? 1 : 0);      brw_MOV(p, dst[1], arg0[0]);      brw_set_saturate(p, 0);   }   if (mask & WRITEMASK_Z) {      emit_math2(p, BRW_MATH_FUNCTION_POW,		 &dst[2],		 WRITEMASK_X | (mask & SATURATE),		 &arg0[1],		 &arg0[3]);   }   /* Ordinarily you'd use an iff statement to skip or shortcircuit    * some of the POW calculations above, but 16-wide iff statements    * seem to lock c1 hardware, so this is a nasty workaround:    */   brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_LE, arg0[0], brw_imm_f(0));   {      if (mask & WRITEMASK_Y) 	 brw_MOV(p, dst[1], brw_imm_f(0));      if (mask & WRITEMASK_Z) 	 brw_MOV(p, dst[2], brw_imm_f(0));    }   brw_set_predicate_control(p, BRW_PREDICATE_NONE);}/* Kill pixel - set execution mask to zero for those pixels which * fail. */static void emit_kil( struct brw_wm_compile *c,		      struct brw_reg *arg0){   struct brw_compile *p = &c->func;   struct brw_reg r0uw = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW);   GLuint i;      /* XXX - usually won't need 4 compares!    */   for (i = 0; i < 4; i++) {      brw_push_insn_state(p);      brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_GE, arg0[i], brw_imm_f(0));         brw_set_predicate_control_flag_value(p, 0xff);      brw_set_compression_control(p, BRW_COMPRESSION_NONE);      brw_AND(p, r0uw, brw_flag_reg(), r0uw);      brw_pop_insn_state(p);   }}static void fire_fb_write( struct brw_wm_compile *c,			   GLuint base_reg,			   GLuint nr,			   GLuint target,			   GLuint eot ){   struct brw_compile *p = &c->func;      /* Pass through control information:    *//*  mov (8) m1.0<1>:ud   r1.0<8;8,1>:ud   { Align1 NoMask } */   {      brw_push_insn_state(p);      brw_set_mask_control(p, BRW_MASK_DISABLE); /* ? */      brw_set_compression_control(p, BRW_COMPRESSION_NONE);      brw_MOV(p, 	       brw_message_reg(base_reg + 1),	       brw_vec8_grf(1, 0));      brw_pop_insn_state(p);   }   /* Send framebuffer write message: *//*  send (16) null.0<1>:uw m0               r0.0<8;8,1>:uw   0x85a04000:ud    { Align1 EOT } */   brw_fb_WRITE(p,		retype(vec16(brw_null_reg()), BRW_REGISTER_TYPE_UW),		base_reg,		retype(brw_vec8_grf(0, 0), BRW_REGISTER_TYPE_UW),		target,				nr,		0, 		eot);}static void emit_aa( struct brw_wm_compile *c,		     struct brw_reg *arg1,		     GLuint reg ){   struct brw_compile *p = &c->func;   GLuint comp = c->key.aa_dest_stencil_reg / 2;   GLuint off = c->key.aa_dest_stencil_reg % 2;   struct brw_reg aa = offset(arg1[comp], off);   brw_push_insn_state(p);   brw_set_compression_control(p, BRW_COMPRESSION_NONE); /* ?? */

⌨️ 快捷键说明

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