st/nine: Fix Multithreading issue with MANAGED buffers
authorAxel Davy <axel.davy@ens.fr>
Thu, 25 Feb 2016 18:07:37 +0000 (19:07 +0100)
committerAxel Davy <axel.davy@ens.fr>
Mon, 29 Feb 2016 17:55:58 +0000 (18:55 +0100)
d3d calls are protected by mutexes, however if app is doing in
two threads:

Thread 1: buffer Lock
Thread 2: Draw call
Thread 1: writes data
Thread 1: Unlock

Then before this patch, the Draw call would begin to upload
the buffer.

Solves this by moving the moment we add the buffer to the queue
of things to upload (We move it from Lock time to Unlock time).

Cc: "11.2" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/buffer9.c

index 8efb4cefb1fb9f9bd17a5f295527b9c04a0fc9f5..6d5d9d691f8924e9b37efd4372d608ace5097eb2 100644 (file)
@@ -178,7 +178,6 @@ NineBuffer9_Lock( struct NineBuffer9 *This,
         if (!(Flags & D3DLOCK_READONLY)) {
             if (!This->managed.dirty) {
                 assert(LIST_IS_EMPTY(&This->managed.list));
-                list_add(&This->managed.list, &This->base.base.device->update_buffers);
                 This->managed.dirty = TRUE;
                 This->managed.dirty_box = box;
             } else {
@@ -232,8 +231,13 @@ NineBuffer9_Unlock( struct NineBuffer9 *This )
     user_assert(This->nmaps > 0, D3DERR_INVALIDCALL);
     if (This->base.pool != D3DPOOL_MANAGED)
         This->pipe->transfer_unmap(This->pipe, This->maps[--(This->nmaps)]);
-    else
+    else {
         This->nmaps--;
+        /* TODO: Fix this to upload at the first draw call needing the data,
+         * instead of at the next draw call */
+        if (!This->nmaps && This->managed.dirty && LIST_IS_EMPTY(&This->managed.list))
+            list_add(&This->managed.list, &This->base.base.device->update_buffers);
+    }
     return D3D_OK;
 }