diff --git a/Core/Config.cpp b/Core/Config.cpp index 5fa7ce1220..125f5b5559 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -985,6 +985,9 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { if (iAnisotropyLevel > 4) { iAnisotropyLevel = 4; } + if (iRenderingMode != FB_NON_BUFFERED_MODE && iRenderingMode != FB_BUFFERED_MODE) { + g_Config.iRenderingMode = FB_BUFFERED_MODE; + } // Check for an old dpad setting IniFile::Section *control = iniFile.GetOrCreateSection("Control"); diff --git a/Core/Config.h b/Core/Config.h index c96ef33af0..07f0975dd5 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -166,7 +166,7 @@ public: bool bHardwareTransform; // only used in the GLES backend bool bSoftwareSkinning; // may speed up some games - int iRenderingMode; // 0 = non-buffered rendering 1 = buffered rendering 2 = Read Framebuffer to memory (CPU) 3 = Read Framebuffer to memory (GPU) + int iRenderingMode; // 0 = non-buffered rendering 1 = buffered rendering int iTexFiltering; // 1 = off , 2 = nearest , 3 = linear , 4 = linear(CG) int iBufFilter; // 1 = linear, 2 = nearest int iSmallDisplayZoomType; // Used to fit display into screen 0 = stretch, 1 = partial stretch, 2 = auto scaling, 3 = manual scaling. diff --git a/Core/MIPS/IR/IRInterpreter.cpp b/Core/MIPS/IR/IRInterpreter.cpp index f58a0abc28..f3a56ba51c 100644 --- a/Core/MIPS/IR/IRInterpreter.cpp +++ b/Core/MIPS/IR/IRInterpreter.cpp @@ -789,8 +789,11 @@ u32 IRInterpret(MIPSState *mips, const IRInst *inst, const u32 *constPool, int c } case IROp::Break: - Crash(); - break; + if (!g_Config.bIgnoreBadMemAccess) { + Core_EnableStepping(true); + host->SetDebugMode(true); + } + return mips->pc + 4; case IROp::SetCtrlVFPU: mips->vfpuCtrl[inst->dest] = constPool[inst->src1]; diff --git a/Core/Reporting.cpp b/Core/Reporting.cpp index 7b9e40af03..02503301d8 100644 --- a/Core/Reporting.cpp +++ b/Core/Reporting.cpp @@ -453,8 +453,6 @@ namespace Reporting bool IsSupported() { // Disabled when using certain hacks, because they make for poor reports. - if (g_Config.iRenderingMode >= 2) // FBO_READFBOMEMORY_MIN - return false; if (g_Config.bTimerHack) return false; if (CheatsInEffect()) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 2ea332f4d9..9054ffe7de 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -162,7 +162,6 @@ bool FramebufferManagerCommon::UpdateSize() { void FramebufferManagerCommon::BeginFrame() { DecimateFBOs(); currentRenderVfb_ = nullptr; - updateVRAM_ = !(g_Config.iRenderingMode == FB_NON_BUFFERED_MODE || g_Config.iRenderingMode == FB_BUFFERED_MODE); } void FramebufferManagerCommon::SetDisplayFramebuffer(u32 framebuf, u32 stride, GEBufferFormat format) { @@ -195,8 +194,7 @@ u32 FramebufferManagerCommon::FramebufferByteSize(const VirtualFramebuffer *vfb) } bool FramebufferManagerCommon::ShouldDownloadFramebuffer(const VirtualFramebuffer *vfb) const { - return updateVRAM_ || - (PSP_CoreParameter().compat.flags().Force04154000Download && vfb->fb_address == 0x00154000) || + return (PSP_CoreParameter().compat.flags().Force04154000Download && vfb->fb_address == 0x00154000) || (PSP_CoreParameter().compat.flags().ForceRangeDownload && vfb->fb_address >= 0x001F3A80 && vfb->fb_address <= 0x001FE7C0) || (PSP_CoreParameter().compat.flags().Force04Download && vfb->fb_address >= 0x00000000 && vfb->fb_address <= 0x00400000); // Should be vfb->fb_address >= 0x00154000 && vfb->fb_address <= 0x00158000, but nah, let's make it less safe, but more universal } @@ -460,7 +458,7 @@ VirtualFramebuffer *FramebufferManagerCommon::DoSetRenderFrameBuffer(const Frame vfbs_.push_back(vfb); currentRenderVfb_ = vfb; - if (useBufferedRendering_ && !updateVRAM_ && !g_Config.bDisableSlowFramebufEffects) { + if (useBufferedRendering_ && !g_Config.bDisableSlowFramebufEffects) { gpu->PerformMemoryUpload(fb_address_mem, byteSize); NotifyStencilUpload(fb_address_mem, byteSize, true); // TODO: Is it worth trying to upload the depth buffer? @@ -1213,7 +1211,7 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, int w, } bool FramebufferManagerCommon::NotifyFramebufferCopy(u32 src, u32 dst, int size, bool isMemset, u32 skipDrawReason) { - if (updateVRAM_ || size == 0) { + if (size == 0) { return false; } @@ -1583,7 +1581,7 @@ void FramebufferManagerCommon::OptimizeDownloadRange(VirtualFramebuffer * vfb, i } bool FramebufferManagerCommon::NotifyBlockTransferBefore(u32 dstBasePtr, int dstStride, int dstX, int dstY, u32 srcBasePtr, int srcStride, int srcX, int srcY, int width, int height, int bpp, u32 skipDrawReason) { - if (!useBufferedRendering_ || updateVRAM_) { + if (!useBufferedRendering_) { return false; } diff --git a/GPU/Common/FramebufferCommon.h b/GPU/Common/FramebufferCommon.h index 13b8a840ec..78005a1126 100644 --- a/GPU/Common/FramebufferCommon.h +++ b/GPU/Common/FramebufferCommon.h @@ -40,15 +40,6 @@ enum { enum { FB_NON_BUFFERED_MODE = 0, FB_BUFFERED_MODE = 1, - - // Hm, it's unfortunate that GPU has ended up as two separate values in GL and GLES. -#ifndef USING_GLES2 - FB_READFBOMEMORY_CPU = 2, - FB_READFBOMEMORY_GPU = 3, -#else - FB_READFBOMEMORY_GPU = 2, -#endif - FBO_READFBOMEMORY_MIN = 2 }; namespace Draw { @@ -385,7 +376,6 @@ protected: u32 framebufRangeEnd_ = 0; bool useBufferedRendering_ = false; - bool updateVRAM_ = false; bool usePostShader_ = false; bool postShaderAtOutputResolution_ = false; bool postShaderIsUpscalingFilter_ = false; diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 8a7ae36976..b55b9c97b4 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -720,10 +720,6 @@ bool TextureCacheCommon::AttachFramebuffer(TexCacheEntry *entry, u32 address, Vi // If they match exactly, it's non-CLUT and from the top left. if (exactMatch) { - // Apply to non-buffered and buffered mode only. - if (!(g_Config.iRenderingMode == FB_NON_BUFFERED_MODE || g_Config.iRenderingMode == FB_BUFFERED_MODE)) - return false; - DEBUG_LOG(G3D, "Render to texture detected at %08x!", address); if (framebuffer->fb_stride != entry->bufw) { WARN_LOG_REPORT_ONCE(diffStrides1, G3D, "Render to texture with different strides %d != %d", entry->bufw, framebuffer->fb_stride); diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 140aa056f7..a0b9b60791 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -1039,11 +1039,6 @@ void FramebufferManagerGLES::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int void FramebufferManagerGLES::EndFrame() { CHECK_GL_ERROR_IF_DEBUG(); - // We flush to memory last requested framebuffer, if any. - // Only do this in the read-framebuffer modes. - if (updateVRAM_) - PackFramebufferAsync_(nullptr); - // Let's explicitly invalidate any temp FBOs used during this frame. if (gl_extensions.GLES3 && glInvalidateFramebuffer != nullptr) { for (auto temp : tempFBOs_) { diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index a1854df7a5..8142419e97 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -255,17 +255,11 @@ void GPU_GLES::CheckGPUFeatures() { bool useCPU = false; if (!gl_extensions.IsGLES) { - // Urrgh, we don't even define FB_READFBOMEMORY_CPU on mobile -#ifndef USING_GLES2 - useCPU = g_Config.iRenderingMode == FB_READFBOMEMORY_CPU; -#endif // Some cards or drivers seem to always dither when downloading a framebuffer to 16-bit. // This causes glitches in games that expect the exact values. // It has not been experienced on NVIDIA cards, so those are left using the GPU (which is faster.) - if (g_Config.iRenderingMode == FB_BUFFERED_MODE) { - if (gl_extensions.gpuVendor != GPU_VENDOR_NVIDIA || gl_extensions.ver[0] < 3) { - useCPU = true; - } + if (gl_extensions.gpuVendor != GPU_VENDOR_NVIDIA || !gl_extensions.VersionGEThan(3, 0)) { + useCPU = true; } } else { useCPU = true; diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 5c8526a945..0897f78c6a 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -1745,7 +1745,8 @@ void GPUCommon::Execute_BoneMtxNum(u32 op, u32 diff) { const int end = 12 * 8 - (op & 0x7F); int i = 0; - bool fastLoad = !debugRecording_; + // TODO: Validate what should happen when explicitly setting num to 96 or higher. + bool fastLoad = !debugRecording_ && end > 0; if (currentList->pc < currentList->stall && currentList->pc + end * 4 >= currentList->stall) { fastLoad = false; } diff --git a/Qt/mainwindow.cpp b/Qt/mainwindow.cpp index 5e4fc65535..7e0b481f9b 100644 --- a/Qt/mainwindow.cpp +++ b/Qt/mainwindow.cpp @@ -551,7 +551,6 @@ void MainWindow::createMenus() anisotropicGroup = new MenuActionGroup(this, anisotropicMenu, SLOT(anisotropicGroup_triggered(QAction *)), QStringList() << "Off" << "2x" << "4x" << "8x" << "16x", QList() << 0 << 1 << 2 << 3 << 4); - // TODO: Check for newer buffer render options videoMenu->add(new MenuAction(this, SLOT(bufferRenderAct()), QT_TR_NOOP("&Buffered Rendering"), Qt::Key_F5)) ->addEventChecked(&g_Config.iRenderingMode); videoMenu->add(new MenuAction(this, SLOT(linearAct()), QT_TR_NOOP("&Linear Filtering"))) diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index b9d16abd70..827bbc2297 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -200,21 +200,15 @@ void GameSettingsScreen::CreateViews() { renderingBackendChoice->HideChoice(3); } - static const char *renderingMode[] = { "Non-Buffered Rendering", "Buffered Rendering", "Read Framebuffers To Memory (CPU)", "Read Framebuffers To Memory (GPU)" }; + static const char *renderingMode[] = { "Non-Buffered Rendering", "Buffered Rendering"}; PopupMultiChoice *renderingModeChoice = graphicsSettings->Add(new PopupMultiChoice(&g_Config.iRenderingMode, gr->T("Mode"), renderingMode, 0, ARRAY_SIZE(renderingMode), gr->GetName(), screenManager())); renderingModeChoice->OnChoice.Add([=](EventParams &e) { switch (g_Config.iRenderingMode) { case FB_NON_BUFFERED_MODE: - settingInfo_->Show(gr->T("RenderingMode NonBuffered Tip", "Faster, but nothing may draw in some games"), e.v); + settingInfo_->Show(gr->T("RenderingMode NonBuffered Tip", "Faster, but graphics may be missing in some games"), e.v); break; case FB_BUFFERED_MODE: break; -#ifndef USING_GLES2 - case FB_READFBOMEMORY_CPU: -#endif - case FB_READFBOMEMORY_GPU: - settingInfo_->Show(gr->T("RenderingMode ReadFromMemory Tip", "Causes crashes in many games, not recommended"), e.v); - break; } return UI::EVENT_CONTINUE; }); diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index 144181e0b1..44831441f7 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -341,8 +341,6 @@ namespace MainWindow { TranslateSubMenu(menu, "Rendering Mode", MENU_OPTIONS, SUBMENU_RENDERING_MODE); TranslateMenuItem(menu, ID_OPTIONS_NONBUFFEREDRENDERING); TranslateMenuItem(menu, ID_OPTIONS_BUFFEREDRENDERING); - TranslateMenuItem(menu, ID_OPTIONS_READFBOTOMEMORYCPU); - TranslateMenuItem(menu, ID_OPTIONS_READFBOTOMEMORYGPU); TranslateSubMenu(menu, "Frame Skipping", MENU_OPTIONS, SUBMENU_FRAME_SKIPPING, L"\tF7"); TranslateMenuItem(menu, ID_OPTIONS_FRAMESKIP_AUTO); TranslateMenuItem(menu, ID_OPTIONS_FRAMESKIP_0); @@ -526,15 +524,9 @@ namespace MainWindow { } static void setRenderingMode(int mode) { - if (mode >= FB_NON_BUFFERED_MODE) - g_Config.iRenderingMode = mode; - else { - if (++g_Config.iRenderingMode > FB_READFBOMEMORY_GPU) - g_Config.iRenderingMode = FB_NON_BUFFERED_MODE; - } - I18NCategory *gr = GetI18NCategory("Graphics"); + g_Config.iRenderingMode = mode; switch (g_Config.iRenderingMode) { case FB_NON_BUFFERED_MODE: osm.Show(gr->T("Non-Buffered Rendering")); @@ -544,14 +536,6 @@ namespace MainWindow { case FB_BUFFERED_MODE: osm.Show(gr->T("Buffered Rendering")); break; - - case FB_READFBOMEMORY_CPU: - osm.Show(gr->T("Read Framebuffers To Memory (CPU)")); - break; - - case FB_READFBOMEMORY_GPU: - osm.Show(gr->T("Read Framebuffers To Memory (GPU)")); - break; } NativeMessageReceived("gpu_resized", ""); @@ -824,8 +808,6 @@ namespace MainWindow { case ID_OPTIONS_NONBUFFEREDRENDERING: setRenderingMode(FB_NON_BUFFERED_MODE); break; case ID_OPTIONS_BUFFEREDRENDERING: setRenderingMode(FB_BUFFERED_MODE); break; - case ID_OPTIONS_READFBOTOMEMORYCPU: setRenderingMode(FB_READFBOMEMORY_CPU); break; - case ID_OPTIONS_READFBOTOMEMORYGPU: setRenderingMode(FB_READFBOMEMORY_GPU); break; case ID_DEBUG_SHOWDEBUGSTATISTICS: g_Config.bShowDebugStats = !g_Config.bShowDebugStats; @@ -1248,14 +1230,7 @@ namespace MainWindow { static const int renderingmode[] = { ID_OPTIONS_NONBUFFEREDRENDERING, ID_OPTIONS_BUFFEREDRENDERING, - ID_OPTIONS_READFBOTOMEMORYCPU, - ID_OPTIONS_READFBOTOMEMORYGPU, }; - if (g_Config.iRenderingMode < FB_NON_BUFFERED_MODE) - g_Config.iRenderingMode = FB_NON_BUFFERED_MODE; - - else if (g_Config.iRenderingMode > FB_READFBOMEMORY_GPU) - g_Config.iRenderingMode = FB_READFBOMEMORY_GPU; for (int i = 0; i < ARRAY_SIZE(renderingmode); i++) { CheckMenuItem(menu, renderingmode[i], MF_BYCOMMAND | ((i == g_Config.iRenderingMode) ? MF_CHECKED : MF_UNCHECKED)); diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index 4b0cfb1797..7f70258eb2 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -504,10 +504,8 @@ BEGIN POPUP "Rendering Mode" BEGIN - MENUITEM "Non-Buffered Rendering", ID_OPTIONS_NONBUFFEREDRENDERING - MENUITEM "Buffered Rendering", ID_OPTIONS_BUFFEREDRENDERING - MENUITEM "Read Framebuffers To Memory (CPU)", ID_OPTIONS_READFBOTOMEMORYCPU - MENUITEM "Read Framebuffers To Memory (GPU)", ID_OPTIONS_READFBOTOMEMORYGPU + MENUITEM "Non-Buffered Rendering", ID_OPTIONS_NONBUFFEREDRENDERING + MENUITEM "Buffered Rendering", ID_OPTIONS_BUFFEREDRENDERING END POPUP "Frame Skipping" BEGIN diff --git a/Windows/resource.h b/Windows/resource.h index 3b723ba153..642f02311f 100644 --- a/Windows/resource.h +++ b/Windows/resource.h @@ -241,8 +241,6 @@ #define ID_DISASM_THREAD_KILL 40073 #define ID_FILE_SAVESTATE_NEXT_SLOT 40074 #define ID_FILE_SAVESTATE_NEXT_SLOT_HC 40075 -#define ID_OPTIONS_READFBOTOMEMORYGPU 40076 -#define ID_OPTIONS_READFBOTOMEMORYCPU 40077 #define ID_OPTIONS_NONBUFFEREDRENDERING 40078 #define ID_OPTIONS_FRAMESKIP_0 40079 #define ID_OPTIONS_FRAMESKIP_1 40080