mesa: handle zero-size buffers in MapBuffer and ranges in MapBufferRange (v3)
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -1004,6 +1004,12 @@ _mesa_MapBufferARB(GLenum target, GLenum access)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!bufObj->Size) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY,
|
||||
"glMapBuffer(buffer size = 0)");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ASSERT(ctx->Driver.MapBufferRange);
|
||||
map = ctx->Driver.MapBufferRange(ctx, 0, bufObj->Size, accessFlags, bufObj);
|
||||
if (!map) {
|
||||
@@ -1411,6 +1417,22 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!bufObj->Size) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY,
|
||||
"glMapBufferRange(buffer size = 0)");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Mapping zero bytes should return a non-null pointer. */
|
||||
if (!length) {
|
||||
static long dummy = 0;
|
||||
bufObj->Pointer = &dummy;
|
||||
bufObj->Length = length;
|
||||
bufObj->Offset = offset;
|
||||
bufObj->AccessFlags = access;
|
||||
return bufObj->Pointer;
|
||||
}
|
||||
|
||||
ASSERT(ctx->Driver.MapBufferRange);
|
||||
map = ctx->Driver.MapBufferRange(ctx, offset, length, access, bufObj);
|
||||
if (!map) {
|
||||
|
@@ -228,13 +228,6 @@ st_bufferobj_data(struct gl_context *ctx,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Dummy data whose's pointer is used for zero size buffers or ranges.
|
||||
*/
|
||||
static long st_bufferobj_zero_length = 0;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Called via glMapBufferRange().
|
||||
*/
|
||||
@@ -280,14 +273,6 @@ st_bufferobj_map_range(struct gl_context *ctx,
|
||||
assert(offset < obj->Size);
|
||||
assert(offset + length <= obj->Size);
|
||||
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
else {
|
||||
obj->Pointer = pipe_buffer_map_range(pipe,
|
||||
st_obj->buffer,
|
||||
offset, length,
|
||||
@@ -296,7 +281,6 @@ st_bufferobj_map_range(struct gl_context *ctx,
|
||||
if (obj->Pointer) {
|
||||
obj->Pointer = (ubyte *) obj->Pointer + offset;
|
||||
}
|
||||
}
|
||||
|
||||
if (obj->Pointer) {
|
||||
obj->Offset = offset;
|
||||
|
Reference in New Issue
Block a user