diff --git a/pcsx2/Linux/AdvancedDlg.cpp b/pcsx2/Linux/AdvancedDlg.cpp
index 72ed0b8470..abb8f16bb0 100644
--- a/pcsx2/Linux/AdvancedDlg.cpp
+++ b/pcsx2/Linux/AdvancedDlg.cpp
@@ -74,6 +74,9 @@ void setAdvancedOptions()
case FLAG_EE_CLAMP_EXTRA_PRESERVE:
set_checked(AdvDlg, "radio_EE_Clamp_Extra_Preserve", TRUE);
break;
+ case FLAG_EE_CLAMP_FULL:
+ set_checked(AdvDlg, "radio_EE_Clamp_Full", TRUE);
+ break;
}
switch (Config.vuOptions)
@@ -145,6 +148,7 @@ void on_Advanced_OK(GtkButton *button, gpointer user_data)
Config.eeOptions |= is_checked(AdvDlg, "radio_EE_Clamp_None") ? FLAG_EE_CLAMP_NONE : 0;
Config.eeOptions |= is_checked(AdvDlg, "radio_EE_Clamp_Normal") ? FLAG_EE_CLAMP_NORMAL : 0;
Config.eeOptions |= is_checked(AdvDlg, "radio_EE_Clamp_Extra_Preserve") ? FLAG_EE_CLAMP_EXTRA_PRESERVE : 0;
+ Config.eeOptions |= is_checked(AdvDlg, "radio_EE_Clamp_Full") ? FLAG_EE_CLAMP_FULL : 0;
Config.vuOptions |= is_checked(AdvDlg, "radio_VU_Clamp_None") ? FLAG_VU_CLAMP_NONE : 0;
Config.vuOptions |= is_checked(AdvDlg, "radio_VU_Clamp_Normal") ? FLAG_VU_CLAMP_NORMAL : 0;
diff --git a/pcsx2/Linux/HacksDlg.cpp b/pcsx2/Linux/HacksDlg.cpp
index 56ce622fd5..7d77378199 100644
--- a/pcsx2/Linux/HacksDlg.cpp
+++ b/pcsx2/Linux/HacksDlg.cpp
@@ -25,6 +25,7 @@ GtkWidget *GameFixDlg, *SpeedHacksDlg;
GameFixDlg = create_GameFixDlg();
set_checked(GameFixDlg, "check_VU_Add_Sub", (Config.GameFixes & FLAG_VU_ADD_SUB));
+ set_checked(GameFixDlg, "check_VU_Clip", (Config.GameFixes & FLAG_VU_CLIP));
set_checked(GameFixDlg, "check_FPU_Clamp", (Config.GameFixes & FLAG_FPU_CLAMP));
gtk_widget_show_all(GameFixDlg);
@@ -37,6 +38,7 @@ void on_Game_Fix_OK(GtkButton *button, gpointer user_data)
Config.GameFixes = 0;
Config.GameFixes |= is_checked(GameFixDlg, "check_VU_Add_Sub") ? FLAG_VU_ADD_SUB : 0;
+ Config.GameFixes |= is_checked(GameFixDlg, "check_VU_Clip") ? FLAG_VU_CLIP : 0;
Config.GameFixes |= is_checked(GameFixDlg, "check_FPU_Clamp") ? FLAG_FPU_CLAMP : 0;
SaveConfig();
diff --git a/pcsx2/Linux/Linux.h b/pcsx2/Linux/Linux.h
index 7065d65a01..af627516d8 100644
--- a/pcsx2/Linux/Linux.h
+++ b/pcsx2/Linux/Linux.h
@@ -102,6 +102,7 @@ char iop_log_names[9][32] =
};
#define FLAG_VU_ADD_SUB 0x1
+#define FLAG_VU_CLIP 0x2
#define FLAG_FPU_CLAMP 0x4
#define FLAG_VU_FCOR_HACK 0x8
#define FLAG_AVOID_DELAY_HANDLING 0x10
@@ -133,5 +134,6 @@ char iop_log_names[9][32] =
#define FLAG_EE_CLAMP_NONE 0x0
#define FLAG_EE_CLAMP_NORMAL 0x1
#define FLAG_EE_CLAMP_EXTRA_PRESERVE 0x3
+#define FLAG_EE_CLAMP_FULL 0x7
#endif /* __LINUX_H__ */
diff --git a/pcsx2/Linux/interface.c b/pcsx2/Linux/interface.c
index 419a84cad3..d544f51a1c 100644
--- a/pcsx2/Linux/interface.c
+++ b/pcsx2/Linux/interface.c
@@ -52,6 +52,8 @@ create_AdvDlg (void)
GSList *radio_EE_Clamp_None_group = NULL;
GtkWidget *radio_EE_Clamp_Normal;
GtkWidget *radio_EE_Clamp_Extra_Preserve;
+ GtkWidget *radio_EE_Clamp_Full;
+ GSList *radio_EE_Clamp_Full_group = NULL;
GtkWidget *label73;
GtkWidget *hbox34;
GtkWidget *check_EE_Flush_Zero;
@@ -206,6 +208,13 @@ create_AdvDlg (void)
gtk_radio_button_set_group (GTK_RADIO_BUTTON (radio_EE_Clamp_Extra_Preserve), radio_EE_Clamp_None_group);
radio_EE_Clamp_None_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_EE_Clamp_Extra_Preserve));
+ radio_EE_Clamp_Full = gtk_radio_button_new_with_mnemonic (NULL, _("Full"));
+ gtk_widget_show (radio_EE_Clamp_Full);
+ gtk_box_pack_start (GTK_BOX (hbox37), radio_EE_Clamp_Full, TRUE, TRUE, 0);
+ gtk_radio_button_set_group (GTK_RADIO_BUTTON (radio_EE_Clamp_Full), radio_EE_Clamp_Full_group);
+ radio_EE_Clamp_Full_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_EE_Clamp_Full));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_EE_Clamp_Full), TRUE);
+
label73 = gtk_label_new (_("Clamp Mode"));
gtk_widget_show (label73);
gtk_frame_set_label_widget (GTK_FRAME (frame27), label73);
@@ -478,6 +487,7 @@ create_AdvDlg (void)
GLADE_HOOKUP_OBJECT (AdvDlg, radio_EE_Clamp_None, "radio_EE_Clamp_None");
GLADE_HOOKUP_OBJECT (AdvDlg, radio_EE_Clamp_Normal, "radio_EE_Clamp_Normal");
GLADE_HOOKUP_OBJECT (AdvDlg, radio_EE_Clamp_Extra_Preserve, "radio_EE_Clamp_Extra_Preserve");
+ GLADE_HOOKUP_OBJECT (AdvDlg, radio_EE_Clamp_Full, "radio_EE_Clamp_Full");
GLADE_HOOKUP_OBJECT (AdvDlg, label73, "label73");
GLADE_HOOKUP_OBJECT (AdvDlg, hbox34, "hbox34");
GLADE_HOOKUP_OBJECT (AdvDlg, check_EE_Flush_Zero, "check_EE_Flush_Zero");
@@ -779,6 +789,7 @@ create_GameFixDlg (void)
GtkWidget *vbox30;
GtkWidget *check_FPU_Clamp;
GtkWidget *check_VU_Add_Sub;
+ GtkWidget *check_VU_Clip;
GtkWidget *label42;
GtkWidget *dialog_action_area1;
GtkWidget *cancelbutton1;
@@ -813,6 +824,10 @@ create_GameFixDlg (void)
gtk_widget_show (check_VU_Add_Sub);
gtk_box_pack_start (GTK_BOX (vbox30), check_VU_Add_Sub, FALSE, FALSE, 0);
+ check_VU_Clip = gtk_check_button_new_with_mnemonic (_("VU Clip Hack - Special fix for God of War"));
+ gtk_widget_show (check_VU_Clip);
+ gtk_box_pack_start (GTK_BOX (vbox30), check_VU_Clip, FALSE, TRUE, 0);
+
label42 = gtk_label_new (_("Some games need special settings.\nConfigure them here."));
gtk_widget_show (label42);
gtk_frame_set_label_widget (GTK_FRAME (GameSettings), label42);
@@ -847,6 +862,7 @@ create_GameFixDlg (void)
GLADE_HOOKUP_OBJECT (GameFixDlg, vbox30, "vbox30");
GLADE_HOOKUP_OBJECT (GameFixDlg, check_FPU_Clamp, "check_FPU_Clamp");
GLADE_HOOKUP_OBJECT (GameFixDlg, check_VU_Add_Sub, "check_VU_Add_Sub");
+ GLADE_HOOKUP_OBJECT (GameFixDlg, check_VU_Clip, "check_VU_Clip");
GLADE_HOOKUP_OBJECT (GameFixDlg, label42, "label42");
GLADE_HOOKUP_OBJECT_NO_REF (GameFixDlg, dialog_action_area1, "dialog_action_area1");
GLADE_HOOKUP_OBJECT (GameFixDlg, cancelbutton1, "cancelbutton1");
diff --git a/pcsx2/Linux/pcsx2.glade b/pcsx2/Linux/pcsx2.glade
index df2a962462..1f8b737d8d 100644
--- a/pcsx2/Linux/pcsx2.glade
+++ b/pcsx2/Linux/pcsx2.glade
@@ -175,6 +175,19 @@
2
+
+
+ True
+ True
+ Full
+ 0
+ True
+ True
+
+
+ 3
+
+
@@ -1133,6 +1146,19 @@ Known to work well with a couple games, namely Shadow of the Colossus (but break
1
+
+
+ True
+ True
+ VU Clip Hack - Special fix for God of War
+ 0
+ True
+
+
+ False
+ 2
+
+
diff --git a/pcsx2/x86/Makefile.am b/pcsx2/x86/Makefile.am
index b2142705c2..519e5a72d1 100644
--- a/pcsx2/x86/Makefile.am
+++ b/pcsx2/x86/Makefile.am
@@ -9,7 +9,7 @@ ix86-32/iR5900LoadStore.cpp ix86-32/iR5900MultDiv.cpp ix86-32/iCore-32.cpp ix86
ix86-32/iR5900Templates.cpp ix86-32/recVTLB.cpp
libx86recomp_a_SOURCES = \
-BaseblockEx.cpp iCOP0.cpp iCOP2.cpp iCore.cpp iFPU.cpp iGS.cpp iHw.cpp iIPU.cpp iMMI.cpp iPsxHw.cpp iPsxMem.cpp \
+BaseblockEx.cpp iCOP0.cpp iCOP2.cpp iCore.cpp iFPU.cpp iFPUd.cpp iGS.cpp iHw.cpp iIPU.cpp iMMI.cpp iPsxHw.cpp iPsxMem.cpp \
iR3000A.cpp iR3000Atables.cpp iR5900CoissuedLoadStore.cpp iR5900Misc.cpp iVU0micro.cpp iVU1micro.cpp iVUmicro.cpp \
iVUmicroLower.cpp iVUmicroUpper.cpp iVUzerorec.cpp iVif.cpp ir5900tables.cpp fast_routines.S aR3000A.S aVUzerorec.S \
aVif.S $(archfiles)