Răsfoiți Sursa

gl_rasterizer: Fix rescale dirty state checking

ameerj 5 ani în urmă
părinte
comite
9bc7b04ca5
1 a modificat fișierele cu 9 adăugiri și 4 ștergeri
  1. 9 4
      src/video_core/renderer_opengl/gl_rasterizer.cpp

+ 9 - 4
src/video_core/renderer_opengl/gl_rasterizer.cpp

@@ -533,7 +533,8 @@ void RasterizerOpenGL::SyncViewport() {
     auto& flags = maxwell3d.dirty.flags;
     const auto& regs = maxwell3d.regs;
 
-    const bool dirty_viewport = flags[Dirty::Viewports];
+    const bool rescale_viewports = flags[VideoCommon::Dirty::RescaleViewports];
+    const bool dirty_viewport = flags[Dirty::Viewports] || rescale_viewports;
     const bool dirty_clip_control = flags[Dirty::ClipControl];
 
     if (dirty_clip_control || flags[Dirty::FrontFace]) {
@@ -574,8 +575,9 @@ void RasterizerOpenGL::SyncViewport() {
     if (dirty_viewport) {
         flags[Dirty::Viewports] = false;
 
-        const bool force = flags[Dirty::ViewportTransform];
+        const bool force = flags[Dirty::ViewportTransform] || rescale_viewports;
         flags[Dirty::ViewportTransform] = false;
+        flags[VideoCommon::Dirty::RescaleViewports] = false;
 
         const auto& resolution = Settings::values.resolution_info;
         const auto scale_up = [&](u32 value) -> u32 {
@@ -911,11 +913,14 @@ void RasterizerOpenGL::SyncLogicOpState() {
 
 void RasterizerOpenGL::SyncScissorTest() {
     auto& flags = maxwell3d.dirty.flags;
-    if (!flags[Dirty::Scissors]) {
+    if (!flags[Dirty::Scissors] && !flags[VideoCommon::Dirty::RescaleScissors]) {
         return;
     }
     flags[Dirty::Scissors] = false;
 
+    const bool force = flags[VideoCommon::Dirty::RescaleScissors];
+    flags[VideoCommon::Dirty::RescaleScissors] = false;
+
     const auto& regs = maxwell3d.regs;
 
     const auto& resolution = Settings::values.resolution_info;
@@ -927,7 +932,7 @@ void RasterizerOpenGL::SyncScissorTest() {
         return std::max<u32>(converted_value, 1U);
     };
     for (std::size_t index = 0; index < Maxwell::NumViewports; ++index) {
-        if (!flags[Dirty::Scissor0 + index]) {
+        if (!force && !flags[Dirty::Scissor0 + index]) {
             continue;
         }
         flags[Dirty::Scissor0 + index] = false;