From 8ad65a23d14f82461c00b1d8dcc1393167f36ab0 Mon Sep 17 00:00:00 2001 From: José Fonseca Date: Wed, 4 Mar 2009 17:49:52 +0000 Subject: mesa: Follow ARB_map_buffer_range more stricly. Namelly, FlushMappedBufferRange takes a subrange relative to the original range. --- src/mesa/state_tracker/st_cb_bufferobjects.c | 32 ++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'src/mesa/state_tracker') diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c index 45fbe8c76e..3651e4ae7d 100644 --- a/src/mesa/state_tracker/st_cb_bufferobjects.c +++ b/src/mesa/state_tracker/st_cb_bufferobjects.c @@ -201,6 +201,10 @@ st_bufferobj_map(GLcontext *ctx, GLenum target, GLenum access, } obj->Pointer = pipe_buffer_map(pipe->screen, st_obj->buffer, flags); + if(obj->Pointer) { + obj->Offset = 0; + obj->Length = obj->Size; + } return obj->Pointer; } @@ -231,11 +235,18 @@ st_bufferobj_map_range(GLcontext *ctx, GLenum target, if (access & MESA_MAP_NOWAIT_BIT) flags |= PIPE_BUFFER_USAGE_DONTBLOCK; - map = pipe_buffer_map_range(pipe->screen, st_obj->buffer, offset, length, flags); - /* this is expected to point to the buffer start, in order to calculate the - * vertices offsets - */ - obj->Pointer = map ? map - offset : NULL; + assert(offset >= 0); + assert(length >= 0); + assert(offset < obj->Size); + assert(offset + length <= obj->Size); + + map = obj->Pointer = pipe_buffer_map_range(pipe->screen, st_obj->buffer, offset, length, flags); + if(obj->Pointer) { + obj->Offset = 0; + obj->Length = obj->Size; + map += offset; + } + return map; } @@ -248,7 +259,14 @@ st_bufferobj_flush_mapped_range(GLcontext *ctx, GLenum target, struct pipe_context *pipe = st_context(ctx)->pipe; struct st_buffer_object *st_obj = st_buffer_object(obj); - pipe_buffer_flush_mapped_range(pipe->screen, st_obj->buffer, offset, length); + /* Subrange is relative to mapped range */ + assert(offset >= 0); + assert(length >= 0); + assert(offset < obj->Length); + assert(offset + length <= obj->Length); + + pipe_buffer_flush_mapped_range(pipe->screen, st_obj->buffer, + obj->Offset + offset, length); } @@ -263,6 +281,8 @@ st_bufferobj_unmap(GLcontext *ctx, GLenum target, struct gl_buffer_object *obj) pipe_buffer_unmap(pipe->screen, st_obj->buffer); obj->Pointer = NULL; + obj->Offset = 0; + obj->Length = 0; return GL_TRUE; } -- cgit v1.2.3