st/nine: Upload Managed buffers just before draw call using them
authorAxel Davy <axel.davy@ens.fr>
Sun, 6 Nov 2016 11:38:38 +0000 (12:38 +0100)
committerAxel Davy <axel.davy@ens.fr>
Tue, 20 Dec 2016 22:44:23 +0000 (23:44 +0100)
Previously we were uploading Managed buffers at the next draw call
after they were set dirty.
This is not the expected behaviour. Instead upload just before
draw call needing the content.

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

index 64c79359139ae878dd23c237fbd46aecb04a63eb..726408aed89b7b15b42d27186f473a10ce941332 100644 (file)
@@ -133,7 +133,6 @@ NineBuffer9_ctor( struct NineBuffer9 *This,
         u_box_1d(0, Size, &This->managed.dirty_box);
         list_inithead(&This->managed.list);
         list_inithead(&This->managed.list2);
-        list_add(&This->managed.list, &pParams->device->update_buffers);
         list_add(&This->managed.list2, &pParams->device->managed_buffers);
     }
 
@@ -208,12 +207,8 @@ NineBuffer9_Lock( struct NineBuffer9 *This,
                 assert(LIST_IS_EMPTY(&This->managed.list));
                 This->managed.dirty = TRUE;
                 This->managed.dirty_box = box;
-            } else {
+            } else
                 u_box_union_2d(&This->managed.dirty_box, &This->managed.dirty_box, &box);
-                /* Do not upload while we are locking, we'll add it back later */
-                if (!LIST_IS_EMPTY(&This->managed.list))
-                    list_delinit(&This->managed.list);
-            }
         }
         *ppbData = (char *)This->managed.data + OffsetToLock;
         DBG("returning pointer %p\n", *ppbData);
@@ -287,10 +282,7 @@ NineBuffer9_Unlock( struct NineBuffer9 *This )
         pipe->transfer_unmap(pipe, This->maps[--(This->nmaps)]);
     } 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);
+        BASEBUF_REGISTER_UPDATE(This);
     }
     return D3D_OK;
 }
@@ -300,10 +292,7 @@ NineBuffer9_SetDirty( struct NineBuffer9 *This )
 {
     assert(This->base.pool == D3DPOOL_MANAGED);
 
-    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 = TRUE;
     u_box_1d(0, This->size, &This->managed.dirty_box);
+    BASEBUF_REGISTER_UPDATE(This);
 }
index 0dd2fc64c0ee8391b056152e80600173ade969b7..49b67a9eaf9471767a998c0786b693fb83662bee 100644 (file)
@@ -104,9 +104,11 @@ NineBindBufferToDevice( struct NineDevice9 *device,
 {
     struct NineBuffer9 *old = *slot;
 
-    (void)device;
-    if (buf)
+    if (buf) {
+        if ((buf->managed.dirty) && LIST_IS_EMPTY(&buf->managed.list))
+            list_add(&buf->managed.list, &device->update_buffers);
         buf->bind_count++;
+    }
     if (old)
         old->bind_count--;
 
@@ -116,4 +118,10 @@ NineBindBufferToDevice( struct NineDevice9 *device,
 void
 NineBuffer9_SetDirty( struct NineBuffer9 *This );
 
+#define BASEBUF_REGISTER_UPDATE(b) { \
+    if ((b)->managed.dirty && (b)->bind_count) \
+        if (LIST_IS_EMPTY(&(b)->managed.list)) \
+            list_add(&(b)->managed.list, &(b)->base.base.device->update_buffers); \
+    }
+
 #endif /* _NINE_BUFFER9_H_ */