mesa: handle zero-size buffers in MapBuffer and ranges in MapBufferRange (v3)

Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Marek Olšák
2011-08-30 19:10:06 +02:00
parent 0a33ac5413
commit 5572de8e7e
2 changed files with 31 additions and 25 deletions

View File

@@ -1004,6 +1004,12 @@ _mesa_MapBufferARB(GLenum target, GLenum access)
return NULL; return NULL;
} }
if (!bufObj->Size) {
_mesa_error(ctx, GL_OUT_OF_MEMORY,
"glMapBuffer(buffer size = 0)");
return NULL;
}
ASSERT(ctx->Driver.MapBufferRange); ASSERT(ctx->Driver.MapBufferRange);
map = ctx->Driver.MapBufferRange(ctx, 0, bufObj->Size, accessFlags, bufObj); map = ctx->Driver.MapBufferRange(ctx, 0, bufObj->Size, accessFlags, bufObj);
if (!map) { if (!map) {
@@ -1411,6 +1417,22 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
return NULL; 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); ASSERT(ctx->Driver.MapBufferRange);
map = ctx->Driver.MapBufferRange(ctx, offset, length, access, bufObj); map = ctx->Driver.MapBufferRange(ctx, offset, length, access, bufObj);
if (!map) { if (!map) {

View File

@@ -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(). * Called via glMapBufferRange().
*/ */
@@ -280,14 +273,6 @@ st_bufferobj_map_range(struct gl_context *ctx,
assert(offset < obj->Size); assert(offset < obj->Size);
assert(offset + length <= 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, obj->Pointer = pipe_buffer_map_range(pipe,
st_obj->buffer, st_obj->buffer,
offset, length, offset, length,
@@ -296,7 +281,6 @@ st_bufferobj_map_range(struct gl_context *ctx,
if (obj->Pointer) { if (obj->Pointer) {
obj->Pointer = (ubyte *) obj->Pointer + offset; obj->Pointer = (ubyte *) obj->Pointer + offset;
} }
}
if (obj->Pointer) { if (obj->Pointer) {
obj->Offset = offset; obj->Offset = offset;