Core: Change a volatile into an atomic

Also changes s_drawn_video into an atomic, as it's used across threads as well.
This commit is contained in:
Lioncash 2015-07-06 06:25:48 -04:00
parent c53e7f2842
commit af4cfd32d4
1 changed files with 12 additions and 11 deletions

View File

@ -2,6 +2,7 @@
// Licensed under GPLv2+ // Licensed under GPLv2+
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include <atomic>
#include <cctype> #include <cctype>
#ifdef _WIN32 #ifdef _WIN32
@ -10,7 +11,6 @@
#include "AudioCommon/AudioCommon.h" #include "AudioCommon/AudioCommon.h"
#include "Common/Atomic.h"
#include "Common/CommonPaths.h" #include "Common/CommonPaths.h"
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/CPUDetect.h" #include "Common/CPUDetect.h"
@ -83,8 +83,8 @@ bool g_want_determinism;
// Declarations and definitions // Declarations and definitions
static Common::Timer s_timer; static Common::Timer s_timer;
static volatile u32 s_drawn_frame = 0; static std::atomic<u32> s_drawn_frame;
static u32 s_drawn_video = 0; static std::atomic<u32> s_drawn_video;
// Function forwarding // Function forwarding
void Callback_WiimoteInterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size); void Callback_WiimoteInterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size);
@ -725,14 +725,14 @@ void VideoThrottle()
{ {
// Update info per second // Update info per second
u32 ElapseTime = (u32)s_timer.GetTimeDifference(); u32 ElapseTime = (u32)s_timer.GetTimeDifference();
if ((ElapseTime >= 1000 && s_drawn_video > 0) || s_request_refresh_info) if ((ElapseTime >= 1000 && s_drawn_video.load() > 0) || s_request_refresh_info)
{ {
UpdateTitle(); UpdateTitle();
// Reset counter // Reset counter
s_timer.Update(); s_timer.Update();
Common::AtomicStore(s_drawn_frame, 0); s_drawn_frame.store(0);
s_drawn_video = 0; s_drawn_video.store(0);
} }
s_drawn_video++; s_drawn_video++;
@ -746,7 +746,7 @@ bool ShouldSkipFrame(int skipped)
const u32 TargetFPS = (SConfig::GetInstance().m_Framelimit > 1) const u32 TargetFPS = (SConfig::GetInstance().m_Framelimit > 1)
? (SConfig::GetInstance().m_Framelimit - 1) * 5 ? (SConfig::GetInstance().m_Framelimit - 1) * 5
: VideoInterface::TargetRefreshRate; : VideoInterface::TargetRefreshRate;
const u32 frames = Common::AtomicLoad(s_drawn_frame); const u32 frames = s_drawn_frame.load();
const bool fps_slow = !(s_timer.GetTimeDifference() < (frames + skipped) * 1000 / TargetFPS); const bool fps_slow = !(s_timer.GetTimeDifference() < (frames + skipped) * 1000 / TargetFPS);
return fps_slow; return fps_slow;
@ -758,7 +758,8 @@ bool ShouldSkipFrame(int skipped)
void Callback_VideoCopiedToXFB(bool video_update) void Callback_VideoCopiedToXFB(bool video_update)
{ {
if (video_update) if (video_update)
Common::AtomicIncrement(s_drawn_frame); s_drawn_frame++;
Movie::FrameUpdate(); Movie::FrameUpdate();
} }
@ -771,9 +772,9 @@ void UpdateTitle()
if (ElapseTime == 0) if (ElapseTime == 0)
ElapseTime = 1; ElapseTime = 1;
float FPS = (float) (Common::AtomicLoad(s_drawn_frame) * 1000.0 / ElapseTime); float FPS = (float)(s_drawn_frame.load() * 1000.0 / ElapseTime);
float VPS = (float) (s_drawn_video * 1000.0 / ElapseTime); float VPS = (float)(s_drawn_video.load() * 1000.0 / ElapseTime);
float Speed = (float) (s_drawn_video * (100 * 1000.0) / (VideoInterface::TargetRefreshRate * ElapseTime)); float Speed = (float)(s_drawn_video.load() * (100 * 1000.0) / (VideoInterface::TargetRefreshRate * ElapseTime));
// Settings are shown the same for both extended and summary info // Settings are shown the same for both extended and summary info
std::string SSettings = StringFromFormat("%s %s | %s | %s", cpu_core_base->GetName(), _CoreParameter.bCPUThread ? "DC" : "SC", std::string SSettings = StringFromFormat("%s %s | %s | %s", cpu_core_base->GetName(), _CoreParameter.bCPUThread ? "DC" : "SC",