diff --git a/Core/Config.cpp b/Core/Config.cpp index 60e96feed7..6dcbc0eed1 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -453,6 +453,7 @@ static ConfigSetting graphicsSettings[] = { ReportedConfigSetting("DisableStencilTest", &g_Config.bDisableStencilTest, false, true, true), ReportedConfigSetting("AlwaysDepthWrite", &g_Config.bAlwaysDepthWrite, false, true, true), ReportedConfigSetting("DepthRangeHack", &g_Config.bDepthRangeHack, false, true, true), + ReportedConfigSetting("BloomHack", &g_Config.iBloomHack, 0, true, true), // Not really a graphics setting... ReportedConfigSetting("TimerHack", &g_Config.bTimerHack, &DefaultTimerHack, true, true), diff --git a/Core/Config.h b/Core/Config.h index db12106ba8..d55f7f0071 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -174,6 +174,7 @@ public: bool bDisableStencilTest; bool bAlwaysDepthWrite; bool bDepthRangeHack; + int iBloomHack; //0 = off, 1 = safe, 2 = balanced, 3 = aggressive bool bTimerHack; bool bAlphaMaskHack; bool bBlockTransferGPU; diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index 7655a54306..9f84af7b8c 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -378,8 +378,44 @@ namespace DX9 { vfb->bufferHeight = std::max(vfb->bufferHeight, h); } - vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; - vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + if (g_Config.iInternalResolution == 1) { + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + } else { + switch (g_Config.iBloomHack) { + case 0: + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + break; + case 1: + if (vfb->bufferWidth <= 128 || vfb->bufferHeight <= 64) { + vfb->renderWidth = vfb->bufferWidth; + vfb->renderHeight = vfb->bufferHeight; + } else { + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + } + break; + case 2: + if (vfb->bufferWidth <= 256 || vfb->bufferHeight <= 128) { + vfb->renderWidth = vfb->bufferWidth; + vfb->renderHeight = vfb->bufferHeight; + } else { + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + } + break; + case 3: + if (vfb->bufferWidth < 480 || vfb->bufferHeight < 272) { + vfb->renderWidth = vfb->bufferWidth; + vfb->renderHeight = vfb->bufferHeight; + } else { + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + } + break; + } + } bool trueColor = g_Config.bTrueColor; if (hackForce04154000Download_ && vfb->fb_address == 0x00154000) { diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 5731c3909a..4196cd88c3 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -667,8 +667,44 @@ void FramebufferManager::ResizeFramebufFBO(VirtualFramebuffer *vfb, u16 w, u16 h vfb->bufferHeight = std::max(vfb->bufferHeight, h); } - vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; - vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + if (g_Config.iInternalResolution==1) { + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + } else { + switch (g_Config.iBloomHack) { + case 0: + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + break; + case 1: + if (vfb->bufferWidth <= 128 || vfb->bufferHeight <= 64) { + vfb->renderWidth = vfb->bufferWidth; + vfb->renderHeight = vfb->bufferHeight; + } else { + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + } + break; + case 2: + if (vfb->bufferWidth <= 256 || vfb->bufferHeight <= 128) { + vfb->renderWidth = vfb->bufferWidth; + vfb->renderHeight = vfb->bufferHeight; + } else { + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + } + break; + case 3: + if (vfb->bufferWidth < 480 || vfb->bufferHeight < 272) { + vfb->renderWidth = vfb->bufferWidth; + vfb->renderHeight = vfb->bufferHeight; + } else { + vfb->renderWidth = vfb->bufferWidth * renderWidthFactor; + vfb->renderHeight = vfb->bufferHeight * renderHeightFactor; + } + break; + } + } bool trueColor = g_Config.bTrueColor; if (hackForce04154000Download_ && vfb->fb_address == 0x00154000) { diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 2b1e61f949..dcfe447623 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -287,6 +287,11 @@ void GameSettingsScreen::CreateViews() { CheckBox *depthRange = graphicsSettings->Add(new CheckBox(&g_Config.bDepthRangeHack, gs->T("Depth Range Hack (Phantasy Star Portable 2)"))); depthRange->SetDisabledPtr(&g_Config.bSoftwareRendering); + static const char *bloomHackOptions[] = { "Off", "Safe", "Balanced", "Aggressive" }; + PopupMultiChoice *bloomHack = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iBloomHack, gs->T("Bloom Effect Smoothing"), bloomHackOptions, 0, ARRAY_SIZE(bloomHackOptions), gs, screenManager())); + bloomHackEnable_ = !g_Config.bSoftwareRendering && (g_Config.iInternalResolution != 1); + bloomHack->SetEnabledPtr(&bloomHackEnable_); + graphicsSettings->Add(new ItemHeader(gs->T("Overlay Information"))); static const char *fpsChoices[] = { "None", "Speed", "FPS", "Both" diff --git a/UI/GameSettingsScreen.h b/UI/GameSettingsScreen.h index ad423cbe15..cabb6ceec5 100644 --- a/UI/GameSettingsScreen.h +++ b/UI/GameSettingsScreen.h @@ -105,6 +105,7 @@ private: bool vtxCacheEnable_; bool postProcEnable_; bool resolutionEnable_; + bool bloomHackEnable_; }; class DeveloperToolsScreen : public UIDialogScreenWithBackground {