mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-11-23 05:19:56 +00:00
Only enable RAM Clears for the SOCOM games that require it.
Should remove the performance impact of #8994 which is bigger than expected, it seems (cache pollution?)
This commit is contained in:
parent
f28fec3fa5
commit
9c55e1e0de
@ -45,11 +45,12 @@ void Compatibility::Clear() {
|
||||
}
|
||||
|
||||
void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) {
|
||||
CheckSetting(iniFile, gameID, "VertexDepthRounding", flags_.VertexDepthRounding);
|
||||
CheckSetting(iniFile, gameID, "PixelDepthRounding", flags_.PixelDepthRounding);
|
||||
CheckSetting(iniFile, gameID, "DepthRangeHack", flags_.DepthRangeHack);
|
||||
CheckSetting(iniFile, gameID, "VertexDepthRounding", &flags_.VertexDepthRounding);
|
||||
CheckSetting(iniFile, gameID, "PixelDepthRounding", &flags_.PixelDepthRounding);
|
||||
CheckSetting(iniFile, gameID, "DepthRangeHack", &flags_.DepthRangeHack);
|
||||
CheckSetting(iniFile, gameID, "ClearToRAM", &flags_.ClearToRAM);
|
||||
}
|
||||
|
||||
void Compatibility::CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, bool &flag) {
|
||||
iniFile.Get(option, gameID.c_str(), &flag, flag);
|
||||
void Compatibility::CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, bool *flag) {
|
||||
iniFile.Get(option, gameID.c_str(), flag, *flag);
|
||||
}
|
||||
|
@ -48,6 +48,7 @@ struct CompatFlags {
|
||||
bool VertexDepthRounding;
|
||||
bool PixelDepthRounding;
|
||||
bool DepthRangeHack;
|
||||
bool ClearToRAM;
|
||||
};
|
||||
|
||||
class IniFile;
|
||||
@ -66,7 +67,7 @@ public:
|
||||
private:
|
||||
void Clear();
|
||||
void CheckSettings(IniFile &iniFile, const std::string &gameID);
|
||||
void CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, bool &flag);
|
||||
void CheckSetting(IniFile &iniFile, const std::string &gameID, const char *option, bool *flag);
|
||||
|
||||
CompatFlags flags_;
|
||||
};
|
@ -140,6 +140,8 @@ void DrawEngineCommon::ApplyClearToMemory(int x1, int y1, int x2, int y2, u32 cl
|
||||
}
|
||||
|
||||
// This will most often be true - rarely is the width not aligned.
|
||||
// TODO: We should really use non-temporal stores here to avoid the cache,
|
||||
// as it's unlikely that these bytes will be read.
|
||||
if ((width & 3) == 0 && (x1 & 3) == 0) {
|
||||
u64 val64 = clearColor | ((u64)clearColor << 32);
|
||||
int xstride = 2;
|
||||
|
@ -864,7 +864,7 @@ rotateVBO:
|
||||
int scissorY2 = gstate.getScissorY2() + 1;
|
||||
framebufferManager_->SetSafeSize(scissorX2, scissorY2);
|
||||
|
||||
if (g_Config.bBlockTransferGPU && gstate.isClearModeColorMask() && (gstate.isClearModeAlphaMask() || gstate.FrameBufFormat() == GE_FORMAT_565)) {
|
||||
if (g_Config.bBlockTransferGPU && (gstate_c.featureFlags & GPU_USE_CLEAR_RAM_HACK) && gstate.isClearModeColorMask() && (gstate.isClearModeAlphaMask() || gstate.FrameBufFormat() == GE_FORMAT_565)) {
|
||||
ApplyClearToMemory(scissorX1, scissorY1, scissorX2, scissorY2, clearColor);
|
||||
}
|
||||
}
|
||||
|
@ -503,6 +503,10 @@ void GPU_DX9::CheckGPUFeatures() {
|
||||
features |= GPU_ROUND_DEPTH_TO_16BIT;
|
||||
}
|
||||
|
||||
if (PSP_CoreParameter().compat.flags().ClearToRAM) {
|
||||
features |= GPU_USE_CLEAR_RAM_HACK;
|
||||
}
|
||||
|
||||
gstate_c.featureFlags = features;
|
||||
}
|
||||
|
||||
|
@ -977,7 +977,7 @@ rotateVBO:
|
||||
int scissorY2 = gstate.getScissorY2() + 1;
|
||||
framebufferManager_->SetSafeSize(scissorX2, scissorY2);
|
||||
|
||||
if (g_Config.bBlockTransferGPU && colorMask && (alphaMask || gstate.FrameBufFormat() == GE_FORMAT_565)) {
|
||||
if (g_Config.bBlockTransferGPU && (gstate_c.featureFlags & GPU_USE_CLEAR_RAM_HACK) && colorMask && (alphaMask || gstate.FrameBufFormat() == GE_FORMAT_565)) {
|
||||
ApplyClearToMemory(scissorX1, scissorY1, scissorX2, scissorY2, clearColor);
|
||||
}
|
||||
}
|
||||
|
@ -607,6 +607,10 @@ void GPU_GLES::CheckGPUFeatures() {
|
||||
features |= GPU_USE_DEPTH_RANGE_HACK;
|
||||
}
|
||||
|
||||
if (PSP_CoreParameter().compat.flags().ClearToRAM) {
|
||||
features |= GPU_USE_CLEAR_RAM_HACK;
|
||||
}
|
||||
|
||||
#ifdef MOBILE_DEVICE
|
||||
// Arguably, we should turn off GPU_IS_MOBILE on like modern Tegras, etc.
|
||||
features |= GPU_IS_MOBILE;
|
||||
|
@ -455,6 +455,7 @@ enum {
|
||||
GPU_USE_DEPTH_RANGE_HACK = FLAG_BIT(6),
|
||||
GPU_SUPPORTS_WIDE_LINES = FLAG_BIT(7),
|
||||
GPU_SUPPORTS_ANISOTROPY = FLAG_BIT(8),
|
||||
GPU_USE_CLEAR_RAM_HACK = FLAG_BIT(9),
|
||||
GPU_SUPPORTS_LARGE_VIEWPORTS = FLAG_BIT(16),
|
||||
GPU_SUPPORTS_ACCURATE_DEPTH = FLAG_BIT(17),
|
||||
GPU_SUPPORTS_VAO = FLAG_BIT(18),
|
||||
|
@ -852,7 +852,7 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) {
|
||||
int scissorY2 = gstate.getScissorY2() + 1;
|
||||
framebufferManager_->SetSafeSize(scissorX2, scissorY2);
|
||||
|
||||
if (g_Config.bBlockTransferGPU && gstate.isClearModeColorMask() && (gstate.isClearModeAlphaMask() || gstate.FrameBufFormat() == GE_FORMAT_565)) {
|
||||
if (g_Config.bBlockTransferGPU && (gstate_c.featureFlags & GPU_USE_CLEAR_RAM_HACK) && gstate.isClearModeColorMask() && (gstate.isClearModeAlphaMask() || gstate.FrameBufFormat() == GE_FORMAT_565)) {
|
||||
ApplyClearToMemory(scissorX1, scissorY1, scissorX2, scissorY2, result.color);
|
||||
}
|
||||
}
|
||||
|
@ -474,6 +474,11 @@ void GPU_Vulkan::CheckGPUFeatures() {
|
||||
if (vulkan_->GetFeaturesEnabled().samplerAnisotropy) {
|
||||
gstate_c.featureFlags |= GPU_SUPPORTS_ANISOTROPY;
|
||||
}
|
||||
|
||||
if (PSP_CoreParameter().compat.flags().ClearToRAM) {
|
||||
gstate_c.featureFlags |= GPU_USE_CLEAR_RAM_HACK;
|
||||
}
|
||||
|
||||
// Mandatory features on Vulkan, which may be checked in "centralized" code
|
||||
gstate_c.featureFlags |= GPU_SUPPORTS_TEXTURE_LOD_CONTROL;
|
||||
gstate_c.featureFlags |= GPU_SUPPORTS_FBO;
|
||||
|
@ -101,3 +101,15 @@ ULJM91018 = true # Infinity demo disc?
|
||||
NPJH90157 = true # Infinity demo
|
||||
ULJM05732 = true
|
||||
NPJH50332 = true
|
||||
|
||||
[ClearToRAM]
|
||||
# SOCOM Navy Seals games require this. See issue #8973.
|
||||
# Navy Seals
|
||||
UCUS98615 = true
|
||||
ULES00038 = true
|
||||
UCKS45021 = true
|
||||
# Fireteam Bravo 3
|
||||
UCJS10102 = true
|
||||
NPJG00035 = true
|
||||
UCUS98716 = true
|
||||
UCES01242 = true
|
Loading…
Reference in New Issue
Block a user