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

📄 r300_vertprog.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
	   ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} TMP 0{X Y Z W } {X Y Z W} neg Xneg Yneg Zneg W */	inst[0] = PVS_OP_DST_OPERAND(VE_FRACTION,				     GL_FALSE,				     GL_FALSE,				     *u_temp_i,				     t_dst_mask(vpi->DstReg.WriteMask),				     PVS_DST_REG_TEMPORARY);	inst[1] = t_src(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = __CONST(0, SWIZZLE_ZERO);	inst += 4;	inst[0] = PVS_OP_DST_OPERAND(VE_ADD,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = PVS_SRC_OPERAND(*u_temp_i,				  PVS_SRC_SELECT_X,				  PVS_SRC_SELECT_Y,				  PVS_SRC_SELECT_Z,				  PVS_SRC_SELECT_W, PVS_SRC_REG_TEMPORARY,				  /* Not 100% sure about this */				  (!src[0].				   NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE				  /*VSF_FLAG_ALL */ );	inst[3] = __CONST(0, SWIZZLE_ZERO);	(*u_temp_i)--;	return inst;}static GLuint *r300TranslateOpcodeFRC(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(VE_FRACTION,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = __CONST(0, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeLG2(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	// LG2 RESULT 1.X Y Z W PARAM 0{} {X X X X}	inst[0] = PVS_OP_DST_OPERAND(ME_LOG_BASE2_FULL_DX,				     GL_TRUE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),				  t_swizzle(GET_SWZ(src[0].Swizzle, 0)),				  t_swizzle(GET_SWZ(src[0].Swizzle, 0)),				  t_swizzle(GET_SWZ(src[0].Swizzle, 0)),				  t_swizzle(GET_SWZ(src[0].Swizzle, 0)),				  t_src_class(src[0].File),				  src[0].				  NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[0].RelAddr << 4);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = __CONST(0, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeLIT(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	//LIT TMP 1.Y Z TMP 1{} {X W Z Y} TMP 1{} {Y W Z X} TMP 1{} {Y X Z W}	inst[0] = PVS_OP_DST_OPERAND(ME_LIGHT_COEFF_DX,				     GL_TRUE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	/* NOTE: Users swizzling might not work. */	inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 0)),	// X				  t_swizzle(GET_SWZ(src[0].Swizzle, 3)),	// W				  PVS_SRC_SELECT_FORCE_0,	// Z				  t_swizzle(GET_SWZ(src[0].Swizzle, 1)),	// Y				  t_src_class(src[0].File),				  src[0].				  NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[0].RelAddr << 4);	inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),	// Y				  t_swizzle(GET_SWZ(src[0].Swizzle, 3)),	// W				  PVS_SRC_SELECT_FORCE_0,	// Z				  t_swizzle(GET_SWZ(src[0].Swizzle, 0)),	// X				  t_src_class(src[0].File),				  src[0].				  NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[0].RelAddr << 4);	inst[3] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),	// Y				  t_swizzle(GET_SWZ(src[0].Swizzle, 0)),	// X				  PVS_SRC_SELECT_FORCE_0,	// Z				  t_swizzle(GET_SWZ(src[0].Swizzle, 3)),	// W				  t_src_class(src[0].File),				  src[0].				  NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[0].RelAddr << 4);	return inst;}static GLuint *r300TranslateOpcodeLOG(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(ME_LOG_BASE2_DX,				     GL_TRUE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src_scalar(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = __CONST(0, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeMAD(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(PVS_MACRO_OP_2CLK_MADD,				     GL_FALSE,				     GL_TRUE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = t_src(vp, &src[1]);	inst[3] = t_src(vp, &src[2]);	return inst;}static GLuint *r300TranslateOpcodeMAX(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(VE_MAXIMUM,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = t_src(vp, &src[1]);	inst[3] = __CONST(1, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeMIN(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(VE_MINIMUM,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = t_src(vp, &src[1]);	inst[3] = __CONST(1, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeMOV(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	//ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{} {ZERO ZERO ZERO ZERO}	inst[0] = PVS_OP_DST_OPERAND(VE_ADD,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = __CONST(0, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeMUL(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = t_src(vp, &src[1]);	inst[3] = __CONST(1, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodePOW(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(ME_POWER_FUNC_FF,				     GL_TRUE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src_scalar(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = t_src_scalar(vp, &src[1]);	return inst;}static GLuint *r300TranslateOpcodeRCP(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(ME_RECIP_DX,				     GL_TRUE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src_scalar(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = __CONST(0, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeRSQ(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(ME_RECIP_SQRT_DX,				     GL_TRUE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src_scalar(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = __CONST(0, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeSGE(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(VE_SET_GREATER_THAN_EQUAL,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = t_src(vp, &src[1]);	inst[3] = __CONST(1, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeSLT(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	inst[0] = PVS_OP_DST_OPERAND(VE_SET_LESS_THAN,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = t_src(vp, &src[1]);	inst[3] = __CONST(1, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeSUB(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	//ADD RESULT 1.X Y Z W TMP 0{} {X Y Z W} PARAM 1{X Y Z W } {X Y Z W} neg Xneg Yneg Zneg W#if 0	inst[0] = PVS_OP_DST_OPERAND(VE_ADD,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]),				  t_swizzle(GET_SWZ(src[1].Swizzle, 0)),				  t_swizzle(GET_SWZ(src[1].Swizzle, 1)),				  t_swizzle(GET_SWZ(src[1].Swizzle, 2)),				  t_swizzle(GET_SWZ(src[1].Swizzle, 3)),				  t_src_class(src[1].File),				  (!src[1].				   NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[1].RelAddr << 4);	inst[3] = 0;#else	inst[0] =	    PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,			       GL_FALSE,			       GL_FALSE,			       t_dst_index(vp, &vpi->DstReg),			       t_dst_mask(vpi->DstReg.WriteMask),			       t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ONE);	inst[3] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]),				  t_swizzle(GET_SWZ(src[1].Swizzle, 0)),				  t_swizzle(GET_SWZ(src[1].Swizzle, 1)),				  t_swizzle(GET_SWZ(src[1].Swizzle, 2)),				  t_swizzle(GET_SWZ(src[1].Swizzle, 3)),				  t_src_class(src[1].File),				  (!src[1].				   NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[1].RelAddr << 4);#endif	return inst;}static GLuint *r300TranslateOpcodeSWZ(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3]){	//ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{} {ZERO ZERO ZERO ZERO}	inst[0] = PVS_OP_DST_OPERAND(VE_ADD,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = t_src(vp, &src[0]);	inst[2] = __CONST(0, SWIZZLE_ZERO);	inst[3] = __CONST(0, SWIZZLE_ZERO);	return inst;}static GLuint *r300TranslateOpcodeXPD(struct r300_vertex_program *vp,				      struct prog_instruction *vpi,				      GLuint * inst,				      struct prog_src_register src[3],				      int *u_temp_i){	/* mul r0, r1.yzxw, r2.zxyw	   mad r0, -r2.yzxw, r1.zxyw, r0	 */	inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,				     GL_FALSE,				     GL_FALSE,				     *u_temp_i,				     t_dst_mask(vpi->DstReg.WriteMask),				     PVS_DST_REG_TEMPORARY);	inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),	// Y				  t_swizzle(GET_SWZ(src[0].Swizzle, 2)),	// Z				  t_swizzle(GET_SWZ(src[0].Swizzle, 0)),	// X				  t_swizzle(GET_SWZ(src[0].Swizzle, 3)),	// W				  t_src_class(src[0].File),				  src[0].				  NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[0].RelAddr << 4);	inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]), t_swizzle(GET_SWZ(src[1].Swizzle, 2)),	// Z				  t_swizzle(GET_SWZ(src[1].Swizzle, 0)),	// X				  t_swizzle(GET_SWZ(src[1].Swizzle, 1)),	// Y				  t_swizzle(GET_SWZ(src[1].Swizzle, 3)),	// W				  t_src_class(src[1].File),				  src[1].				  NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[1].RelAddr << 4);	inst[3] = __CONST(1, SWIZZLE_ZERO);	inst += 4;	inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,				     GL_FALSE,				     GL_FALSE,				     t_dst_index(vp, &vpi->DstReg),				     t_dst_mask(vpi->DstReg.WriteMask),				     t_dst_class(vpi->DstReg.File));	inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]), t_swizzle(GET_SWZ(src[1].Swizzle, 1)),	// Y				  t_swizzle(GET_SWZ(src[1].Swizzle, 2)),	// Z				  t_swizzle(GET_SWZ(src[1].Swizzle, 0)),	// X				  t_swizzle(GET_SWZ(src[1].Swizzle, 3)),	// W				  t_src_class(src[1].File),				  (!src[1].				   NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[1].RelAddr << 4);	inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 2)),	// Z				  t_swizzle(GET_SWZ(src[0].Swizzle, 0)),	// X				  t_swizzle(GET_SWZ(src[0].Swizzle, 1)),	// Y				  t_swizzle(GET_SWZ(src[0].Swizzle, 3)),	// W				  t_src_class(src[0].File),				  src[0].				  NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |	    (src[0].RelAddr << 4);	inst[3] =	    PVS_SRC_OPERAND(*u_temp_i, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y,			    PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W,			    PVS_SRC_REG_TEMPORARY, VSF_FLAG_NONE);	(*u_temp_i)--;	return inst;}static void t_inputs_outputs(struct r300_vertex_program *vp){	int i;	int cur_reg = 0;	for (i = 0; i < VERT_ATTRIB_MAX; i++)		vp->inputs[i] = -1;	for (i = 0; i < VERT_RESULT_MAX; i++)		vp->outputs[i] = -1;	assert(vp->key.OutputsWritten & (1 << VERT_RESULT_HPOS));	if (vp->key.OutputsWritten & (1 << VERT_RESULT_HPOS)) {		vp->outputs[VERT_RESULT_HPOS] = cur_reg++;	}	if (vp->key.OutputsWritten & (1 << VERT_RESULT_PSIZ)) {		vp->outputs[VERT_RESULT_PSIZ] = cur_reg++;	}	if (vp->key.OutputsWritten & (1 << VERT_RESULT_COL0)) {		vp->outputs[VERT_RESULT_COL0] = cur_reg++;	}	if (vp->key.OutputsWritten & (1 << VERT_RESULT_COL1)) {		vp->outputs[VERT_RESULT_COL1] =		    vp->outputs[VERT_RESULT_COL0] + 1;		cur_reg = vp->outputs[VERT_RESULT_COL1] + 1;	}	if (vp->key.OutputsWritten & (1 << VERT_RESULT_BFC0)) {		vp->outputs[VERT_RESULT_BFC0] =		    vp->outputs[VERT_RESULT_COL0] + 2;		cur_reg = vp->outputs[VERT_RESULT_BFC0] + 2;

⌨️ 快捷键说明

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