st/nine: Finish if nooverwrite after normal mapping
authorAxel Davy <davyaxel0@gmail.com>
Wed, 24 Apr 2019 21:58:38 +0000 (23:58 +0200)
committerAxel Davy <davyaxel0@gmail.com>
Tue, 30 Apr 2019 17:18:50 +0000 (19:18 +0200)
d3d's nooverwrite and gallium's unsynchronized
have different semantics.
Indeed nooverwrite says the applications won't
write to locations needed by previous draws,
which is less strong than unsynchronized which
won't synchronize previous writes.

Thus in case app is locking without discard/nooverwrite,
then using nooverwrite, we need to add a
synchronization.

Fixes: https://github.com/iXit/wine-nine-standalone/issues/29
Signed-off-by: Axel Davy <davyaxel0@gmail.com>
src/gallium/state_trackers/nine/buffer9.c
src/gallium/state_trackers/nine/buffer9.h

index 5880ee3c1a27b7a13551e8a02faa1adab5e5b710..54855f16aeffd28c3467a805a5693485e2f995eb 100644 (file)
@@ -358,6 +358,23 @@ NineBuffer9_Lock( struct NineBuffer9 *This,
         }
     }
 
+    /* Previous mappings may need pending commands to write to the
+     * buffer (staging buffer for example). Before a NOOVERWRITE,
+     * we thus need a finish, to guarantee any upload is finished.
+     * Note for discard_nooverwrite_only we don't need to do this
+     * check as neither discard nor nooverwrite have issues there */
+    if (This->need_sync_if_nooverwrite && !(Flags & D3DLOCK_DISCARD) &&
+        (Flags & D3DLOCK_NOOVERWRITE)) {
+        struct pipe_screen *screen = NineDevice9_GetScreen(device);
+        struct pipe_fence_handle *fence = NULL;
+
+        pipe = NineDevice9_GetPipe(device);
+        pipe->flush(pipe, &fence, 0);
+        (void) screen->fence_finish(screen, NULL, fence, PIPE_TIMEOUT_INFINITE);
+        screen->fence_reference(screen, &fence, NULL);
+    }
+    This->need_sync_if_nooverwrite = !(Flags & (D3DLOCK_DISCARD | D3DLOCK_NOOVERWRITE));
+
     /* When csmt is active, we want to avoid stalls as much as possible,
      * and thus we want to create a new resource on discard and map it
      * with the secondary pipe, instead of waiting on the main pipe. */
index 9ccd6dab9909074523bba6566f7d4031b2a30255..7ae3ea6cc07bf5ffb0f0dbd109525d05620125f9 100644 (file)
@@ -56,6 +56,7 @@ struct NineBuffer9
     /* Whether only discard and nooverwrite were used so far
      * for this buffer. Allows some optimization. */
     boolean discard_nooverwrite_only;
+    boolean need_sync_if_nooverwrite;
     struct nine_subbuffer *buf;
 
     /* Specific to managed buffers */