diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0a134fcf70..fa8e556a41 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2361,8 +2361,6 @@ add_library(${CoreLibName} ${CoreLinkType}
Core/FileLoaders/HTTPFileLoader.h
Core/FileLoaders/LocalFileLoader.cpp
Core/FileLoaders/LocalFileLoader.h
- Core/FileLoaders/RamCachingFileLoader.cpp
- Core/FileLoaders/RamCachingFileLoader.h
Core/FileLoaders/RetryingFileLoader.cpp
Core/FileLoaders/RetryingFileLoader.h
Core/MIPS/MIPS.cpp
diff --git a/Core/Config.cpp b/Core/Config.cpp
index 71011cda2d..f0baff4c42 100644
--- a/Core/Config.cpp
+++ b/Core/Config.cpp
@@ -290,7 +290,6 @@ static const ConfigSetting generalSettings[] = {
// "default" means let emulator decide, "" means disable.
ConfigSetting("ReportingHost", &g_Config.sReportHost, "default", CfgFlag::DEFAULT),
ConfigSetting("AutoSaveSymbolMap", &g_Config.bAutoSaveSymbolMap, false, CfgFlag::PER_GAME),
- ConfigSetting("CacheFullIsoInRam", &g_Config.bCacheFullIsoInRam, false, CfgFlag::PER_GAME),
ConfigSetting("RemoteISOPort", &g_Config.iRemoteISOPort, 0, CfgFlag::DEFAULT),
ConfigSetting("LastRemoteISOServer", &g_Config.sLastRemoteISOServer, "", CfgFlag::DEFAULT),
ConfigSetting("LastRemoteISOPort", &g_Config.iLastRemoteISOPort, 0, CfgFlag::DEFAULT),
diff --git a/Core/Config.h b/Core/Config.h
index d765da3abc..9802dea07f 100644
--- a/Core/Config.h
+++ b/Core/Config.h
@@ -123,7 +123,6 @@ public:
int iIOTimingMethod;
int iLockedCPUSpeed;
bool bAutoSaveSymbolMap;
- bool bCacheFullIsoInRam;
int iRemoteISOPort;
std::string sLastRemoteISOServer;
int iLastRemoteISOPort;
diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index fd23e717c5..869d7efa44 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -667,7 +667,6 @@
-
@@ -1255,7 +1254,6 @@
-
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index e3576f61a2..b92c083ea8 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -661,9 +661,6 @@
HW
-
- FileLoaders
-
MIPS\IR
@@ -1887,9 +1884,6 @@
HW
-
- FileLoaders
-
MIPS\IR
diff --git a/Core/FileLoaders/RamCachingFileLoader.cpp b/Core/FileLoaders/RamCachingFileLoader.cpp
deleted file mode 100644
index 826e0b11c4..0000000000
--- a/Core/FileLoaders/RamCachingFileLoader.cpp
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright (c) 2015- PPSSPP Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0 or later versions.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official git repository and contact information can be found at
-// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
-
-#include
-#include
-#include
-
-#include "Common/Thread/ThreadUtil.h"
-#include "Common/TimeUtil.h"
-#include "Core/FileLoaders/RamCachingFileLoader.h"
-
-// Takes ownership of backend.
-RamCachingFileLoader::RamCachingFileLoader(FileLoader *backend)
- : ProxiedFileLoader(backend) {
- filesize_ = backend->FileSize();
- if (filesize_ > 0) {
- InitCache();
- }
-}
-
-RamCachingFileLoader::~RamCachingFileLoader() {
- if (filesize_ > 0) {
- ShutdownCache();
- }
-}
-
-bool RamCachingFileLoader::Exists() {
- if (exists_ == -1) {
- exists_ = ProxiedFileLoader::Exists() ? 1 : 0;
- }
- return exists_ == 1;
-}
-
-bool RamCachingFileLoader::ExistsFast() {
- if (exists_ == -1) {
- return ProxiedFileLoader::ExistsFast();
- }
- return exists_ == 1;
-}
-
-bool RamCachingFileLoader::IsDirectory() {
- if (isDirectory_ == -1) {
- isDirectory_ = ProxiedFileLoader::IsDirectory() ? 1 : 0;
- }
- return isDirectory_ == 1;
-}
-
-s64 RamCachingFileLoader::FileSize() {
- return filesize_;
-}
-
-size_t RamCachingFileLoader::ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags) {
- size_t readSize = 0;
- if (cache_ == nullptr || (flags & Flags::HINT_UNCACHED) != 0) {
- readSize = backend_->ReadAt(absolutePos, bytes, data, flags);
- } else {
- readSize = ReadFromCache(absolutePos, bytes, data);
- // While in case the cache size is too small for the entire read.
- while (readSize < bytes) {
- SaveIntoCache(absolutePos + readSize, bytes - readSize, flags);
- size_t bytesFromCache = ReadFromCache(absolutePos + readSize, bytes - readSize, (u8 *)data + readSize);
- readSize += bytesFromCache;
- if (bytesFromCache == 0) {
- // We can't read any more.
- break;
- }
- }
-
- StartReadAhead(absolutePos + readSize);
- }
- return readSize;
-}
-
-void RamCachingFileLoader::InitCache() {
- std::lock_guard guard(blocksMutex_);
- u32 blockCount = (u32)((filesize_ + BLOCK_SIZE - 1) >> BLOCK_SHIFT);
- // Overallocate for the last block.
- cache_ = (u8 *)malloc((size_t)blockCount << BLOCK_SHIFT);
- if (cache_ == nullptr) {
- return;
- }
- aheadRemaining_ = blockCount;
- blocks_.resize(blockCount);
-}
-
-void RamCachingFileLoader::ShutdownCache() {
- Cancel();
-
- // We can't delete while the thread is running, so have to wait.
- // This should only happen from the menu.
- while (aheadThreadRunning_) {
- sleep_ms(1, "shutdown-ram-cache-poll");
- }
- if (aheadThread_.joinable())
- aheadThread_.join();
-
- std::lock_guard guard(blocksMutex_);
- blocks_.clear();
- if (cache_ != nullptr) {
- free(cache_);
- cache_ = nullptr;
- }
-}
-
-void RamCachingFileLoader::Cancel() {
- if (aheadThreadRunning_) {
- std::lock_guard guard(blocksMutex_);
- aheadCancel_ = true;
- }
-
- ProxiedFileLoader::Cancel();
-}
-
-size_t RamCachingFileLoader::ReadFromCache(s64 pos, size_t bytes, void *data) {
- s64 cacheStartPos = pos >> BLOCK_SHIFT;
- s64 cacheEndPos = (pos + bytes - 1) >> BLOCK_SHIFT;
- if ((size_t)cacheEndPos >= blocks_.size()) {
- cacheEndPos = blocks_.size() - 1;
- }
-
- size_t readSize = 0;
- size_t offset = (size_t)(pos - (cacheStartPos << BLOCK_SHIFT));
- u8 *p = (u8 *)data;
-
- // Clamp bytes to what's actually available.
- if (pos + (s64)bytes > filesize_) {
- // Should've been caught above, but just in case.
- if (pos >= filesize_) {
- return 0;
- }
- bytes = (size_t)(filesize_ - pos);
- }
-
- std::lock_guard guard(blocksMutex_);
- for (s64 i = cacheStartPos; i <= cacheEndPos; ++i) {
- if (blocks_[(size_t)i] == 0) {
- return readSize;
- }
-
- size_t toRead = std::min(bytes - readSize, (size_t)BLOCK_SIZE - offset);
- s64 cachePos = (i << BLOCK_SHIFT) + offset;
- memcpy(p + readSize, &cache_[cachePos], toRead);
- readSize += toRead;
-
- // Don't need an offset after the first read.
- offset = 0;
- }
- return readSize;
-}
-
-void RamCachingFileLoader::SaveIntoCache(s64 pos, size_t bytes, Flags flags) {
- s64 cacheStartPos = pos >> BLOCK_SHIFT;
- s64 cacheEndPos = (pos + bytes - 1) >> BLOCK_SHIFT;
- if ((size_t)cacheEndPos >= blocks_.size()) {
- cacheEndPos = blocks_.size() - 1;
- }
-
- size_t blocksToRead = 0;
- {
- std::lock_guard guard(blocksMutex_);
- for (s64 i = cacheStartPos; i <= cacheEndPos; ++i) {
- if (blocks_[(size_t)i] == 0) {
- ++blocksToRead;
- if (blocksToRead >= MAX_BLOCKS_PER_READ) {
- break;
- }
- }
- }
- }
-
- s64 cacheFilePos = cacheStartPos << BLOCK_SHIFT;
- size_t bytesRead = backend_->ReadAt(cacheFilePos, blocksToRead << BLOCK_SHIFT, &cache_[cacheFilePos], flags);
-
- // In case there was an error, let's not mark blocks that failed to read as read.
- u32 blocksActuallyRead = (u32)((bytesRead + BLOCK_SIZE - 1) >> BLOCK_SHIFT);
- {
- std::lock_guard guard(blocksMutex_);
-
- // In case they were simultaneously read.
- u32 blocksRead = 0;
- for (size_t i = 0; i < blocksActuallyRead; ++i) {
- if (blocks_[(size_t)cacheStartPos + i] == 0) {
- blocks_[(size_t)cacheStartPos + i] = 1;
- ++blocksRead;
- }
- }
-
- if (aheadRemaining_ != 0) {
- aheadRemaining_ -= blocksRead;
- }
- }
-}
-
-void RamCachingFileLoader::StartReadAhead(s64 pos) {
- if (cache_ == nullptr) {
- return;
- }
-
- std::lock_guard guard(blocksMutex_);
- aheadPos_ = pos;
- if (aheadThreadRunning_) {
- // Already going.
- return;
- }
-
- aheadThreadRunning_ = true;
- aheadCancel_ = false;
- if (aheadThread_.joinable())
- aheadThread_.join();
- aheadThread_ = std::thread([this] {
- SetCurrentThreadName("FileLoaderReadAhead");
-
- AndroidJNIThreadContext jniContext;
-
- while (aheadRemaining_ != 0 && !aheadCancel_) {
- // Where should we look?
- const u32 cacheStartPos = NextAheadBlock();
- if (cacheStartPos == 0xFFFFFFFF) {
- // Must be full.
- break;
- }
- u32 cacheEndPos = cacheStartPos + BLOCK_READAHEAD - 1;
- if (cacheEndPos >= blocks_.size()) {
- cacheEndPos = (u32)blocks_.size() - 1;
- }
-
- for (u32 i = cacheStartPos; i <= cacheEndPos; ++i) {
- if (blocks_[i] == 0) {
- SaveIntoCache((u64)i << BLOCK_SHIFT, BLOCK_SIZE * BLOCK_READAHEAD, Flags::NONE);
- break;
- }
- }
- }
-
- aheadThreadRunning_ = false;
- });
-}
-
-u32 RamCachingFileLoader::NextAheadBlock() {
- std::lock_guard guard(blocksMutex_);
-
- // If we had an aheadPos_ set, start reading from there and go forward.
- u32 startFrom = (u32)(aheadPos_ >> BLOCK_SHIFT);
- // But next time, start from the beginning again.
- aheadPos_ = 0;
-
- for (u32 i = startFrom; i < blocks_.size(); ++i) {
- if (blocks_[i] == 0) {
- return i;
- }
- }
-
- return 0xFFFFFFFF;
-}
diff --git a/Core/FileLoaders/RamCachingFileLoader.h b/Core/FileLoaders/RamCachingFileLoader.h
deleted file mode 100644
index dde5e74ecb..0000000000
--- a/Core/FileLoaders/RamCachingFileLoader.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2015- PPSSPP Project.
-
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, version 2.0 or later versions.
-
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official git repository and contact information can be found at
-// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
-
-#pragma once
-
-#include
-#include
-#include
-
-#include "Common/CommonTypes.h"
-#include "Core/Loaders.h"
-
-class RamCachingFileLoader : public ProxiedFileLoader {
-public:
- RamCachingFileLoader(FileLoader *backend);
- ~RamCachingFileLoader();
-
- bool Exists() override;
- bool ExistsFast() override;
- bool IsDirectory() override;
- s64 FileSize() override;
-
- size_t ReadAt(s64 absolutePos, size_t bytes, size_t count, void *data, Flags flags = Flags::NONE) override {
- return ReadAt(absolutePos, bytes * count, data, flags) / bytes;
- }
- size_t ReadAt(s64 absolutePos, size_t bytes, void *data, Flags flags = Flags::NONE) override;
-
- void Cancel() override;
-
-private:
- void InitCache();
- void ShutdownCache();
- size_t ReadFromCache(s64 pos, size_t bytes, void *data);
- // Guaranteed to read at least one block into the cache.
- void SaveIntoCache(s64 pos, size_t bytes, Flags flags);
- void StartReadAhead(s64 pos);
- u32 NextAheadBlock();
-
- enum {
- BLOCK_SIZE = 65536,
- BLOCK_SHIFT = 16,
- MAX_BLOCKS_PER_READ = 16,
- BLOCK_READAHEAD = 4,
- };
-
- s64 filesize_ = 0;
- u8 *cache_ = nullptr;
- int exists_ = -1;
- int isDirectory_ = -1;
-
- std::vector blocks_;
- std::mutex blocksMutex_;
- u32 aheadRemaining_;
- s64 aheadPos_;
- std::thread aheadThread_;
- bool aheadThreadRunning_ = false;
- bool aheadCancel_ = false;
-};
diff --git a/Core/System.cpp b/Core/System.cpp
index 103fca6074..2c8bb27ac7 100644
--- a/Core/System.cpp
+++ b/Core/System.cpp
@@ -57,7 +57,6 @@
#include "Core/Core.h"
#include "Core/CoreTiming.h"
#include "Core/CoreParameter.h"
-#include "Core/FileLoaders/RamCachingFileLoader.h"
#include "Core/FileSystems/MetaFileSystem.h"
#include "Core/Loaders.h"
#include "Core/PSPLoaders.h"
@@ -416,18 +415,6 @@ bool PSP_InitStart(const CoreParameter &coreParam, std::string *error_string) {
IdentifiedFileType type = Identify_File(loadedFile, &g_CoreParameter.errorString);
g_CoreParameter.fileType = type;
- if (g_Config.bCacheFullIsoInRam) {
- switch (g_CoreParameter.fileType) {
- case IdentifiedFileType::PSP_ISO:
- case IdentifiedFileType::PSP_ISO_NP:
- loadedFile = new RamCachingFileLoader(loadedFile);
- break;
- default:
- INFO_LOG(Log::System, "RAM caching is on, but file is not an ISO, so ignoring");
- break;
- }
- }
-
if (g_Config.bAchievementsEnable) {
// Need to re-identify after ResolveFileLoaderTarget - although in practice probably not,
// but also, re-using the identification would require some plumbing, to be done later.
diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp
index ce9ad044db..4148077e77 100644
--- a/UI/GameSettingsScreen.cpp
+++ b/UI/GameSettingsScreen.cpp
@@ -1341,7 +1341,6 @@ void GameSettingsScreen::CreateSystemSettings(UI::ViewGroup *systemSettings) {
if (System_GetPropertyBool(SYSPROP_HAS_KEYBOARD))
systemSettings->Add(new CheckBox(&g_Config.bBypassOSKWithKeyboard, sy->T("Use system native keyboard")));
- systemSettings->Add(new CheckBox(&g_Config.bCacheFullIsoInRam, sy->T("Cache ISO in RAM", "Cache full ISO in RAM")))->SetEnabled(!PSP_IsInited());
systemSettings->Add(new CheckBox(&g_Config.bCheckForNewVersion, sy->T("VersionCheck", "Check for new versions of PPSSPP")));
systemSettings->Add(new CheckBox(&g_Config.bScreenshotsAsPNG, sy->T("Screenshots as PNG")));
static const char *screenshotModeChoices[] = { "Final processed image", "Raw game image" };
diff --git a/UWP/CoreUWP/CoreUWP.vcxproj b/UWP/CoreUWP/CoreUWP.vcxproj
index 4dd08eb4c7..b4ab643637 100644
--- a/UWP/CoreUWP/CoreUWP.vcxproj
+++ b/UWP/CoreUWP/CoreUWP.vcxproj
@@ -163,7 +163,6 @@
-
@@ -425,7 +424,6 @@
-
diff --git a/UWP/CoreUWP/CoreUWP.vcxproj.filters b/UWP/CoreUWP/CoreUWP.vcxproj.filters
index 8ccae0e868..df3f272763 100644
--- a/UWP/CoreUWP/CoreUWP.vcxproj.filters
+++ b/UWP/CoreUWP/CoreUWP.vcxproj.filters
@@ -306,9 +306,6 @@
FileLoaders
-
- FileLoaders
-
FileLoaders
@@ -1395,9 +1392,6 @@
FileLoaders
-
- FileLoaders
-
FileLoaders
diff --git a/android/jni/Android.mk b/android/jni/Android.mk
index c18a9aa3e7..2c80a248e2 100644
--- a/android/jni/Android.mk
+++ b/android/jni/Android.mk
@@ -607,7 +607,6 @@ EXEC_AND_LIB_FILES := \
$(SRC)/Core/FileLoaders/DiskCachingFileLoader.cpp \
$(SRC)/Core/FileLoaders/HTTPFileLoader.cpp \
$(SRC)/Core/FileLoaders/LocalFileLoader.cpp \
- $(SRC)/Core/FileLoaders/RamCachingFileLoader.cpp \
$(SRC)/Core/FileLoaders/RetryingFileLoader.cpp \
$(SRC)/Core/MemFault.cpp \
$(SRC)/Core/MemMap.cpp \
diff --git a/libretro/Makefile.common b/libretro/Makefile.common
index 977dc8202e..8b182994c1 100644
--- a/libretro/Makefile.common
+++ b/libretro/Makefile.common
@@ -656,7 +656,6 @@ SOURCES_CXX += \
$(COREDIR)/FileLoaders/CachingFileLoader.cpp \
$(COREDIR)/FileLoaders/DiskCachingFileLoader.cpp \
$(COREDIR)/FileLoaders/RetryingFileLoader.cpp \
- $(COREDIR)/FileLoaders/RamCachingFileLoader.cpp \
$(COREDIR)/FileLoaders/LocalFileLoader.cpp \
$(COREDIR)/CoreTiming.cpp \
$(COREDIR)/CwCheat.cpp \
diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp
index aea0227eb7..9cc0f060ad 100644
--- a/libretro/libretro.cpp
+++ b/libretro/libretro.cpp
@@ -591,15 +591,6 @@ static void check_variables(CoreParameter &coreParam)
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
g_Config.iLockedCPUSpeed = atoi(var.value);
- var.key = "ppsspp_cache_iso";
- if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
- {
- if (!strcmp(var.value, "disabled"))
- g_Config.bCacheFullIsoInRam = false;
- else
- g_Config.bCacheFullIsoInRam = true;
- }
-
var.key = "ppsspp_cheats";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{