mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
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.
This commit is contained in:
parent
14452aee73
commit
686a6c7468
1 changed files with 21 additions and 18 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue