diff options
Diffstat (limited to 'src/video_core/engines')
| -rw-r--r-- | src/video_core/engines/fermi_2d.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/engines/kepler_memory.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 16 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 5 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_dma.cpp | 5 | 
5 files changed, 34 insertions, 0 deletions
diff --git a/src/video_core/engines/fermi_2d.cpp b/src/video_core/engines/fermi_2d.cpp index 74e44c7fe..8d0700d13 100644 --- a/src/video_core/engines/fermi_2d.cpp +++ b/src/video_core/engines/fermi_2d.cpp @@ -2,8 +2,10 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include "core/core.h"  #include "core/memory.h"  #include "video_core/engines/fermi_2d.h" +#include "video_core/engines/maxwell_3d.h"  #include "video_core/rasterizer_interface.h"  #include "video_core/textures/decoders.h" @@ -47,6 +49,9 @@ void Fermi2D::HandleSurfaceCopy() {      u32 dst_bytes_per_pixel = RenderTargetBytesPerPixel(regs.dst.format);      if (!rasterizer.AccelerateSurfaceCopy(regs.src, regs.dst)) { +        // All copies here update the main memory, so mark all rasterizer states as invalid. +        Core::System::GetInstance().GPU().Maxwell3D().dirty_flags.OnMemoryWrite(); +          rasterizer.FlushRegion(source_cpu, src_bytes_per_pixel * regs.src.width * regs.src.height);          // We have to invalidate the destination region to evict any outdated surfaces from the          // cache. We do this before actually writing the new data because the destination address diff --git a/src/video_core/engines/kepler_memory.cpp b/src/video_core/engines/kepler_memory.cpp index 585290d9f..2adbc9eaf 100644 --- a/src/video_core/engines/kepler_memory.cpp +++ b/src/video_core/engines/kepler_memory.cpp @@ -3,8 +3,10 @@  // Refer to the license.txt file included.  #include "common/logging/log.h" +#include "core/core.h"  #include "core/memory.h"  #include "video_core/engines/kepler_memory.h" +#include "video_core/engines/maxwell_3d.h"  #include "video_core/rasterizer_interface.h"  namespace Tegra::Engines { @@ -47,6 +49,7 @@ void KeplerMemory::ProcessData(u32 data) {      rasterizer.InvalidateRegion(dest_address, sizeof(u32));      Memory::Write32(dest_address, data); +    Core::System::GetInstance().GPU().Maxwell3D().dirty_flags.OnMemoryWrite();      state.write_offset++;  } diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 6de07ea56..1772882b2 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp @@ -123,10 +123,24 @@ void Maxwell3D::WriteReg(u32 method, u32 value, u32 remaining_params) {      if (regs.reg_array[method] != value) {          regs.reg_array[method] = value; +        // Vertex format          if (method >= MAXWELL3D_REG_INDEX(vertex_attrib_format) &&              method < MAXWELL3D_REG_INDEX(vertex_attrib_format) + regs.vertex_attrib_format.size()) {              dirty_flags.vertex_attrib_format = true;          } + +        // Vertex buffer +        if (method >= MAXWELL3D_REG_INDEX(vertex_array) && +            method < MAXWELL3D_REG_INDEX(vertex_array) + 4 * 32) { +            dirty_flags.vertex_array |= 1u << ((method - MAXWELL3D_REG_INDEX(vertex_array)) >> 2); +        } else if (method >= MAXWELL3D_REG_INDEX(vertex_array_limit) && +                   method < MAXWELL3D_REG_INDEX(vertex_array_limit) + 2 * 32) { +            dirty_flags.vertex_array |= +                1u << ((method - MAXWELL3D_REG_INDEX(vertex_array_limit)) >> 1); +        } else if (method >= MAXWELL3D_REG_INDEX(instanced_arrays) && +                   method < MAXWELL3D_REG_INDEX(instanced_arrays) + 32) { +            dirty_flags.vertex_array |= 1u << (method - MAXWELL3D_REG_INDEX(instanced_arrays)); +        }      }      switch (method) { @@ -258,6 +272,7 @@ void Maxwell3D::ProcessQueryGet() {              query_result.timestamp = CoreTiming::GetTicks();              Memory::WriteBlock(*address, &query_result, sizeof(query_result));          } +        dirty_flags.OnMemoryWrite();          break;      }      default: @@ -334,6 +349,7 @@ void Maxwell3D::ProcessCBData(u32 value) {          memory_manager.GpuToCpuAddress(buffer_address + regs.const_buffer.cb_pos);      Memory::Write32(*address, value); +    dirty_flags.OnMemoryWrite();      // Increment the current buffer position.      regs.const_buffer.cb_pos = regs.const_buffer.cb_pos + 4; diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index 91ca57883..0848b7121 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h @@ -1014,6 +1014,11 @@ public:      struct DirtyFlags {          bool vertex_attrib_format = true; +        u32 vertex_array = 0xFFFFFFFF; + +        void OnMemoryWrite() { +            vertex_array = 0xFFFFFFFF; +        }      };      DirtyFlags dirty_flags; diff --git a/src/video_core/engines/maxwell_dma.cpp b/src/video_core/engines/maxwell_dma.cpp index b8a78cf82..a34e884fe 100644 --- a/src/video_core/engines/maxwell_dma.cpp +++ b/src/video_core/engines/maxwell_dma.cpp @@ -2,7 +2,9 @@  // Licensed under GPLv2 or any later version  // Refer to the license.txt file included. +#include "core/core.h"  #include "core/memory.h" +#include "video_core/engines/maxwell_3d.h"  #include "video_core/engines/maxwell_dma.h"  #include "video_core/rasterizer_interface.h"  #include "video_core/textures/decoders.h" @@ -54,6 +56,9 @@ void MaxwellDMA::HandleCopy() {          return;      } +    // All copies here update the main memory, so mark all rasterizer states as invalid. +    Core::System::GetInstance().GPU().Maxwell3D().dirty_flags.OnMemoryWrite(); +      if (regs.exec.is_dst_linear && regs.exec.is_src_linear) {          // When the enable_2d bit is disabled, the copy is performed as if we were copying a 1D          // buffer of length `x_count`, otherwise we copy a 2D image of dimensions (x_count,  | 
