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

📄 brw_wm_glsl.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
    interp[2] = brw_vec1_grf(nr+1, 0);    interp[3] = brw_vec1_grf(nr+1, 4);    brw_set_saturate(p, inst->SaturateMode != SATURATE_OFF);    for(i = 0; i < 4; i++ ) {        if (mask & (1<<i)) {            dst = get_dst_reg(c, inst, i, 1);            brw_MOV(p, dst, interp[i]);            brw_MUL(p, dst, dst, w);        }    }    brw_set_saturate(p, 0);}static void emit_ddy(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);    nr = src0.nr;    w = get_src_reg(c, &inst->SrcReg[1], 3, 1);    interp[0] = brw_vec1_grf(nr, 0);    interp[1] = brw_vec1_grf(nr, 4);    interp[2] = brw_vec1_grf(nr+1, 0);    interp[3] = brw_vec1_grf(nr+1, 4);    brw_set_saturate(p, inst->SaturateMode != SATURATE_OFF);    for(i = 0; i < 4; i++ ) {        if (mask & (1<<i)) {            dst = get_dst_reg(c, inst, i, 1);            brw_MOV(p, dst, suboffset(interp[i], 1));            brw_MUL(p, dst, dst, w);        }    }    brw_set_saturate(p, 0);}static void emit_wpos_xy(struct brw_wm_compile *c,                struct prog_instruction *inst){    struct brw_compile *p = &c->func;    GLuint mask = inst->DstReg.WriteMask;    struct brw_reg src0[2], dst[2];    dst[0] = get_dst_reg(c, inst, 0, 1);    dst[1] = get_dst_reg(c, inst, 1, 1);    src0[0] = get_src_reg(c, &inst->SrcReg[0], 0, 1);    src0[1] = get_src_reg(c, &inst->SrcReg[0], 1, 1);    /* Calculate the pixel offset from window bottom left into destination     * X and Y channels.     */    if (mask & WRITEMASK_X) {	/* X' = X - origin_x */	brw_ADD(p,		dst[0],		retype(src0[0], BRW_REGISTER_TYPE_W),		brw_imm_d(0 - c->key.origin_x));    }    if (mask & WRITEMASK_Y) {	/* Y' = height - (Y - origin_y) = height + origin_y - Y */	brw_ADD(p,		dst[1],		negate(retype(src0[1], BRW_REGISTER_TYPE_W)),		brw_imm_d(c->key.origin_y + c->key.drawable_height - 1));    }}/* TODO   BIAS on SIMD8 not workind yet... */	static void emit_txb(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    struct brw_reg dst[4], src[4], payload_reg;    GLuint unit = c->fp->program.Base.SamplerUnits[inst->TexSrcUnit];    GLuint i;    payload_reg = get_reg(c, PROGRAM_PAYLOAD, PAYLOAD_DEPTH, 0, 1, 0, 0);    for (i = 0; i < 4; i++) 	dst[i] = get_dst_reg(c, inst, i, 1);    for (i = 0; i < 4; i++)	src[i] = get_src_reg(c, &inst->SrcReg[0], i, 1);    switch (inst->TexSrcTarget) {	case TEXTURE_1D_INDEX:	    brw_MOV(p, brw_message_reg(2), src[0]);	    brw_MOV(p, brw_message_reg(3), brw_imm_f(0));	    brw_MOV(p, brw_message_reg(4), brw_imm_f(0));	    break;	case TEXTURE_2D_INDEX:	case TEXTURE_RECT_INDEX:	    brw_MOV(p, brw_message_reg(2), src[0]);	    brw_MOV(p, brw_message_reg(3), src[1]);	    brw_MOV(p, brw_message_reg(4), brw_imm_f(0));	    break;	default:	    brw_MOV(p, brw_message_reg(2), src[0]);	    brw_MOV(p, brw_message_reg(3), src[1]);	    brw_MOV(p, brw_message_reg(4), src[2]);	    break;    }    brw_MOV(p, brw_message_reg(5), src[3]);    brw_MOV(p, brw_message_reg(6), brw_imm_f(0));    brw_SAMPLE(p,	    retype(vec8(dst[0]), BRW_REGISTER_TYPE_UW),	    1,	    retype(payload_reg, BRW_REGISTER_TYPE_UW),	    unit + MAX_DRAW_BUFFERS, /* surface */	    unit,     /* sampler */	    inst->DstReg.WriteMask,	    BRW_SAMPLER_MESSAGE_SIMD16_SAMPLE_BIAS,	    4,	    4,	    0);}static void emit_tex(struct brw_wm_compile *c,		struct prog_instruction *inst){    struct brw_compile *p = &c->func;    struct brw_reg dst[4], src[4], payload_reg;    GLuint unit = c->fp->program.Base.SamplerUnits[inst->TexSrcUnit];    GLuint msg_len;    GLuint i, nr;    GLuint emit;    GLboolean shadow = (c->key.shadowtex_mask & (1<<unit)) ? 1 : 0;    payload_reg = get_reg(c, PROGRAM_PAYLOAD, PAYLOAD_DEPTH, 0, 1, 0, 0);    for (i = 0; i < 4; i++) 	dst[i] = get_dst_reg(c, inst, i, 1);    for (i = 0; i < 4; i++)	src[i] = get_src_reg(c, &inst->SrcReg[0], i, 1);    switch (inst->TexSrcTarget) {	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;    }    msg_len = 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(msg_len+1), src[swz[i]]);	else	    brw_MOV(p, brw_message_reg(msg_len+1), brw_imm_f(0));	msg_len += 1;    }    if (shadow) {	brw_MOV(p, brw_message_reg(5), brw_imm_f(0));	brw_MOV(p, brw_message_reg(6), src[2]);    }    brw_SAMPLE(p,	    retype(vec8(dst[0]), BRW_REGISTER_TYPE_UW),	    1,	    retype(payload_reg, BRW_REGISTER_TYPE_UW),	    unit + MAX_DRAW_BUFFERS, /* surface */	    unit,     /* sampler */	    inst->DstReg.WriteMask,	    BRW_SAMPLER_MESSAGE_SIMD8_SAMPLE,	    4,	    shadow ? 6 : 4,	    0);    if (shadow)	brw_MOV(p, dst[3], brw_imm_f(1.0));}static void post_wm_emit( struct brw_wm_compile *c ){    GLuint nr_insns = c->fp->program.Base.NumInstructions;    GLuint insn, target_insn;    struct prog_instruction *inst1, *inst2;    struct brw_instruction *brw_inst1, *brw_inst2;    int offset;    for (insn = 0; insn < nr_insns; insn++) {	inst1 = &c->fp->program.Base.Instructions[insn];	brw_inst1 = inst1->Data;	switch (inst1->Opcode) {	    case OPCODE_CAL:		target_insn = inst1->BranchTarget;		inst2 = &c->fp->program.Base.Instructions[target_insn];		brw_inst2 = inst2->Data;		offset = brw_inst2 - brw_inst1;		brw_set_src1(brw_inst1, brw_imm_d(offset*16));		break;	    default:		break;	}    }}static void brw_wm_emit_glsl(struct brw_context *brw, struct brw_wm_compile *c){#define MAX_IFSN 32#define MAX_LOOP_DEPTH 32    struct brw_instruction *if_inst[MAX_IFSN], *loop_inst[MAX_LOOP_DEPTH];    struct brw_instruction *inst0, *inst1;    int i, if_insn = 0, loop_insn = 0;    struct brw_compile *p = &c->func;    struct brw_indirect stack_index = brw_indirect(0, 0);    c->reg_index = 0;    prealloc_reg(c);    brw_set_compression_control(p, BRW_COMPRESSION_NONE);    brw_MOV(p, get_addr_reg(stack_index), brw_address(c->stack));    for (i = 0; i < c->nr_fp_insns; i++) {	struct prog_instruction *inst = &c->prog_instructions[i];	struct prog_instruction *orig_inst;	if ((orig_inst = inst->Data) != 0)	    orig_inst->Data = current_insn(p);	if (inst->CondUpdate)	    brw_set_conditionalmod(p, BRW_CONDITIONAL_NZ);	else	    brw_set_conditionalmod(p, BRW_CONDITIONAL_NONE);	switch (inst->Opcode) {	    case WM_PIXELXY:		emit_pixel_xy(c, inst);		break;	    case WM_DELTAXY: 		emit_delta_xy(c, inst);		break;	    case WM_PIXELW:		emit_pixel_w(c, inst);		break;		    case WM_LINTERP:		emit_linterp(c, inst);		break;	    case WM_PINTERP:		emit_pinterp(c, inst);		break;	    case WM_CINTERP:		emit_cinterp(c, inst);		break;	    case WM_WPOSXY:		emit_wpos_xy(c, inst);		break;	    case WM_FB_WRITE:		emit_fb_write(c, inst);		break;	    case OPCODE_ABS:		emit_abs(c, inst);		break;	    case OPCODE_ADD:		emit_add(c, inst);		break;	    case OPCODE_SUB:		emit_sub(c, inst);		break;	    case OPCODE_FRC:		emit_frc(c, inst);		break;	    case OPCODE_FLR:		emit_flr(c, inst);		break;	    case OPCODE_LRP:		emit_lrp(c, inst);		break;	    case OPCODE_INT:		emit_int(c, inst);		break;	    case OPCODE_MOV:		emit_mov(c, inst);		break;	    case OPCODE_DP3:		emit_dp3(c, inst);		break;	    case OPCODE_DP4:		emit_dp4(c, inst);		break;	    case OPCODE_XPD:		emit_xpd(c, inst);		break;	    case OPCODE_DPH:		emit_dph(c, inst);		break;	    case OPCODE_RCP:		emit_rcp(c, inst);		break;	    case OPCODE_RSQ:		emit_rsq(c, inst);		break;	    case OPCODE_SIN:		emit_sin(c, inst);		break;	    case OPCODE_COS:		emit_cos(c, inst);		break;	    case OPCODE_EX2:		emit_ex2(c, inst);		break;	    case OPCODE_LG2:		emit_lg2(c, inst);		break;	    case OPCODE_MAX:			emit_max(c, inst);		break;	    case OPCODE_MIN:			emit_min(c, inst);		break;	    case OPCODE_DDX:		emit_ddx(c, inst);		break;	    case OPCODE_DDY:                emit_ddy(c, inst);                break;	    case OPCODE_SLT:		emit_slt(c, inst);		break;	    case OPCODE_SLE:		emit_sle(c, inst);		break;	    case OPCODE_SGT:		emit_sgt(c, inst);		break;	    case OPCODE_SGE:		emit_sge(c, inst);		break;	    case OPCODE_SEQ:		emit_seq(c, inst);		break;	    case OPCODE_SNE:		emit_sne(c, inst);		break;	    case OPCODE_MUL:		emit_mul(c, inst);		break;	    case OPCODE_POW:		emit_pow(c, inst);		break;	    case OPCODE_MAD:		emit_mad(c, inst);		break;	    case OPCODE_TEX:		emit_tex(c, inst);		break;	    case OPCODE_TXB:		emit_txb(c, inst);		break;	    case OPCODE_KIL_NV:		emit_kil(c);		break;	    case OPCODE_IF:		assert(if_insn < MAX_IFSN);		if_inst[if_insn++] = brw_IF(p, BRW_EXECUTE_8);		break;	    case OPCODE_ELSE:		if_inst[if_insn-1]  = brw_ELSE(p, if_inst[if_insn-1]);		break;	    case OPCODE_ENDIF:		assert(if_insn > 0);		brw_ENDIF(p, if_inst[--if_insn]);		break;	    case OPCODE_BGNSUB:	    case OPCODE_ENDSUB:		break;	    case OPCODE_CAL: 		brw_push_insn_state(p);		brw_set_mask_control(p, BRW_MASK_DISABLE);                brw_set_access_mode(p, BRW_ALIGN_1);                brw_ADD(p, deref_1ud(stack_index, 0), brw_ip_reg(), brw_imm_d(3*16));                brw_set_access_mode(p, BRW_ALIGN_16);                brw_ADD(p, get_addr_reg(stack_index),                         get_addr_reg(stack_index), brw_imm_d(4));                orig_inst = inst->Data;                orig_inst->Data = &p->store[p->nr_insn];                brw_ADD(p, brw_ip_reg(), brw_ip_reg(), brw_imm_d(1*16));                brw_pop_insn_state(p);		break;	    case OPCODE_RET:		brw_push_insn_state(p);		brw_set_mask_control(p, BRW_MASK_DISABLE);                brw_ADD(p, get_addr_reg(stack_index),                        get_addr_reg(stack_index), brw_imm_d(-4));                brw_set_access_mode(p, BRW_ALIGN_1);                brw_MOV(p, brw_ip_reg(), deref_1ud(stack_index, 0));                brw_set_access_mode(p, BRW_ALIGN_16);		brw_pop_insn_state(p);		break;	    case OPCODE_BGNLOOP:		loop_inst[loop_insn++] = brw_DO(p, BRW_EXECUTE_8);		break;	    case OPCODE_BRK:		brw_BREAK(p);		brw_set_predicate_control(p, BRW_PREDICATE_NONE);		break;	    case OPCODE_CONT:		brw_CONT(p);		brw_set_predicate_control(p, BRW_PREDICATE_NONE);		break;	    case OPCODE_ENDLOOP: 		loop_insn--;		inst0 = inst1 = brw_WHILE(p, loop_inst[loop_insn]);		/* patch all the BREAK instructions from		   last BEGINLOOP */		while (inst0 > loop_inst[loop_insn]) {		    inst0--;		    if (inst0->header.opcode == BRW_OPCODE_BREAK) {			inst0->bits3.if_else.jump_count = inst1 - inst0 + 1;			inst0->bits3.if_else.pop_count = 0;		    } else if (inst0->header.opcode == BRW_OPCODE_CONTINUE) {                        inst0->bits3.if_else.jump_count = inst1 - inst0;                        inst0->bits3.if_else.pop_count = 0;                    }		}		break;	    default:		_mesa_printf("unsupported IR in fragment shader %d\n",			inst->Opcode);	}	if (inst->CondUpdate)	    brw_set_predicate_control(p, BRW_PREDICATE_NORMAL);	else	    brw_set_predicate_control(p, BRW_PREDICATE_NONE);    }    post_wm_emit(c);    for (i = 0; i < c->fp->program.Base.NumInstructions; i++)	c->fp->program.Base.Instructions[i].Data = NULL;}void brw_wm_glsl_emit(struct brw_context *brw, struct brw_wm_compile *c){    brw_wm_pass_fp(c);    c->tmp_index = 127;    brw_wm_emit_glsl(brw, c);    c->prog_data.total_grf = c->reg_index;    c->prog_data.total_scratch = 0;}

⌨️ 快捷键说明

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