Skip to content

Commit

Permalink
GS/HW: Allow more draws to remain if recent draws done near vsync
Browse files Browse the repository at this point in the history
  • Loading branch information
refractionpcsx2 committed Nov 24, 2023
1 parent 7cc6af8 commit 1cc4b9b
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 7 deletions.
5 changes: 5 additions & 0 deletions pcsx2/GS/Renderers/Common/GSRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -944,6 +944,11 @@ bool GSRenderer::IsIdleFrame() const
return (m_last_draw_n == s_n && m_last_transfer_n == s_transfer_n);
}

int GSRenderer::GetLastVSyncDraw() const
{
return m_last_draw_n;
}

bool GSRenderer::SaveSnapshotToMemory(u32 window_width, u32 window_height, bool apply_aspect, bool crop_borders,
u32* width, u32* height, std::vector<u32>* pixels)
{
Expand Down
1 change: 1 addition & 0 deletions pcsx2/GS/Renderers/Common/GSRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class GSRenderer : public GSState
virtual GSTexture* LookupPaletteSource(u32 CBP, u32 CPSM, u32 CBW, GSVector2i& offset, float* scale, const GSVector2i& size);

bool IsIdleFrame() const;
int GetLastVSyncDraw() const;

bool SaveSnapshotToMemory(u32 window_width, u32 window_height, bool apply_aspect, bool crop_borders,
u32* width, u32* height, std::vector<u32>* pixels);
Expand Down
4 changes: 2 additions & 2 deletions pcsx2/GS/Renderers/HW/GSRendererHW.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,11 +113,11 @@ void GSRendererHW::VSync(u32 field, bool registers_written, bool idle_frame)
{
// If it did draws very recently, we should keep the recent stuff in case it hasn't been preloaded/used yet.
// Rocky Legend does this with the main menu FMV's.
if (s_last_transfer_draw_n == s_n)
if (s_last_transfer_draw_n > (s_n - 5) && s_last_transfer_draw_n >= GetLastVSyncDraw())
{
for (auto iter = m_draw_transfers.rbegin(); iter != m_draw_transfers.rend(); iter++)
{
if ((s_n - iter->draw) > 5)
if ((s_n - iter->draw) > 50)
{
m_draw_transfers.erase(m_draw_transfers.begin(), std::next(iter).base());
break;
Expand Down
9 changes: 4 additions & 5 deletions pcsx2/GS/Renderers/HW/GSTextureCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2411,11 +2411,10 @@ GSTextureCache::Target* GSTextureCache::LookupDisplayTarget(GIFRegTEX0 TEX0, con
else
++iter;

if (eerect.rintersect(newrect).eq(newrect))
{
can_create = true;
break;
}
// In theory it might not be a full rect, but it should be enough to display *something*.
// It's also possible we haven't saved enough of the transfers to fill the rect if the game draws the picture in lots of small transfers.
can_create = true;
break;
}
else
++iter;
Expand Down

0 comments on commit 1cc4b9b

Please sign in to comment.