summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJosé Fonseca <jrfonseca@tungstengraphics.com>2008-04-01 10:41:43 +0900
committerJosé Fonseca <jrfonseca@tungstengraphics.com>2008-04-01 10:46:04 +0900
commit686a6c746851b4bc2572aaa1153d570717bdd77f (patch)
tree139c727e88dfcf4ab4725b1359d934e8e86d32e6 /src
parent14452aee73e16f2ede075cf894e69d62cc539f5e (diff)
gallium: Do not assume that buffers are freed in the same order they are fenced.
Also free buffers as soon as possible. This short term fix corrects the fenced list behavior but it will impact on performance. The long term fix is probably replace the linked list (legacy from the bufpool code) by a binary tree.
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
index 6e217eb2e0..55f32e6816 100644
--- a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
+++ b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c
@@ -29,8 +29,8 @@
* \file
* Implementation of fenced buffers.
*
- * \author José Fonseca <jrfonseca-at-tungstengraphics-dot-com>
- * \author Thomas Hellström <thomas-at-tungstengraphics-dot-com>
+ * \author José Fonseca <jrfonseca-at-tungstengraphics-dot-com>
+ * \author Thomas Hellström <thomas-at-tungstengraphics-dot-com>
*/
@@ -44,7 +44,7 @@
#include "pb_buffer.h"
#include "pb_buffer_fenced.h"
-#ifndef __MSC__
+#ifndef WIN32
#include <unistd.h>
#endif
@@ -93,8 +93,6 @@ fenced_buffer(struct pb_buffer *buf)
}
-
-
static void
_fenced_buffer_list_check_free(struct fenced_buffer_list *fenced_list,
int wait)
@@ -105,15 +103,6 @@ _fenced_buffer_list_check_free(struct fenced_buffer_list *fenced_list,
int signaled = -1;
list = fenced_list->delayed.next;
-
- if (fenced_list->numDelayed > 3) {
- unsigned i;
-
- for (i = 0; i < fenced_list->numDelayed; i += 3) {
- list = list->next;
- }
- }
-
prev = list->prev;
for (; list != &fenced_list->delayed; list = prev, prev = list->prev) {
@@ -128,11 +117,17 @@ _fenced_buffer_list_check_free(struct fenced_buffer_list *fenced_list,
}
}
- if (signaled != 0)
+ if (signaled != 0) {
+#if 0
/* XXX: we are assuming that buffers are freed in the same order they
* are fenced which may not always be true...
*/
break;
+#else
+ signaled = -1;
+ continue;
+#endif
+ }
winsys->fence_reference(winsys, &fenced_buf->fence, NULL);
@@ -154,8 +149,16 @@ fenced_buffer_destroy(struct pb_buffer *buf)
struct fenced_buffer_list *fenced_list = fenced_buf->list;
if (fenced_buf->fence) {
- LIST_ADDTAIL(&fenced_buf->head, &fenced_list->delayed);
- fenced_list->numDelayed++;
+ struct pipe_winsys *winsys = fenced_list->winsys;
+ if(winsys->fence_finish(winsys, fenced_buf->fence, 0) != 0) {
+ LIST_ADDTAIL(&fenced_buf->head, &fenced_list->delayed);
+ fenced_list->numDelayed++;
+ }
+ else {
+ winsys->fence_reference(winsys, &fenced_buf->fence, NULL);
+ pb_reference(&fenced_buf->buffer, NULL);
+ FREE(fenced_buf);
+ }
}
else {
pb_reference(&fenced_buf->buffer, NULL);
@@ -285,7 +288,7 @@ fenced_buffer_list_destroy(struct fenced_buffer_list *fenced_list)
/* Wait on outstanding fences */
while (fenced_list->numDelayed) {
_glthread_UNLOCK_MUTEX(fenced_list->mutex);
-#ifndef __MSC__
+#ifndef WIN32
sched_yield();
#endif
_fenced_buffer_list_check_free(fenced_list, 1);