add a number of PBO validate/map/unmap functions
authorBrian <brian.paul@tungstengraphics.com>
Fri, 21 Mar 2008 19:41:00 +0000 (13:41 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 21 Mar 2008 19:41:00 +0000 (13:41 -0600)
Helper functions for (some) drivers, including swrast.

src/mesa/main/bufferobj.c
src/mesa/main/bufferobj.h
src/mesa/swrast/s_bitmap.c
src/mesa/swrast/s_drawpix.c
src/mesa/swrast/s_readpix.c

index 9ad2dccc1243683d76f2e58a7322f2e54429a911..3023d8fec36729dc30468a1a9a5a6e502bfa1b8d 100644 (file)
@@ -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"),
@@ -564,6 +564,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.
index 1d2715da846aaa8e62065fff344709460d65d1a4..1b63e684330d188e6e06c0b634cae55cc180779b 100644 (file)
@@ -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 );
 
index 1e7f6c18e6a2df7d7c8248019be0635e6a26e0cf..17f639fd5578ee3c0c93008fa5c5d53970942f15 100644 (file)
@@ -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);
 }
 
 
index 4733d10bb5923899da7ddaf0165eb1bb8cb00f9b..09ff96fd3279fdd40d1d5802862c88717f833414 100644 (file)
@@ -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);
 }
 
 
index 8df15c8704e66c1e5dd90529def483f741bf5c01..050506b0d05324e0abfd3ed1ffc02f5c6d59c1d9 100644 (file)
@@ -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);
 }