diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c | 20 | 
1 files changed, 15 insertions, 5 deletions
| diff --git a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c index ede2af4460..788bf9087f 100644 --- a/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c +++ b/src/gallium/auxiliary/pipebuffer/pb_buffer_fenced.c @@ -291,16 +291,26 @@ fenced_buffer_map(struct pb_buffer *buf,                    unsigned flags)  {     struct fenced_buffer *fenced_buf = fenced_buffer(buf); +   struct fenced_buffer_list *fenced_list = fenced_buf->list; +   struct pipe_winsys *winsys = fenced_list->winsys;     void *map; -   assert(!(flags & ~PIPE_BUFFER_USAGE_CPU_READ_WRITE)); -   flags &= PIPE_BUFFER_USAGE_CPU_READ_WRITE; +   assert(!(flags & PIPE_BUFFER_USAGE_GPU_READ_WRITE));     /* Serialize writes */     if((fenced_buf->flags & PIPE_BUFFER_USAGE_GPU_WRITE) ||        ((fenced_buf->flags & PIPE_BUFFER_USAGE_GPU_READ) && (flags & PIPE_BUFFER_USAGE_CPU_WRITE))) { -      /* Wait for the GPU to finish */ -      _fenced_buffer_finish(fenced_buf); +      if(flags & PIPE_BUFFER_USAGE_DONTBLOCK) { +         /* Don't wait for the GPU to finish writing */ +         if(winsys->fence_finish(winsys, fenced_buf->fence, 0) == 0) +            _fenced_buffer_remove(fenced_list, fenced_buf); +         else +            return NULL; +      } +      else { +         /* Wait for the GPU to finish writing */ +         _fenced_buffer_finish(fenced_buf); +      }     }  #if 0 @@ -314,7 +324,7 @@ fenced_buffer_map(struct pb_buffer *buf,     map = pb_map(fenced_buf->buffer, flags);     if(map) {        ++fenced_buf->mapcount; -      fenced_buf->flags |= flags; +      fenced_buf->flags |= flags & PIPE_BUFFER_USAGE_CPU_READ_WRITE;     }     return map; | 
