From 57795d81cbc26be2fd4ae764ad7656e27b790af6 Mon Sep 17 00:00:00 2001
From: antangelo <antonio.abbatangelo@gmail.com>
Date: Tue, 28 Dec 2021 17:53:47 -0500
Subject: [PATCH] nv2a: Don't mark surface dirty on unchanged offset, pitch

---
 hw/xbox/nv2a/pgraph.c | 21 ++++++++-------------
 1 file changed, 8 insertions(+), 13 deletions(-)

diff --git a/hw/xbox/nv2a/pgraph.c b/hw/xbox/nv2a/pgraph.c
index e76976849b..f7fa4af6b6 100644
--- a/hw/xbox/nv2a/pgraph.c
+++ b/hw/xbox/nv2a/pgraph.c
@@ -1180,30 +1180,28 @@ DEF_METHOD(NV097, SET_SURFACE_FORMAT)
 DEF_METHOD(NV097, SET_SURFACE_PITCH)
 {
     pgraph_update_surface(d, false, true, true);
+    unsigned int color_pitch = GET_MASK(parameter, NV097_SET_SURFACE_PITCH_COLOR);
+    unsigned int zeta_pitch  = GET_MASK(parameter, NV097_SET_SURFACE_PITCH_ZETA);
 
-    pg->surface_color.pitch =
-        GET_MASK(parameter, NV097_SET_SURFACE_PITCH_COLOR);
-    pg->surface_zeta.pitch =
-        GET_MASK(parameter, NV097_SET_SURFACE_PITCH_ZETA);
+    pg->surface_color.buffer_dirty |= (pg->surface_color.pitch != color_pitch);
+    pg->surface_color.pitch = color_pitch;
 
-    pg->surface_color.buffer_dirty = true;
-    pg->surface_zeta.buffer_dirty = true;
+    pg->surface_zeta.buffer_dirty |= (pg->surface_zeta.pitch != zeta_pitch);
+    pg->surface_zeta.pitch = zeta_pitch;
 }
 
 DEF_METHOD(NV097, SET_SURFACE_COLOR_OFFSET)
 {
     pgraph_update_surface(d, false, true, true);
-
+    pg->surface_color.buffer_dirty |= (pg->surface_color.offset != parameter);
     pg->surface_color.offset = parameter;
-    pg->surface_color.buffer_dirty = true;
 }
 
 DEF_METHOD(NV097, SET_SURFACE_ZETA_OFFSET)
 {
     pgraph_update_surface(d, false, true, true);
-
+    pg->surface_zeta.buffer_dirty |= (pg->surface_zeta.offset != parameter);
     pg->surface_zeta.offset = parameter;
-    pg->surface_zeta.buffer_dirty = true;
 }
 
 DEF_METHOD(NV097, SET_COMBINER_ALPHA_ICW)
@@ -5582,9 +5580,6 @@ static void pgraph_update_surface(NV2AState *d, bool upload,
     color_write = color_write && pgraph_color_write_enabled(pg);
     zeta_write = zeta_write && pgraph_zeta_write_enabled(pg);
 
-    // FIXME: We don't need to bind/unbind so much (fix reprogram of same
-    // pitch/offset causing dirty)
-
     if (upload) {
         bool fb_dirty = pgraph_framebuffer_dirty(pg);
         if (fb_dirty) {