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;
|
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) {
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user