summaryrefslogtreecommitdiffstats
path: root/src/gallium/include/pipe
diff options
context:
space:
mode:
authorJosé Fonseca <[email protected]>2010-01-21 09:30:22 -0800
committerJosé Fonseca <[email protected]>2010-01-21 15:18:40 -0800
commita8477fb00c1a7b8bfefb5779bc05c51cdb29cdb5 (patch)
tree8bd4b6fd9ea7050aea02ae2eedec51fb0adad486 /src/gallium/include/pipe
parent707b28136f7b7dea49bce23b0fcd0a757646ff7a (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.h31
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,