diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/main/bufferobj.c | 187 | ||||
| -rw-r--r-- | src/mesa/main/bufferobj.h | 39 | ||||
| -rw-r--r-- | src/mesa/swrast/s_bitmap.c | 32 | ||||
| -rw-r--r-- | src/mesa/swrast/s_drawpix.c | 32 | ||||
| -rw-r--r-- | src/mesa/swrast/s_readpix.c | 34 | 
5 files changed, 241 insertions, 83 deletions
| diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index 9ad2dccc12..3023d8fec3 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -1,8 +1,8 @@  /*   * Mesa 3-D graphics library - * Version:  6.5.1 + * Version:  7.1   * - * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -565,6 +565,189 @@ _mesa_validate_pbo_access(GLuint dimensions,  /** + * If the source of glBitmap data is a PBO, check that we won't read out + * of buffer bounds, then map the buffer. + * If not sourcing from a PBO, just return the bitmap pointer. + * This is a helper function for (some) drivers. + * Return NULL if error. + * If non-null return, must call validate_and_map_bitmap_pbo() when done. + */ +const GLubyte * +_mesa_validate_and_map_bitmap_pbo(GLcontext *ctx, +                                  GLsizei width, GLsizei height, +                                  const struct gl_pixelstore_attrib *unpack, +                                  const GLubyte *bitmap) +{ +   const GLubyte *buf; + +   if (unpack->BufferObj->Name) { +      /* unpack from PBO */ +      if (!_mesa_validate_pbo_access(2, unpack, width, height, 1, +                                     GL_COLOR_INDEX, GL_BITMAP, +                                     (GLvoid *) bitmap)) { +         _mesa_error(ctx, GL_INVALID_OPERATION,"glBitmap(invalid PBO access)"); +         return NULL; +      } + +      if (unpack->BufferObj->Pointer) { +         /* buffer is already mapped - that's an error */ +         _mesa_error(ctx, GL_INVALID_OPERATION, "glBitmap(PBO is mapped)"); +         return NULL; +      } + +      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, +                                              GL_READ_ONLY_ARB, +                                              unpack->BufferObj); +      if (!buf) +         return NULL; + +      buf = ADD_POINTERS(buf, bitmap); +   } +   else { +      /* unpack from normal memory */ +      buf = bitmap; +   } + +   return buf; +} + + +/** + * Counterpart to validate_and_map_bitmap_pbo() + * This is a helper function for (some) drivers. + */ +void +_mesa_unmap_bitmap_pbo(GLcontext *ctx, +                       const struct gl_pixelstore_attrib *unpack) +{ +   if (unpack->BufferObj->Name) { +      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, +                              unpack->BufferObj); +   } +} + + +/** + * \sa _mesa_validate_and_map_bitmap_pbo + */ +const GLvoid * +_mesa_validate_and_map_drawpix_pbo(GLcontext *ctx, +                                   GLsizei width, GLsizei height, +                                   GLenum format, GLenum type, +                                   const struct gl_pixelstore_attrib *unpack, +                                   const GLvoid *pixels) +{ +   const GLvoid *buf; + +   if (unpack->BufferObj->Name) { +      /* unpack from PBO */ + +      if (!_mesa_validate_pbo_access(2, unpack, width, height, 1, +                                     format, type, pixels)) { +         _mesa_error(ctx, GL_INVALID_OPERATION, +                     "glDrawPixels(invalid PBO access)"); +         return NULL; +      } + +      if (unpack->BufferObj->Pointer) { +         /* buffer is already mapped - that's an error */ +         _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawPixels(PBO is mapped)"); +         return NULL; +      } + +      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, +                                              GL_READ_ONLY_ARB, +                                              unpack->BufferObj); +      if (!buf) +         return NULL; + +      buf = ADD_POINTERS(buf, pixels); +   } +   else { +      /* unpack from normal memory */ +      buf = pixels; +   } + +   return buf; +} + + +/** + * \sa _mesa_unmap_bitmap_pbo + */ +void +_mesa_unmap_drapix_pbo(GLcontext *ctx, +                       const struct gl_pixelstore_attrib *unpack) +{ +   if (unpack->BufferObj->Name) { +      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, +                              unpack->BufferObj); +   } +} + + +/** + * When doing glReadPixels into a PBO, this function will check for errors + * and map the buffer. + * Call _mesa_unmap_readpix_pbo() when finished + * \return NULL if error + */ +void * +_mesa_validate_and_map_readpix_pbo(GLcontext *ctx, +                                   GLint x, GLint y, +                                   GLsizei width, GLsizei height, +                                   GLenum format, GLenum type, +                                   const struct gl_pixelstore_attrib *pack, +                                   GLvoid *dest) +{ +   void *buf; + +   if (pack->BufferObj->Name) { +      /* pack into PBO */ +      if (!_mesa_validate_pbo_access(2, pack, width, height, 1, +                                     format, type, dest)) { +         _mesa_error(ctx, GL_INVALID_OPERATION, +                     "glReadPixels(invalid PBO access)"); +         return NULL; +      } + +      if (pack->BufferObj->Pointer) { +         /* buffer is already mapped - that's an error */ +         _mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(PBO is mapped)"); +         return NULL; +      } + +      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, +                                              GL_WRITE_ONLY_ARB, +                                              pack->BufferObj); +      if (!buf) +         return NULL; + +      buf = ADD_POINTERS(buf, dest); +   } +   else { +      /* pack to normal memory */ +      buf = dest; +   } + +   return buf; +} + + +/** + * Counterpart to validate_and_map_readpix_pbo() + */ +void +_mesa_unmap_readpix_pbo(GLcontext *ctx, +                        const struct gl_pixelstore_attrib *pack) +{ +   if (pack->BufferObj->Name) { +      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, pack->BufferObj); +   } +} + + +/**   * Return the gl_buffer_object for the given ID.   * Always return NULL for ID 0.   */ diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h index 1d2715da84..1b63e68433 100644 --- a/src/mesa/main/bufferobj.h +++ b/src/mesa/main/bufferobj.h @@ -1,8 +1,8 @@  /*   * Mesa 3-D graphics library - * Version:  6.3 + * Version:  7.1   * - * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -89,6 +89,41 @@ _mesa_validate_pbo_access(GLuint dimensions,                            GLsizei width, GLsizei height, GLsizei depth,                            GLenum format, GLenum type, const GLvoid *ptr); +extern const GLubyte * +_mesa_validate_and_map_bitmap_pbo(GLcontext *ctx, +                                  GLsizei width, GLsizei height, +                                  const struct gl_pixelstore_attrib *unpack, +                                  const GLubyte *bitmap); + +extern void +_mesa_unmap_bitmap_pbo(GLcontext *ctx, +                       const struct gl_pixelstore_attrib *unpack); + +extern const GLvoid * +_mesa_validate_and_map_drawpix_pbo(GLcontext *ctx, +                                   GLsizei width, GLsizei height, +                                   GLenum format, GLenum type, +                                   const struct gl_pixelstore_attrib *unpack, +                                   const GLvoid *pixels); + +extern void +_mesa_unmap_drapix_pbo(GLcontext *ctx, +                       const struct gl_pixelstore_attrib *unpack); + + +extern void * +_mesa_validate_and_map_readpix_pbo(GLcontext *ctx, +                                   GLint x, GLint y, +                                   GLsizei width, GLsizei height, +                                   GLenum format, GLenum type, +                                   const struct gl_pixelstore_attrib *pack, +                                   GLvoid *dest); + +extern void +_mesa_unmap_readpix_pbo(GLcontext *ctx, +                        const struct gl_pixelstore_attrib *pack); + +  extern void  _mesa_unbind_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj ); diff --git a/src/mesa/swrast/s_bitmap.c b/src/mesa/swrast/s_bitmap.c index 1e7f6c18e6..17f639fd55 100644 --- a/src/mesa/swrast/s_bitmap.c +++ b/src/mesa/swrast/s_bitmap.c @@ -1,8 +1,8 @@  /*   * Mesa 3-D graphics library - * Version:  6.5.2 + * Version:  7.1   * - * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved. + * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -57,24 +57,10 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,     ASSERT(ctx->RenderMode == GL_RENDER); -   if (unpack->BufferObj->Name) { -      /* unpack from PBO */ -      GLubyte *buf; -      if (!_mesa_validate_pbo_access(2, unpack, width, height, 1, -                                     GL_COLOR_INDEX, GL_BITMAP, -                                     (GLvoid *) bitmap)) { -         _mesa_error(ctx, GL_INVALID_OPERATION,"glBitmap(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, "glBitmap(PBO is mapped)"); -         return; -      } -      bitmap = ADD_POINTERS(buf, bitmap); +   bitmap = _mesa_validate_and_map_bitmap_pbo(ctx, width, height, +                                              unpack, bitmap); +   if (!bitmap) { +      return NULL;     }     RENDER_START(swrast,ctx); @@ -150,11 +136,7 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,     RENDER_FINISH(swrast,ctx); -   if (unpack->BufferObj->Name) { -      /* done with PBO so unmap it now */ -      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, -                              unpack->BufferObj); -   } +   _mesa_unmap_bitmap_pbo(ctx, unpack);  } diff --git a/src/mesa/swrast/s_drawpix.c b/src/mesa/swrast/s_drawpix.c index 4733d10bb5..09ff96fd32 100644 --- a/src/mesa/swrast/s_drawpix.c +++ b/src/mesa/swrast/s_drawpix.c @@ -817,7 +817,6 @@ draw_depth_stencil_pixels(GLcontext *ctx, GLint x, GLint y,  } -  /**   * Execute software-based glDrawPixels.   * By time we get here, all error checking will have been done. @@ -840,27 +839,10 @@ _swrast_DrawPixels( GLcontext *ctx,     if (swrast->NewState)        _swrast_validate_derived( ctx ); -   if (unpack->BufferObj->Name) { -      /* unpack from PBO */ -      GLubyte *buf; -      if (!_mesa_validate_pbo_access(2, unpack, width, height, 1, -                                     format, type, pixels)) { -         _mesa_error(ctx, GL_INVALID_OPERATION, -                     "glDrawPixels(invalid PBO access)"); -         RENDER_FINISH(swrast, ctx); -	 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)"); -         RENDER_FINISH(swrast, ctx); -	 return; -      } -      pixels = ADD_POINTERS(buf, pixels); -   } +    pixels = _mesa_validate_and_map_drawpix_pbo(ctx, width, height, +                                                format, type, unpack, pixels); +    if (!pixels) +       return;     switch (format) {     case GL_STENCIL_INDEX: @@ -899,11 +881,7 @@ _swrast_DrawPixels( GLcontext *ctx,     RENDER_FINISH(swrast,ctx); -   if (unpack->BufferObj->Name) { -      /* done with PBO so unmap it now */ -      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, -                              unpack->BufferObj); -   } +   _mesa_unmap_drapix_pbo(ctx, unpack);  } diff --git a/src/mesa/swrast/s_readpix.c b/src/mesa/swrast/s_readpix.c index 8df15c8704..050506b0d0 100644 --- a/src/mesa/swrast/s_readpix.c +++ b/src/mesa/swrast/s_readpix.c @@ -574,28 +574,12 @@ _swrast_ReadPixels( GLcontext *ctx,        return;     } -   if (clippedPacking.BufferObj->Name) { -      /* pack into PBO */ -      GLubyte *buf; -      if (!_mesa_validate_pbo_access(2, &clippedPacking, width, height, 1, -                                     format, type, pixels)) { -         _mesa_error(ctx, GL_INVALID_OPERATION, -                     "glReadPixels(invalid PBO access)"); -	 RENDER_FINISH(swrast, ctx); -	 return; -      } -      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, -                                              GL_WRITE_ONLY_ARB, -                                              clippedPacking.BufferObj); -      if (!buf) { -         /* buffer is already mapped - that's an error */ -         _mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(PBO is mapped)"); -	 RENDER_FINISH(swrast, ctx); -	 return; -      } -      pixels = ADD_POINTERS(buf, pixels); -   } - +    pixels = _mesa_validate_and_map_readpix_pbo(ctx, x, y, width, height, +                                                format, type, +                                                &clippedPacking, pixels); +    if (!pixels) +       return; +       switch (format) {        case GL_COLOR_INDEX:           read_index_pixels(ctx, x, y, width, height, type, pixels, @@ -634,9 +618,5 @@ _swrast_ReadPixels( GLcontext *ctx,     RENDER_FINISH(swrast, ctx); -   if (clippedPacking.BufferObj->Name) { -      /* done with PBO so unmap it now */ -      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, -                              clippedPacking.BufferObj); -   } +   _mesa_unmap_readpix_pbo(ctx, &clippedPacking);  } | 
