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

📄 brw_wm_glsl.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
	    brw_MUL(p, dst, dst, w);	}    }}static void emit_xpd(struct brw_wm_compile *c,		struct prog_instruction *inst){    int i;    struct brw_compile *p = &c->func;    GLuint mask = inst->DstReg.WriteMask;    for (i = 0; i < 4; i++) {	GLuint i2 = (i+2)%3;	GLuint i1 = (i+1)%3;	if (mask & (1<<i)) {	    struct brw_reg src0, src1, dst;	    dst = get_dst_reg(c, inst, i, 1);	    src0 = negate(get_src_reg(c, &inst->SrcReg[0], i2, 1));	    src1 = get_src_reg(c, &inst->SrcReg[1], i1, 1);	    brw_MUL(p, brw_null_reg(), src0, src1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i1, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i2, 1);	    brw_set_saturate(p, inst->SaturateMode != SATURATE_OFF);	    brw_MAC(p, dst, src0, src1);	    brw_set_saturate(p, 0);	}    }    brw_set_saturate(p, 0);}static void emit_dp3(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_reg src0[3], src1[3], dst;    int i;    struct brw_compile *p = &c->func;    for (i = 0; i < 3; i++) {	src0[i] = get_src_reg(c, &inst->SrcReg[0], i, 1);	src1[i] = get_src_reg(c, &inst->SrcReg[1], i, 1);    }    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst), 1);    brw_MUL(p, brw_null_reg(), src0[0], src1[0]);    brw_MAC(p, brw_null_reg(), src0[1], src1[1]);    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);    brw_MAC(p, dst, src0[2], src1[2]);    brw_set_saturate(p, 0);}static void emit_dp4(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_reg src0[4], src1[4], dst;    int i;    struct brw_compile *p = &c->func;    for (i = 0; i < 4; i++) {	src0[i] = get_src_reg(c, &inst->SrcReg[0], i, 1);	src1[i] = get_src_reg(c, &inst->SrcReg[1], i, 1);    }    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst), 1);    brw_MUL(p, brw_null_reg(), src0[0], src1[0]);    brw_MAC(p, brw_null_reg(), src0[1], src1[1]);    brw_MAC(p, brw_null_reg(), src0[2], src1[2]);    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);    brw_MAC(p, dst, src0[3], src1[3]);    brw_set_saturate(p, 0);}static void emit_dph(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_reg src0[4], src1[4], dst;    int i;    struct brw_compile *p = &c->func;    for (i = 0; i < 4; i++) {	src0[i] = get_src_reg(c, &inst->SrcReg[0], i, 1);	src1[i] = get_src_reg(c, &inst->SrcReg[1], i, 1);    }    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst), 1);    brw_MUL(p, brw_null_reg(), src0[0], src1[0]);    brw_MAC(p, brw_null_reg(), src0[1], src1[1]);    brw_MAC(p, dst, src0[2], src1[2]);    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);    brw_ADD(p, dst, src0[3], src1[3]);    brw_set_saturate(p, 0);}static void emit_math1(struct brw_wm_compile *c,		struct prog_instruction *inst, GLuint func){    struct brw_compile *p = &c->func;    struct brw_reg src0, dst;    src0 = get_src_reg(c, &inst->SrcReg[0], 0, 1);    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst), 1);    brw_MOV(p, brw_message_reg(2), src0);    brw_math(p,	    dst,	    func,	    (inst->SaturateMode != SATURATE_OFF) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,	    2,	    brw_null_reg(),	    BRW_MATH_DATA_VECTOR,	    BRW_MATH_PRECISION_FULL);}static void emit_rcp(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_math1(c, inst, BRW_MATH_FUNCTION_INV);}static void emit_rsq(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_math1(c, inst, BRW_MATH_FUNCTION_RSQ);}static void emit_sin(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_math1(c, inst, BRW_MATH_FUNCTION_SIN);}static void emit_cos(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_math1(c, inst, BRW_MATH_FUNCTION_COS);}static void emit_ex2(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_math1(c, inst, BRW_MATH_FUNCTION_EXP);}static void emit_lg2(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_math1(c, inst, BRW_MATH_FUNCTION_LOG);}static void emit_add(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    struct brw_reg src0, src1, dst;    GLuint mask = inst->DstReg.WriteMask;    int i;    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);    for (i = 0 ; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);	    brw_ADD(p, dst, src0, src1);	}    }    brw_set_saturate(p, 0);}static void emit_sub(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    struct brw_reg src0, src1, dst;    GLuint mask = inst->DstReg.WriteMask;    int i;    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);    for (i = 0 ; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);	    brw_ADD(p, dst, src0, negate(src1));	}    }    brw_set_saturate(p, 0);}static void emit_mul(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    struct brw_reg src0, src1, dst;    GLuint mask = inst->DstReg.WriteMask;    int i;    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);    for (i = 0 ; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);	    brw_MUL(p, dst, src0, src1);	}    }    brw_set_saturate(p, 0);}static void emit_frc(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    struct brw_reg src0, dst;    GLuint mask = inst->DstReg.WriteMask;    int i;    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);    for (i = 0 ; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    brw_FRC(p, dst, src0);	}    }    if (inst->SaturateMode != SATURATE_OFF)	brw_set_saturate(p, 0);}static void emit_flr(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    struct brw_reg src0, dst;    GLuint mask = inst->DstReg.WriteMask;    int i;    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);    for (i = 0 ; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    brw_RNDD(p, dst, src0);	}    }    brw_set_saturate(p, 0);}static void emit_max(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    GLuint mask = inst->DstReg.WriteMask;    struct brw_reg src0, src1, dst;    int i;    brw_push_insn_state(p);    for (i = 0; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);	    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);	    brw_MOV(p, dst, src0);	    brw_set_saturate(p, 0);	    brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_L, src0, src1);	    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);	    brw_set_predicate_control(p, BRW_PREDICATE_NORMAL);	    brw_MOV(p, dst, src1);	    brw_set_saturate(p, 0);	    brw_set_predicate_control_flag_value(p, 0xff);	}    }    brw_pop_insn_state(p);}static void emit_min(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    GLuint mask = inst->DstReg.WriteMask;    struct brw_reg src0, src1, dst;    int i;    brw_push_insn_state(p);    for (i = 0; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);	    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);	    brw_MOV(p, dst, src0);	    brw_set_saturate(p, 0);	    brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_L, src1, src0);	    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);	    brw_set_predicate_control(p, BRW_PREDICATE_NORMAL);	    brw_MOV(p, dst, src1);	    brw_set_saturate(p, 0);	    brw_set_predicate_control_flag_value(p, 0xff);	}    }    brw_pop_insn_state(p);}static void emit_pow(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    struct brw_reg dst, src0, src1;    dst = get_dst_reg(c, inst, get_scalar_dst_index(inst), 1);    src0 = get_src_reg(c, &inst->SrcReg[0], 0, 1);    src1 = get_src_reg(c, &inst->SrcReg[1], 0, 1);    brw_MOV(p, brw_message_reg(2), src0);    brw_MOV(p, brw_message_reg(3), src1);    brw_math(p,	    dst,	    BRW_MATH_FUNCTION_POW,	    (inst->SaturateMode != SATURATE_OFF) ? BRW_MATH_SATURATE_SATURATE : BRW_MATH_SATURATE_NONE,	    2,	    brw_null_reg(),	    BRW_MATH_DATA_VECTOR,	    BRW_MATH_PRECISION_FULL);}static void emit_lrp(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    GLuint mask = inst->DstReg.WriteMask;    struct brw_reg dst, tmp1, tmp2, src0, src1, src2;    int i;    for (i = 0; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);	    if (src1.nr == dst.nr) {		tmp1 = alloc_tmp(c);		brw_MOV(p, tmp1, src1);	    } else		tmp1 = src1;	    src2 = get_src_reg(c, &inst->SrcReg[2], i, 1);	    if (src2.nr == dst.nr) {		tmp2 = alloc_tmp(c);		brw_MOV(p, tmp2, src2);	    } else		tmp2 = src2;	    brw_ADD(p, dst, negate(src0), brw_imm_f(1.0));	    brw_MUL(p, brw_null_reg(), dst, tmp2);	    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);	    brw_MAC(p, dst, src0, tmp1);	    brw_set_saturate(p, 0);	}	release_tmps(c);    }}static void emit_kil(struct brw_wm_compile *c){	struct brw_compile *p = &c->func;	struct brw_reg depth = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW);	brw_push_insn_state(p);	brw_set_mask_control(p, BRW_MASK_DISABLE);	brw_NOT(p, c->emit_mask_reg, brw_mask_reg(1)); //IMASK	brw_AND(p, depth, c->emit_mask_reg, depth);	brw_pop_insn_state(p);}static void emit_mad(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    GLuint mask = inst->DstReg.WriteMask;    struct brw_reg dst, src0, src1, src2;    int i;    for (i = 0; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);	    src2 = get_src_reg(c, &inst->SrcReg[2], i, 1);	    brw_MUL(p, dst, src0, src1);	    brw_set_saturate(p, (inst->SaturateMode != SATURATE_OFF) ? 1 : 0);	    brw_ADD(p, dst, dst, src2);	    brw_set_saturate(p, 0);	}    }}static void emit_sop(struct brw_wm_compile *c,		struct prog_instruction *inst, GLuint cond){    struct brw_compile *p = &c->func;    GLuint mask = inst->DstReg.WriteMask;    struct brw_reg dst, src0, src1;    int i;    for (i = 0; i < 4; i++) {	if (mask & (1<<i)) {	    dst = get_dst_reg(c, inst, i, 1);	    src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);	    src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);	    brw_push_insn_state(p);	    brw_CMP(p, brw_null_reg(), cond, src0, src1);	    brw_set_predicate_control(p, BRW_PREDICATE_NONE);	    brw_MOV(p, dst, brw_imm_f(0.0));	    brw_set_predicate_control(p, BRW_PREDICATE_NORMAL);	    brw_MOV(p, dst, brw_imm_f(1.0));	    brw_pop_insn_state(p);	}    }}static void emit_slt(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_sop(c, inst, BRW_CONDITIONAL_L);}static void emit_sle(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_sop(c, inst, BRW_CONDITIONAL_LE);}static void emit_sgt(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_sop(c, inst, BRW_CONDITIONAL_G);}static void emit_sge(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_sop(c, inst, BRW_CONDITIONAL_GE);}static void emit_seq(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_sop(c, inst, BRW_CONDITIONAL_EQ);}static void emit_sne(struct brw_wm_compile *c,		struct prog_instruction *inst){    emit_sop(c, inst, BRW_CONDITIONAL_NEQ);}static void emit_ddx(struct brw_wm_compile *c,                struct prog_instruction *inst){    struct brw_compile *p = &c->func;    GLuint mask = inst->DstReg.WriteMask;    struct brw_reg interp[4];    struct brw_reg dst;    struct brw_reg src0, w;    GLuint nr, i;    src0 = get_src_reg(c, &inst->SrcReg[0], 0, 1);    w = get_src_reg(c, &inst->SrcReg[1], 3, 1);    nr = src0.nr;    interp[0] = brw_vec1_grf(nr, 0);    interp[1] = brw_vec1_grf(nr, 4);

⌨️ 快捷键说明

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