diff --git a/src/ShaderCache.cpp b/src/ShaderCache.cpp index c02199dc86..d8e90cea6a 100644 --- a/src/ShaderCache.cpp +++ b/src/ShaderCache.cpp @@ -2529,7 +2529,8 @@ namespace SIE return std::nullopt; } if (!shaderCache->IsCompiling()) { // we just got woken up because there's a task, start clock - lastCalculation = lastReset = high_resolution_clock::now(); + QueryPerformanceCounter(&lastReset); + lastCalculation = lastReset; } auto node = availableTasks.extract(availableTasks.begin()); auto& task = node.value(); @@ -2564,8 +2565,9 @@ namespace SIE logger::debug("Compiling Task failed: {}", key); failedTasks++; } - auto now = high_resolution_clock::now(); - totalMs += duration_cast(now - lastCalculation).count(); + LARGE_INTEGER now; + QueryPerformanceCounter(&now); + totalTime.QuadPart += now.QuadPart - lastCalculation.QuadPart; lastCalculation = now; std::scoped_lock lock(compilationMutex); processedTasks.insert(task); @@ -2583,14 +2585,14 @@ namespace SIE completedTasks = 0; failedTasks = 0; cacheHitTasks = 0; - lastReset = high_resolution_clock::now(); - lastCalculation = high_resolution_clock::now(); - totalMs = (double)duration_cast(lastReset - lastReset).count(); + QueryPerformanceCounter(&lastReset); + QueryPerformanceCounter(&lastCalculation); + totalTime = { 0 }; } - std::string CompilationSet::GetHumanTime(double a_totalms) + std::string CompilationSet::GetHumanTime(double a_totalMs) { - int milliseconds = (int)a_totalms; + int milliseconds = (int)a_totalMs; int seconds = milliseconds / 1000; int minutes = seconds / 60; seconds %= 60; @@ -2602,6 +2604,11 @@ namespace SIE double CompilationSet::GetEta() { + double totalMs = static_cast(totalTime.QuadPart) * 1000.0 / frequency.QuadPart; + + if (totalMs == 0.0) { + return 0.0; // Avoid division by zero + } auto rate = completedTasks / totalMs; auto remaining = totalTasks - completedTasks - failedTasks; return std::max(remaining / rate, 0.0); @@ -2609,6 +2616,8 @@ namespace SIE std::string CompilationSet::GetStatsString(bool a_timeOnly) { + double totalMs = static_cast(totalTime.QuadPart) * 1000.0 / frequency.QuadPart; + if (a_timeOnly) return fmt::format("{}/{}", GetHumanTime(totalMs), diff --git a/src/ShaderCache.h b/src/ShaderCache.h index 801bed9b5f..face72e928 100644 --- a/src/ShaderCache.h +++ b/src/ShaderCache.h @@ -242,11 +242,23 @@ namespace SIE class CompilationSet { public: + LARGE_INTEGER lastReset; + LARGE_INTEGER lastCalculation; + LARGE_INTEGER frequency; + LARGE_INTEGER totalTime = { 0 }; + + CompilationSet() + { + QueryPerformanceFrequency(&frequency); + QueryPerformanceCounter(&lastReset); + QueryPerformanceCounter(&lastCalculation); + } + std::optional WaitTake(std::stop_token stoken); void Add(const ShaderCompilationTask& task); void Complete(const ShaderCompilationTask& task); void Clear(); - std::string GetHumanTime(double a_totalms); + std::string GetHumanTime(double a_totalMs); double GetEta(); std::string GetStatsString(bool a_timeOnly = false); std::atomic completedTasks = 0; @@ -260,9 +272,6 @@ namespace SIE std::unordered_set tasksInProgress; std::unordered_set processedTasks; // completed or failed std::condition_variable_any conditionVariable; - std::chrono::steady_clock::time_point lastReset = high_resolution_clock::now(); - std::chrono::steady_clock::time_point lastCalculation = high_resolution_clock::now(); - double totalMs = (double)duration_cast(lastReset - lastReset).count(); }; struct ShaderCacheResult