VarAction2: Move optimiser flags to a separate setting

pull/393/head
Jonathan G Rennison 2 years ago
parent 6ff8066d34
commit 9e414a1eab

@ -234,6 +234,9 @@ char *CrashLog::LogConfiguration(char *buffer, const char *last) const
if (_settings_game.debug.chicken_bits != 0) {
buffer += seprintf(buffer, last, "Chicken bits: 0x%08X\n\n", _settings_game.debug.chicken_bits);
}
if (_settings_game.debug.newgrf_optimiser_flags != 0) {
buffer += seprintf(buffer, last, "NewGRF optimiser flags: 0x%08X\n\n", _settings_game.debug.newgrf_optimiser_flags);
}
buffer += seprintf(buffer, last, "AI Configuration (local: %i) (current: %i):\n", (int)_local_company, (int)_current_company);
for (const Company *c : Company::Iterate()) {

@ -20,10 +20,6 @@ enum ChickenBitFlags {
DCBF_DESYNC_CHECK_POST_COMMAND = 3,
DCBF_DESYNC_CHECK_NO_GENERAL = 4,
DCBF_DESYNC_CHECK_PERIODIC_SIGNALS = 5,
DCBF_NO_OPTIMISE_VARACT2 = 6,
DCBF_NO_OPTIMISE_VARACT2_DSE = 7,
DCBF_NO_OPTIMISE_VARACT2_PRUNE = 8,
DCBF_NO_OPTIMISE_VARACT2_EXP_VAR = 9,
};
inline bool HasChickenBit(ChickenBitFlags flag)
@ -31,6 +27,18 @@ inline bool HasChickenBit(ChickenBitFlags flag)
return HasBit(_settings_game.debug.chicken_bits, flag);
}
enum NewGRFOptimiserFlags {
NGOF_NO_OPT_VARACT2 = 0,
NGOF_NO_OPT_VARACT2_DSE = 1,
NGOF_NO_OPT_VARACT2_GROUP_PRUNE = 2,
NGOF_NO_OPT_VARACT2_EXPENSIVE_VARS = 3,
};
inline bool HasGrfOptimiserFlag(NewGRFOptimiserFlags flag)
{
return HasBit(_settings_game.debug.newgrf_optimiser_flags, flag);
}
enum MiscDebugFlags {
MDF_OVERHEAT_BREAKDOWN_OPEN_WIN,
MDF_ZONING_RS_WATER_FLOOD_STATE,

@ -5536,7 +5536,7 @@ static const SpriteGroup *GetGroupFromGroupID(byte setid, byte type, uint16 grou
}
const SpriteGroup *result = _cur.spritegroups[groupid];
if (HasChickenBit(DCBF_NO_OPTIMISE_VARACT2) || HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_PRUNE)) return result;
if (HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2) || HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_GROUP_PRUNE)) return result;
while (result != nullptr) {
if (result->type == SGT_DETERMINISTIC) {
const DeterministicSpriteGroup *sg = static_cast<const DeterministicSpriteGroup *>(result);
@ -5667,7 +5667,7 @@ static bool IsFeatureUsableForDSE(GrfSpecFeature feature)
static void OptimiseVarAction2Adjust(VarAction2OptimiseState &state, const GrfSpecFeature feature, const byte varsize, DeterministicSpriteGroup *group, DeterministicSpriteGroupAdjust &adjust)
{
if (unlikely(HasChickenBit(DCBF_NO_OPTIMISE_VARACT2))) return;
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2))) return;
VarAction2AdjustInferenceFlags prev_inference = state.inference;
state.inference = VA2AIF_NONE;
@ -6428,9 +6428,9 @@ static void OptimiseVarAction2DeterministicSpriteGroupExpensiveVars(const GrfSpe
static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &state, const GrfSpecFeature feature, const byte varsize, DeterministicSpriteGroup *group)
{
if (unlikely(HasChickenBit(DCBF_NO_OPTIMISE_VARACT2))) return;
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2))) return;
if (!HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_PRUNE) && (state.inference & VA2AIF_HAVE_CONSTANT) && !group->calculated_result) {
if (!HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_GROUP_PRUNE) && (state.inference & VA2AIF_HAVE_CONSTANT) && !group->calculated_result) {
/* Result of this sprite group is always the same, discard the unused branches */
const SpriteGroup *target = group->default_group;
for (const auto &range : group->ranges) {
@ -6443,7 +6443,7 @@ static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &
group->ranges.clear();
}
if (!HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_PRUNE) && group->ranges.empty() && !group->calculated_result) {
if (!HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_GROUP_PRUNE) && group->ranges.empty() && !group->calculated_result) {
/* There is only one option, remove any redundant adjustments when the result will be ignored anyway */
while (!group->adjusts.empty()) {
const DeterministicSpriteGroupAdjust &prev = group->adjusts.back();
@ -6521,8 +6521,8 @@ static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &
bool dse_candidate = false;
if (check_dse || state.seen_procedure_call) dse_candidate = CheckDeterministicSpriteGroupOutputVarBits(group, bits, check_dse, !state.seen_procedure_call);
if (state.check_expensive_vars && !HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_EXP_VAR)) {
if (dse_candidate && !HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_DSE)) {
if (state.check_expensive_vars && !HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_EXPENSIVE_VARS)) {
if (dse_candidate && !HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_DSE)) {
_cur.pending_expensive_var_checks.push_back({ feature, group });
} else {
OptimiseVarAction2DeterministicSpriteGroupExpensiveVars(feature, group);
@ -6532,7 +6532,7 @@ static void OptimiseVarAction2DeterministicSpriteGroup(VarAction2OptimiseState &
static void HandleVarAction2DeadStoreElimination()
{
if (unlikely(HasChickenBit(DCBF_NO_OPTIMISE_VARACT2) || HasChickenBit(DCBF_NO_OPTIMISE_VARACT2_DSE))) return;
if (unlikely(HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2) || HasGrfOptimiserFlag(NGOF_NO_OPT_VARACT2_DSE))) return;
for (DeterministicSpriteGroup *group : _cur.dead_store_elimination_candidates) {
std::bitset<256> bits;

@ -757,6 +757,7 @@ struct CompanySettings {
/** Debug settings. */
struct DebugSettings {
uint32 chicken_bits; ///< chicken bits
uint32 newgrf_optimiser_flags; ///< NewGRF optimiser flags
};
/** Scenario editor settings. */

@ -5999,3 +5999,13 @@ min = 0
max = 0xFFFFFFFF
cat = SC_EXPERT
patxname = ""debug.chicken_bits""
[SDT_VAR]
var = debug.newgrf_optimiser_flags
type = SLE_UINT32
flags = SF_NOT_IN_CONFIG | SF_NO_NEWGAME | SF_NO_NETWORK
def = 0
min = 0
max = 0xFFFFFFFF
cat = SC_EXPERT
patxname = ""debug.newgrf_optimiser_flags""

Loading…
Cancel
Save