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

📄 r300_fragprog.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
{	s->Outputs[FRAG_RESULT_COLR].Sourced = WRITEMASK_XYZW;	s->Outputs[FRAG_RESULT_DEPR].Sourced = WRITEMASK_W;}static GLuint build_dtm(GLuint depthmode){	switch(depthmode) {	default:	case GL_LUMINANCE: return 0;	case GL_INTENSITY: return 1;	case GL_ALPHA: return 2;	}}static GLuint build_func(GLuint comparefunc){	return comparefunc - GL_NEVER;}/** * Collect all external state that is relevant for compiling the given * fragment program. */static void build_state(	r300ContextPtr r300,	struct r300_fragment_program *fp,	struct r300_fragment_program_external_state *state){	int unit;	_mesa_bzero(state, sizeof(*state));	for(unit = 0; unit < 16; ++unit) {		if (fp->mesa_program.Base.ShadowSamplers & (1 << unit)) {			struct gl_texture_object* tex = r300->radeon.glCtx->Texture.Unit[unit]._Current;			state->unit[unit].depth_texture_mode = build_dtm(tex->DepthMode);			state->unit[unit].texture_compare_func = build_func(tex->CompareFunc);		}	}}void r300TranslateFragmentShader(r300ContextPtr r300,				 struct r300_fragment_program *fp){	struct r300_fragment_program_external_state state;	build_state(r300, fp, &state);	if (_mesa_memcmp(&fp->state, &state, sizeof(state))) {		/* TODO: cache compiled programs */		fp->translated = GL_FALSE;		_mesa_memcpy(&fp->state, &state, sizeof(state));	}	if (!fp->translated) {		struct r300_fragment_program_compiler compiler;		compiler.r300 = r300;		compiler.fp = fp;		compiler.code = &fp->code;		compiler.program = _mesa_clone_program(r300->radeon.glCtx, &fp->mesa_program.Base);		if (RADEON_DEBUG & DEBUG_PIXEL) {			_mesa_printf("Fragment Program: Initial program:\n");			_mesa_print_program(compiler.program);		}		insert_WPOS_trailer(&compiler);		struct radeon_program_transformation transformations[] = {			{ &transform_TEX, &compiler },			{ &radeonTransformALU, 0 },			{ &radeonTransformTrigSimple, 0 }		};		radeonLocalTransform(			r300->radeon.glCtx,			compiler.program,			3, transformations);		if (RADEON_DEBUG & DEBUG_PIXEL) {			_mesa_printf("Fragment Program: After native rewrite:\n");			_mesa_print_program(compiler.program);		}		struct radeon_nqssadce_descr nqssadce = {			.Init = &nqssadce_init,			.IsNativeSwizzle = &r300FPIsNativeSwizzle,			.BuildSwizzle = &r300FPBuildSwizzle,			.RewriteDepthOut = GL_TRUE		};		radeonNqssaDce(r300->radeon.glCtx, compiler.program, &nqssadce);		if (RADEON_DEBUG & DEBUG_PIXEL) {			_mesa_printf("Compiler: after NqSSA-DCE:\n");			_mesa_print_program(compiler.program);		}		if (!r300FragmentProgramEmit(&compiler))			fp->error = GL_TRUE;		/* Subtle: Rescue any parameters that have been added during transformations */		_mesa_free_parameter_list(fp->mesa_program.Base.Parameters);		fp->mesa_program.Base.Parameters = compiler.program->Parameters;		compiler.program->Parameters = 0;		_mesa_reference_program(r300->radeon.glCtx, &compiler.program, NULL);		if (!fp->error)			fp->translated = GL_TRUE;		if (fp->error || (RADEON_DEBUG & DEBUG_PIXEL))			r300FragmentProgramDump(fp, &fp->code);		r300UpdateStateParameters(r300->radeon.glCtx, _NEW_PROGRAM);	}	update_params(r300, fp);}/* just some random things... */void r300FragmentProgramDump(	struct r300_fragment_program *fp,	struct r300_fragment_program_code *code){	int n, i, j;	static int pc = 0;	fprintf(stderr, "pc=%d*************************************\n", pc++);	fprintf(stderr, "Hardware program\n");	fprintf(stderr, "----------------\n");	for (n = 0; n < (code->cur_node + 1); n++) {		fprintf(stderr, "NODE %d: alu_offset: %d, tex_offset: %d, "			"alu_end: %d, tex_end: %d, flags: %08x\n", n,			code->node[n].alu_offset,			code->node[n].tex_offset,			code->node[n].alu_end, code->node[n].tex_end,			code->node[n].flags);		if (n > 0 || code->first_node_has_tex) {			fprintf(stderr, "  TEX:\n");			for (i = code->node[n].tex_offset;			     i <= code->node[n].tex_offset + code->node[n].tex_end;			     ++i) {				const char *instr;				switch ((code->tex.					 inst[i] >> R300_TEX_INST_SHIFT) &					15) {				case R300_TEX_OP_LD:					instr = "TEX";					break;				case R300_TEX_OP_KIL:					instr = "KIL";					break;				case R300_TEX_OP_TXP:					instr = "TXP";					break;				case R300_TEX_OP_TXB:					instr = "TXB";					break;				default:					instr = "UNKNOWN";				}				fprintf(stderr,					"    %s t%i, %c%i, texture[%i]   (%08x)\n",					instr,					(code->tex.					 inst[i] >> R300_DST_ADDR_SHIFT) & 31,					't',					(code->tex.					 inst[i] >> R300_SRC_ADDR_SHIFT) & 31,					(code->tex.					 inst[i] & R300_TEX_ID_MASK) >>					R300_TEX_ID_SHIFT,					code->tex.inst[i]);			}		}		for (i = code->node[n].alu_offset;		     i <= code->node[n].alu_offset + code->node[n].alu_end; ++i) {			char srcc[3][10], dstc[20];			char srca[3][10], dsta[20];			char argc[3][20];			char arga[3][20];			char flags[5], tmp[10];			for (j = 0; j < 3; ++j) {				int regc = code->alu.inst[i].inst1 >> (j * 6);				int rega = code->alu.inst[i].inst3 >> (j * 6);				sprintf(srcc[j], "%c%i",					(regc & 32) ? 'c' : 't', regc & 31);				sprintf(srca[j], "%c%i",					(rega & 32) ? 'c' : 't', rega & 31);			}			dstc[0] = 0;			sprintf(flags, "%s%s%s",				(code->alu.inst[i].				 inst1 & R300_ALU_DSTC_REG_X) ? "x" : "",				(code->alu.inst[i].				 inst1 & R300_ALU_DSTC_REG_Y) ? "y" : "",				(code->alu.inst[i].				 inst1 & R300_ALU_DSTC_REG_Z) ? "z" : "");			if (flags[0] != 0) {				sprintf(dstc, "t%i.%s ",					(code->alu.inst[i].					 inst1 >> R300_ALU_DSTC_SHIFT) & 31,					flags);			}			sprintf(flags, "%s%s%s",				(code->alu.inst[i].				 inst1 & R300_ALU_DSTC_OUTPUT_X) ? "x" : "",				(code->alu.inst[i].				 inst1 & R300_ALU_DSTC_OUTPUT_Y) ? "y" : "",				(code->alu.inst[i].				 inst1 & R300_ALU_DSTC_OUTPUT_Z) ? "z" : "");			if (flags[0] != 0) {				sprintf(tmp, "o%i.%s",					(code->alu.inst[i].					 inst1 >> R300_ALU_DSTC_SHIFT) & 31,					flags);				strcat(dstc, tmp);			}			dsta[0] = 0;			if (code->alu.inst[i].inst3 & R300_ALU_DSTA_REG) {				sprintf(dsta, "t%i.w ",					(code->alu.inst[i].					 inst3 >> R300_ALU_DSTA_SHIFT) & 31);			}			if (code->alu.inst[i].inst3 & R300_ALU_DSTA_OUTPUT) {				sprintf(tmp, "o%i.w ",					(code->alu.inst[i].					 inst3 >> R300_ALU_DSTA_SHIFT) & 31);				strcat(dsta, tmp);			}			if (code->alu.inst[i].inst3 & R300_ALU_DSTA_DEPTH) {				strcat(dsta, "Z");			}			fprintf(stderr,				"%3i: xyz: %3s %3s %3s -> %-20s (%08x)\n"				"       w: %3s %3s %3s -> %-20s (%08x)\n", i,				srcc[0], srcc[1], srcc[2], dstc,				code->alu.inst[i].inst1, srca[0], srca[1],				srca[2], dsta, code->alu.inst[i].inst3);			for (j = 0; j < 3; ++j) {				int regc = code->alu.inst[i].inst0 >> (j * 7);				int rega = code->alu.inst[i].inst2 >> (j * 7);				int d;				char buf[20];				d = regc & 31;				if (d < 12) {					switch (d % 4) {					case R300_ALU_ARGC_SRC0C_XYZ:						sprintf(buf, "%s.xyz",							srcc[d / 4]);						break;					case R300_ALU_ARGC_SRC0C_XXX:						sprintf(buf, "%s.xxx",							srcc[d / 4]);						break;					case R300_ALU_ARGC_SRC0C_YYY:						sprintf(buf, "%s.yyy",							srcc[d / 4]);						break;					case R300_ALU_ARGC_SRC0C_ZZZ:						sprintf(buf, "%s.zzz",							srcc[d / 4]);						break;					}				} else if (d < 15) {					sprintf(buf, "%s.www", srca[d - 12]);				} else if (d == 20) {					sprintf(buf, "0.0");				} else if (d == 21) {					sprintf(buf, "1.0");				} else if (d == 22) {					sprintf(buf, "0.5");				} else if (d >= 23 && d < 32) {					d -= 23;					switch (d / 3) {					case 0:						sprintf(buf, "%s.yzx",							srcc[d % 3]);						break;					case 1:						sprintf(buf, "%s.zxy",							srcc[d % 3]);						break;					case 2:						sprintf(buf, "%s.Wzy",							srcc[d % 3]);						break;					}				} else {					sprintf(buf, "%i", d);				}				sprintf(argc[j], "%s%s%s%s",					(regc & 32) ? "-" : "",					(regc & 64) ? "|" : "",					buf, (regc & 64) ? "|" : "");				d = rega & 31;				if (d < 9) {					sprintf(buf, "%s.%c", srcc[d / 3],						'x' + (char)(d % 3));				} else if (d < 12) {					sprintf(buf, "%s.w", srca[d - 9]);				} else if (d == 16) {					sprintf(buf, "0.0");				} else if (d == 17) {					sprintf(buf, "1.0");				} else if (d == 18) {					sprintf(buf, "0.5");				} else {					sprintf(buf, "%i", d);				}				sprintf(arga[j], "%s%s%s%s",					(rega & 32) ? "-" : "",					(rega & 64) ? "|" : "",					buf, (rega & 64) ? "|" : "");			}			fprintf(stderr, "     xyz: %8s %8s %8s    op: %08x\n"				"       w: %8s %8s %8s    op: %08x\n",				argc[0], argc[1], argc[2],				code->alu.inst[i].inst0, arga[0], arga[1],				arga[2], code->alu.inst[i].inst2);		}	}}

⌨️ 快捷键说明

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