diff options
author | José Fonseca <[email protected]> | 2010-01-21 09:30:22 -0800 |
---|---|---|
committer | José Fonseca <[email protected]> | 2010-01-21 15:18:40 -0800 |
commit | a8477fb00c1a7b8bfefb5779bc05c51cdb29cdb5 (patch) | |
tree | 8bd4b6fd9ea7050aea02ae2eedec51fb0adad486 /src/gallium/include/pipe | |
parent | 707b28136f7b7dea49bce23b0fcd0a757646ff7a (diff) |
gallium: New inline to write buffers which avoids synchronization.
Diffstat (limited to 'src/gallium/include/pipe')
-rw-r--r-- | src/gallium/include/pipe/p_inlines.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/gallium/include/pipe/p_inlines.h b/src/gallium/include/pipe/p_inlines.h index 11ed46c7e72..72f5c1dc2a2 100644 --- a/src/gallium/include/pipe/p_inlines.h +++ b/src/gallium/include/pipe/p_inlines.h @@ -129,6 +129,37 @@ pipe_buffer_write(struct pipe_screen *screen, } } +/** + * Special case for writing non-overlapping ranges. + * + * We can avoid GPU/CPU synchronization when writing range that has never + * been written before. + */ +static INLINE void +pipe_buffer_write_nooverlap(struct pipe_screen *screen, + struct pipe_buffer *buf, + unsigned offset, unsigned size, + const void *data) +{ + void *map; + + assert(offset < buf->size); + assert(offset + size <= buf->size); + assert(size); + + map = pipe_buffer_map_range(screen, buf, offset, size, + PIPE_BUFFER_USAGE_CPU_WRITE | + PIPE_BUFFER_USAGE_FLUSH_EXPLICIT | + PIPE_BUFFER_USAGE_DISCARD | + PIPE_BUFFER_USAGE_UNSYNCHRONIZED); + assert(map); + if(map) { + memcpy((uint8_t *)map + offset, data, size); + pipe_buffer_flush_mapped_range(screen, buf, offset, size); + pipe_buffer_unmap(screen, buf); + } +} + static INLINE void pipe_buffer_read(struct pipe_screen *screen, struct pipe_buffer *buf, |