Compare commits

...

17 Commits

Author SHA1 Message Date
JordanTheToaster
0afc9d6d10 GameDB: Small fixes 2025-12-07 06:22:03 -05:00
JordanTheToaster
2f4583f2e4 Git/CI: Bump controller db create-pull-request to v7.0.11 2025-12-07 04:45:26 -06:00
JordanTheToaster
86af608bfc Git/CI: Bump translations create-pull-request to v7.0.11 2025-12-07 04:20:22 -06:00
TJnotJT
3a7489b2cc GS: Fix typos in GSState::EarlyDetectShuffle(). 2025-12-07 07:20:14 +01:00
lightningterror
51947f8f93 GS/GL: Only issue barriers for framebuffer optimizations if needed.
Check if the state changed previous draw/pass and if not then we
need to issue a barrier or render pass then to ensure writes.
2025-12-06 22:51:02 +01:00
KamFretoZ
e07f02d9bc Qt: Fix default value for texture replacements OSD 2025-12-06 14:51:20 +01:00
KamFretoZ
6c07160503 OSD: Cleanup Unused Headers 2025-12-06 14:51:20 +01:00
KamFretoZ
a02e1b3487 OSD: Formatting Cleanup 2025-12-06 14:51:20 +01:00
KamFretoZ
86a7e97025 OSD: Decouple Indicator from Performance Overlay 2025-12-06 14:51:20 +01:00
Silent
5d641e4a9d Achievements: Fix label names for subsets 2025-12-06 14:36:09 +01:00
chaoticgd
a5f7b4e8c6 FullscreenUI: Fix crash when changing settings with a background set 2025-12-06 14:33:49 +01:00
SternXD
9bb30dcb44 Qt: Fix status bar widgets being cut off with longer translations 2025-12-06 14:29:51 +01:00
lightningterror
4eb0b097d6 GS/HW: Adjust color_dest_blend, color_dest_blend2, blend_zero_to_one_range conditions.
Don't enable color_dest_blend if it's a channel shuffle or dithering draw.

Don't enable color_dest_blend2 if it's preferring sw blend or dithering draw.

Don't enable blend_zero_to_one_range if it's preferring sw blend or dithering draw.
2025-12-06 11:11:09 +01:00
lightningterror
38f61b9658 GS/HW: Exclude date check for late draw cancel.
No rt change, no rgba write, no depth write, no need to check date this late.
2025-12-06 11:11:09 +01:00
lightningterror
80ffb82a4a GS/HW: PrimID Date shouldn't enable feedbackloop check. 2025-12-06 11:11:09 +01:00
refractionpcsx2
3cecd894a3 GameDB: Brazenly remove patches for ESPN games 2025-12-05 11:20:15 -05:00
refractionpcsx2
02f0921b2d EE: Force sync on EE timer read 2025-12-05 11:20:15 -05:00
19 changed files with 240 additions and 359 deletions

View File

@@ -17,7 +17,7 @@ jobs:
run: ./.github/workflows/scripts/common/update_base_translation.sh
- name: Create Pull Request
uses: peter-evans/create-pull-request@4320041ed380b20e97d388d56a7fb4f9b8c20e79
uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676
with:
title: "Qt: Update Base Translation"
commit-message: "[ci skip] Qt: Update Base Translation."

View File

@@ -19,7 +19,7 @@ jobs:
mv ./game_controller_db.txt ${{github.workspace}}/bin/resources/game_controller_db.txt
- name: Create Pull Request
uses: peter-evans/create-pull-request@4320041ed380b20e97d388d56a7fb4f9b8c20e79
uses: peter-evans/create-pull-request@22a9089034f40e5a961c8808d113e2c98fb63676
with:
title: "PAD: Update to latest controller database"
commit-message: "[ci skip] PAD: Update to latest controller database."

View File

@@ -1603,9 +1603,11 @@ SCAJ-20052:
- "SCAJ-20001"
SCAJ-20055:
name: "Battle Gear 3"
region: "NTSC-Unk"
region: "NTSC-J"
clampModes:
vuClampMode: 3 # Stops car from falling through track.
gsHWFixes:
textureInsideRT: 1 # Fixes broken splitscreen mode.
SCAJ-20056:
name: "Bujingai"
region: "NTSC-Unk"
@@ -21856,12 +21858,6 @@ SLES-52942:
SLES-52943:
name: "ESPN NFL 2K5"
region: "PAL-E"
patches:
7D5403E1:
content: |-
comment=Patch by Prafull
// Fixes random hangs.
patch=1,EE,0043c930,word,00000000
SLES-52944:
name: "Robotech - Invasion"
region: "PAL-M5"
@@ -21922,13 +21918,6 @@ SLES-52965:
SLES-52966:
name: "ESPN NHL 2K5"
region: "PAL-E"
patches:
EC301155:
content: |-
author=Prafull
comment=Patched by Prafull
// Avoid hanging at loading screen.
patch=1,EE,003e4018,word,00000000
SLES-52967:
name: "Guilty Gear X2 Reloaded"
region: "PAL-E"
@@ -22148,12 +22137,6 @@ SLES-53022:
region: "PAL-E"
gameFixes:
- SkipMPEGHack # Fixes videos.
patches:
CA37B42E:
content: |-
author=Prafull
comment=fixes hang at start
patch=1,EE,0034DA98,word,00000000
SLES-53023:
name: "RTL Ski Jump 2005"
region: "PAL-E-G"
@@ -24260,38 +24243,9 @@ SLES-53685:
SLES-53686:
name: "NHL 2K6"
region: "PAL-M3"
patches:
98EC4D86:
content: |-
author=Prafull
comment=Patched by Prafull
// Avoid hanging at loading screen.
patch=1,EE,00433150,word,00000000
SLES-53687:
name: "NBA 2K6"
region: "PAL-M5"
patches:
4047DB34: # English
content: |-
author=Prafull
comment=fixes hang at start
patch=1,EE,00441ff8,word,00000000
B91D81A3: # French
content: |-
comment=fixes hang at start
patch=1,EE,00441fa0,word,00000000
C96E2007: # German
content: |-
comment=fixes hang at start
patch=1,EE,00441e48,word,00000000
79A6C879: # Italian
content: |-
comment=fixes hang at start
patch=1,EE,00441de8,word,00000000
08349AAF: # Spanish
content: |-
comment=fixes hang at start
patch=1,EE,00441ec8,word,00000000
SLES-53689:
name: "World Poker Tour"
region: "PAL-M3"
@@ -25867,22 +25821,9 @@ SLES-54209:
SLES-54210:
name: "NBA 2K7"
region: "PAL-M5"
patches:
04808D11:
content: |-
author=Prafull
comment=fixes hang at start
patch=1,EE,0044f0f8,word,00000000
SLES-54211:
name: "NHL 2K7"
region: "PAL-M5"
patches:
1AD6EFD1:
content: |-
author=Prafull
comment=Patched by Prafull
// Avoid hanging at loading screen.
patch=1,EE,004412a8,word,00000000
SLES-54212:
name: "Agent Hugo - RoboRumble"
region: "PAL-M11"
@@ -28073,13 +28014,6 @@ SLES-54880:
SLES-54881:
name: "NHL 2K8"
region: "PAL-M5"
patches:
F2027778:
content: |-
author=Prafull
comment=Patched by Prafull
// Avoid hanging at loading screen.
patch=1,EE,004323b8,word,00000000
SLES-54882:
name: "Gecko Blaster"
region: "PAL-M5"
@@ -29178,7 +29112,7 @@ SLES-55191:
nativeScaling: 1 # Fixes post-processing smoothness and position.
getSkipCount: "GSC_GuitarHero"
SLES-55192:
name: "Steam Express"
name: "Nitrobike"
region: "PAL-M5"
SLES-55193:
name: "Disney/Pixar WALL-E"
@@ -29456,13 +29390,6 @@ SLES-55251:
SLES-55252:
name: "NHL 2K9"
region: "PAL-M5"
patches:
5D981DF2:
content: |-
author=Prafull
comment=Patched by Prafull
// Avoid hanging at loading screen.
patch=1,EE,00430d38,word,00000000
SLES-55253:
name: "NBA 2K9"
region: "PAL-M5"
@@ -43556,6 +43483,8 @@ SLPM-65434:
region: "NTSC-J"
clampModes:
vuClampMode: 3 # Stops car from falling through track.
gsHWFixes:
textureInsideRT: 1 # Fixes broken splitscreen mode.
SLPM-65435:
name: "北へ。Diamond Dust"
name-sort: "きたへ Diamond Dust"
@@ -49723,12 +49652,6 @@ SLPM-66451:
name-sort: "めじゃー りーぐ べーすぼーる 2K6"
name-en: "Major League Baseball 2K6"
region: "NTSC-J"
patches:
F0393708:
content: |-
author=Prafull
comment=fixes hang at start
patch=1,EE,0035d8b8,word,00000000
SLPM-66452:
name: "かまいたちの夜×3 三日月島事件の真相"
name-sort: "かまいたちのよる3 みかづきじまじけんのしんそう"
@@ -62661,12 +62584,6 @@ SLPS-25925:
name-sort: "NHL 2K9"
name-en: "NHL 2K9"
region: "NTSC-J"
patches:
69C963FA:
content: |-
comment= patch by prafull , someother1ne
// Fixes hang at start
patch=1,EE,00430C70,word,00000000
SLPS-25927:
name: "トゥームレイダー アンダーワールド"
name-sort: "とぅーむれいだー あんだーわーるど"
@@ -62692,12 +62609,6 @@ SLPS-25930:
name-sort: "MLB 2K9 [えいごばん]"
name-en: "Major League Baseball 2K9"
region: "NTSC-J"
patches:
69C963FA:
content: |-
comment= patch by prafull , someother1ne
// Fixes hang at start
patch=1,EE,003AFCA0,word,00000000
SLPS-25931:
name: "家庭教師ヒットマンREBORN 狙え!? リング×ボンゴレトレーナーズ [Best Collection]"
name-sort: "かてきょーひっとまんりぼーん! ねらえ!? りんぐ×ぼんごれとれーなーず [Best Collection]"
@@ -67522,21 +67433,9 @@ SLUS-20725:
SLUS-20726:
name: "ESPN - NBA Basketball"
region: "NTSC-U"
patches:
A13E5DD5:
content: |-
comment=Patch by Prafull
// Avoids hang at start.
patch=1,EE,003161c0,word,00000000
SLUS-20727:
name: "ESPN - NFL Football"
region: "NTSC-U"
patches:
56920AD1:
content: |-
comment=Patch by Prafull
// Fixes random hangs.
patch=0,EE,003bb900,word,00000000
SLUS-20728:
name: "ESPN - NHL Hockey"
region: "NTSC-U"
@@ -68607,41 +68506,17 @@ SLUS-20919:
name: "ESPN - NFL 2K5"
region: "NTSC-U"
compat: 5
patches:
42F9D5AF:
content: |-
comment=Patch by Prafull
// Fixes random hangs.
patch=1,EE,0041c680,word,00000000
SLUS-20920:
name: "ESPN - NBA 2K5"
region: "NTSC-U"
patches:
903C7BC5:
content: |-
comment=Patch by Prafull
// Avoids hanging at loading screen.
patch=1,EE,003bc800,word,00000000
SLUS-20921:
name: "ESPN - NHL 2K5"
region: "NTSC-U"
compat: 5
patches:
9B6E69EC:
content: |-
comment=Patch by Prafull
// Avoids hang at start.
patch=1,EE,003ed218,word,00000000
SLUS-20922:
name: "ESPN - College Hoops 2K5"
region: "NTSC-U"
compat: 2
patches:
2B54D3E5:
content: |-
comment=Patch by Prafull
// Avoids hang at loading.
patch=1,EE,003bcc08,word,00000000
SLUS-20923:
name: "KOF - Maximum Impact"
region: "NTSC-U"
@@ -69381,13 +69256,6 @@ SLUS-21035:
eeClampMode: 2 # Fixes hang when the baseball hits the ground.
gsHWFixes:
texturePreloading: 1 # Performs much better and stops freezing and or stuttering.
patches:
2243CE1D:
content: |-
author=Prafull
comment=Patched by Prafull
// Skip hang at start.
patch=1,EE,00364080,word,00000000
SLUS-21036:
name: "Get On Da Mic"
region: "NTSC-U"
@@ -70562,41 +70430,17 @@ SLUS-21232:
name: "College Hoops 2K6"
region: "NTSC-U"
compat: 5
patches:
A60E027C:
content: |-
comment=Patch by Prafull
// This fixes random hangs and makes the game playable.
patch=1,EE,0045f410,word,00000000
SLUS-21233:
name: "NBA 2K6"
region: "NTSC-U"
patches:
E5C65369:
content: |-
comment=Patch by Prafull
// Avoids hang at start.
patch=1,EE,004413a8,word,00000000
SLUS-21234:
name: "NHL 2K6"
region: "NTSC-U"
compat: 2
patches:
87007AB7:
content: |-
author=Prafull
// Avoid hang at start.
patch=1,EE,003fd608,word,00000000
SLUS-21235:
name: "Major League Baseball 2K6"
region: "NTSC-U"
compat: 5
patches:
88BB9A5C:
content: |-
comment=Patch by Prafull
// Avoids hang at start.
patch=1,EE,003c4280,word,00000000
SLUS-21236:
name: "Tokyo Xtreme Racer Drift"
region: "NTSC-U"
@@ -71268,12 +71112,6 @@ SLUS-21324:
eeClampMode: 2 # Fixes hang when the baseball hits the ground.
gsHWFixes:
texturePreloading: 1 # Performs much better and stops freezing and or stuttering.
patches:
D592B291:
content: |-
comment=Patch by Prafull
// Skip hang at start.
patch=1,EE,0036b220,word,00000000 //1040fffd
SLUS-21325:
name: "Harry Potter and the Goblet of Fire"
region: "NTSC-U"
@@ -71994,22 +71832,10 @@ SLUS-21423:
SLUS-21424:
name: "NBA 2K7"
region: "NTSC-U"
patches:
F5AEDCC3:
content: |-
comment=Patch by Prafull
// Avoids hang at start.
patch=1,EE,0044ef60,word,00000000
SLUS-21425:
name: "NHL 2K7"
region: "NTSC-U"
compat: 5
patches:
478EFBDB:
content: |-
comment=Patch by Prafull
// Avoids hang at start.
patch=1,EE,004409d8,word,00000000
SLUS-21426:
name: "Call of Duty 3"
region: "NTSC-U"
@@ -72653,12 +72479,6 @@ SLUS-21560:
SLUS-21561:
name: "Major League Baseball 2K7"
region: "NTSC-U"
patches:
73D6D171:
content: |-
author=Prafull
comment=fixes hang at start
patch=1,EE,003CDE10,word,00000000
SLUS-21563:
name: "Horsez"
region: "NTSC-U"
@@ -73112,12 +72932,6 @@ SLUS-21632:
name: "NHL 2K8"
region: "NTSC-U"
compat: 5
patches:
77B49EF8:
content: |-
// Patched by Prafull-thanks to harsh.
// Avoids hang at start.
patch=1,EE,00432310,word,00000000
SLUS-21633:
name: "Aqua Teen Hunger Force - Zombie Ninja Pro-Am"
region: "NTSC-U"
@@ -73643,20 +73457,6 @@ SLUS-21728:
SLUS-21729:
name: "Major League Baseball 2K8"
region: "NTSC-U"
patches:
0BE24520:
content: |-
author=Prafull
// Fixes hanging at start.
// This hanging problem is common in every 2K
// games sport titles.
// They all hit the exact same piece of code when crashing.
// The game can randomly goes a bit further but it's impossible
// to progress in menus without this patch at least.
// Note: This issue will only happen if the game
// run on the inhouse Visual Concept engine.
// My theory is on a deep timing issue.
patch=1,EE,003cc1a0,word,00000000
SLUS-21730:
name: "Jumper - Griffin's Story"
region: "NTSC-U"
@@ -73858,12 +73658,6 @@ SLUS-21763:
name: "NHL 2K9"
region: "NTSC-U"
compat: 2
patches:
29FDCBF7:
content: |-
author=Prafull
// Avoid hang at start.
patch=1,EE,00431848,word,00000000
SLUS-21764:
name: "Cake Mania - Baker's Challenge"
region: "NTSC-U"
@@ -74407,12 +74201,6 @@ SLUS-21870:
SLUS-21871:
name: "Major League Baseball 2K9"
region: "NTSC-U"
patches:
72905002:
content: |-
author=Prafull
comment=fixes hang at start
patch=1,EE,003CC5D8,word,00000000
SLUS-21872:
name: "MTV Pimp My Ride - Street Racing"
region: "NTSC-U"
@@ -74635,12 +74423,6 @@ SLUS-21914:
name: "NHL 2K10"
region: "NTSC-U"
compat: 5
patches:
82CA153C:
content: |-
comment=Patch by Prafull
// Fixes hanging problem.
patch=1,EE,00431b70,word,00000000
SLUS-21915:
name: "The Lord of the Rings - Aragorn's Quest"
name-sort: "Lord of the Rings, The - Aragorn's Quest"
@@ -74691,12 +74473,6 @@ SLUS-21928:
SLUS-21929:
name: "Major League Baseball 2K10"
region: "NTSC-U"
patches:
2283765A:
content: |-
author=Prafull
// Avoid hanging at loading screen.
patch=1,EE,003cd6d8,word,00000000
SLUS-21930:
name: "Sakura Wars - So Long, My Love [Japanese - Disc 2]"
region: "NTSC-U"
@@ -74765,12 +74541,6 @@ SLUS-21944:
SLUS-21945:
name: "Major League Baseball 2K11"
region: "NTSC-U"
patches:
3D621C56:
content: |-
author=By Prafull
comment=fixes hang at start
patch=1,EE,003CFE58,word,00000000
SLUS-21946:
name: "Madden NFL 12"
region: "NTSC-U"
@@ -74797,12 +74567,6 @@ SLUS-21950:
SLUS-21951:
name: "Major League Baseball 2K12"
region: "NTSC-U"
patches:
C26C70A9:
content: |-
author=By Prafull
comment=fixes hang at start
patch=1,EE,003D4098,word,00000000
SLUS-21954:
name: "FIFA 13"
region: "NTSC-U" # Latin America with En,Fr,Es

View File

@@ -221,15 +221,21 @@ void MainWindow::setupAdditionalUi()
m_status_resolution_widget->hide();
m_status_fps_widget = new QLabel(m_ui.statusBar);
m_status_fps_widget->setFixedSize(60, 16);
m_status_fps_widget->setFixedHeight(16);
m_status_fps_widget->setMinimumWidth(60);
m_status_fps_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
m_status_fps_widget->hide();
m_status_vps_widget = new QLabel(m_ui.statusBar);
m_status_vps_widget->setFixedSize(60, 16);
m_status_vps_widget->setFixedHeight(16);
m_status_vps_widget->setMinimumWidth(60);
m_status_vps_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
m_status_vps_widget->hide();
m_status_speed_widget = new QLabel(m_ui.statusBar);
m_status_speed_widget->setFixedSize(90, 16);
m_status_speed_widget->setFixedHeight(16);
m_status_speed_widget->setMinimumWidth(130);
m_status_speed_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
m_status_speed_widget->hide();
m_settings_toolbar_menu = new QMenu(m_ui.toolBar);

View File

@@ -770,7 +770,7 @@ GraphicsSettingsWidget::GraphicsSettingsWidget(SettingsWindow* settings_dialog,
dialog()->registerWidgetHelp(m_osd.showInputRec, tr("Show Input Recording Status"), tr("Checked"),
tr("Shows the status of the currently active input recording in the top-right corner of the display.."));
dialog()->registerWidgetHelp(m_osd.showTextureReplacements, tr("Show Texture Replacement Status"), tr("Checked"),
dialog()->registerWidgetHelp(m_osd.showTextureReplacements, tr("Show Texture Replacement Status"), tr("Unchecked"),
tr("Shows the status of the number of dumped and loaded texture replacements in the top-right corner of the display."));
dialog()->registerWidgetHelp(m_osd.warnAboutUnsafeSettings, tr("Warn About Unsafe Settings"), tr("Checked"),

View File

@@ -40,6 +40,7 @@
#include <cstdlib>
#include <functional>
#include <limits>
#include <map>
#include <optional>
#include <string>
#include <vector>
@@ -2499,7 +2500,7 @@ void Achievements::DrawAchievementsWindow()
ImVec2(display_size.x, display_size.y - heading_height - LayoutScale(ImGuiFullscreen::LAYOUT_FOOTER_HEIGHT)),
"achievements", background, 0.0f, ImVec2(ImGuiFullscreen::LAYOUT_MENU_WINDOW_X_PADDING, 0.0f), 0))
{
static bool buckets_collapsed[NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS] = {};
static std::map<std::pair<u32, u32>, bool> buckets_collapsed;
static const char* bucket_names[NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS] = {
TRANSLATE_NOOP("Achievements", "Unknown"),
TRANSLATE_NOOP("Achievements", "Locked"),
@@ -2525,11 +2526,25 @@ void Achievements::DrawAchievementsWindow()
pxAssert(bucket.bucket_type < NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS);
// TODO: Once subsets are supported, this will need to change.
bool& bucket_collapsed = buckets_collapsed[bucket.bucket_type];
bucket_collapsed ^=
ImGuiFullscreen::MenuHeadingButton(Host::TranslateToCString("Achievements", bucket_names[bucket.bucket_type]),
bucket_collapsed ? ICON_FA_CHEVRON_DOWN : ICON_FA_CHEVRON_UP);
bool& bucket_collapsed = buckets_collapsed[std::make_pair(bucket.subset_id, bucket.bucket_type)];
const char* translated_bucket_name = Host::TranslateToCString("Achievements", bucket_names[bucket.bucket_type]);
if (bucket.subset_id != 0)
{
const rc_client_subset_t* subset_info = rc_client_get_subset_info(s_client, bucket.subset_id);
bucket_collapsed ^=
ImGuiFullscreen::MenuHeadingButton(TinyString::from_format("{} - {}",
subset_info != nullptr ? subset_info->title : TRANSLATE("Achievements", "Unknown Subset"),
translated_bucket_name), bucket_collapsed ? ICON_FA_CHEVRON_DOWN : ICON_FA_CHEVRON_UP);
}
else
{
// Game without subsets
bucket_collapsed ^=
ImGuiFullscreen::MenuHeadingButton(translated_bucket_name,
bucket_collapsed ? ICON_FA_CHEVRON_DOWN : ICON_FA_CHEVRON_UP);
}
if (!bucket_collapsed)
{
for (u32 i = 0; i < bucket.num_achievements; i++)

View File

@@ -4003,7 +4003,6 @@ __forceinline bool GSState::EarlyDetectShuffle(u32 prim)
const GSVertex* RESTRICT vertex = &m_vertex.buff[0];
const u16* RESTRICT index = &m_index.buff[0];
const GSVector4i& o = m_xyof;
if (GSLocalMemory::m_psm[m_context->FRAME.PSM].bpp == 16 && GSLocalMemory::m_psm[m_context->TEX0.PSM].bpp == 16)
{
@@ -4023,6 +4022,7 @@ __forceinline bool GSState::EarlyDetectShuffle(u32 prim)
{
const float q0 = vertex[index[0]].RGBAQ.Q == 0.0f ? FLT_MIN : vertex[index[0]].RGBAQ.Q;
u0 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[0]].ST.S / q0) * 16.0f);
const float qn = m_v.RGBAQ.Q == 0.0f ? FLT_MIN : m_v.RGBAQ.Q;
un = static_cast<int>((1 << m_context->TEX0.TW) * (m_v.ST.S / qn) * 16.0f);
}
@@ -4044,6 +4044,7 @@ __forceinline bool GSState::EarlyDetectShuffle(u32 prim)
const int x0 = static_cast<int>(vertex[index[0]].XYZ.X) - static_cast<int>(m_context->XYOFFSET.OFX);
const int y0 = static_cast<int>(vertex[index[0]].XYZ.Y) - static_cast<int>(m_context->XYOFFSET.OFY);
const int x1 = static_cast<int>(vertex[index[1]].XYZ.X) - static_cast<int>(m_context->XYOFFSET.OFX);
const int y1 = static_cast<int>(vertex[index[1]].XYZ.Y) - static_cast<int>(m_context->XYOFFSET.OFY);
@@ -4053,17 +4054,20 @@ __forceinline bool GSState::EarlyDetectShuffle(u32 prim)
{
u0 = static_cast<int>(vertex[index[0]].U);
v0 = static_cast<int>(vertex[index[0]].V);
u1 = static_cast<int>(vertex[index[1]].U);
v1 = static_cast<int>(vertex[index[1]].V);
}
else
{
const float q0 = vertex[index[0]].RGBAQ.Q == 0.0f ? FLT_MIN : vertex[index[0]].RGBAQ.Q;
u0 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[0]].ST.S / q0) * 16.0f);
v0 = static_cast<int>((1 << m_context->TEX0.TH) * (vertex[index[0]].ST.T / q0) * 16.0f);
// Sprites have constant Q so use the second.
const float q1 = vertex[index[1]].RGBAQ.Q == 0.0f ? FLT_MIN : vertex[index[1]].RGBAQ.Q;
u1 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[1]].ST.S / q0) * 16.0f);
v1 = static_cast<int>((1 << m_context->TEX0.TH) * (vertex[index[1]].ST.T / q0) * 16.0f);
u0 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[0]].ST.S / q1) * 16.0f);
v0 = static_cast<int>((1 << m_context->TEX0.TH) * (vertex[index[0]].ST.T / q1) * 16.0f);
u1 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[1]].ST.S / q1) * 16.0f);
v1 = static_cast<int>((1 << m_context->TEX0.TH) * (vertex[index[1]].ST.T / q1) * 16.0f);
}
// Check that the source and destination sprite are exactly 8 pixel squares.
@@ -4093,6 +4097,7 @@ __forceinline bool GSState::EarlyDetectShuffle(u32 prim)
const int x0 = static_cast<int>(vertex[index[0]].XYZ.X) - static_cast<int>(m_context->XYOFFSET.OFX);
const int y0 = static_cast<int>(vertex[index[0]].XYZ.Y) - static_cast<int>(m_context->XYOFFSET.OFY);
const int x1 = static_cast<int>(vertex[index[1]].XYZ.X) - static_cast<int>(m_context->XYOFFSET.OFX);
const int y1 = static_cast<int>(vertex[index[1]].XYZ.Y) - static_cast<int>(m_context->XYOFFSET.OFY);
@@ -4102,17 +4107,20 @@ __forceinline bool GSState::EarlyDetectShuffle(u32 prim)
{
u0 = static_cast<int>(vertex[index[0]].U);
v0 = static_cast<int>(vertex[index[0]].V);
u1 = static_cast<int>(vertex[index[1]].U);
v1 = static_cast<int>(vertex[index[1]].V);
}
else
{
const float q0 = vertex[index[0]].RGBAQ.Q == 0.0f ? FLT_MIN : vertex[index[0]].RGBAQ.Q;
u0 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[0]].ST.S / q0) * 16.0f);
v0 = static_cast<int>((1 << m_context->TEX0.TH) * (vertex[index[0]].ST.T / q0) * 16.0f);
// Sprites have constant Q so use the second.
const float q1 = vertex[index[1]].RGBAQ.Q == 0.0f ? FLT_MIN : vertex[index[1]].RGBAQ.Q;
u1 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[1]].ST.S / q0) * 16.0f);
v1 = static_cast<int>((1 << m_context->TEX0.TH) * (vertex[index[1]].ST.T / q0) * 16.0f);
u0 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[0]].ST.S / q1) * 16.0f);
v0 = static_cast<int>((1 << m_context->TEX0.TH) * (vertex[index[0]].ST.T / q1) * 16.0f);
u1 = static_cast<int>((1 << m_context->TEX0.TW) * (vertex[index[1]].ST.S / q1) * 16.0f);
v1 = static_cast<int>((1 << m_context->TEX0.TH) * (vertex[index[1]].ST.T / q1) * 16.0f);
}
// Check that the source and destination sprite are exactly 8 pixel squares.

View File

@@ -432,7 +432,7 @@ struct alignas(16) GSHWDrawConfig
{
const u32 sw_blend_bits = blend_a | blend_b | blend_d;
const bool sw_blend_needs_rt = (sw_blend_bits != 0 && ((sw_blend_bits | blend_c) & 1u)) || ((a_masked & blend_c) != 0);
return channel_fb || tex_is_fb || fbmask || (date > 0 && date != 3) || sw_blend_needs_rt;
return channel_fb || tex_is_fb || fbmask || (date >= 5) || sw_blend_needs_rt;
}
/// Disables color output from the pixel shader, this is done when all channels are masked.

View File

@@ -5876,9 +5876,9 @@ void GSRendererHW::EmulateBlending(int rt_alpha_min, int rt_alpha_max, const boo
case AccBlendLevel::Basic:
default:
// Prefer sw blend if possible.
color_dest_blend &= !prefer_sw_blend;
color_dest_blend2 &= !prefer_sw_blend;
blend_zero_to_one_range &= !prefer_sw_blend;
color_dest_blend &= !(m_channel_shuffle || m_conf.ps.dither);
color_dest_blend2 &= !(prefer_sw_blend || m_conf.ps.dither);
blend_zero_to_one_range &= !(prefer_sw_blend || m_conf.ps.dither);
accumulation_blend &= !prefer_sw_blend;
// Enable sw blending for barriers.
sw_blending |= blend_requires_barrier || prefer_sw_blend;
@@ -7681,7 +7681,7 @@ __ri void GSRendererHW::DrawPrims(GSTextureCache::Target* rt, GSTextureCache::Ta
}
// Similar to IsRTWritten(), check if the rt will change.
const bool no_rt = !rt || !(DATE || m_conf.colormask.wrgba || m_channel_shuffle);
const bool no_rt = !rt || !(m_conf.colormask.wrgba || m_channel_shuffle);
const bool no_ds = !ds ||
// Depth will be written through the RT.
(!no_rt && m_cached_ctx.FRAME.FBP == m_cached_ctx.ZBUF.ZBP && !PRIM->TME && m_cached_ctx.ZBUF.ZMSK == 0 &&

View File

@@ -36,6 +36,10 @@ namespace GLState
GSTextureOGL* rt = nullptr;
GSTextureOGL* ds = nullptr;
bool rt_written;
bool ds_written;
GLuint tex_unit[8];
GLuint64 tex_handle[8];
@@ -67,6 +71,10 @@ namespace GLState
rt = nullptr;
ds = nullptr;
rt_written = false;
ds_written = false;
std::fill(std::begin(tex_unit), std::end(tex_unit), 0);
std::fill(std::begin(tex_handle), std::end(tex_handle), 0);
}

View File

@@ -40,6 +40,10 @@ namespace GLState
extern GSTextureOGL* rt; // render target
extern GSTextureOGL* ds; // Depth-Stencil
extern bool rt_written; // Render Target written
extern bool ds_written; // Depth Stencil written
extern GLuint tex_unit[8]; // shader input texture
extern GLuint64 tex_handle[8]; // shader input texture

View File

@@ -2305,26 +2305,35 @@ void GSDeviceOGL::OMSetBlendState(bool enable, GLenum src_factor, GLenum dst_fac
void GSDeviceOGL::OMSetRenderTargets(GSTexture* rt, GSTexture* ds, const GSVector4i* scissor)
{
g_perfmon.Put(GSPerfMon::RenderPasses, static_cast<double>(GLState::rt != rt || GLState::ds != ds));
const bool rt_changed = (rt != GLState::rt);
const bool ds_changed = (ds != GLState::ds);
g_perfmon.Put(GSPerfMon::RenderPasses, static_cast<double>(rt_changed || ds_changed));
// Split up to avoid unbind/bind calls when clearing.
OMSetFBO(m_fbo);
GLState::rt_written = false;
GLState::ds_written = false;
if (rt)
{
OMAttachRt(rt);
CommitClear(rt, false);
GLState::rt_written = rt_changed;
}
else
OMAttachRt();
if (ds)
{
OMAttachDs(ds);
CommitClear(ds, false);
GLState::ds_written = ds_changed;
}
else
OMAttachDs();
if (rt)
CommitClear(rt, false);
if (ds)
CommitClear(ds, false);
if (rt || ds)
{
const GSVector2i size = rt ? rt->GetSize() : ds->GetSize();
@@ -2578,14 +2587,6 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config)
if (config.require_one_barrier || !m_features.texture_barrier)
rt_hazard_barrier = false; // Already in place or not available
// Be careful of the rt already being bound and the blend using the RT without a barrier.
if (rt_hazard_barrier)
{
// Ensure all depth writes are finished before sampling
GL_INS("GL: Texture barrier to flush depth or rt before reading");
g_perfmon.Put(GSPerfMon::Barriers, 1);
glTextureBarrier();
}
// additional non-pipeline config stuff
const bool point_size_enabled = config.vs.point_size;
if (GLState::point_size != point_size_enabled)
@@ -2644,15 +2645,27 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config)
// avoid changing framebuffer just to switch from rt+depth to rt and vice versa
GSTexture* draw_rt = colclip_rt ? colclip_rt : config.rt;
GSTexture* draw_ds = config.ds;
bool fb_optimization_needs_barrier = false;
if (!draw_rt && GLState::rt && GLState::ds == draw_ds && config.tex != GLState::rt &&
GLState::rt->GetSize() == draw_ds->GetSize())
{
draw_rt = GLState::rt;
fb_optimization_needs_barrier = !GLState::rt_written;
}
else if (!draw_ds && GLState::ds && GLState::rt == draw_rt && config.tex != GLState::ds &&
GLState::ds->GetSize() == draw_rt->GetSize())
{
draw_ds = GLState::ds;
fb_optimization_needs_barrier = !GLState::ds_written;
}
// Be careful of the rt already being bound and the blend using the RT without a barrier.
if (fb_optimization_needs_barrier && rt_hazard_barrier)
{
// Ensure all depth writes are finished before sampling
GL_INS("GL: Texture barrier to flush depth or rt before reading");
g_perfmon.Put(GSPerfMon::Barriers, 1);
glTextureBarrier();
}
OMSetRenderTargets(draw_rt, draw_ds, &config.scissor);

View File

@@ -1038,7 +1038,9 @@ void FullscreenUI::CheckForConfigChanges(const Pcsx2Config& old_config)
ImGuiFullscreen::SetTheme(Host::GetBaseStringSettingValue("UI", "FullscreenUITheme", "Dark"));
LoadCustomBackground();
MTGS::RunOnGSThread([]() {
LoadCustomBackground();
});
// If achievements got disabled, we might have the menu open...
// That means we're going to be reaching achievement state.
@@ -4034,17 +4036,17 @@ void FullscreenUI::DrawInterfaceSettingsPage()
[](const std::string& path) {
if (!path.empty())
{
auto lock = Host::GetSettingsLock();
SettingsInterface* bsi = GetEditingSettingsInterface(false);
{
auto lock = Host::GetSettingsLock();
SettingsInterface* bsi = GetEditingSettingsInterface(false);
std::string relative_path = Path::MakeRelative(path, EmuFolders::DataRoot);
bsi->SetStringValue("UI", "GameListBackgroundPath", relative_path.c_str());
bsi->SetBoolValue("UI", "GameListBackgroundEnabled", true);
SetSettingsChanged(bsi);
}
std::string relative_path = Path::MakeRelative(path, EmuFolders::DataRoot);
bsi->SetStringValue("UI", "GameListBackgroundPath", relative_path.c_str());
bsi->SetBoolValue("UI", "GameListBackgroundEnabled", true);
SetSettingsChanged(bsi);
Host::RunOnCPUThread([]() {
LoadCustomBackground();
});
LoadCustomBackground();
}
CloseFileSelector();
},

View File

@@ -4,7 +4,6 @@
#include "BuildVersion.h"
#include "Config.h"
#include "Counters.h"
#include "GS.h"
#include "GS/GS.h"
#include "GS/GSCapture.h"
#include "GS/GSVector.h"
@@ -32,7 +31,6 @@
#include "common/Error.h"
#include "common/FileSystem.h"
#include "common/Path.h"
#include "common/StringUtil.h"
#include "common/Timer.h"
#include "fmt/chrono.h"
@@ -40,14 +38,10 @@
#include "imgui.h"
#include <array>
#include <chrono>
#include <cmath>
#include <deque>
#include <limits>
#include <mutex>
#include <span>
#include <tuple>
#include <unordered_map>
InputRecordingUI::InputRecordingData g_InputRecordingData;
@@ -108,7 +102,7 @@ ImVec2 CalculateOSDPosition(OsdOverlayPos position, float margin, const ImVec2&
ImVec2 CalculatePerformanceOverlayTextPosition(OsdOverlayPos position, float margin, const ImVec2& text_size, float window_width, float position_y)
{
const float abs_margin = std::abs(margin);
// Get the X position based on horizontal alignment
float x_pos;
switch (position)
@@ -118,13 +112,13 @@ ImVec2 CalculatePerformanceOverlayTextPosition(OsdOverlayPos position, float mar
case OsdOverlayPos::BottomLeft:
x_pos = abs_margin; // Left alignment
break;
case OsdOverlayPos::TopCenter:
case OsdOverlayPos::Center:
case OsdOverlayPos::BottomCenter:
x_pos = (window_width - text_size.x) * 0.5f; // Center alignment
break;
case OsdOverlayPos::TopRight:
case OsdOverlayPos::CenterRight:
case OsdOverlayPos::BottomRight:
@@ -132,7 +126,7 @@ ImVec2 CalculatePerformanceOverlayTextPosition(OsdOverlayPos position, float mar
x_pos = window_width - text_size.x - abs_margin; // Right alignment
break;
}
return ImVec2(x_pos, position_y);
}
@@ -150,6 +144,7 @@ namespace ImGuiManager
static void DrawInputRecordingOverlay(float& position_y, float scale, float margin, float spacing);
static void DrawVideoCaptureOverlay(float& position_y, float scale, float margin, float spacing);
static void DrawTextureReplacementsOverlay(float& position_y, float scale, float margin, float spacing);
static void DrawIndicatorsOverlay(float& position_y, float scale, float margin, float spacing);
} // namespace ImGuiManager
static std::tuple<float, float> GetMinMax(std::span<const float> values)
@@ -194,7 +189,6 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f
const float shadow_offset = std::ceil(scale);
ImFont* const fixed_font = ImGuiManager::GetFixedFont();
ImFont* const standard_font = ImGuiManager::GetStandardFont();
const float font_size = ImGuiManager::GetFontSizeStandard();
ImDrawList* dl = ImGui::GetBackgroundDrawList();
@@ -209,14 +203,14 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f
position_y = (GetWindowHeight() - (font_size * 8.0f)) * 0.5f;
break;
case OsdOverlayPos::BottomLeft:
case OsdOverlayPos::BottomCenter:
case OsdOverlayPos::BottomRight:
position_y = GetWindowHeight() - margin - (font_size * 15.0f + spacing * 14.0f);
break;
case OsdOverlayPos::TopLeft:
case OsdOverlayPos::TopCenter:
case OsdOverlayPos::TopRight:
@@ -389,24 +383,6 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f
FormatProcessorStat(s_gpu_usage_line, PerformanceMetrics::GetGPUUsage(), PerformanceMetrics::GetGPUAverageTime());
DRAW_LINE(fixed_font, font_size, s_gpu_usage_line.c_str(), white_color);
}
if (GSConfig.OsdShowIndicators)
{
const float target_speed = VMManager::GetTargetSpeed();
const bool is_normal_speed = (target_speed == EmuConfig.EmulationSpeed.NominalScalar ||
VMManager::IsTargetSpeedAdjustedToHost());
if (!is_normal_speed)
{
if (target_speed == EmuConfig.EmulationSpeed.SlomoScalar) // Slow-Motion
s_speed_icon = ICON_PF_SLOW_MOTION;
else if (target_speed == EmuConfig.EmulationSpeed.TurboScalar) // Turbo
s_speed_icon = ICON_FA_FORWARD_FAST;
else // Unlimited
s_speed_icon = ICON_FA_FORWARD;
DRAW_LINE(standard_font, font_size, s_speed_icon, white_color);
}
}
}
// No refresh yet. Display cached lines.
else
@@ -451,14 +427,6 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f
if (GSConfig.OsdShowGPU)
DRAW_LINE(fixed_font, font_size, s_gpu_usage_line.c_str(), white_color);
if (GSConfig.OsdShowIndicators)
{
const bool is_normal_speed = (VMManager::GetTargetSpeed() == EmuConfig.EmulationSpeed.NominalScalar ||
VMManager::IsTargetSpeedAdjustedToHost());
if (!is_normal_speed)
DRAW_LINE(standard_font, font_size, s_speed_icon, white_color);
}
}
// Check every OSD frame because this is an animation.
@@ -466,7 +434,7 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f
{
const ImVec2 history_size(200.0f * scale, 50.0f * scale);
ImGui::SetNextWindowSize(ImVec2(history_size.x, history_size.y));
const ImVec2 window_pos = CalculatePerformanceOverlayTextPosition(GSConfig.OsdPerformancePos, margin, history_size, GetWindowWidth(), position_y);
ImGui::SetNextWindowPos(window_pos);
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.0f, 0.0f, 0.0f, 0.25f));
@@ -505,7 +473,7 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f
SmallString frame_times_text;
frame_times_text.format("Max: {:.1f} ms", max);
text_size = fixed_font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, frame_times_text.c_str(), frame_times_text.c_str() + frame_times_text.length());
float text_x;
switch (GSConfig.OsdPerformancePos)
{
@@ -533,7 +501,7 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f
frame_times_text.format("Min: {:.1f} ms", min);
text_size = fixed_font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, frame_times_text.c_str(), frame_times_text.c_str() + frame_times_text.length());
float min_text_x;
switch (GSConfig.OsdPerformancePos)
{
@@ -565,17 +533,6 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f
ImGui::PopStyleColor(3);
}
}
else if (!FullscreenUI::HasActiveWindow())
{
if (GSConfig.OsdShowIndicators)
{
// We should put the Pause icon in the top right regardless of performance overlay position
text_size = standard_font->CalcTextSizeA(font_size, std::numeric_limits<float>::max(), -1.0f, ICON_FA_PAUSE, nullptr, nullptr);
const ImVec2 pause_pos(GetWindowWidth() - margin - text_size.x, margin);
dl->AddText(standard_font, font_size, ImVec2(pause_pos.x + shadow_offset, pause_pos.y + shadow_offset), IM_COL32(0, 0, 0, 100), ICON_FA_PAUSE);
dl->AddText(standard_font, font_size, pause_pos, white_color, ICON_FA_PAUSE);
}
}
#undef DRAW_LINE
}
@@ -596,10 +553,10 @@ __ri void ImGuiManager::DrawSettingsOverlay(float scale, float margin, float spa
} while (0)
if (Patch::GetAllActivePatchesCount() > 0 && EmuConfig.GS.OsdshowPatches)
APPEND("DB={} P={} C={} | ",
Patch::GetActiveGameDBPatchesCount(),
Patch::GetActivePatchesCount(),
Patch::GetActiveCheatsCount());
APPEND("DB={} P={} C={} | ",
Patch::GetActiveGameDBPatchesCount(),
Patch::GetActivePatchesCount(),
Patch::GetActiveCheatsCount());
if (EmuConfig.Speedhacks.EECycleRate != 0)
APPEND("CR={} ", EmuConfig.Speedhacks.EECycleRate);
@@ -988,6 +945,60 @@ __ri void ImGuiManager::DrawTextureReplacementsOverlay(float& position_y, float
position_y += text_size.y + spacing;
}
__ri void ImGuiManager::DrawIndicatorsOverlay(float& position_y, float scale, float margin, float spacing)
{
if (!GSConfig.OsdShowIndicators ||
FullscreenUI::HasActiveWindow())
return;
const float shadow_offset = std::ceil(scale);
ImFont* const standard_font = ImGuiManager::GetStandardFont();
const float font_size = ImGuiManager::GetFontSizeStandard();
ImDrawList* dl = ImGui::GetBackgroundDrawList();
std::string text;
ImVec2 text_size;
text.reserve(64);
#define DRAW_LINE(font, size, text, color) \
do \
{ \
text_size = font->CalcTextSizeA(size, std::numeric_limits<float>::max(), -1.0f, (text), nullptr, nullptr); \
dl->AddText(font, size, \
ImVec2(GetWindowWidth() - margin - text_size.x + shadow_offset, position_y + shadow_offset), \
IM_COL32(0, 0, 0, 100), (text)); \
dl->AddText(font, size, ImVec2(GetWindowWidth() - margin - text_size.x, position_y), color, (text)); \
position_y += text_size.y + spacing; \
} while (0)
if (VMManager::GetState() != VMState::Paused)
{
// Draw Speed indicator
const float target_speed = VMManager::GetTargetSpeed();
const bool is_normal_speed = (target_speed == EmuConfig.EmulationSpeed.NominalScalar ||
VMManager::IsTargetSpeedAdjustedToHost());
if (!is_normal_speed)
{
if (target_speed == EmuConfig.EmulationSpeed.SlomoScalar) // Slow-Motion
s_speed_icon = ICON_PF_SLOW_MOTION;
else if (target_speed == EmuConfig.EmulationSpeed.TurboScalar) // Turbo
s_speed_icon = ICON_FA_FORWARD_FAST;
else // Unlimited
s_speed_icon = ICON_FA_FORWARD;
DRAW_LINE(standard_font, font_size, s_speed_icon, white_color);
}
}
else
{
// Draw Pause indicator
const TinyString pause_msg = TinyString::from_format(TRANSLATE_FS("ImGuiOverlays", "{} Paused"), ICON_FA_PAUSE);
DRAW_LINE(standard_font, font_size, pause_msg, white_color);
}
#undef DRAW_LINE
}
namespace SaveStateSelectorUI
{
namespace
@@ -1068,7 +1079,8 @@ void SaveStateSelectorUI::Open(float open_time /* = DEFAULT_OPEN_TIME */)
RefreshHotkeyLegend();
}
bool SaveStateSelectorUI::IsOpen(){
bool SaveStateSelectorUI::IsOpen()
{
return s_open;
}
@@ -1418,9 +1430,10 @@ void ImGuiManager::RenderOverlays()
{
const float scale = ImGuiManager::GetGlobalScale();
const float margin = std::ceil(10.0f * scale);
const float spacing = std::ceil(5.0f * scale);
const float spacing = std::ceil(5.0f * scale);
float position_y = margin;
DrawIndicatorsOverlay(position_y, scale, margin, spacing);
DrawVideoCaptureOverlay(position_y, scale, margin, spacing);
DrawInputRecordingOverlay(position_y, scale, margin, spacing);
DrawTextureReplacementsOverlay(position_y, scale, margin, spacing);

View File

@@ -24,7 +24,7 @@ static bool intExitExecution = false;
static fastjmp_buf intJmpBuf;
static u32 intLastBranchTo;
static void intEventTest();
void intEventTest();
void intUpdateCPUCycles()
{
@@ -548,7 +548,7 @@ static void intReset()
branch2 = 0;
}
static void intEventTest()
void intEventTest()
{
// Perform counters, ints, and IOP updates:
_cpuEventTest_Shared();

View File

@@ -673,7 +673,7 @@ const char* Pcsx2Config::GSOptions::DEFAULT_CAPTURE_CONTAINER = "mp4";
const char* Pcsx2Config::AchievementsOptions::OverlayPositionNames[(size_t)AchievementOverlayPosition::MaxCount + 1] = {
"TopLeft",
"TopCenter",
"TopCenter",
"TopRight",
"CenterLeft",
"Center",
@@ -741,7 +741,7 @@ Pcsx2Config::GSOptions::GSOptions()
OsdShowInputs = false;
OsdShowVideoCapture = true;
OsdShowInputRec = true;
OsdShowTextureReplacements = true;
OsdShowTextureReplacements = false;
HWDownloadMode = GSHardwareDownloadMode::Enabled;
HWSpinGPUForReadbacks = false;
@@ -1906,7 +1906,7 @@ void Pcsx2Config::AchievementsOptions::LoadSave(SettingsWrapper& wrap)
bool Pcsx2Config::AchievementsOptions::operator==(const AchievementsOptions& right) const
{
return OpEqu(bitset) && OpEqu(NotificationsDuration) && OpEqu(LeaderboardsDuration) &&
return OpEqu(bitset) && OpEqu(NotificationsDuration) && OpEqu(LeaderboardsDuration) &&
OpEqu(OverlayPosition) && OpEqu(NotificationPosition);
}

View File

@@ -283,6 +283,7 @@ static fpuRegisters& fpuRegs = _cpuRegistersPack.fpuRegs;
extern bool eeEventTestIsActive;
void intUpdateCPUCycles();
void intEventTest();
void intSetBranch();
// This is a special form of the interpreter's doBranch that is run from various

View File

@@ -524,6 +524,13 @@ void LB()
if (!_Rt_) return;
cpuRegs.GPR.r[_Rt_].SD[0] = temp;
// Force event test on EE counter read to improve read + interrupt syncing. Namely ESPN Games.
if ((addr & 0xFFFFE0000) == 0x10000000)
{
intUpdateCPUCycles();
intEventTest();
}
}
void LBU()
@@ -533,6 +540,13 @@ void LBU()
if (!_Rt_) return;
cpuRegs.GPR.r[_Rt_].UD[0] = temp;
// Force event test on EE counter read to improve read + interrupt syncing. Namely ESPN Games.
if ((addr & 0xFFFFE0000) == 0x10000000)
{
intUpdateCPUCycles();
intEventTest();
}
}
void LH()
@@ -546,6 +560,13 @@ void LH()
if (!_Rt_) return;
cpuRegs.GPR.r[_Rt_].SD[0] = temp;
// Force event test on EE counter read to improve read + interrupt syncing. Namely ESPN Games.
if ((addr & 0xFFFFE0000) == 0x10000000)
{
intUpdateCPUCycles();
intEventTest();
}
}
void LHU()
@@ -559,6 +580,13 @@ void LHU()
if (!_Rt_) return;
cpuRegs.GPR.r[_Rt_].UD[0] = temp;
// Force event test on EE counter read to improve read + interrupt syncing. Namely ESPN Games.
if ((addr & 0xFFFFE0000) == 0x10000000)
{
intUpdateCPUCycles();
intEventTest();
}
}
void LW()
@@ -572,6 +600,13 @@ void LW()
if (!_Rt_) return;
cpuRegs.GPR.r[_Rt_].SD[0] = (s32)temp;
// Force event test on EE counter read to improve read + interrupt syncing. Namely ESPN Games.
if ((addr & 0xFFFFE0000) == 0x10000000)
{
intUpdateCPUCycles();
intEventTest();
}
}
void LWU()

View File

@@ -107,9 +107,15 @@ static void recLoad(u32 bits, bool sign)
alloc_cb = []() { return _allocX86reg(X86TYPE_GPR, _Rt_, MODE_WRITE); };
int x86reg;
bool needs_flush = false;
if (GPR_IS_CONST1(_Rs_))
{
const u32 srcadr = g_cpuConstRegs[_Rs_].UL[0] + _Imm_;
// Force event test on EE counter read to improve read + interrupt syncing. Namely ESPN Games.
if (bits <= 32 && (srcadr & 0xFFFFE0000) == 0x10000000)
needs_flush = true;
x86reg = vtlb_DynGenReadNonQuad_Const(bits, sign, false, srcadr, alloc_cb);
}
else
@@ -127,6 +133,12 @@ static void recLoad(u32 bits, bool sign)
pxAssert(!_Rt_ || !GPR_IS_CONST1(_Rt_));
if (!_Rt_)
_freeX86reg(x86reg);
if (bits <= 32 && needs_flush)
{
iFlushCall(FLUSH_INTERPRETER);
g_branch = 2;
}
}
//////////////////////////////////////////////////////////////////////////////////////////