GLES: Move some vendor bug checks to Draw.

This commit is contained in:
Unknown W. Brackets 2018-12-23 12:46:48 -08:00
parent 9a3de5cb1c
commit adeca2c3ba
15 changed files with 32 additions and 21 deletions

View File

@ -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 {

View File

@ -73,7 +73,7 @@ public:
}
void ThreadStart() override {
renderManager_->ThreadStart();
renderManager_->ThreadStart(draw_);
}
bool ThreadFrame() override {

View File

@ -32,7 +32,7 @@ public:
}
void ThreadStart() override {
renderManager_->ThreadStart();
renderManager_->ThreadStart(draw_);
}
bool ThreadFrame() override {

View File

@ -458,7 +458,7 @@ void WindowsGLContext::Resize() {
}
void WindowsGLContext::ThreadStart() {
renderManager_->ThreadStart();
renderManager_->ThreadStart(draw_);
}
bool WindowsGLContext::ThreadFrame() {

View File

@ -21,7 +21,7 @@ public:
}
void ThreadStart() override {
renderManager_->ThreadStart();
renderManager_->ThreadStart(draw_);
}
bool ThreadFrame() override {

View File

@ -34,7 +34,7 @@ public:
}
void ThreadStart() override {
renderManager_->ThreadStart();
renderManager_->ThreadStart(draw_);
}
bool ThreadFrame() override {

View File

@ -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;
}
}

View File

@ -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:

View File

@ -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.

View File

@ -19,6 +19,10 @@
class GLRInputLayout;
class GLPushBuffer;
namespace Draw {
class DrawContext;
}
class GLRTexture {
public:
~GLRTexture() {
@ -365,7 +369,7 @@ public:
GLRenderManager();
~GLRenderManager();
void ThreadStart();
void ThreadStart(Draw::DrawContext *draw);
void ThreadEnd();
bool ThreadFrame(); // Returns false to request exiting the loop.

View File

@ -327,6 +327,8 @@ public:
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:

View File

@ -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() {

View File

@ -76,7 +76,7 @@ public:
}
void ThreadStart() override {
renderManager_->ThreadStart();
renderManager_->ThreadStart(draw_);
}
bool ThreadFrame() override {

View File

@ -51,7 +51,7 @@ public:
return draw_;
}
void ThreadStart() override {
renderManager_->ThreadStart();
renderManager_->ThreadStart(draw_);
}
bool ThreadFrame() override {

View File

@ -26,7 +26,7 @@ public:
g_defaultFBO = hw_render_.get_current_framebuffer();
}
void ThreadStart() override { renderManager_->ThreadStart(); }
void ThreadStart() override { renderManager_->ThreadStart(draw_); }
bool ThreadFrame() override { return renderManager_->ThreadFrame(); }
void ThreadEnd() override { renderManager_->ThreadEnd(); }
void StopThread() override {