Browse Source

OpenGlTextureCache: Fix state invalidation on rescaling.

Fernando Sahmkow 4 years ago
parent
commit
5c6fa88935

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

@@ -942,10 +942,21 @@ bool Image::Scale(bool up_scale) {
         dst_info.size.height = scaled_height;
         upscaled_backup = MakeImage(dst_info, gl_internal_format);
     }
+    auto& state_tracker = runtime->GetStateTracker();
+    state_tracker.NotifyViewport0();
+    state_tracker.NotifyScissor0();
     // 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);
+    if (up_scale) {
+      glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(scaled_width),
+                         static_cast<GLfloat>(scaled_height));
+    } else {
+      glViewportIndexedf(0, 0.0f, 0.0f, static_cast<GLfloat>(original_width),
+                         static_cast<GLfloat>(original_height));
+    }
+
 
     const GLuint read_fbo = runtime->rescale_read_fbos[fbo_index].handle;
     const GLuint draw_fbo = runtime->rescale_draw_fbos[fbo_index].handle;

+ 4 - 0
src/video_core/renderer_opengl/gl_texture_cache.h

@@ -116,6 +116,10 @@ public:
 
     void TickFrame() {}
 
+    StateTracker& GetStateTracker() {
+        return state_tracker;
+    }
+
 private:
     struct StagingBuffers {
         explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_);

+ 2 - 2
src/video_core/texture_cache/texture_cache.h

@@ -1810,8 +1810,8 @@ void TextureCache<P>::BindRenderTarget(ImageViewId* old_id, ImageViewId new_id)
     if (*old_id == new_id) {
         return;
     }
-    if (*old_id) {
-        const ImageViewBase& old_view = slot_image_views[*old_id];
+    if (new_id) {
+        const ImageViewBase& old_view = slot_image_views[new_id];
         if (True(old_view.flags & ImageViewFlagBits::PreemtiveDownload)) {
             uncommitted_downloads.push_back(old_view.image_id);
         }