st/nine: Do not wait for DEFAULT lock for volumes when we can
authorAxel Davy <axel.davy@ens.fr>
Sun, 4 Dec 2016 09:34:34 +0000 (10:34 +0100)
committerAxel Davy <axel.davy@ens.fr>
Tue, 20 Dec 2016 22:47:08 +0000 (23:47 +0100)
If the volumes (and the texture container) are not referenced,
then they are no pending operations on them. We can lock directly.

Signed-off-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/volume9.c

index 29a1fcbbd03a7155942c2490948668a7c20df451..11236a02e7554337e9ad9e5690416bdbb363c115 100644 (file)
@@ -320,10 +320,17 @@ NineVolume9_LockBox( struct NineVolume9 *This,
         pLockedVolume->pBits =
             NineVolume9_GetSystemMemPointer(This, box.x, box.y, box.z);
     } else {
-        pipe = NineDevice9_GetPipe(This->base.device);
+        bool no_refs = !p_atomic_read(&This->base.bind) &&
+            !p_atomic_read(&This->base.container->bind);
+        if (no_refs)
+            pipe = nine_context_get_pipe_acquire(This->base.device);
+        else
+            pipe = NineDevice9_GetPipe(This->base.device);
         pLockedVolume->pBits =
             pipe->transfer_map(pipe, resource, This->level, usage,
                                &box, &This->transfer);
+        if (no_refs)
+            nine_context_get_pipe_release(This->base.device);
         if (!This->transfer) {
             if (Flags & D3DLOCK_DONOTWAIT)
                 return D3DERR_WASSTILLDRAWING;