From b420ca1833853afa6c60d4657ae4e82cea2d02b1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 23 Dec 2018 12:46:48 -0800 Subject: [PATCH] GLES: Move some vendor bug checks to Draw. --- GPU/GLES/TextureCacheGLES.cpp | 2 +- Qt/QtMain.h | 2 +- Windows/GPU/WindowsGLContext.cpp | 2 +- android/jni/AndroidEGLContext.h | 2 +- android/jni/AndroidJavaGLContext.h | 2 +- ext/native/gfx_es2/gpu_features.cpp | 7 ------- ext/native/gfx_es2/gpu_features.h | 2 -- ext/native/thin3d/GLRenderManager.cpp | 6 ++++-- ext/native/thin3d/GLRenderManager.h | 6 +++++- ext/native/thin3d/thin3d.h | 2 ++ ext/native/thin3d/thin3d_gl.cpp | 12 ++++++++++++ headless/SDLHeadlessHost.cpp | 2 +- ios/ViewController.mm | 2 +- 13 files changed, 30 insertions(+), 19 deletions(-) diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 395651f24b29..9bfc2a6cfa8a 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -672,7 +672,7 @@ void TextureCacheGLES::BuildTexture(TexCacheEntry *const entry) { } } else { // Avoid PowerVR driver bug - if (canAutoGen && w > 1 && h > 1 && !(h > w && (gl_extensions.bugs & BUG_PVR_GENMIPMAP_HEIGHT_GREATER))) { // Really! only seems to fail if height > width + if (canAutoGen && w > 1 && h > 1 && !(h > w && draw_->GetBugs().Has(Draw::Bugs::PVR_GENMIPMAP_HEIGHT_GREATER))) { // Really! only seems to fail if height > width // NOTICE_LOG(G3D, "Generating mipmap for texture sized %dx%d%d", w, h, (int)format); genMips = true; } else { diff --git a/Qt/QtMain.h b/Qt/QtMain.h index 70d89b88d8d3..3e165a8d9f8c 100644 --- a/Qt/QtMain.h +++ b/Qt/QtMain.h @@ -73,7 +73,7 @@ class QtGLGraphicsContext : public GraphicsContext { } void ThreadStart() override { - renderManager_->ThreadStart(); + renderManager_->ThreadStart(draw_); } bool ThreadFrame() override { diff --git a/Windows/GPU/WindowsGLContext.cpp b/Windows/GPU/WindowsGLContext.cpp index 002464cf2779..0701ffa4aac4 100644 --- a/Windows/GPU/WindowsGLContext.cpp +++ b/Windows/GPU/WindowsGLContext.cpp @@ -458,7 +458,7 @@ void WindowsGLContext::Resize() { } void WindowsGLContext::ThreadStart() { - renderManager_->ThreadStart(); + renderManager_->ThreadStart(draw_); } bool WindowsGLContext::ThreadFrame() { diff --git a/android/jni/AndroidEGLContext.h b/android/jni/AndroidEGLContext.h index 35ae334294c5..45b33f82410b 100644 --- a/android/jni/AndroidEGLContext.h +++ b/android/jni/AndroidEGLContext.h @@ -21,7 +21,7 @@ class AndroidEGLGraphicsContext : public AndroidGraphicsContext { } void ThreadStart() override { - renderManager_->ThreadStart(); + renderManager_->ThreadStart(draw_); } bool ThreadFrame() override { diff --git a/android/jni/AndroidJavaGLContext.h b/android/jni/AndroidJavaGLContext.h index 99db77dfcb24..05d3966896bb 100644 --- a/android/jni/AndroidJavaGLContext.h +++ b/android/jni/AndroidJavaGLContext.h @@ -34,7 +34,7 @@ class AndroidJavaEGLGraphicsContext : public AndroidGraphicsContext { } void ThreadStart() override { - renderManager_->ThreadStart(); + renderManager_->ThreadStart(draw_); } bool ThreadFrame() override { diff --git a/ext/native/gfx_es2/gpu_features.cpp b/ext/native/gfx_es2/gpu_features.cpp index 35b1e421c9ff..c6b71021affa 100644 --- a/ext/native/gfx_es2/gpu_features.cpp +++ b/ext/native/gfx_es2/gpu_features.cpp @@ -114,13 +114,6 @@ void ProcessGPUFeatures() { WLOG("GL DRIVER BUG: PVR with bad precision"); gl_extensions.bugs |= BUG_PVR_SHADER_PRECISION_BAD; } - gl_extensions.bugs |= BUG_PVR_GENMIPMAP_HEIGHT_GREATER; - } - - // TODO: Make this check more lenient. Disabled for all right now - // because it murders performance on Mali. - if (gl_extensions.gpuVendor != GPU_VENDOR_NVIDIA) { - gl_extensions.bugs |= BUG_ANY_MAP_BUFFER_RANGE_SLOW; } } diff --git a/ext/native/gfx_es2/gpu_features.h b/ext/native/gfx_es2/gpu_features.h index 6764d08105d0..80cbc906bd06 100644 --- a/ext/native/gfx_es2/gpu_features.h +++ b/ext/native/gfx_es2/gpu_features.h @@ -22,8 +22,6 @@ enum { BUG_FBO_UNUSABLE = 1, BUG_PVR_SHADER_PRECISION_BAD = 2, BUG_PVR_SHADER_PRECISION_TERRIBLE = 4, - BUG_PVR_GENMIPMAP_HEIGHT_GREATER = 8, - BUG_ANY_MAP_BUFFER_RANGE_SLOW = 16, }; // Extensions to look at using: diff --git a/ext/native/thin3d/GLRenderManager.cpp b/ext/native/thin3d/GLRenderManager.cpp index bc9defccadc2..b7585b7a033c 100644 --- a/ext/native/thin3d/GLRenderManager.cpp +++ b/ext/native/thin3d/GLRenderManager.cpp @@ -2,6 +2,7 @@ #include "GLRenderManager.h" #include "gfx_es2/gpu_features.h" +#include "thin3d/thin3d.h" #include "thread/threadutil.h" #include "base/logging.h" #include "GPU/GPUState.h" @@ -89,12 +90,13 @@ GLRenderManager::~GLRenderManager() { _assert_(deleter_.IsEmpty()); } -void GLRenderManager::ThreadStart() { +void GLRenderManager::ThreadStart(Draw::DrawContext *draw) { queueRunner_.CreateDeviceObjects(); threadFrame_ = threadInitFrame_; renderThreadId = std::this_thread::get_id(); - bool mapBuffers = (gl_extensions.bugs & BUG_ANY_MAP_BUFFER_RANGE_SLOW) == 0; + // Don't save draw, we don't want any thread safety confusion. + bool mapBuffers = draw->GetBugs().Has(Draw::Bugs::ANY_MAP_BUFFER_RANGE_SLOW); bool hasBufferStorage = gl_extensions.ARB_buffer_storage || gl_extensions.EXT_buffer_storage; if (!gl_extensions.VersionGEThan(3, 0, 0) && gl_extensions.IsGLES && !hasBufferStorage) { // Force disable if it wouldn't work anyway. diff --git a/ext/native/thin3d/GLRenderManager.h b/ext/native/thin3d/GLRenderManager.h index 719ad156e6ac..7b38c024e86d 100644 --- a/ext/native/thin3d/GLRenderManager.h +++ b/ext/native/thin3d/GLRenderManager.h @@ -19,6 +19,10 @@ class GLRInputLayout; class GLPushBuffer; +namespace Draw { +class DrawContext; +} + class GLRTexture { public: ~GLRTexture() { @@ -365,7 +369,7 @@ class GLRenderManager { GLRenderManager(); ~GLRenderManager(); - void ThreadStart(); + void ThreadStart(Draw::DrawContext *draw); void ThreadEnd(); bool ThreadFrame(); // Returns false to request exiting the loop. diff --git a/ext/native/thin3d/thin3d.h b/ext/native/thin3d/thin3d.h index 8e8f5eb81de4..1d0e28a98389 100644 --- a/ext/native/thin3d/thin3d.h +++ b/ext/native/thin3d/thin3d.h @@ -327,6 +327,8 @@ class Bugs { enum : uint32_t { NO_DEPTH_CANNOT_DISCARD_STENCIL = 0, DUAL_SOURCE_BLENDING_BROKEN = 1, + ANY_MAP_BUFFER_RANGE_SLOW = 2, + PVR_GENMIPMAP_HEIGHT_GREATER = 3, }; protected: diff --git a/ext/native/thin3d/thin3d_gl.cpp b/ext/native/thin3d/thin3d_gl.cpp index e3668b8b9756..1d812ce4966d 100644 --- a/ext/native/thin3d/thin3d_gl.cpp +++ b/ext/native/thin3d/thin3d_gl.cpp @@ -568,6 +568,18 @@ OpenGLContext::OpenGLContext() { } } } + + // TODO: Make this check more lenient. Disabled for all right now + // because it murders performance on Mali. + if (caps_.vendor != GPUVendor::VENDOR_NVIDIA) { + bugs_.Infest(Bugs::ANY_MAP_BUFFER_RANGE_SLOW); + } + + if (caps_.vendor == GPUVendor::VENDOR_IMGTEC) { + // See https://github.com/hrydgard/ppsspp/commit/8974cd675e538f4445955e3eac572a9347d84232 + // TODO: Should this workaround be removed for newer devices/drivers? + bugs_.Infest(Bugs::PVR_GENMIPMAP_HEIGHT_GREATER); + } } OpenGLContext::~OpenGLContext() { diff --git a/headless/SDLHeadlessHost.cpp b/headless/SDLHeadlessHost.cpp index 1545a53f9cec..c5702eabc414 100644 --- a/headless/SDLHeadlessHost.cpp +++ b/headless/SDLHeadlessHost.cpp @@ -76,7 +76,7 @@ class GLDummyGraphicsContext : public DummyGraphicsContext { } void ThreadStart() override { - renderManager_->ThreadStart(); + renderManager_->ThreadStart(draw_); } bool ThreadFrame() override { diff --git a/ios/ViewController.mm b/ios/ViewController.mm index 61c2eee554e3..0c5c5ae5dad8 100644 --- a/ios/ViewController.mm +++ b/ios/ViewController.mm @@ -51,7 +51,7 @@ return draw_; } void ThreadStart() override { - renderManager_->ThreadStart(); + renderManager_->ThreadStart(draw_); } bool ThreadFrame() override {