/** * Try to merge the given instructions into the rgb instructions. * * Return true on success; on failure, return false, and keep * the instructions untouched. */ static int merge_instructions(struct rc_pair_instruction * rgb, struct rc_pair_instruction * alpha) { struct rc_pair_instruction backup; /*Instructions can't write output registers and ALU result at the * same time. */ if ((rgb->WriteALUResult && alpha->Alpha.OutputWriteMask) || (rgb->RGB.OutputWriteMask && alpha->WriteALUResult)) { return 0; } /* Writing output registers in the middle of shaders is slow, so * we don't want to pair output writes with temp writes. */ if ((rgb->RGB.OutputWriteMask && !alpha->Alpha.OutputWriteMask) || (!rgb->RGB.OutputWriteMask && alpha->Alpha.OutputWriteMask)) { return 0; } memcpy(&backup, rgb, sizeof(struct rc_pair_instruction)); if (destructive_merge_instructions(rgb, alpha)) return 1; memcpy(rgb, &backup, sizeof(struct rc_pair_instruction)); return 0; }
/** * Try to merge the given instructions into the rgb instructions. * * Return true on success; on failure, return false, and keep * the instructions untouched. */ static int merge_instructions(struct rc_pair_instruction * rgb, struct rc_pair_instruction * alpha) { struct rc_pair_instruction backup; /*Instructions can't write output registers and ALU result at the * same time. */ if ((rgb->WriteALUResult && alpha->Alpha.OutputWriteMask) || (rgb->RGB.OutputWriteMask && alpha->WriteALUResult)) { return 0; } memcpy(&backup, rgb, sizeof(struct rc_pair_instruction)); if (destructive_merge_instructions(rgb, alpha)) return 1; memcpy(rgb, &backup, sizeof(struct rc_pair_instruction)); return 0; }