System: Fix CPU usage not showing for sw-renderer-for-readbacks

This commit is contained in:
Connor McLaughlin 2022-08-05 17:17:29 +10:00
parent 8f314c8d49
commit 06ecc50797
7 changed files with 28 additions and 17 deletions

View file

@ -20,6 +20,11 @@ class HostDisplayTexture;
class TimingEvent; class TimingEvent;
class Timers; class Timers;
namespace Threading
{
class Thread;
}
class GPU class GPU
{ {
public: public:
@ -74,6 +79,7 @@ public:
virtual ~GPU(); virtual ~GPU();
virtual GPURenderer GetRendererType() const = 0; virtual GPURenderer GetRendererType() const = 0;
virtual const Threading::Thread* GetSWThread() const = 0;
virtual bool Initialize(); virtual bool Initialize();
virtual void Reset(bool clear_vram); virtual void Reset(bool clear_vram);

View file

@ -44,6 +44,11 @@ GPU_HW::~GPU_HW()
} }
} }
const Threading::Thread* GPU_HW::GetSWThread() const
{
return m_sw_renderer ? m_sw_renderer->GetThread() : nullptr;
}
bool GPU_HW::Initialize() bool GPU_HW::Initialize()
{ {
if (!GPU::Initialize()) if (!GPU::Initialize())

View file

@ -33,6 +33,8 @@ public:
GPU_HW(); GPU_HW();
virtual ~GPU_HW(); virtual ~GPU_HW();
const Threading::Thread* GetSWThread() const;
virtual bool Initialize() override; virtual bool Initialize() override;
virtual void Reset(bool clear_vram) override; virtual void Reset(bool clear_vram) override;
virtual bool DoState(StateWrapper& sw, HostDisplayTexture** host_texture, bool update_display) override; virtual bool DoState(StateWrapper& sw, HostDisplayTexture** host_texture, bool update_display) override;

View file

@ -45,6 +45,11 @@ GPURenderer GPU_SW::GetRendererType() const
return GPURenderer::Software; return GPURenderer::Software;
} }
const Threading::Thread* GPU_SW::GetSWThread() const
{
return m_backend.GetThread();
}
bool GPU_SW::Initialize() bool GPU_SW::Initialize()
{ {
// we need something to draw in.. but keep the current api if we have one // we need something to draw in.. but keep the current api if we have one

View file

@ -23,6 +23,7 @@ public:
ALWAYS_INLINE const GPU_SW_Backend& GetBackend() const { return m_backend; } ALWAYS_INLINE const GPU_SW_Backend& GetBackend() const { return m_backend; }
GPURenderer GetRendererType() const override; GPURenderer GetRendererType() const override;
const Threading::Thread* GetSWThread() const;
bool Initialize() override; bool Initialize() override;
bool DoState(StateWrapper& sw, HostDisplayTexture** host_texture, bool update_display) override; bool DoState(StateWrapper& sw, HostDisplayTexture** host_texture, bool update_display) override;

View file

@ -20,7 +20,6 @@
#include "fmt/format.h" #include "fmt/format.h"
#include "game_database.h" #include "game_database.h"
#include "gpu.h" #include "gpu.h"
#include "gpu_sw.h"
#include "gte.h" #include "gte.h"
#include "host.h" #include "host.h"
#include "host_display.h" #include "host_display.h"
@ -2149,9 +2148,8 @@ void System::UpdatePerformanceCounters()
100.0f; 100.0f;
s_last_global_tick_counter = global_tick_counter; s_last_global_tick_counter = global_tick_counter;
const Threading::Thread* sw_thread = const Threading::Thread* sw_thread = g_gpu->GetSWThread();
g_gpu->IsHardwareRenderer() ? nullptr : static_cast<GPU_SW*>(g_gpu.get())->GetBackend().GetThread(); const u64 cpu_time = s_cpu_thread_handle ? s_cpu_thread_handle.GetCPUTime() : 0;
const u64 cpu_time = s_cpu_thread_handle.GetCPUTime();
const u64 sw_time = sw_thread ? sw_thread->GetCPUTime() : 0; const u64 sw_time = sw_thread ? sw_thread->GetCPUTime() : 0;
const u64 cpu_delta = cpu_time - s_last_cpu_time; const u64 cpu_delta = cpu_time - s_last_cpu_time;
const u64 sw_delta = sw_time - s_last_sw_time; const u64 sw_delta = sw_time - s_last_sw_time;
@ -2176,20 +2174,14 @@ void System::ResetPerformanceCounters()
s_last_frame_number = s_frame_number; s_last_frame_number = s_frame_number;
s_last_internal_frame_number = s_internal_frame_number; s_last_internal_frame_number = s_internal_frame_number;
s_last_global_tick_counter = TimingEvents::GetGlobalTickCounter(); s_last_global_tick_counter = TimingEvents::GetGlobalTickCounter();
s_last_cpu_time = s_cpu_thread_handle.GetCPUTime(); s_last_cpu_time = s_cpu_thread_handle ? s_cpu_thread_handle.GetCPUTime() : 0;
s_last_sw_time = 0; if (const Threading::Thread* sw_thread = g_gpu->GetSWThread(); sw_thread)
if (!g_gpu->IsHardwareRenderer())
{
const Threading::Thread* sw_thread = static_cast<GPU_SW*>(g_gpu.get())->GetBackend().GetThread();
if (sw_thread)
s_last_sw_time = sw_thread->GetCPUTime(); s_last_sw_time = sw_thread->GetCPUTime();
} else
s_last_sw_time = 0;
s_average_frame_time_accumulator = 0.0f; s_average_frame_time_accumulator = 0.0f;
s_worst_frame_time_accumulator = 0.0f; s_worst_frame_time_accumulator = 0.0f;
s_cpu_thread_usage = 0.0f;
s_cpu_thread_time = 0.0f;
s_sw_thread_usage = 0.0f;
s_sw_thread_time = 0.0f;
s_fps_timer.Reset(); s_fps_timer.Reset();
ResetThrottler(); ResetThrottler();
} }

View file

@ -168,7 +168,7 @@ void ImGuiManager::DrawPerformanceOverlay()
FormatProcessorStat(text, System::GetCPUThreadUsage(), System::GetCPUThreadAverageTime()); FormatProcessorStat(text, System::GetCPUThreadUsage(), System::GetCPUThreadAverageTime());
DRAW_LINE(fixed_font, text, IM_COL32(255, 255, 255, 255)); DRAW_LINE(fixed_font, text, IM_COL32(255, 255, 255, 255));
if (!g_gpu->IsHardwareRenderer() && g_settings.gpu_use_thread) if (g_gpu->GetSWThread())
{ {
text.Assign("SW: "); text.Assign("SW: ");
FormatProcessorStat(text, System::GetSWThreadUsage(), System::GetSWThreadAverageTime()); FormatProcessorStat(text, System::GetSWThreadUsage(), System::GetSWThreadAverageTime());