|
|
|
@@ -103,6 +103,17 @@ st_bufferobj_subdata(GLcontext *ctx, |
|
|
|
ASSERT(size >= 0); |
|
|
|
ASSERT(offset + size <= obj->Size); |
|
|
|
|
|
|
|
if (!size) |
|
|
|
return; |
|
|
|
|
|
|
|
/* |
|
|
|
* According to ARB_vertex_buffer_object specification, if data is null, |
|
|
|
* then the contents of the buffer object's data store is undefined. We just |
|
|
|
* ignore, and leave it unchanged. |
|
|
|
*/ |
|
|
|
if (!data) |
|
|
|
return; |
|
|
|
|
|
|
|
st_cond_flush_pipe_buffer_write(st_context(ctx), st_obj->buffer, |
|
|
|
offset, size, data); |
|
|
|
} |
|
|
|
@@ -125,6 +136,9 @@ st_bufferobj_get_subdata(GLcontext *ctx, |
|
|
|
ASSERT(size >= 0); |
|
|
|
ASSERT(offset + size <= obj->Size); |
|
|
|
|
|
|
|
if (!size) |
|
|
|
return; |
|
|
|
|
|
|
|
st_cond_flush_pipe_buffer_read(st_context(ctx), st_obj->buffer, |
|
|
|
offset, size, data); |
|
|
|
} |
|
|
|
@@ -222,6 +236,13 @@ st_bufferobj_map(GLcontext *ctx, GLenum target, GLenum access, |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Dummy data whose's pointer is used for zero length ranges. |
|
|
|
*/ |
|
|
|
static long |
|
|
|
st_bufferobj_zero_length_range = 0; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Called via glMapBufferRange(). |
|
|
|
*/ |
|
|
|
@@ -257,14 +278,26 @@ st_bufferobj_map_range(GLcontext *ctx, GLenum target, |
|
|
|
assert(offset < obj->Size); |
|
|
|
assert(offset + length <= obj->Size); |
|
|
|
|
|
|
|
obj->Pointer = pipe_buffer_map_range(pipe->screen, st_obj->buffer, offset, length, flags); |
|
|
|
/* |
|
|
|
* We go out of way here to hide the degenerate yet valid case of zero |
|
|
|
* length range from the pipe driver. |
|
|
|
*/ |
|
|
|
if (!length) { |
|
|
|
obj->Pointer = &st_bufferobj_zero_length_range; |
|
|
|
} |
|
|
|
else { |
|
|
|
obj->Pointer = pipe_buffer_map_range(pipe->screen, st_obj->buffer, offset, length, flags); |
|
|
|
if (obj->Pointer) { |
|
|
|
obj->Pointer = (ubyte *) obj->Pointer + offset; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (obj->Pointer) { |
|
|
|
obj->Pointer = (ubyte *) obj->Pointer + offset; |
|
|
|
obj->Offset = offset; |
|
|
|
obj->Length = length; |
|
|
|
obj->AccessFlags = access; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return obj->Pointer; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -282,6 +315,9 @@ st_bufferobj_flush_mapped_range(GLcontext *ctx, GLenum target, |
|
|
|
assert(length >= 0); |
|
|
|
assert(offset + length <= obj->Length); |
|
|
|
|
|
|
|
if (!length) |
|
|
|
return; |
|
|
|
|
|
|
|
pipe_buffer_flush_mapped_range(pipe->screen, st_obj->buffer, |
|
|
|
obj->Offset + offset, length); |
|
|
|
} |
|
|
|
@@ -296,7 +332,9 @@ st_bufferobj_unmap(GLcontext *ctx, GLenum target, struct gl_buffer_object *obj) |
|
|
|
struct pipe_context *pipe = st_context(ctx)->pipe; |
|
|
|
struct st_buffer_object *st_obj = st_buffer_object(obj); |
|
|
|
|
|
|
|
pipe_buffer_unmap(pipe->screen, st_obj->buffer); |
|
|
|
if(obj->Length) |
|
|
|
pipe_buffer_unmap(pipe->screen, st_obj->buffer); |
|
|
|
|
|
|
|
obj->Pointer = NULL; |
|
|
|
obj->Offset = 0; |
|
|
|
obj->Length = 0; |
|
|
|
@@ -319,6 +357,9 @@ st_copy_buffer_subdata(GLcontext *ctx, |
|
|
|
struct st_buffer_object *dstObj = st_buffer_object(dst); |
|
|
|
ubyte *srcPtr, *dstPtr; |
|
|
|
|
|
|
|
if(!size) |
|
|
|
return; |
|
|
|
|
|
|
|
/* buffer should not already be mapped */ |
|
|
|
assert(!src->Pointer); |
|
|
|
assert(!dst->Pointer); |