gallium: Always map for READ flag when DISCARD is not set.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 14 Aug 2009 19:05:33 +0000 (20:05 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Fri, 14 Aug 2009 19:05:51 +0000 (20:05 +0100)
This prevents the driver from discarding a buffer when the whole buffer
is mapped for writing, but only a portion is effectively written.

This is a temporary fix, because WRITE shouldn't imply DISCARD.

The full fix implies using PIPE_BUFFER_USAGE_DISCARD, throughout
the code, and will go only into master.

src/gallium/include/pipe/p_inlines.h

index cf176c9209961efd93a7d5174ce402da41a6b134..a5c1e8270a3aeb1177a56b4eff4e09ab5b1cd875 100644 (file)
@@ -63,6 +63,13 @@ pipe_buffer_map(struct pipe_screen *screen,
    if(screen->buffer_map_range) {
       unsigned offset = 0;
       unsigned length = buf->size;
+
+      /* XXX: Actually we should be using/detecting DISCARD
+       * instead of assuming that WRITE implies discard */
+      if((usage & PIPE_BUFFER_USAGE_CPU_WRITE) &&
+         !(usage & PIPE_BUFFER_USAGE_DISCARD))
+         usage |= PIPE_BUFFER_USAGE_CPU_READ;
+
       return screen->buffer_map_range(screen, buf, offset, length, usage);
    }
    else