Refactor PBO validate/map code.
authorBrian <brian.paul@tungstengraphics.com>
Fri, 21 Mar 2008 20:19:28 +0000 (14:19 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 21 Mar 2008 20:19:28 +0000 (14:19 -0600)
We always need to do PBO validation, so do that in core Mesa before calling driver routine.

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

index 3023d8fec36729dc30468a1a9a5a6e502bfa1b8d..eb418610a729a19ab45a1cc378ba28b287e46793 100644 (file)
@@ -570,31 +570,17 @@ _mesa_validate_pbo_access(GLuint dimensions,
  * 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.
+ * If non-null return, must call _mesa_unmap_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)
+_mesa_map_bitmap_pbo(GLcontext *ctx,
+                     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);
@@ -613,7 +599,7 @@ _mesa_validate_and_map_bitmap_pbo(GLcontext *ctx,
 
 
 /**
- * Counterpart to validate_and_map_bitmap_pbo()
+ * Counterpart to _mesa_map_bitmap_pbo()
  * This is a helper function for (some) drivers.
  */
 void
@@ -628,33 +614,17 @@ _mesa_unmap_bitmap_pbo(GLcontext *ctx,
 
 
 /**
- * \sa _mesa_validate_and_map_bitmap_pbo
+ * \sa _mesa_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)
+_mesa_map_drawpix_pbo(GLcontext *ctx,
+                      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);
@@ -687,36 +657,19 @@ _mesa_unmap_drapix_pbo(GLcontext *ctx,
 
 
 /**
- * When doing glReadPixels into a PBO, this function will check for errors
- * and map the buffer.
+ * If PBO is bound, map the buffer, return dest pointer in mapped 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)
+_mesa_map_readpix_pbo(GLcontext *ctx,
+                      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);
@@ -735,7 +688,7 @@ _mesa_validate_and_map_readpix_pbo(GLcontext *ctx,
 
 
 /**
- * Counterpart to validate_and_map_readpix_pbo()
+ * Counterpart to _mesa_map_readpix_pbo()
  */
 void
 _mesa_unmap_readpix_pbo(GLcontext *ctx,
@@ -747,6 +700,7 @@ _mesa_unmap_readpix_pbo(GLcontext *ctx,
 }
 
 
+
 /**
  * Return the gl_buffer_object for the given ID.
  * Always return NULL for ID 0.
index 1b63e684330d188e6e06c0b634cae55cc180779b..8baa59d6171c8b8fe9a21992f29ed7e4d75df29d 100644 (file)
@@ -90,21 +90,18 @@ _mesa_validate_pbo_access(GLuint dimensions,
                           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);
+_mesa_map_bitmap_pbo(GLcontext *ctx,
+                     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);
+_mesa_map_drawpix_pbo(GLcontext *ctx,
+                      const struct gl_pixelstore_attrib *unpack,
+                      const GLvoid *pixels);
 
 extern void
 _mesa_unmap_drapix_pbo(GLcontext *ctx,
@@ -112,12 +109,9 @@ _mesa_unmap_drapix_pbo(GLcontext *ctx,
 
 
 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);
+_mesa_map_readpix_pbo(GLcontext *ctx,
+                      const struct gl_pixelstore_attrib *pack,
+                      GLvoid *dest);
 
 extern void
 _mesa_unmap_readpix_pbo(GLcontext *ctx,
index d9b724bc06d5d6c8e4ae3ea3c67604c03e2174ab..4f287666746613795084f3617332b7306da1a983 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "glheader.h"
 #include "imports.h"
+#include "bufferobj.h"
 #include "context.h"
 #include "drawpix.h"
 #include "feedback.h"
@@ -182,6 +183,23 @@ _mesa_DrawPixels( GLsizei width, GLsizei height,
       /* Round, to satisfy conformance tests (matches SGI's OpenGL) */
       GLint x = IROUND(ctx->Current.RasterPos[0]);
       GLint y = IROUND(ctx->Current.RasterPos[1]);
+
+      if (ctx->Unpack.BufferObj->Name) {
+         /* unpack from PBO */
+         if (!_mesa_validate_pbo_access(2, &ctx->Unpack, width, height, 1,
+                                        format, type, pixels)) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glDrawPixels(invalid PBO access)");
+            return;
+         }
+         if (ctx->Unpack.BufferObj->Pointer) {
+            /* buffer is mapped - that's an error */
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glDrawPixels(PBO is mapped)");
+            return;
+         }
+      }
+
       ctx->Driver.DrawPixels(ctx, x, y, width, height, format, type,
                             &ctx->Unpack, pixels);
    }
@@ -300,6 +318,21 @@ _mesa_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height,
       return;
    }
 
+   if (ctx->Pack.BufferObj->Name) {
+      if (!_mesa_validate_pbo_access(2, &ctx->Pack, width, height, 1,
+                                     format, type, pixels)) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glReadPixels(invalid PBO access)");
+         return;
+      }
+
+      if (ctx->Pack.BufferObj->Pointer) {
+         /* buffer is mapped - that's an error */
+         _mesa_error(ctx, GL_INVALID_OPERATION, "glReadPixels(PBO is mapped)");
+         return;
+      }
+   }
+
    ctx->Driver.ReadPixels(ctx, x, y, width, height,
                          format, type, &ctx->Pack, pixels);
 }
@@ -343,6 +376,23 @@ _mesa_Bitmap( GLsizei width, GLsizei height,
       /* Truncate, to satisfy conformance tests (matches SGI's OpenGL). */
       GLint x = IFLOOR(ctx->Current.RasterPos[0] - xorig);
       GLint y = IFLOOR(ctx->Current.RasterPos[1] - yorig);
+
+      if (ctx->Unpack.BufferObj->Name) {
+         /* unpack from PBO */
+         if (!_mesa_validate_pbo_access(2, &ctx->Unpack, width, height, 1,
+                                        GL_COLOR_INDEX, GL_BITMAP,
+                                        (GLvoid *) bitmap)) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glBitmap(invalid PBO access)");
+            return;
+         }
+         if (ctx->Unpack.BufferObj->Pointer) {
+            /* buffer is mapped - that's an error */
+            _mesa_error(ctx, GL_INVALID_OPERATION, "glBitmap(PBO is mapped)");
+            return;
+         }
+      }
+
       ctx->Driver.Bitmap( ctx, x, y, width, height, &ctx->Unpack, bitmap );
    }
 #if _HAVE_FULL_GL
index 17f639fd5578ee3c0c93008fa5c5d53970942f15..f3dda12e252dcf21a183e3cd1a4522e54d509b3d 100644 (file)
@@ -57,11 +57,9 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
 
    ASSERT(ctx->RenderMode == GL_RENDER);
 
-   bitmap = _mesa_validate_and_map_bitmap_pbo(ctx, width, height,
-                                              unpack, bitmap);
-   if (!bitmap) {
-      return NULL;
-   }
+   bitmap = _mesa_map_bitmap_pbo(ctx, unpack, bitmap);
+   if (!bitmap)
+      return;
 
    RENDER_START(swrast,ctx);
 
index 09ff96fd3279fdd40d1d5802862c88717f833414..81f5caa27065b9edf288fa145a5f11f59416271d 100644 (file)
@@ -839,8 +839,7 @@ _swrast_DrawPixels( GLcontext *ctx,
    if (swrast->NewState)
       _swrast_validate_derived( ctx );
 
-    pixels = _mesa_validate_and_map_drawpix_pbo(ctx, width, height,
-                                                format, type, unpack, pixels);
+    pixels = _mesa_map_drawpix_pbo(ctx, unpack, pixels);
     if (!pixels)
        return;
 
index 050506b0d05324e0abfd3ed1ffc02f5c6d59c1d9..9140d12ea076924dc06c8a7da661f7165d7e190a 100644 (file)
@@ -574,11 +574,9 @@ _swrast_ReadPixels( GLcontext *ctx,
       return;
    }
 
-    pixels = _mesa_validate_and_map_readpix_pbo(ctx, x, y, width, height,
-                                                format, type,
-                                                &clippedPacking, pixels);
-    if (!pixels)
-       return;
+   pixels = _mesa_map_readpix_pbo(ctx, &clippedPacking, pixels);
+   if (!pixels)
+      return;
   
    switch (format) {
       case GL_COLOR_INDEX: