diff --git a/src/crashlog.cpp b/src/crashlog.cpp index ab8408772a..2653490dd3 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -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()) { diff --git a/src/debug_settings.h b/src/debug_settings.h index c724eeee87..e9db946533 100644 --- a/src/debug_settings.h +++ b/src/debug_settings.h @@ -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, diff --git a/src/newgrf.cpp b/src/newgrf.cpp index dc9e65f511..e806f9c34c 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -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(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; diff --git a/src/settings_type.h b/src/settings_type.h index bde815dc52..13cce7b135 100644 --- a/src/settings_type.h +++ b/src/settings_type.h @@ -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. */ diff --git a/src/table/settings/settings.ini b/src/table/settings/settings.ini index 874e7da594..7a0f789f55 100644 --- a/src/table/settings/settings.ini +++ b/src/table/settings/settings.ini @@ -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""