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); }
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); } } }