Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better control profile for Retroid devices, minor fixes and cleanup #19550

Merged
merged 8 commits into from
Oct 23, 2024
Merged
2 changes: 0 additions & 2 deletions Common/CPUDetect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -546,8 +546,6 @@ std::string CPUInfo::Summarize() {
const char *GetCompilerABI() {
#if PPSSPP_ARCH(ARMV7)
return "armeabi-v7a";
#elif PPSSPP_ARCH(ARM)
return "armeabi";
#elif PPSSPP_ARCH(ARM64)
return "arm64";
#elif PPSSPP_ARCH(X86)
Expand Down
4 changes: 2 additions & 2 deletions Common/Render/Text/draw_text_android.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ void TextDrawerAndroid::MeasureStringInternal(std::string_view str, float *w, fl
*w = (float)(size >> 16);
*h = (float)(size & 0xFFFF);

WARN_LOG(Log::G3D, "Measure Modified: '%.*s' size: %fx%f", (int)text.length(), text.data(), *w, *h);
// WARN_LOG(Log::G3D, "Measure Modified: '%.*s' size: %fx%f", (int)text.length(), text.data(), *w, *h);
}

bool TextDrawerAndroid::DrawStringBitmap(std::vector<uint8_t> &bitmapData, TextStringEntry &entry, Draw::DataFormat texFormat, std::string_view str, int align, bool fullColor) {
Expand Down Expand Up @@ -124,7 +124,7 @@ bool TextDrawerAndroid::DrawStringBitmap(std::vector<uint8_t> &bitmapData, TextS
imageWidth = 1;
if (imageHeight <= 0)
imageHeight = 1;
WARN_LOG(Log::G3D, "Text: '%.*s' (%02x)", (int)str.length(), str.data(), str[0]);
// WARN_LOG(Log::G3D, "Text: '%.*s' (%02x)", (int)str.length(), str.data(), str[0]);

jintArray imageData = (jintArray)env->CallStaticObjectMethod(cls_textRenderer, method_renderText, jstr, size);
env->DeleteLocalRef(jstr);
Expand Down
4 changes: 2 additions & 2 deletions Common/UI/Context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void UIContext::Begin() {

void UIContext::BeginNoTex() {
draw_->BindSamplerStates(0, 1, &sampler_);
UIBegin(ui_pipeline_notex_);
ui_draw2d.Begin(ui_pipeline_notex_);
}

void UIContext::BeginPipeline(Draw::Pipeline *pipeline, Draw::SamplerState *samplerState) {
Expand All @@ -89,7 +89,7 @@ void UIContext::BeginPipeline(Draw::Pipeline *pipeline, Draw::SamplerState *samp
Draw::Texture *textures[2]{};
draw_->BindTextures(1, 2, textures);
RebindTexture();
UIBegin(pipeline);
ui_draw2d.Begin(pipeline);
}

void UIContext::RebindTexture() const {
Expand Down
2 changes: 1 addition & 1 deletion Common/UI/PopupScreens.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,12 @@ void PopupMultiChoice::ChoiceCallback(int num) {
UI::EventParams e{};
e.v = this;
e.a = num;
e.b = PostChoiceCallback(num);
OnChoice.Trigger(e);

if (restoreFocus_) {
SetFocusedView(this);
}
PostChoiceCallback(num);
}
}

Expand Down
12 changes: 9 additions & 3 deletions Common/UI/PopupScreens.h
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ class PopupMultiChoice : public AbstractChoiceWithValueDisplay {
UI::EventReturn HandleClick(UI::EventParams &e);

void ChoiceCallback(int num);
virtual void PostChoiceCallback(int num) {}
virtual bool PostChoiceCallback(int num) { return true; }

I18NCat category_;
ScreenManager *screenManager_;
Expand Down Expand Up @@ -274,9 +274,15 @@ class PopupMultiChoiceDynamic : public PopupMultiChoice {
}

protected:
void PostChoiceCallback(int num) override {
if (valueStr_) {
bool PostChoiceCallback(int num) override {
if (!valueStr_) {
return true;
}
if (*valueStr_ != choices_[num]) {
*valueStr_ = choices_[num];
return true;
} else {
return false;
}
}

Expand Down
9 changes: 0 additions & 9 deletions Common/UI/UI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,3 @@

// TODO: UI should probably not own these.
DrawBuffer ui_draw2d;
DrawBuffer ui_draw2d_front;

void UIBegin(Draw::Pipeline *pipeline) {
ui_draw2d.Begin(pipeline);
}

void UIFlush() {
ui_draw2d.Flush();
}
6 changes: 0 additions & 6 deletions Common/UI/UI.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,3 @@ class StringVectorListAdapter : public UIListAdapter {
private:
const std::vector<std::string> *items_;
};


// Begins/flushes the two UI drawbuffers together.
void UIBegin(Draw::Pipeline *shaderSet);
void UIFlush();

19 changes: 14 additions & 5 deletions Core/Config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -726,6 +726,19 @@ static bool DefaultShowTouchControls() {
}
}

static bool DefaultShowPauseButton() {
switch (System_GetPropertyInt(SYSPROP_DEVICE_TYPE)) {
case DEVICE_TYPE_MOBILE:
case DEVICE_TYPE_DESKTOP:
return true;
case DEVICE_TYPE_VR:
case DEVICE_TYPE_TV:
return false;
default:
return false;
}
}

static const float defaultControlScale = 1.15f;
static const ConfigTouchPos defaultTouchPosShow = { -1.0f, -1.0f, defaultControlScale, true };
static const ConfigTouchPos defaultTouchPosHide = { -1.0f, -1.0f, defaultControlScale, false };
Expand Down Expand Up @@ -779,13 +792,9 @@ static const ConfigSetting controlSettings[] = {
ConfigSetting("fcombo18X", "fcombo18Y", "comboKeyScale18", "ShowComboKey18", &g_Config.touchCustom[18], defaultTouchPosHide, CfgFlag::PER_GAME),
ConfigSetting("fcombo19X", "fcombo19Y", "comboKeyScale19", "ShowComboKey19", &g_Config.touchCustom[19], defaultTouchPosHide, CfgFlag::PER_GAME),

#if defined(_WIN32)
// A win32 user seeing touch controls is likely using PPSSPP on a tablet. There it makes
// sense to default this to on.
ConfigSetting("ShowTouchPause", &g_Config.bShowTouchPause, true, CfgFlag::DEFAULT),
#else
ConfigSetting("ShowTouchPause", &g_Config.bShowTouchPause, false, CfgFlag::DEFAULT),
#endif
ConfigSetting("ShowTouchPause", &g_Config.bShowTouchPause, &DefaultShowPauseButton, CfgFlag::DEFAULT),
#if defined(USING_WIN_UI)
ConfigSetting("IgnoreWindowsKey", &g_Config.bIgnoreWindowsKey, false, CfgFlag::PER_GAME),
#endif
Expand Down
6 changes: 3 additions & 3 deletions Core/KeyMap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -418,11 +418,11 @@ const KeyMap_IntStrPair psp_button_names[] = {
{VIRTKEY_AXIS_SWAP, "AxisSwap"},

{VIRTKEY_FASTFORWARD, "Fast-forward"},
{VIRTKEY_PAUSE, "Pause"},
{VIRTKEY_SPEED_TOGGLE, "SpeedToggle"},
{VIRTKEY_SPEED_CUSTOM1, "Alt speed 1"},
{VIRTKEY_SPEED_CUSTOM2, "Alt speed 2"},
{VIRTKEY_SPEED_ANALOG, "Analog speed"},
{VIRTKEY_PAUSE, "Pause"},
{VIRTKEY_RESET_EMULATION, "Reset"},
{VIRTKEY_FRAME_ADVANCE, "Frame Advance"},
#if !defined(MOBILE_DEVICE)
Expand Down Expand Up @@ -734,7 +734,7 @@ void RestoreDefault() {
} else if (IsMOQII7S(name)) {
SetDefaultKeyMap(DEFAULT_MAPPING_MOQI_I7S, false);
} else if (IsRetroid(name)) {
SetDefaultKeyMap(DEFAULT_MAPPING_RETRO_STATION_CONTROLLER, false);
SetDefaultKeyMap(DEFAULT_MAPPING_RETROID_CONTROLLER, false);
} else {
SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_PAD, false);
}
Expand Down Expand Up @@ -855,7 +855,7 @@ void AutoConfForPad(const std::string &name) {
if (name.find("Xbox") != std::string::npos) {
SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_XBOX, false);
} else if (name == "Retro Station Controller") {
SetDefaultKeyMap(DEFAULT_MAPPING_RETRO_STATION_CONTROLLER, false);
SetDefaultKeyMap(DEFAULT_MAPPING_RETROID_CONTROLLER, false);
} else {
SetDefaultKeyMap(DEFAULT_MAPPING_ANDROID_PAD, false);
}
Expand Down
16 changes: 10 additions & 6 deletions Core/KeyMapDefaults.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,29 +200,33 @@ static const DefMappingStruct defaultAndroidXboxControllerMap[] = {

// Retroid reports its controller as "Retro Station Controller".
// It's very similar to the Android Xbox mapping, just with main buttons swapped around.
static const DefMappingStruct defaultRetroStationControllerMap[] = {
static const DefMappingStruct defaultRetroidControllerMap[] = {
{CTRL_CROSS , NKCODE_BUTTON_B},
{CTRL_CIRCLE , NKCODE_BUTTON_A},
{CTRL_SQUARE , NKCODE_BUTTON_Y},
{CTRL_TRIANGLE , NKCODE_BUTTON_X},
// The hat for DPAD is standard for bluetooth pads, which is the most likely pads on Android I think.
{CTRL_LEFT , JOYSTICK_AXIS_HAT_X, -1},
{CTRL_LEFT , NKCODE_DPAD_LEFT},
{CTRL_RIGHT , JOYSTICK_AXIS_HAT_X, +1},
{CTRL_RIGHT , NKCODE_DPAD_RIGHT},
{CTRL_UP , JOYSTICK_AXIS_HAT_Y, -1},
{CTRL_UP , NKCODE_DPAD_UP},
{CTRL_DOWN , JOYSTICK_AXIS_HAT_Y, +1},
{CTRL_DOWN , NKCODE_DPAD_DOWN},
{CTRL_START , NKCODE_BUTTON_START},
{CTRL_SELECT , NKCODE_BACK},
{CTRL_SELECT , NKCODE_BUTTON_SELECT},
{CTRL_LTRIGGER , NKCODE_BUTTON_L1},
{CTRL_RTRIGGER , NKCODE_BUTTON_R1},
{VIRTKEY_FASTFORWARD , NKCODE_BUTTON_R2},
{VIRTKEY_FASTFORWARD , JOYSTICK_AXIS_RTRIGGER, +1},
{VIRTKEY_PAUSE , NKCODE_BUTTON_L2},
{VIRTKEY_PAUSE , JOYSTICK_AXIS_LTRIGGER, +1},
{VIRTKEY_AXIS_X_MIN, JOYSTICK_AXIS_X, -1},
{VIRTKEY_AXIS_X_MAX, JOYSTICK_AXIS_X, +1},
{VIRTKEY_AXIS_Y_MIN, JOYSTICK_AXIS_Y, +1},
{VIRTKEY_AXIS_Y_MAX, JOYSTICK_AXIS_Y, -1},
};


static const DefMappingStruct defaultPadMapAndroid[] = {
{CTRL_CROSS , NKCODE_BUTTON_A},
{CTRL_CIRCLE , NKCODE_BUTTON_B},
Expand Down Expand Up @@ -415,8 +419,8 @@ void SetDefaultKeyMap(DefaultMaps dmap, bool replace) {
case DEFAULT_MAPPING_ANDROID_XBOX:
SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultAndroidXboxControllerMap, ARRAY_SIZE(defaultAndroidXboxControllerMap), replace);
break;
case DEFAULT_MAPPING_RETRO_STATION_CONTROLLER:
SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultRetroStationControllerMap, ARRAY_SIZE(defaultRetroStationControllerMap), replace);
case DEFAULT_MAPPING_RETROID_CONTROLLER:
SetDefaultKeyMap(DEVICE_ID_PAD_0, defaultRetroidControllerMap, ARRAY_SIZE(defaultRetroidControllerMap), replace);
break;
case DEFAULT_MAPPING_VR_HEADSET:
SetDefaultKeyMap(DEVICE_ID_XR_CONTROLLER_LEFT, defaultVRLeftController, ARRAY_SIZE(defaultVRLeftController), replace);
Expand Down
2 changes: 1 addition & 1 deletion Core/KeyMapDefaults.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ enum DefaultMaps {
DEFAULT_MAPPING_OUYA,
DEFAULT_MAPPING_XPERIA_PLAY,
DEFAULT_MAPPING_MOQI_I7S,
DEFAULT_MAPPING_RETRO_STATION_CONTROLLER,
DEFAULT_MAPPING_RETROID_CONTROLLER,
DEFAULT_MAPPING_VR_HEADSET,
};

Expand Down
6 changes: 5 additions & 1 deletion Core/MIPS/JitCommon/JitBlockCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ JitBlockCache::~JitBlockCache() {
bool JitBlock::ContainsAddress(u32 em_address) const {
// WARNING - THIS DOES NOT WORK WITH JIT INLINING ENABLED.
// However, that doesn't exist yet so meh.
return (em_address >= originalAddress && em_address < originalAddress + 4 * originalSize);
return em_address >= originalAddress && em_address < originalAddress + 4 * originalSize;
}

bool JitBlockCache::IsFull() const {
Expand Down Expand Up @@ -146,6 +146,8 @@ const JitBlock *JitBlockCache::GetBlock(int no) const {
}

int JitBlockCache::AllocateBlock(u32 startAddress) {
_assert_(num_blocks_ < MAX_NUM_BLOCKS);

JitBlock &b = blocks_[num_blocks_];

b.proxyFor = 0;
Expand Down Expand Up @@ -177,6 +179,8 @@ int JitBlockCache::AllocateBlock(u32 startAddress) {
}

void JitBlockCache::ProxyBlock(u32 rootAddress, u32 startAddress, u32 size, const u8 *codePtr) {
_assert_(num_blocks_ < MAX_NUM_BLOCKS);

// If there's an existing block at the startAddress, add rootAddress as a proxy root of that block
// instead of creating a new block.
int num = GetBlockNumberFromStartAddress(startAddress, false);
Expand Down
2 changes: 2 additions & 0 deletions GPU/Common/DrawEngineCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,8 @@ int DrawEngineCommon::ComputeNumVertsToDecode() const {
return sum;
}

// Takes a list of consecutive PRIM opcodes, and extends the current draw call to include them.
// This is just a performance optimization.
int DrawEngineCommon::ExtendNonIndexedPrim(const uint32_t *cmd, const uint32_t *stall, u32 vertTypeID, bool clockwise, int *bytesRead, bool isTriangle) {
const uint32_t *start = cmd;
int prevDrawVerts = numDrawVerts_ - 1;
Expand Down
5 changes: 5 additions & 0 deletions UI/GameSettingsScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1098,6 +1098,11 @@ void GameSettingsScreen::CreateSystemSettings(UI::ViewGroup *systemSettings) {
PopupMultiChoiceDynamic *theme = systemSettings->Add(new PopupMultiChoiceDynamic(&g_Config.sThemeName, sy->T("Theme"), GetThemeInfoNames(), I18NCat::THEMES, screenManager()));
theme->OnChoice.Add([=](EventParams &e) {
UpdateTheme(screenManager()->getUIContext());
// Reset the tint/saturation if the theme changed.
if (e.b) {
g_Config.fUITint = 0.0f;
g_Config.fUISaturation = 1.0f;
}
return UI::EVENT_CONTINUE;
});

Expand Down
4 changes: 3 additions & 1 deletion UI/MainScreen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -794,7 +794,9 @@ void GameBrowser::Refresh() {
topBar->Add(new Choice(ImageID("I_FOLDER_OPEN"), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Handle(this, &GameBrowser::BrowseClick);
#else
if ((browseFlags_ & BrowseFlags::BROWSE) && System_GetPropertyBool(SYSPROP_HAS_FOLDER_BROWSER)) {
topBar->Add(new Choice(mm->T("Browse"), ImageID("I_FOLDER_OPEN"), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Handle(this, &GameBrowser::BrowseClick);
// Collapse the button title on very small screens (Retroid Pocket).
std::string_view browseTitle = g_display.pixel_xres <= 640 ? "" : mm->T("Browse");
topBar->Add(new Choice(browseTitle, ImageID("I_FOLDER_OPEN"), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Handle(this, &GameBrowser::BrowseClick);
}
if (System_GetPropertyInt(SYSPROP_DEVICE_TYPE) == DEVICE_TYPE_TV) {
topBar->Add(new Choice(mm->T("Enter Path"), new LayoutParams(WRAP_CONTENT, 64.0f)))->OnClick.Add([=](UI::EventParams &) {
Expand Down
4 changes: 2 additions & 2 deletions UI/Store.cpp
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that the hardcoded value was the same as the Default ItemDownStyleBg. However, here ItemFocusedStyle gets applied instead. This leads to the highlighted Back button blending into the top bar.

image
image

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, right. Not ideal.

Original file line number Diff line number Diff line change
Expand Up @@ -523,9 +523,9 @@ void StoreScreen::CreateViews() {
LinearLayout *topBar = root_->Add(new LinearLayout(ORIENT_HORIZONTAL, new LinearLayoutParams(FILL_PARENT, 64.0f)));
topBar->Add(new Choice(di->T("Back"), new LinearLayoutParams(WRAP_CONTENT, FILL_PARENT)))->OnClick.Handle<UIScreen>(this, &UIScreen::OnBack);
titleText_ = new TextView(mm->T("PPSSPP Homebrew Store"), ALIGN_VCENTER, false, new LinearLayoutParams(WRAP_CONTENT, FILL_PARENT));
titleText_->SetTextColor(screenManager()->getUIContext()->GetTheme().itemFocusedStyle.fgColor);
topBar->Add(titleText_);
UI::Drawable solid(0xFFbd9939);
topBar->SetBG(solid);
topBar->SetBG(screenManager()->getUIContext()->GetTheme().itemFocusedStyle.background);

LinearLayout *content;
if (connectionError_ || loading_) {
Expand Down
10 changes: 0 additions & 10 deletions android/jni/Locals.mk
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,6 @@ ifeq ($(findstring armeabi-v7a,$(TARGET_ARCH_ABI)),armeabi-v7a)

LOCAL_CFLAGS := $(LOCAL_CFLAGS) -D_ARCH_32
endif
ifeq ($(TARGET_ARCH_ABI),armeabi)
LOCAL_LDLIBS += $(LOCAL_PATH)/../../ffmpeg/android/armv6/lib/libavformat.a
LOCAL_LDLIBS += $(LOCAL_PATH)/../../ffmpeg/android/armv6/lib/libavcodec.a
LOCAL_LDLIBS += $(LOCAL_PATH)/../../ffmpeg/android/armv6/lib/libswresample.a
LOCAL_LDLIBS += $(LOCAL_PATH)/../../ffmpeg/android/armv6/lib/libswscale.a
LOCAL_LDLIBS += $(LOCAL_PATH)/../../ffmpeg/android/armv6/lib/libavutil.a
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ffmpeg/android/armv6/include

LOCAL_CFLAGS := $(LOCAL_CFLAGS) -D_ARCH_32 -march=armv6
endif

ifeq ($(TARGET_ARCH_ABI),x86_64)
LOCAL_LDLIBS += $(LOCAL_PATH)/../../ffmpeg/android/x86_64/lib/libavformat.a
Expand Down
25 changes: 8 additions & 17 deletions android/src/org/ppsspp/ppsspp/PpssppActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ public class PpssppActivity extends NativeActivity {
// Key used for debugging.
public static final String ARGS_EXTRA_KEY = "org.ppsspp.ppsspp.Args";

private static boolean m_hasUnsupportedABI = false;
private static boolean m_hasNoNativeBinary = false;

public static boolean libraryLoaded = false;
Expand All @@ -42,16 +41,12 @@ public class PpssppActivity extends NativeActivity {
private static final int STORAGE_ERROR_ALREADY_EXISTS = -4;

public static void CheckABIAndLoadLibrary() {
if (Build.CPU_ABI.equals("armeabi")) {
m_hasUnsupportedABI = true;
} else {
try {
System.loadLibrary("ppsspp_jni");
libraryLoaded = true;
} catch (UnsatisfiedLinkError e) {
Log.e(TAG, "LoadLibrary failed, UnsatifiedLinkError: " + e);
m_hasNoNativeBinary = true;
}
try {
System.loadLibrary("ppsspp_jni");
libraryLoaded = true;
} catch (UnsatisfiedLinkError e) {
Log.e(TAG, "LoadLibrary failed, UnsatifiedLinkError: " + e);
m_hasNoNativeBinary = true;
}
}

Expand All @@ -65,17 +60,13 @@ public PpssppActivity() {

@Override
public void onCreate(Bundle savedInstanceState) {
if (m_hasUnsupportedABI || m_hasNoNativeBinary) {
if (m_hasNoNativeBinary) {
new Thread() {
@Override
public void run() {
Looper.prepare();
AlertDialog.Builder builder = new AlertDialog.Builder(PpssppActivity.this);
if (m_hasUnsupportedABI) {
builder.setMessage(Build.CPU_ABI + " target is not supported.").setTitle("Error starting PPSSPP").create().show();
} else {
builder.setMessage("The native part of PPSSPP for ABI " + Build.CPU_ABI + " is missing. Try downloading an official build?").setTitle("Error starting PPSSPP").create().show();
}
builder.setMessage("The native part of PPSSPP for ABI " + Build.CPU_ABI + " is missing. Try downloading an official build?").setTitle("Error starting PPSSPP").create().show();
Looper.loop();
}
}.start();
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/ar_AE.ini
Original file line number Diff line number Diff line change
Expand Up @@ -1299,6 +1299,8 @@ JIT using IR = JIT using IR
Language = ‎اللغة
Loaded plugin: %1 = Loaded plugin: %1
Memory Stick folder = Memory Stick folder
Memory Stick in installed.txt = ‎installed.txt مسار الحفظ في
Memory Stick in My Documents = ‎مسار الحفظ في مستنداتي
Memory Stick size = Memory Stick size
Change Nickname = ‎تغيير الأسم المستعار
ChangingMemstickPath = Save games, save states, and other data will not be copied to this folder.\n\nChange the Memory Stick folder?
Expand Down Expand Up @@ -1362,8 +1364,6 @@ Reset Recording on Save/Load State = Reset recording on Save/Load state
Restore Default Settings = ‎إلي الإفتراضي PPSSPP's إعادة إعدادات
RetroAchievements = RetroAchievements
Rewind Snapshot Interval = ‎ترجيع تردد اللقطة (يأكل الذاكرة)
Save path in installed.txt = ‎installed.txt مسار الحفظ في
Save path in My Documents = ‎مسار الحفظ في مستنداتي
Savestate Slot = ‎منطقة حفظ الحالة
Savestate slot backups = Savestate slot backups
Screenshots as PNG = ‎PNG إحفظ لقطة الشاشة في صيغة
Expand Down
Loading
Loading