From 6858c7761276fe615af59b7c4b7a6f7631576085 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 17 Mar 2018 01:53:19 +0100 Subject: [PATCH] Don't allow wrapping on framebuffer textures. Fixes GTA on old NV Shield --- GPU/GLES/DrawEngineGLES.cpp | 2 +- GPU/GLES/ShaderManagerGLES.cpp | 2 -- GPU/GLES/ShaderManagerGLES.h | 6 ++---- UI/DevScreens.cpp | 3 ++- ext/native/thin3d/GLQueueRunner.cpp | 18 +++++++++++------- ext/native/thin3d/GLRenderManager.h | 5 +++-- 6 files changed, 19 insertions(+), 17 deletions(-) diff --git a/GPU/GLES/DrawEngineGLES.cpp b/GPU/GLES/DrawEngineGLES.cpp index 0dcf21a6ab..24c84b616a 100644 --- a/GPU/GLES/DrawEngineGLES.cpp +++ b/GPU/GLES/DrawEngineGLES.cpp @@ -109,7 +109,7 @@ void DrawEngineGLES::DeviceRestore() { void DrawEngineGLES::InitDeviceObjects() { for (int i = 0; i < GLRenderManager::MAX_INFLIGHT_FRAMES; i++) { - frameData_[i].pushVertex = new GLPushBuffer(render_, GL_ARRAY_BUFFER, 256 * 1024); + frameData_[i].pushVertex = new GLPushBuffer(render_, GL_ARRAY_BUFFER, 1024 * 1024); frameData_[i].pushIndex = new GLPushBuffer(render_, GL_ELEMENT_ARRAY_BUFFER, 256 * 1024); render_->RegisterPushBuffer(i, frameData_[i].pushVertex); diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 399b01c1b0..237e1edb56 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -79,8 +79,6 @@ LinkedShader::LinkedShader(GLRenderManager *render, VShaderID VSID, Shader *vs, semantics.push_back({ ATTR_POSITION, "position" }); semantics.push_back({ ATTR_TEXCOORD, "texcoord" }); semantics.push_back({ ATTR_NORMAL, "normal" }); - semantics.push_back({ ATTR_W1, "w1" }); - semantics.push_back({ ATTR_W2, "w2" }); semantics.push_back({ ATTR_COLOR0, "color0" }); semantics.push_back({ ATTR_COLOR1, "color1" }); diff --git a/GPU/GLES/ShaderManagerGLES.h b/GPU/GLES/ShaderManagerGLES.h index 7f19a77e28..6c6efd5b3a 100644 --- a/GPU/GLES/ShaderManagerGLES.h +++ b/GPU/GLES/ShaderManagerGLES.h @@ -34,10 +34,8 @@ enum { ATTR_POSITION = 0, ATTR_TEXCOORD = 1, ATTR_NORMAL = 2, - ATTR_W1 = 3, - ATTR_W2 = 4, - ATTR_COLOR0 = 5, - ATTR_COLOR1 = 6, + ATTR_COLOR0 = 3, + ATTR_COLOR1 = 4, ATTR_COUNT, }; diff --git a/UI/DevScreens.cpp b/UI/DevScreens.cpp index c499a90392..227265233b 100644 --- a/UI/DevScreens.cpp +++ b/UI/DevScreens.cpp @@ -120,7 +120,8 @@ UI::EventReturn DevMenu::OnJitCompare(UI::EventParams &e) { UI::EventReturn DevMenu::OnShaderView(UI::EventParams &e) { UpdateUIState(UISTATE_PAUSEMENU); - screenManager()->push(new ShaderListScreen()); + if (gpu) // Avoid crashing if chosen while the game is being loaded. + screenManager()->push(new ShaderListScreen()); return UI::EVENT_DONE; } diff --git a/ext/native/thin3d/GLQueueRunner.cpp b/ext/native/thin3d/GLQueueRunner.cpp index 46850f3c70..f183dbe8c5 100644 --- a/ext/native/thin3d/GLQueueRunner.cpp +++ b/ext/native/thin3d/GLQueueRunner.cpp @@ -326,10 +326,12 @@ void GLQueueRunner::InitCreateFramebuffer(const GLRInitStep &step) { fbo->color_texture.wrapT = GL_CLAMP_TO_EDGE; fbo->color_texture.magFilter = GL_LINEAR; fbo->color_texture.minFilter = GL_LINEAR; + fbo->color_texture.canWrap = false; glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, fbo->color_texture.wrapS); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, fbo->color_texture.wrapT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, fbo->color_texture.magFilter); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, fbo->color_texture.minFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); if (gl_extensions.IsGLES) { if (gl_extensions.OES_packed_depth_stencil) { @@ -846,13 +848,15 @@ void GLQueueRunner::PerformRenderPass(const GLRStep &step) { if (!tex) { break; } - if (tex->wrapS != c.textureSampler.wrapS) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, c.textureSampler.wrapS); - tex->wrapS = c.textureSampler.wrapS; - } - if (tex->wrapT != c.textureSampler.wrapT) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, c.textureSampler.wrapT); - tex->wrapT = c.textureSampler.wrapT; + if (tex->canWrap) { + if (tex->wrapS != c.textureSampler.wrapS) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, c.textureSampler.wrapS); + tex->wrapS = c.textureSampler.wrapS; + } + if (tex->wrapT != c.textureSampler.wrapT) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, c.textureSampler.wrapT); + tex->wrapT = c.textureSampler.wrapT; + } } if (tex->magFilter != c.textureSampler.magFilter) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, c.textureSampler.magFilter); diff --git a/ext/native/thin3d/GLRenderManager.h b/ext/native/thin3d/GLRenderManager.h index 5cb4e54e61..e697aa3220 100644 --- a/ext/native/thin3d/GLRenderManager.h +++ b/ext/native/thin3d/GLRenderManager.h @@ -33,9 +33,10 @@ public: GLenum wrapT = 0xFFFF; GLenum magFilter = 0xFFFF; GLenum minFilter = 0xFFFF; + bool canWrap = true; float anisotropy = -100000.0f; - float minLod = -100000.0f; - float maxLod = 100000.0f; + float minLod = -1000.0f; + float maxLod = 1000.0f; float lodBias = 0.0f; };