[Mesa-dev] [PATCH] mesa: handle zero-size buffers in MapBuffer and ranges in MapBufferRange
Marek Olšák
maraeo at gmail.com
Tue Aug 30 10:15:12 PDT 2011
Moved from st/mesa.
This also fixes an assertion failure in piglit/fdo31934 on gallium drivers.
---
src/mesa/main/bufferobj.c | 18 +++++++++++++-
src/mesa/state_tracker/st_cb_bufferobjects.c | 32 ++++++-------------------
2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index c453f9c..515abc5 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -1004,6 +1004,13 @@ _mesa_MapBufferARB(GLenum target, GLenum access)
return NULL;
}
+ /* Handle zero-size buffers here rather than in drivers. */
+ if (!bufObj->Size) {
+ /* Dummy data whose pointer is used for zero-size buffers. */
+ static long bufferobj_zero_length = 0;
+ return &bufferobj_zero_length;
+ }
+
ASSERT(ctx->Driver.MapBufferRange);
map = ctx->Driver.MapBufferRange(ctx, 0, bufObj->Size, accessFlags, bufObj);
if (!map) {
@@ -1410,7 +1417,16 @@ _mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length,
"glMapBufferRange(buffer already mapped)");
return NULL;
}
-
+
+ /* We go out of way here to hide the degenerate yet valid case of zero
+ * length range.
+ */
+ if (!length) {
+ /* Dummy data whose pointer is used for zero-size buffers. */
+ static long bufferobj_zero_length = 0;
+ return &bufferobj_zero_length;
+ }
+
ASSERT(ctx->Driver.MapBufferRange);
map = ctx->Driver.MapBufferRange(ctx, offset, length, access, bufObj);
if (!map) {
diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c
index a451b44..aab7444 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.c
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
@@ -229,13 +229,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().
*/
static void *
@@ -280,24 +273,15 @@ 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,
- flags,
- &st_obj->transfer);
- if (obj->Pointer) {
- obj->Pointer = (ubyte *) obj->Pointer + offset;
- }
+ obj->Pointer = pipe_buffer_map_range(pipe,
+ st_obj->buffer,
+ offset, length,
+ flags,
+ &st_obj->transfer);
+ if (obj->Pointer) {
+ obj->Pointer = (ubyte *) obj->Pointer + offset;
}
-
+
if (obj->Pointer) {
obj->Offset = offset;
obj->Length = length;
--
1.7.4.1
More information about the mesa-dev
mailing list