Просмотр исходного кода

gl_texture_cache: Disable scissor test when scaling textures

Fixes a bug on BOTW where some objects were no longer being rendered after blitting
ameerj 4 лет назад
Родитель
Сommit
3233fa5dc8
1 измененных файлов с 8 добавлено и 0 удалено
  1. 8 0
      src/video_core/renderer_opengl/gl_texture_cache.cpp

+ 8 - 0
src/video_core/renderer_opengl/gl_texture_cache.cpp

@@ -939,6 +939,11 @@ bool Image::Scale() {
         dst_info.size.height = scaled_height;
         dst_info.size.height = scaled_height;
         upscaled_backup = MakeImage(dst_info, gl_internal_format);
         upscaled_backup = MakeImage(dst_info, gl_internal_format);
     }
     }
+    // TODO (ameerj): Investigate other GL states that affect blitting.
+    GLboolean scissor_test;
+    glGetBooleani_v(GL_SCISSOR_TEST, 0, &scissor_test);
+    glDisablei(GL_SCISSOR_TEST, 0);
+
     const GLuint read_fbo = runtime->rescale_read_fbos[fbo_index].handle;
     const GLuint read_fbo = runtime->rescale_read_fbos[fbo_index].handle;
     const GLuint draw_fbo = runtime->rescale_draw_fbos[fbo_index].handle;
     const GLuint draw_fbo = runtime->rescale_draw_fbos[fbo_index].handle;
     for (s32 layer = 0; layer < info.resources.layers; ++layer) {
     for (s32 layer = 0; layer < info.resources.layers; ++layer) {
@@ -955,6 +960,9 @@ bool Image::Scale() {
                                    0, dst_level_width, dst_level_height, mask, filter);
                                    0, dst_level_width, dst_level_height, mask, filter);
         }
         }
     }
     }
+    if (scissor_test != GL_FALSE) {
+        glEnablei(GL_SCISSOR_TEST, 0);
+    }
     current_texture = upscaled_backup.handle;
     current_texture = upscaled_backup.handle;
     return true;
     return true;
 }
 }