diff options
-rw-r--r-- | src/mesa/drivers/x11/xm_dd.c | 60 | ||||
-rw-r--r-- | src/mesa/swrast/s_context.c | 22 | ||||
-rw-r--r-- | src/mesa/swrast/swrast.h | 5 |
3 files changed, 52 insertions, 35 deletions
diff --git a/src/mesa/drivers/x11/xm_dd.c b/src/mesa/drivers/x11/xm_dd.c index db94e40c211..a83c5ec3ec8 100644 --- a/src/mesa/drivers/x11/xm_dd.c +++ b/src/mesa/drivers/x11/xm_dd.c @@ -843,10 +843,27 @@ xmesa_DrawPixels_8R8G8B( GLcontext *ctx, int srcY = unpack->SkipRows; int rowLength = unpack->RowLength ? unpack->RowLength : width; - pixels = _swrast_validate_pbo_access(unpack, width, height, 1, - format, type, (GLvoid *) pixels); - if (!pixels) - return; + if (unpack->BufferObj->Name) { + /* unpack from PBO */ + GLubyte *buf; + if (!_mesa_validate_pbo_access(unpack, width, height, 1, + format, type, pixels)) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glDrawPixels(invalid PBO access)"); + return; + } + buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, + GL_PIXEL_UNPACK_BUFFER_EXT, + GL_READ_ONLY_ARB, + unpack->BufferObj); + if (!buf) { + /* buffer is already mapped - that's an error */ + _mesa_error(ctx, GL_INVALID_OPERATION, + "glDrawPixels(PBO is mapped)"); + return; + } + pixels = ADD_POINTERS(buf, pixels); + } if (_swrast_clip_pixelrect(ctx, &dstX, &dstY, &w, &h, &srcX, &srcY)) { /* This is a little tricky since all coordinates up to now have @@ -872,6 +889,11 @@ xmesa_DrawPixels_8R8G8B( GLcontext *ctx, dstY = FLIP(xmesa->xm_draw_buffer, dstY) - h + 1; XPutImage(dpy, buffer, gc, &ximage, 0, 0, dstX, dstY, w, h); } + + if (unpack->BufferObj->Name) { + ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, + unpack->BufferObj); + } } else { /* software fallback */ @@ -924,10 +946,27 @@ xmesa_DrawPixels_5R6G5B( GLcontext *ctx, int srcY = unpack->SkipRows; int rowLength = unpack->RowLength ? unpack->RowLength : width; - pixels = _swrast_validate_pbo_access(unpack, width, height, 1, - format, type, (GLvoid *) pixels); - if (!pixels) - return; + if (unpack->BufferObj->Name) { + /* unpack from PBO */ + GLubyte *buf; + if (!_mesa_validate_pbo_access(unpack, width, height, 1, + format, type, pixels)) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glDrawPixels(invalid PBO access)"); + return; + } + buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, + GL_PIXEL_UNPACK_BUFFER_EXT, + GL_READ_ONLY_ARB, + unpack->BufferObj); + if (!buf) { + /* buffer is already mapped - that's an error */ + _mesa_error(ctx, GL_INVALID_OPERATION, + "glDrawPixels(PBO is mapped)"); + return; + } + pixels = ADD_POINTERS(buf, pixels); + } if (_swrast_clip_pixelrect(ctx, &dstX, &dstY, &w, &h, &srcX, &srcY)) { /* This is a little tricky since all coordinates up to now have @@ -953,6 +992,11 @@ xmesa_DrawPixels_5R6G5B( GLcontext *ctx, dstY = FLIP(xmesa->xm_draw_buffer, dstY) - h + 1; XPutImage(dpy, buffer, gc, &ximage, 0, 0, dstX, dstY, w, h); } + + if (unpack->BufferObj->Name) { + ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, + unpack->BufferObj); + } } else { /* software fallback */ diff --git a/src/mesa/swrast/s_context.c b/src/mesa/swrast/s_context.c index e9755e91997..a8716d80f50 100644 --- a/src/mesa/swrast/s_context.c +++ b/src/mesa/swrast/s_context.c @@ -771,25 +771,3 @@ _swrast_print_vertex( GLcontext *ctx, const SWvertex *v ) _mesa_debug(ctx, "\n"); } } - - -/** - * Validate access to a PBO to be sure we're not going to read/write - * out of buffer bounds. - */ -GLvoid * -_swrast_validate_pbo_access(const struct gl_pixelstore_attrib *pack, - GLsizei width, GLsizei height, GLsizei depth, - GLenum format, GLenum type, GLvoid *ptr) -{ - if (pack->BufferObj->Name == 0) { - /* no PBO */ - return ptr; - } - else if (_mesa_validate_pbo_access(pack, width, height, depth, format, - type, ptr)) { - return ADD_POINTERS(pack->BufferObj->Data, ptr); - } - /* bad access! */ - return NULL; -} diff --git a/src/mesa/swrast/swrast.h b/src/mesa/swrast/swrast.h index 7d8cf8c7a8a..8f249d94280 100644 --- a/src/mesa/swrast/swrast.h +++ b/src/mesa/swrast/swrast.h @@ -201,11 +201,6 @@ extern void _swrast_print_vertex( GLcontext *ctx, const SWvertex *v ); -extern GLvoid * -_swrast_validate_pbo_access(const struct gl_pixelstore_attrib *pack, - GLsizei width, GLsizei height, GLsizei depth, - GLenum format, GLenum type, GLvoid *ptr); - /* * Imaging fallbacks (a better solution should be found, perhaps * moving all the imaging fallback code to a new module) |