Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions src/ShaderCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -2564,8 +2565,9 @@ namespace SIE
logger::debug("Compiling Task failed: {}", key);
failedTasks++;
}
auto now = high_resolution_clock::now();
totalMs += duration_cast<milliseconds>(now - lastCalculation).count();
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
totalTime.QuadPart += now.QuadPart - lastCalculation.QuadPart;
lastCalculation = now;
std::scoped_lock lock(compilationMutex);
processedTasks.insert(task);
Expand All @@ -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<std::chrono::milliseconds>(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;
Expand All @@ -2602,13 +2604,20 @@ namespace SIE

double CompilationSet::GetEta()
{
double totalMs = static_cast<double>(totalTime.QuadPart) * 1000.0 / frequency.QuadPart;

Copilot AI Jul 16, 2025

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The conversion from performance counter to milliseconds is duplicated in GetEta() and GetStatsString(). Consider extracting this calculation into a private helper method to reduce code duplication.

Copilot uses AI. Check for mistakes.

Comment thread
alandtse marked this conversation as resolved.
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);
}

std::string CompilationSet::GetStatsString(bool a_timeOnly)
{
double totalMs = static_cast<double>(totalTime.QuadPart) * 1000.0 / frequency.QuadPart;

if (a_timeOnly)
return fmt::format("{}/{}",
GetHumanTime(totalMs),
Expand Down
17 changes: 13 additions & 4 deletions src/ShaderCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<ShaderCompilationTask> 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<uint64_t> completedTasks = 0;
Expand All @@ -260,9 +272,6 @@ namespace SIE
std::unordered_set<ShaderCompilationTask> tasksInProgress;
std::unordered_set<ShaderCompilationTask> 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<std::chrono::milliseconds>(lastReset - lastReset).count();
};

struct ShaderCacheResult
Expand Down