static void test_runner_rc_regalloc(
	struct test_result *result,
	struct radeon_compiler *c,
	const char *filename)
{
	struct rc_test_file test_file;
	unsigned optimizations = 1;
	unsigned do_full_regalloc = 1;
	struct rc_instruction *inst;
	unsigned pass = 1;

	test_begin(result);

	if (!load_program(c, &test_file, filename)) {
		fprintf(stderr, "Failed to load program\n");
	}

	rc_pair_translate(c, NULL);
	rc_pair_schedule(c, &optimizations);
	rc_pair_remove_dead_sources(c, NULL);
	rc_pair_regalloc(c, &do_full_regalloc);

	for(inst = c->Program.Instructions.Next;
				inst != &c->Program.Instructions;
				inst = inst->Next) {
		if (inst->Type == RC_INSTRUCTION_NORMAL &&
				inst->U.I.Opcode != RC_OPCODE_BEGIN_TEX) {
			if (GET_SWZ(inst->U.I.SrcReg[0].Swizzle, 0)
							!= RC_SWIZZLE_X) {
				pass = 0;
			}
		}
	}

	test_check(result, pass);
}
Example #2
0
void r3xx_compile_fragment_program(struct r300_fragment_program_compiler* c)
{
	rewrite_depth_out(c);

	if (c->is_r500) {
		struct radeon_program_transformation transformations[] = {
			{ &r500_transform_TEX, c },
			{ &r500_transform_IF, 0 },
			{ &radeonTransformALU, 0 },
			{ &radeonTransformDeriv, 0 },
			{ &radeonTransformTrigScale, 0 }
		};
		radeonLocalTransform(&c->Base, 5, transformations);

		c->Base.SwizzleCaps = &r500_swizzle_caps;
	} else {
		struct radeon_program_transformation transformations[] = {
			{ &r300_transform_TEX, c },
			{ &radeonTransformALU, 0 },
			{ &radeonTransformTrigSimple, 0 }
		};
		radeonLocalTransform(&c->Base, 3, transformations);

		c->Base.SwizzleCaps = &r300_swizzle_caps;
	}

	if (c->Base.Debug) {
		fprintf(stderr, "Fragment Program: After native rewrite:\n");
		rc_print_program(&c->Base.Program);
		fflush(stderr);
	}

	rc_dataflow_deadcode(&c->Base, &dataflow_outputs_mark_use, c);
	if (c->Base.Error)
		return;

	if (c->Base.Debug) {
		fprintf(stderr, "Fragment Program: After deadcode:\n");
		rc_print_program(&c->Base.Program);
		fflush(stderr);
	}

	rc_dataflow_swizzles(&c->Base);
	if (c->Base.Error)
		return;

	if (c->Base.Debug) {
		fprintf(stderr, "Compiler: after dataflow passes:\n");
		rc_print_program(&c->Base.Program);
		fflush(stderr);
	}

	rc_pair_translate(c);
	if (c->Base.Error)
		return;

	if (c->Base.Debug) {
		fprintf(stderr, "Compiler: after pair translate:\n");
		rc_print_program(&c->Base.Program);
		fflush(stderr);
	}

	rc_pair_schedule(c);
	if (c->Base.Error)
		return;

	if (c->Base.Debug) {
		fprintf(stderr, "Compiler: after pair scheduling:\n");
		rc_print_program(&c->Base.Program);
		fflush(stderr);
	}

	if (c->is_r500)
		rc_pair_regalloc(c, 128);
	else
		rc_pair_regalloc(c, R300_PFS_NUM_TEMP_REGS);

	if (c->Base.Error)
		return;

	if (c->Base.Debug) {
		fprintf(stderr, "Compiler: after pair register allocation:\n");
		rc_print_program(&c->Base.Program);
		fflush(stderr);
	}

	if (c->is_r500) {
		r500BuildFragmentProgramHwCode(c);
	} else {
		r300BuildFragmentProgramHwCode(c);
	}

	rc_constants_copy(&c->code->constants, &c->Base.Program.Constants);

	if (c->Base.Debug) {
		if (c->is_r500) {
			r500FragmentProgramDump(c->code);
		} else {
			r300FragmentProgramDump(c->code);
		}
	}
}