From 672871b3be4ff59b3d7420098ee0abc3e43481b8 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 25 Jul 2013 05:44:01 +0000 Subject: [PATCH] Add in the Mali driver bug so we can call glFlush every flush. It seemingly is quicker calling flush every time instead of every n times. --- Source/Core/VideoCommon/Src/DriverDetails.cpp | 6 ++++++ Source/Core/VideoCommon/Src/DriverDetails.h | 10 ++++++++++ Source/Plugins/Plugin_VideoOGL/Src/Render.cpp | 8 ++++++++ Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp | 2 ++ 4 files changed, 26 insertions(+) diff --git a/Source/Core/VideoCommon/Src/DriverDetails.cpp b/Source/Core/VideoCommon/Src/DriverDetails.cpp index 0a6510eb90..153a07226f 100644 --- a/Source/Core/VideoCommon/Src/DriverDetails.cpp +++ b/Source/Core/VideoCommon/Src/DriverDetails.cpp @@ -31,6 +31,9 @@ namespace DriverDetails {BUG_BROKENINFOLOG, 300, -1.0, -1.0}, {BUG_BROKENBUFFERS, 300, 14.0, -1.0}, }; + BugInfo m_armbugs[] = { + {BUG_MALIBROKENBUFFERS, 600, -1.0, -1.0}, + }; std::map, BugInfo> m_bugs; @@ -43,6 +46,9 @@ namespace DriverDetails for (unsigned int a = 0; a < (sizeof(m_qualcommbugs) / sizeof(BugInfo)); ++a) m_bugs[std::make_pair(m_vendor, m_qualcommbugs[a].m_bug)] = m_qualcommbugs[a]; break; + case VENDOR_ARM: + for (unsigned int a = 0; a < (sizeof(m_armbugs) / sizeof(BugInfo)); ++a) + m_bugs[std::make_pair(m_vendor, m_armbugs[a].m_bug)] = m_armbugs[a]; default: break; } diff --git a/Source/Core/VideoCommon/Src/DriverDetails.h b/Source/Core/VideoCommon/Src/DriverDetails.h index f2f3480f70..bf67abe9eb 100644 --- a/Source/Core/VideoCommon/Src/DriverDetails.h +++ b/Source/Core/VideoCommon/Src/DriverDetails.h @@ -62,6 +62,16 @@ namespace DriverDetails // The "workaround" is calling swapbuffers every single time we flush // This causes flickering, but it is the only known way to work around it BUG_BROKENBUFFERS, + // Bug: Uploading data without swapping causes issues + // Affected devices: Mali-T6xx + // Started Version: -1 + // Ended Version: -1 + // This is similar to the Adreno rendering bug where uploading the data + // to the GPU causes the device to quickly run out of RAM. + // Unlike the Adreno workaround though, this can be fixed by calling + // either glFlush() or glFinish() after flushing. + // glFlush tends to take 0-1Ms on each call + BUG_MALIBROKENBUFFERS, }; // Initializes our internal vendor, device family, and driver version diff --git a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp index 0bc64a2769..74a3033efe 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/Render.cpp @@ -307,6 +307,12 @@ void InitDriverInfo() sscanf(g_ogl_config.gl_version, "OpenGL ES %lg V@%lg", &glVersion, &version); } break; + case DriverDetails::VENDOR_ARM: + if (std::string::npos != srenderer.find("Mali-T6")) + devfamily = 600; + else if(std::string::npos != srenderer.find("Mali-4")) + devfamily = 400; + break; // We don't care about these default: break; @@ -664,6 +670,7 @@ void Renderer::DrawDebugInfo() if (g_ActiveConfig.bShowInputDisplay) p+=sprintf(p, "%s", Movie::GetInputDisplay().c_str()); +#ifndef USE_GLES3 if (g_ActiveConfig.bShowEFBCopyRegions) { // Set Line Size @@ -783,6 +790,7 @@ void Renderer::DrawDebugInfo() // Clear stored regions stats.efb_regions.clear(); } +#endif if (g_ActiveConfig.bOverlayStats) p = Statistics::ToString(p); diff --git a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp index eafe16736c..6c188b04f7 100644 --- a/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp +++ b/Source/Plugins/Plugin_VideoOGL/Src/VertexManager.cpp @@ -270,6 +270,8 @@ void VertexManager::vFlush() Draw(stride); if (DriverDetails::HasBug(DriverDetails::BUG_BROKENBUFFERS)) GLInterface->Swap(); + if(DriverDetails::HasBug(DriverDetails::BUG_MALIBROKENBUFFERS)) + glFlush(); g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP); //ERROR_LOG(VIDEO, "PerfQuery result: %d", g_perf_query->GetQueryResult(bpmem.zcontrol.early_ztest ? PQ_ZCOMP_OUTPUT_ZCOMPLOC : PQ_ZCOMP_OUTPUT));