st/nine: Lock the entire buffer in some cases.
authorAxel Davy <davyaxel0@gmail.com>
Sun, 16 Sep 2018 19:59:55 +0000 (21:59 +0200)
committerAxel Davy <davyaxel0@gmail.com>
Tue, 25 Sep 2018 20:05:24 +0000 (22:05 +0200)
Previously we had already found that for
MANAGED buffers the buffer started dirty
(which meant all writes out of bound
before the first draw call using the
buffer have to be taken into account).

Possibly it is the same for the other types of buffers.
For now always lock the entire buffer (starting from the offset)
for these (except for DYNAMIC buffers, which might hurt
performance too much).

Fixes: https://github.com/iXit/Mesa-3D/issues/301
Signed-off-by: Axel Davy <davyaxel0@gmail.com>
src/gallium/state_trackers/nine/buffer9.c

index 69b08e8c10e29d6c0ecf64ed476a3cd700f2e947..5880ee3c1a27b7a13551e8a02faa1adab5e5b710 100644 (file)
@@ -231,6 +231,14 @@ NineBuffer9_Lock( struct NineBuffer9 *This,
         user_warn(OffsetToLock != 0);
     }
 
+    /* Write out of bound seems to have to be taken into account for these.
+     * TODO: Do more tests (is it only at buffer first lock ? etc).
+     * Since these buffers are supposed to be locked once and never
+     * writen again (MANAGED or DYNAMIC is used for the other uses cases),
+     * performance should be unaffected. */
+    if (!(This->base.usage & D3DUSAGE_DYNAMIC) && This->base.pool != D3DPOOL_MANAGED)
+        SizeToLock = This->size - OffsetToLock;
+
     u_box_1d(OffsetToLock, SizeToLock, &box);
 
     if (This->base.pool == D3DPOOL_MANAGED) {