[Mesa-dev] [PATCH] gallium: fix behavior of pipe_buffer_map_range

Marek Olšák maraeo at gmail.com
Sun Jan 1 09:27:06 PST 2012


To match what transfer_map returns. Really, subtracting the offset leads
to bugs if someone expects it to work exactly like transfer_map.
---
 src/gallium/auxiliary/util/u_inlines.h       |    7 ++-----
 src/gallium/auxiliary/util/u_upload_mgr.c    |    4 +++-
 src/gallium/drivers/svga/svga_state_vs.c     |    1 +
 src/mesa/state_tracker/st_cb_bufferobjects.c |    4 ----
 src/mesa/state_tracker/st_draw.c             |   11 ++++++-----
 5 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h
index 4428390..9660cdc 100644
--- a/src/gallium/auxiliary/util/u_inlines.h
+++ b/src/gallium/auxiliary/util/u_inlines.h
@@ -252,10 +252,7 @@ pipe_buffer_map_range(struct pipe_context *pipe,
       return NULL;
    }
 
-   /* Match old screen->buffer_map_range() behaviour, return pointer
-    * to where the beginning of the buffer would be:
-    */
-   return (void *)((char *)map - offset);
+   return map;
 }
 
 
@@ -374,7 +371,7 @@ pipe_buffer_read(struct pipe_context *pipe,
 					 &src_transfer);
 
    if (map)
-      memcpy(data, map + offset, size);
+      memcpy(data, map, size);
 
    pipe_buffer_unmap(pipe, src_transfer);
 }
diff --git a/src/gallium/auxiliary/util/u_upload_mgr.c b/src/gallium/auxiliary/util/u_upload_mgr.c
index a2319d0..936e881 100644
--- a/src/gallium/auxiliary/util/u_upload_mgr.c
+++ b/src/gallium/auxiliary/util/u_upload_mgr.c
@@ -192,6 +192,8 @@ enum pipe_error u_upload_alloc( struct u_upload_mgr *upload,
          *ptr = NULL;
          return PIPE_ERROR_OUT_OF_MEMORY;
       }
+
+      upload->map -= offset;
    }
 
    assert(offset < upload->buffer->width0);
@@ -261,7 +263,7 @@ enum pipe_error u_upload_buffer( struct u_upload_mgr *upload,
    ret = u_upload_data( upload,
                         min_out_offset,
                         size,
-                        map + offset,
+                        map,
                         out_offset,
                         outbuf, flushed );
 
diff --git a/src/gallium/drivers/svga/svga_state_vs.c b/src/gallium/drivers/svga/svga_state_vs.c
index 3d3caea..b82e685 100644
--- a/src/gallium/drivers/svga/svga_state_vs.c
+++ b/src/gallium/drivers/svga/svga_state_vs.c
@@ -228,6 +228,7 @@ update_zero_stride( struct svga_context *svga,
                                                util_format_get_blocksize(vel->src_format),
                                                PIPE_TRANSFER_READ,
 					       &transfer);
+         mapped_buffer = (uint8_t*)mapped_buffer - vel->src_offset;
 
          translate->set_buffer(translate, vel->vertex_buffer_index,
                                mapped_buffer,
diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c
index adac92f..6d95d57 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.c
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
@@ -291,10 +291,6 @@ st_bufferobj_map_range(struct gl_context *ctx,
                                         flags,
                                         &st_obj->transfer);
    if (obj->Pointer) {
-      obj->Pointer = (ubyte *) obj->Pointer + offset;
-   }
-
-   if (obj->Pointer) {
       obj->Offset = offset;
       obj->Length = length;
       obj->AccessFlags = access;
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index 954f15a..4805aba 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -768,16 +768,17 @@ handle_fallback_primitive_restart(struct pipe_context *pipe,
                                   start * ibuffer->index_size, /* start */
                                   count * ibuffer->index_size, /* length */
                                   PIPE_TRANSFER_READ, &transfer);
+      if (!ptr)
+         return;
+
+      ptr = (uint8_t*)ptr + (ibuffer->offset - start * ibuffer->index_size);
    }
    else {
       ptr = ib->ptr;
+      if (!ptr)
+         return;
    }
 
-   if (!ptr)
-      return;
-
-   ptr = ADD_POINTERS(ptr, ibuffer->offset);
-
    sub_prims = find_sub_primitives(ptr, ibuffer->index_size,
                                    0, count, orig_info->restart_index,
                                    &num_sub_prims);
-- 
1.7.4.1



More information about the mesa-dev mailing list