12auto clamp_u64(std::int64_t value) -> std::uint64_t
14 return static_cast<std::uint64_t
>(std::max<std::int64_t>(0, value));
20auto manual_target_ratio(
const eviction_settings& s) ->
double
22 if(
s.budget_fraction <= 0.0f)
26 const double ratio =
static_cast<double>(
s.target_fraction) /
static_cast<double>(
s.budget_fraction);
30 return std::clamp(ratio, 0.1, 1.0);
35auto safety_margin_for(std::uint64_t hard_limit_bytes) -> std::uint64_t
37 constexpr std::uint64_t k_floor = std::uint64_t(64) * 1024 * 1024;
38 return std::max(k_floor, hard_limit_bytes / 50);
48auto build_budget(
const eviction_settings& settings, std::uint64_t gpu_max)
52 if(settings.auto_budget && gpu_max > 0)
54 b.hard_limit_bytes = gpu_max;
55 b.soft_budget_bytes =
static_cast<std::uint64_t
>(
static_cast<double>(gpu_max) * settings.budget_fraction);
56 b.target_bytes =
static_cast<std::uint64_t
>(
static_cast<double>(gpu_max) * settings.target_fraction);
60 const std::uint64_t mb = clamp_u64(settings.manual_budget_mb) * 1024ull * 1024ull;
65 b.hard_limit_bytes = mb;
66 b.soft_budget_bytes = mb;
67 b.target_bytes =
static_cast<std::uint64_t
>(
static_cast<double>(mb) * manual_target_ratio(settings));
78 if(!ev::is_supported())
84 const std::uint64_t gpu_max = (
bx !=
nullptr) ? clamp_u64(
bx->gpuMemoryMax) : 0;
85 const std::uint64_t gpu_used = (
bx !=
nullptr) ? clamp_u64(
bx->gpuMemoryUsed) : 0;
92 const std::uint64_t queued = ev::peek_queued_bytes();
94 const ev::budget_state budget = build_budget(
settings, gpu_max);
100 const std::uint64_t gross_auto = gpu_used + queued;
101 const std::uint64_t pending = ev::peek_pending_release_bytes();
102 const std::uint64_t used =
103 (
settings.auto_budget && gpu_max > 0)
104 ? (gross_auto > pending ? gross_auto - pending : 0)
105 : (ev::get_stats().resident_bytes + ev::peek_external_queued_bytes());
108 ev::set_budget(budget, used);
110 if(!
settings.enabled || used <= budget.soft_budget_bytes)
115 const auto strat =
static_cast<ev::strategy
>(
settings.strategy);
116 const auto min_age =
static_cast<std::uint32_t
>(std::max(0,
settings.min_age_frames));
117 const auto max_evictions = (used > budget.hard_limit_bytes)
118 ?
static_cast<std::uint32_t
>(0)
119 :
static_cast<std::uint32_t
>(std::max(0,
settings.max_evictions));
120 ev::evict_bytes(used - budget.target_bytes, strat, min_age, max_evictions);
const stats * get_stats()
void update_eviction(const eviction_settings &settings)
std::uint64_t safety_margin_bytes