Android: Move screenshot waiting logic to Renderer
This commit is contained in:
parent
811eafda57
commit
459a5ab554
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue