VideoCommon: Add a hidden setting to cap immediate XFB swaps to one per VI.
This commit is contained in:
@@ -194,6 +194,7 @@ const Info<bool> GFX_HACK_SKIP_XFB_COPY_TO_RAM{{System::GFX, "Hacks", "XFBToText
|
|||||||
const Info<bool> GFX_HACK_DISABLE_COPY_TO_VRAM{{System::GFX, "Hacks", "DisableCopyToVRAM"}, false};
|
const Info<bool> GFX_HACK_DISABLE_COPY_TO_VRAM{{System::GFX, "Hacks", "DisableCopyToVRAM"}, false};
|
||||||
const Info<bool> GFX_HACK_DEFER_EFB_COPIES{{System::GFX, "Hacks", "DeferEFBCopies"}, true};
|
const Info<bool> GFX_HACK_DEFER_EFB_COPIES{{System::GFX, "Hacks", "DeferEFBCopies"}, true};
|
||||||
const Info<bool> GFX_HACK_IMMEDIATE_XFB{{System::GFX, "Hacks", "ImmediateXFBEnable"}, false};
|
const Info<bool> GFX_HACK_IMMEDIATE_XFB{{System::GFX, "Hacks", "ImmediateXFBEnable"}, false};
|
||||||
|
const Info<bool> GFX_HACK_CAP_IMMEDIATE_XFB{{System::GFX, "Hacks", "CapImmediateXFB"}, false};
|
||||||
const Info<bool> GFX_HACK_SKIP_DUPLICATE_XFBS{{System::GFX, "Hacks", "SkipDuplicateXFBs"}, true};
|
const Info<bool> GFX_HACK_SKIP_DUPLICATE_XFBS{{System::GFX, "Hacks", "SkipDuplicateXFBs"}, true};
|
||||||
const Info<bool> GFX_HACK_EARLY_XFB_OUTPUT{{System::GFX, "Hacks", "EarlyXFBOutput"}, true};
|
const Info<bool> GFX_HACK_EARLY_XFB_OUTPUT{{System::GFX, "Hacks", "EarlyXFBOutput"}, true};
|
||||||
const Info<bool> GFX_HACK_COPY_EFB_SCALED{{System::GFX, "Hacks", "EFBScaledCopy"}, true};
|
const Info<bool> GFX_HACK_COPY_EFB_SCALED{{System::GFX, "Hacks", "EFBScaledCopy"}, true};
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ extern const Info<bool> GFX_HACK_SKIP_XFB_COPY_TO_RAM;
|
|||||||
extern const Info<bool> GFX_HACK_DISABLE_COPY_TO_VRAM;
|
extern const Info<bool> GFX_HACK_DISABLE_COPY_TO_VRAM;
|
||||||
extern const Info<bool> GFX_HACK_DEFER_EFB_COPIES;
|
extern const Info<bool> GFX_HACK_DEFER_EFB_COPIES;
|
||||||
extern const Info<bool> GFX_HACK_IMMEDIATE_XFB;
|
extern const Info<bool> GFX_HACK_IMMEDIATE_XFB;
|
||||||
|
extern const Info<bool> GFX_HACK_CAP_IMMEDIATE_XFB;
|
||||||
extern const Info<bool> GFX_HACK_SKIP_DUPLICATE_XFBS;
|
extern const Info<bool> GFX_HACK_SKIP_DUPLICATE_XFBS;
|
||||||
extern const Info<bool> GFX_HACK_EARLY_XFB_OUTPUT;
|
extern const Info<bool> GFX_HACK_EARLY_XFB_OUTPUT;
|
||||||
extern const Info<bool> GFX_HACK_COPY_EFB_SCALED;
|
extern const Info<bool> GFX_HACK_COPY_EFB_SCALED;
|
||||||
|
|||||||
@@ -95,8 +95,13 @@ static void TryToSnapToXFBSize(int& width, int& height, int xfb_width, int xfb_h
|
|||||||
|
|
||||||
Presenter::Presenter()
|
Presenter::Presenter()
|
||||||
{
|
{
|
||||||
|
auto& video_events = GetVideoEvents();
|
||||||
|
|
||||||
m_config_changed =
|
m_config_changed =
|
||||||
GetVideoEvents().config_changed_event.Register([this](u32 bits) { ConfigChanged(bits); });
|
video_events.config_changed_event.Register([this](u32 bits) { ConfigChanged(bits); });
|
||||||
|
|
||||||
|
m_end_field_hook = video_events.vi_end_field_event.Register(
|
||||||
|
[this] { m_immediate_swap_happened_this_field.store(false, std::memory_order_relaxed); });
|
||||||
}
|
}
|
||||||
|
|
||||||
Presenter::~Presenter()
|
Presenter::~Presenter()
|
||||||
@@ -109,6 +114,8 @@ bool Presenter::Initialize()
|
|||||||
{
|
{
|
||||||
UpdateDrawRectangle();
|
UpdateDrawRectangle();
|
||||||
|
|
||||||
|
m_immediate_swap_happened_this_field.store(false, std::memory_order_relaxed);
|
||||||
|
|
||||||
if (!g_gfx->IsHeadless())
|
if (!g_gfx->IsHeadless())
|
||||||
{
|
{
|
||||||
SetBackbuffer(g_gfx->GetSurfaceInfo());
|
SetBackbuffer(g_gfx->GetSurfaceInfo());
|
||||||
@@ -214,6 +221,12 @@ void Presenter::ViSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height,
|
|||||||
|
|
||||||
void Presenter::ImmediateSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height)
|
void Presenter::ImmediateSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height)
|
||||||
{
|
{
|
||||||
|
if (m_immediate_swap_happened_this_field.exchange(true, std::memory_order_relaxed) &&
|
||||||
|
Config::Get(Config::GFX_HACK_CAP_IMMEDIATE_XFB))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const u64 ticks = m_next_swap_estimated_ticks;
|
const u64 ticks = m_next_swap_estimated_ticks;
|
||||||
|
|
||||||
FetchXFB(xfb_addr, fb_width, fb_stride, fb_height, ticks);
|
FetchXFB(xfb_addr, fb_width, fb_stride, fb_height, ticks);
|
||||||
@@ -984,6 +997,8 @@ void Presenter::DoState(PointerWrap& p)
|
|||||||
m_next_swap_estimated_ticks = m_last_xfb_ticks;
|
m_next_swap_estimated_ticks = m_last_xfb_ticks;
|
||||||
m_next_swap_estimated_time = Clock::now();
|
m_next_swap_estimated_time = Clock::now();
|
||||||
|
|
||||||
|
m_immediate_swap_happened_this_field.store(false, std::memory_order_relaxed);
|
||||||
|
|
||||||
ImmediateSwap(m_last_xfb_addr, m_last_xfb_width, m_last_xfb_stride, m_last_xfb_height);
|
ImmediateSwap(m_last_xfb_addr, m_last_xfb_width, m_last_xfb_stride, m_last_xfb_height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,6 +169,7 @@ private:
|
|||||||
u32 m_last_xfb_height = MAX_XFB_HEIGHT;
|
u32 m_last_xfb_height = MAX_XFB_HEIGHT;
|
||||||
|
|
||||||
Common::EventHook m_config_changed;
|
Common::EventHook m_config_changed;
|
||||||
|
Common::EventHook m_end_field_hook;
|
||||||
|
|
||||||
// Updates state for the SmoothEarlyPresentation setting if enabled.
|
// Updates state for the SmoothEarlyPresentation setting if enabled.
|
||||||
// Returns the desired presentation time regardless.
|
// Returns the desired presentation time regardless.
|
||||||
@@ -181,6 +182,8 @@ private:
|
|||||||
// Can be used for presentation of ImmediateXFB swaps which don't have timing information.
|
// Can be used for presentation of ImmediateXFB swaps which don't have timing information.
|
||||||
u64 m_next_swap_estimated_ticks = 0;
|
u64 m_next_swap_estimated_ticks = 0;
|
||||||
TimePoint m_next_swap_estimated_time{Clock::now()};
|
TimePoint m_next_swap_estimated_time{Clock::now()};
|
||||||
|
|
||||||
|
std::atomic_bool m_immediate_swap_happened_this_field{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace VideoCommon
|
} // namespace VideoCommon
|
||||||
|
|||||||
Reference in New Issue
Block a user