mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-24 06:39:46 -06:00
Core/VideoCommon: Push presentation time calculated from CPU thread to GPU thread.
This commit is contained in:
@ -157,7 +157,7 @@ void AsyncRequests::HandleEvent(const AsyncRequests::Event& e)
|
||||
|
||||
case Event::SWAP_EVENT:
|
||||
g_presenter->ViSwap(e.swap_event.xfbAddr, e.swap_event.fbWidth, e.swap_event.fbStride,
|
||||
e.swap_event.fbHeight, e.time);
|
||||
e.swap_event.fbHeight, e.time, e.swap_event.presentation_time);
|
||||
break;
|
||||
|
||||
case Event::BBOX_READ:
|
||||
|
@ -19,6 +19,8 @@ class AsyncRequests
|
||||
public:
|
||||
struct Event
|
||||
{
|
||||
Event() {}
|
||||
|
||||
enum Type
|
||||
{
|
||||
EFB_POKE_COLOR,
|
||||
@ -55,6 +57,7 @@ public:
|
||||
u32 fbWidth;
|
||||
u32 fbStride;
|
||||
u32 fbHeight;
|
||||
TimePoint presentation_time;
|
||||
} swap_event;
|
||||
|
||||
struct
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "Common/ChunkFile.h"
|
||||
#include "Core/Config/GraphicsSettings.h"
|
||||
#include "Core/CoreTiming.h"
|
||||
#include "Core/HW/VideoInterface.h"
|
||||
#include "Core/Host.h"
|
||||
#include "Core/System.h"
|
||||
@ -17,7 +18,6 @@
|
||||
#include "VideoCommon/FramebufferManager.h"
|
||||
#include "VideoCommon/OnScreenUI.h"
|
||||
#include "VideoCommon/PostProcessing.h"
|
||||
#include "VideoCommon/Statistics.h"
|
||||
#include "VideoCommon/VertexManagerBase.h"
|
||||
#include "VideoCommon/VideoConfig.h"
|
||||
#include "VideoCommon/VideoEvents.h"
|
||||
@ -157,7 +157,8 @@ bool Presenter::FetchXFB(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_heigh
|
||||
return old_xfb_id == m_last_xfb_id;
|
||||
}
|
||||
|
||||
void Presenter::ViSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks)
|
||||
void Presenter::ViSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks,
|
||||
TimePoint presentation_time)
|
||||
{
|
||||
bool is_duplicate = FetchXFB(xfb_addr, fb_width, fb_stride, fb_height, ticks);
|
||||
|
||||
@ -198,7 +199,7 @@ void Presenter::ViSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height,
|
||||
|
||||
if (!is_duplicate || !g_ActiveConfig.bSkipPresentingDuplicateXFBs)
|
||||
{
|
||||
Present();
|
||||
Present(presentation_time);
|
||||
ProcessFrameDumping(ticks);
|
||||
|
||||
AfterPresentEvent::Trigger(present_info);
|
||||
@ -814,7 +815,7 @@ void Presenter::RenderXFBToScreen(const MathUtil::Rectangle<int>& target_rc,
|
||||
}
|
||||
}
|
||||
|
||||
void Presenter::Present()
|
||||
void Presenter::Present(std::optional<TimePoint> presentation_time)
|
||||
{
|
||||
m_present_count++;
|
||||
|
||||
@ -867,6 +868,10 @@ void Presenter::Present()
|
||||
// Present to the window system.
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(m_swap_mutex);
|
||||
|
||||
if (presentation_time.has_value())
|
||||
Core::System::GetInstance().GetCoreTiming().SleepUntil(*presentation_time);
|
||||
|
||||
g_gfx->PresentBackbuffer();
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <span>
|
||||
#include <tuple>
|
||||
|
||||
class AbstractTexture;
|
||||
@ -36,10 +35,11 @@ public:
|
||||
Presenter();
|
||||
virtual ~Presenter();
|
||||
|
||||
void ViSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks);
|
||||
void ViSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks,
|
||||
TimePoint presentation_time);
|
||||
void ImmediateSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u64 ticks);
|
||||
|
||||
void Present();
|
||||
void Present(std::optional<TimePoint> presentation_time = std::nullopt);
|
||||
void ClearLastXfbId() { m_last_xfb_id = std::numeric_limits<u64>::max(); }
|
||||
|
||||
bool Initialize();
|
||||
|
@ -13,13 +13,13 @@
|
||||
|
||||
#include "Common/ChunkFile.h"
|
||||
#include "Common/CommonTypes.h"
|
||||
#include "Common/Event.h"
|
||||
#include "Common/FileUtil.h"
|
||||
#include "Common/Logging/Log.h"
|
||||
|
||||
#include "Core/Config/MainSettings.h"
|
||||
#include "Core/ConfigManager.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/CoreTiming.h"
|
||||
#include "Core/DolphinAnalytics.h"
|
||||
#include "Core/System.h"
|
||||
|
||||
@ -51,9 +51,7 @@
|
||||
#include "VideoCommon/FramebufferManager.h"
|
||||
#include "VideoCommon/GeometryShaderManager.h"
|
||||
#include "VideoCommon/GraphicsModSystem/Runtime/GraphicsModManager.h"
|
||||
#include "VideoCommon/IndexGenerator.h"
|
||||
#include "VideoCommon/OnScreenDisplay.h"
|
||||
#include "VideoCommon/OpcodeDecoding.h"
|
||||
#include "VideoCommon/PixelEngine.h"
|
||||
#include "VideoCommon/PixelShaderManager.h"
|
||||
#include "VideoCommon/Present.h"
|
||||
@ -108,6 +106,7 @@ void VideoBackendBase::Video_OutputXFB(u32 xfb_addr, u32 fb_width, u32 fb_stride
|
||||
e.swap_event.fbWidth = fb_width;
|
||||
e.swap_event.fbStride = fb_stride;
|
||||
e.swap_event.fbHeight = fb_height;
|
||||
e.swap_event.presentation_time = system.GetCoreTiming().GetTargetHostTime(ticks);
|
||||
AsyncRequests::GetInstance()->PushEvent(e, false);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user