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 db94e40c21..a83c5ec3ec 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 e9755e9199..a8716d80f5 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 7d8cf8c7a8..8f249d9428 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)   | 
