Android: Move screenshot waiting logic to Renderer

This commit is contained in:
Stenzek 2017-03-04 16:42:35 +10:00
parent 811eafda57
commit 459a5ab554
5 changed files with 23 additions and 16 deletions

View File

@ -484,8 +484,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_StopEmulatio
jobject obj) jobject obj)
{ {
std::lock_guard<std::mutex> guard(s_host_identity_lock); std::lock_guard<std::mutex> guard(s_host_identity_lock);
Core::SaveScreenShot("thumb"); Core::SaveScreenShot("thumb", true);
g_renderer->s_screenshot_completed.WaitFor(std::chrono::seconds(2));
Core::Stop(); Core::Stop();
updateMainFrameEvent.Set(); // Kick the waiting event updateMainFrameEvent.Set(); // Kick the waiting event
} }

View File

@ -732,19 +732,19 @@ static std::string GenerateScreenshotName()
return name; return name;
} }
void SaveScreenShot() void SaveScreenShot(bool wait_for_completion)
{ {
const bool bPaused = GetState() == State::Paused; const bool bPaused = GetState() == State::Paused;
SetState(State::Paused); SetState(State::Paused);
g_renderer->SetScreenshot(GenerateScreenshotName()); g_renderer->SaveScreenshot(GenerateScreenshotName(), wait_for_completion);
if (!bPaused) if (!bPaused)
SetState(State::Running); SetState(State::Running);
} }
void SaveScreenShot(const std::string& name) void SaveScreenShot(const std::string& name, bool wait_for_completion)
{ {
const bool bPaused = GetState() == State::Paused; const bool bPaused = GetState() == State::Paused;
@ -752,7 +752,7 @@ void SaveScreenShot(const std::string& name)
std::string filePath = GenerateScreenshotFolderPath() + name + ".png"; std::string filePath = GenerateScreenshotFolderPath() + name + ".png";
g_renderer->SetScreenshot(filePath); g_renderer->SaveScreenshot(filePath, wait_for_completion);
if (!bPaused) if (!bPaused)
SetState(State::Running); SetState(State::Running);

View File

@ -55,8 +55,8 @@ bool IsGPUThread();
void SetState(State state); void SetState(State state);
State GetState(); State GetState();
void SaveScreenShot(); void SaveScreenShot(bool wait_for_completion = false);
void SaveScreenShot(const std::string& name); void SaveScreenShot(const std::string& name, bool wait_for_completion = false);
void Callback_WiimoteInterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size); void Callback_WiimoteInterruptChannel(int _number, u16 _channelID, const void* _pData, u32 _Size);

View File

@ -276,11 +276,20 @@ void Renderer::ConvertStereoRectangle(const TargetRectangle& rc, TargetRectangle
} }
} }
void Renderer::SetScreenshot(const std::string& filename) void Renderer::SaveScreenshot(const std::string& filename, bool wait_for_completion)
{ {
std::lock_guard<std::mutex> lk(m_screenshot_lock); // We must not hold the lock while waiting for the screenshot to complete.
m_screenshot_name = filename; {
m_screenshot_request.Set(); std::lock_guard<std::mutex> lk(m_screenshot_lock);
m_screenshot_name = filename;
m_screenshot_request.Set();
}
if (wait_for_completion)
{
// This is currently only used by Android, and it was using a wait time of 2 seconds.
m_screenshot_completed.WaitFor(std::chrono::seconds(2));
}
} }
// Create On-Screen-Messages // Create On-Screen-Messages
@ -814,7 +823,7 @@ void Renderer::RunFrameDumps()
// Reset settings // Reset settings
m_screenshot_name.clear(); m_screenshot_name.clear();
s_screenshot_completed.Set(); m_screenshot_completed.Set();
} }
if (SConfig::GetInstance().m_DumpFrames) if (SConfig::GetInstance().m_DumpFrames)

View File

@ -111,7 +111,7 @@ public:
float EFBToScaledXf(float x) { return x * ((float)GetTargetWidth() / (float)EFB_WIDTH); } float EFBToScaledXf(float x) { return x * ((float)GetTargetWidth() / (float)EFB_WIDTH); }
float EFBToScaledYf(float y) { return y * ((float)GetTargetHeight() / (float)EFB_HEIGHT); } float EFBToScaledYf(float y) { return y * ((float)GetTargetHeight() / (float)EFB_HEIGHT); }
// Random utilities // Random utilities
void SetScreenshot(const std::string& filename); void SaveScreenshot(const std::string& filename, bool wait_for_completion);
void DrawDebugText(); void DrawDebugText();
virtual void RenderText(const std::string& text, int left, int top, u32 color) = 0; virtual void RenderText(const std::string& text, int left, int top, u32 color) = 0;
@ -140,8 +140,6 @@ public:
// Max height/width // Max height/width
virtual u32 GetMaxTextureSize() = 0; virtual u32 GetMaxTextureSize() = 0;
Common::Event s_screenshot_completed;
// Final surface changing // Final surface changing
// This is called when the surface is resized (WX) or the window changes (Android). // This is called when the surface is resized (WX) or the window changes (Android).
virtual void ChangeSurface(void* new_surface_handle) {} virtual void ChangeSurface(void* new_surface_handle) {}
@ -158,6 +156,7 @@ protected:
void FinishFrameData(); void FinishFrameData();
Common::Flag m_screenshot_request; Common::Flag m_screenshot_request;
Common::Event m_screenshot_completed;
std::mutex m_screenshot_lock; std::mutex m_screenshot_lock;
std::string m_screenshot_name; std::string m_screenshot_name;