mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-10-08 03:13:25 +00:00
GLES: Move some vendor bug checks to Draw.
This commit is contained in:
parent
9a3de5cb1c
commit
adeca2c3ba
@ -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 {
|
||||
|
@ -73,7 +73,7 @@ public:
|
||||
}
|
||||
|
||||
void ThreadStart() override {
|
||||
renderManager_->ThreadStart();
|
||||
renderManager_->ThreadStart(draw_);
|
||||
}
|
||||
|
||||
bool ThreadFrame() override {
|
||||
|
@ -32,7 +32,7 @@ public:
|
||||
}
|
||||
|
||||
void ThreadStart() override {
|
||||
renderManager_->ThreadStart();
|
||||
renderManager_->ThreadStart(draw_);
|
||||
}
|
||||
|
||||
bool ThreadFrame() override {
|
||||
|
@ -458,7 +458,7 @@ void WindowsGLContext::Resize() {
|
||||
}
|
||||
|
||||
void WindowsGLContext::ThreadStart() {
|
||||
renderManager_->ThreadStart();
|
||||
renderManager_->ThreadStart(draw_);
|
||||
}
|
||||
|
||||
bool WindowsGLContext::ThreadFrame() {
|
||||
|
@ -21,7 +21,7 @@ public:
|
||||
}
|
||||
|
||||
void ThreadStart() override {
|
||||
renderManager_->ThreadStart();
|
||||
renderManager_->ThreadStart(draw_);
|
||||
}
|
||||
|
||||
bool ThreadFrame() override {
|
||||
|
@ -34,7 +34,7 @@ public:
|
||||
}
|
||||
|
||||
void ThreadStart() override {
|
||||
renderManager_->ThreadStart();
|
||||
renderManager_->ThreadStart(draw_);
|
||||
}
|
||||
|
||||
bool ThreadFrame() override {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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.
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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() {
|
||||
|
@ -76,7 +76,7 @@ public:
|
||||
}
|
||||
|
||||
void ThreadStart() override {
|
||||
renderManager_->ThreadStart();
|
||||
renderManager_->ThreadStart(draw_);
|
||||
}
|
||||
|
||||
bool ThreadFrame() override {
|
||||
|
@ -51,7 +51,7 @@ public:
|
||||
return draw_;
|
||||
}
|
||||
void ThreadStart() override {
|
||||
renderManager_->ThreadStart();
|
||||
renderManager_->ThreadStart(draw_);
|
||||
}
|
||||
|
||||
bool ThreadFrame() override {
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user