Merge branch 'mesa_7_5_branch' into mesa_7_6_branch
[mesa.git] / src / mesa / main / convolve.c
index 1f4eaf439b8790f18309166980de0e2b9fa67aae..70951112a18a06b7d7a6676557d92f6f6d7b1feb 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.3
+ * Version:  6.5.2
  *
- * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  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"),
@@ -144,39 +144,19 @@ _mesa_ConvolutionFilter1D(GLenum target, GLenum internalFormat, GLsizei width, G
    ctx->Convolution1D.Width = width;
    ctx->Convolution1D.Height = 1;
 
-   if (ctx->Unpack.BufferObj->Name) {
-      /* unpack filter from PBO */
-      GLubyte *buf;
-      if (!_mesa_validate_pbo_access(&ctx->Unpack, width, 1, 1,
-                                     format, type, image)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glConvolutionFilter1D(invalid PBO access)");
-         return;
-      }
-      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
-                                              GL_READ_ONLY_ARB,
-                                              ctx->Unpack.BufferObj);
-      if (!buf) {
-         /* buffer is already mapped - that's an error */
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glConvolutionFilter1D(PBO is mapped)");
-         return;
-      }
-      image = ADD_POINTERS(buf, image);
-   }
-   else if (!image) {
+   image = _mesa_map_validate_pbo_source(ctx, 
+                                        1, &ctx->Unpack, width, 1, 1,
+                                        format, type, image,
+                                        "glConvolutionFilter1D");
+   if (!image)
       return;
-   }
 
    _mesa_unpack_color_span_float(ctx, width, GL_RGBA,
                                  ctx->Convolution1D.Filter,
                                  format, type, image, &ctx->Unpack,
                                  0); /* transferOps */
 
-   if (ctx->Unpack.BufferObj->Name) {
-      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
-                              ctx->Unpack.BufferObj);
-   }
+   _mesa_unmap_pbo_source(ctx, &ctx->Unpack);
 
    _mesa_scale_and_bias_rgba(width,
                              (GLfloat (*)[4]) ctx->Convolution1D.Filter,
@@ -242,44 +222,24 @@ _mesa_ConvolutionFilter2D(GLenum target, GLenum internalFormat, GLsizei width, G
    ctx->Convolution2D.Width = width;
    ctx->Convolution2D.Height = height;
 
-   if (ctx->Unpack.BufferObj->Name) {
-      /* unpack filter from PBO */
-      GLubyte *buf;
-      if (!_mesa_validate_pbo_access(&ctx->Unpack, width, height, 1,
-                                     format, type, image)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glConvolutionFilter2D(invalid PBO access)");
-         return;
-      }
-      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
-                                              GL_READ_ONLY_ARB,
-                                              ctx->Unpack.BufferObj);
-      if (!buf) {
-         /* buffer is already mapped - that's an error */
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glConvolutionFilter2D(PBO is mapped)");
-         return;
-      }
-      image = ADD_POINTERS(buf, image);
-   }
-   else if (!image) {
+   image = _mesa_map_validate_pbo_source(ctx, 
+                                         2, &ctx->Unpack, width, height, 1,
+                                         format, type, image,
+                                         "glConvolutionFilter2D");
+   if (!image)
       return;
-   }
 
    /* Unpack filter image.  We always store filters in RGBA format. */
    for (i = 0; i < height; i++) {
-      const GLvoid *src = _mesa_image_address(&ctx->Unpack, image, width,
-                                              height, format, type, 0, i, 0);
+      const GLvoid *src = _mesa_image_address2d(&ctx->Unpack, image, width,
+                                                height, format, type, i, 0);
       GLfloat *dst = ctx->Convolution2D.Filter + i * width * 4;
       _mesa_unpack_color_span_float(ctx, width, GL_RGBA, dst,
                                     format, type, src, &ctx->Unpack,
                                     0); /* transferOps */
    }
 
-   if (ctx->Unpack.BufferObj->Name) {
-      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
-                              ctx->Unpack.BufferObj);
-   }
+   _mesa_unmap_pbo_source(ctx, &ctx->Unpack);
 
    _mesa_scale_and_bias_rgba(width * height,
                              (GLfloat (*)[4]) ctx->Convolution2D.Filter,
@@ -560,9 +520,10 @@ _mesa_CopyConvolutionFilter2D(GLenum target, GLenum internalFormat, GLint x, GLi
 
 
 void GLAPIENTRY
-_mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *image)
+_mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type,
+                           GLvoid *image)
 {
-   const struct gl_convolution_attrib *filter;
+   struct gl_convolution_attrib *filter;
    GLuint row;
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
@@ -597,41 +558,23 @@ _mesa_GetConvolutionFilter(GLenum target, GLenum format, GLenum type, GLvoid *im
          return;
    }
 
-   if (ctx->Pack.BufferObj->Name) {
-      /* Pack the filter into a PBO */
-      GLubyte *buf;
-      if (!_mesa_validate_pbo_access(&ctx->Pack, filter->Width, filter->Height,
-                                     1, format, type, image)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetConvolutionFilter(invalid PBO access)");
-         return;
-      }
-      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
-                                              GL_WRITE_ONLY_ARB,
-                                              ctx->Pack.BufferObj);
-      if (!buf) {
-         /* buffer is already mapped - that's an error */
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetConvolutionFilter(PBO is mapped)");
-         return;
-      }
-      image = ADD_POINTERS(image, buf);
-   }
+   image = _mesa_map_validate_pbo_dest(ctx, 2, &ctx->Pack,
+                                       filter->Width, filter->Height, 1,
+                                       format, type, image,
+                                       "glGetConvolutionFilter");
+   if (!image)
+      return;
 
    for (row = 0; row < filter->Height; row++) {
-      GLvoid *dst = _mesa_image_address( &ctx->Pack, image, filter->Width,
-                                         filter->Height, format, type,
-                                         0, row, 0);
-      const GLfloat *src = filter->Filter + row * filter->Width * 4;
-      _mesa_pack_rgba_span_float(ctx, filter->Width,
-                                 (const GLfloat (*)[4]) src,
-                                 format, type, dst, &ctx->Pack, 0);
+      GLvoid *dst = _mesa_image_address2d(&ctx->Pack, image, filter->Width,
+                                          filter->Height, format, type,
+                                          row, 0);
+      GLfloat (*src)[4] = (GLfloat (*)[4]) (filter->Filter + row * filter->Width * 4);
+      _mesa_pack_rgba_span_float(ctx, filter->Width, src,
+                                 format, type, dst, &ctx->Pack, 0x0);
    }
 
-   if (ctx->Pack.BufferObj->Name) {
-      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
-                              ctx->Pack.BufferObj);
-   }
+   _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
 }
 
 
@@ -767,10 +710,11 @@ _mesa_GetConvolutionParameteriv(GLenum target, GLenum pname, GLint *params)
 
 
 void GLAPIENTRY
-_mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row, GLvoid *column, GLvoid *span)
+_mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type,
+                         GLvoid *row, GLvoid *column, GLvoid *span)
 {
    const GLint colStart = MAX_CONVOLUTION_WIDTH * 4;
-   const struct gl_convolution_attrib *filter;
+   struct gl_convolution_attrib *filter;
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
@@ -784,7 +728,8 @@ _mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row,
    }
 
    if (!_mesa_is_legal_format_and_type(ctx, format, type)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetConvolutionFilter(format or type)");
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glGetConvolutionFilter(format or type)");
       return;
    }
 
@@ -799,62 +744,35 @@ _mesa_GetSeparableFilter(GLenum target, GLenum format, GLenum type, GLvoid *row,
 
    filter = &ctx->Separable2D;
 
-   if (ctx->Pack.BufferObj->Name) {
-      /* Pack filter into PBO */
-      GLubyte *buf;
-      if (!_mesa_validate_pbo_access(&ctx->Pack, filter->Width, 1, 1,
-                                     format, type, row)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetSeparableFilter(invalid PBO access, width)");
-         return;
-      }
-      if (!_mesa_validate_pbo_access(&ctx->Pack, filter->Height, 1, 1,
-                                     format, type, column)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetSeparableFilter(invalid PBO access, height)");
-         return;
-      }
-      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT,
-                                              GL_WRITE_ONLY_ARB,
-                                              ctx->Pack.BufferObj);
-      if (!buf) {
-         /* buffer is already mapped - that's an error */
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glGetSeparableFilter(PBO is mapped)");
-         return;
-      }
-      row = ADD_POINTERS(buf, row);
-      column = ADD_POINTERS(buf, column);
-   }
-
-   /* Row filter */
+   /* Get row filter */
+   row = _mesa_map_validate_pbo_dest(ctx, 1, &ctx->Pack,
+                                     filter->Width, 1, 1,
+                                     format, type, row,
+                                     "glGetConvolutionFilter");
    if (row) {
-      GLvoid *dst = _mesa_image_address( &ctx->Pack, row, filter->Width,
-                                         filter->Height, format, type,
-                                         0, 0, 0);
+      GLvoid *dst = _mesa_image_address1d(&ctx->Pack, row, filter->Width,
+                                          format, type, 0);
       _mesa_pack_rgba_span_float(ctx, filter->Width,
-                                 (const GLfloat (*)[4]) filter->Filter,
-                                 format, type, dst, &ctx->Pack, 0);
+                                 (GLfloat (*)[4]) filter->Filter,
+                                 format, type, dst, &ctx->Pack, 0x0);
+      _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
    }
 
-   /* Column filter */
+   /* get column filter */
+   column = _mesa_map_validate_pbo_dest(ctx, 1, &ctx->Pack,
+                                        filter->Height, 1, 1,
+                                        format, type, column,
+                                        "glGetConvolutionFilter");
    if (column) {
-      GLvoid *dst = _mesa_image_address( &ctx->Pack, column, filter->Width,
-                                         1, format, type,
-                                         0, 0, 0);
-      const GLfloat *src = filter->Filter + colStart;
-      _mesa_pack_rgba_span_float(ctx, filter->Height,
-                                 (const GLfloat (*)[4]) src,
-                                 format, type, dst, &ctx->Pack, 0);
+      GLvoid *dst = _mesa_image_address1d(&ctx->Pack, column, filter->Height,
+                                          format, type, 0);
+      GLfloat (*src)[4] = (GLfloat (*)[4]) (filter->Filter + colStart);
+      _mesa_pack_rgba_span_float(ctx, filter->Height, src,
+                                 format, type, dst, &ctx->Pack, 0x0);
+      _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
    }
 
    (void) span;  /* unused at this time */
-
-   if (ctx->Pack.BufferObj->Name) {
-      /* Pack filter into PBO */
-      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
-                              ctx->Unpack.BufferObj);
-   }
 }
 
 
@@ -905,41 +823,16 @@ _mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLs
    ctx->Separable2D.Width = width;
    ctx->Separable2D.Height = height;
 
-   if (ctx->Unpack.BufferObj->Name) {
-      /* unpack filter from PBO */
-      GLubyte *buf;
-      if (!_mesa_validate_pbo_access(&ctx->Unpack, width, 1, 1,
-                                     format, type, row)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glSeparableFilter2D(invalid PBO access, width)");
-         return;
-      }
-      if (!_mesa_validate_pbo_access(&ctx->Unpack, height, 1, 1,
-                                     format, type, column)) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glSeparableFilter2D(invalid PBO access, height)");
-         return;
-      }
-      buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
-                                              GL_READ_ONLY_ARB,
-                                              ctx->Unpack.BufferObj);
-      if (!buf) {
-         /* buffer is already mapped - that's an error */
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glSeparableFilter2D(PBO is mapped)");
-         return;
-      }
-      row = ADD_POINTERS(buf, row);
-      column = ADD_POINTERS(buf, column);
-   }
-
    /* unpack row filter */
+   row = _mesa_map_validate_pbo_source(ctx, 1, &ctx->Unpack,
+                                       width, 1, 1,
+                                       format, type, row,
+                                       "glSeparableFilter2D");
    if (row) {
       _mesa_unpack_color_span_float(ctx, width, GL_RGBA,
                                     ctx->Separable2D.Filter,
                                     format, type, row, &ctx->Unpack,
-                                    0);  /* transferOps */
-
+                                    0x0);  /* transferOps */
       _mesa_scale_and_bias_rgba(width,
                              (GLfloat (*)[4]) ctx->Separable2D.Filter,
                              ctx->Pixel.ConvolutionFilterScale[2][0],
@@ -950,14 +843,19 @@ _mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLs
                              ctx->Pixel.ConvolutionFilterBias[2][1],
                              ctx->Pixel.ConvolutionFilterBias[2][2],
                              ctx->Pixel.ConvolutionFilterBias[2][3]);
+      _mesa_unmap_pbo_source(ctx, &ctx->Unpack);
    }
 
    /* unpack column filter */
+   column = _mesa_map_validate_pbo_source(ctx, 1, &ctx->Unpack,
+                                          height, 1, 1,
+                                          format, type, column,
+                                          "glSeparableFilter2D");
    if (column) {
-     _mesa_unpack_color_span_float(ctx, height, GL_RGBA,
-                                   &ctx->Separable2D.Filter[colStart],
-                                   format, type, column, &ctx->Unpack,
-                                   0); /* transferOps */
+      _mesa_unpack_color_span_float(ctx, height, GL_RGBA,
+                                    &ctx->Separable2D.Filter[colStart],
+                                    format, type, column, &ctx->Unpack,
+                                    0); /* transferOps */
 
       _mesa_scale_and_bias_rgba(height,
                        (GLfloat (*)[4]) (ctx->Separable2D.Filter + colStart),
@@ -969,9 +867,10 @@ _mesa_SeparableFilter2D(GLenum target, GLenum internalFormat, GLsizei width, GLs
                        ctx->Pixel.ConvolutionFilterBias[2][1],
                        ctx->Pixel.ConvolutionFilterBias[2][2],
                        ctx->Pixel.ConvolutionFilterBias[2][3]);
+      _mesa_unmap_pbo_source(ctx, &ctx->Unpack);
    }
 
-   if (ctx->Unpack.BufferObj->Name) {
+   if (_mesa_is_bufferobj(ctx->Unpack.BufferObj)) {
       ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
                               ctx->Unpack.BufferObj);
    }