diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/main/teximage.c | 39 | 
1 files changed, 32 insertions, 7 deletions
| diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 3ef3d6442e..726ba37d9b 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -1,6 +1,6 @@  /*   * Mesa 3-D graphics library - * Version:  6.1 + * Version:  6.3   *   * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.   * @@ -36,6 +36,7 @@  #include "glheader.h" +#include "bufferobj.h"  #include "context.h"  #include "convolve.h"  #include "image.h" @@ -1950,11 +1951,6 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,        return;     } -   if (!texImage->Data) { -      /* no image data, not an error */ -      return; -   } -     /* Make sure the requested image format is compatible with the      * texture's format.      */ @@ -1979,6 +1975,31 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,        return;     } +   if (ctx->Pack.BufferObj->Name) { +      /* pack texture imaage into a PBO */ +      GLubyte *buf; +      if (!_mesa_validate_pbo_access(&ctx->Pack, texImage->Width, +                                     texImage->Height, texImage->Depth, +                                     format, type, pixels)) { +         _mesa_error(ctx, GL_INVALID_OPERATION, +                     "glGetTexImage(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,"glGetTexImage(PBO is mapped)"); +         return; +      } +      pixels = ADD_POINTERS(buf, pixels); +   } +   else if (!pixels) { +      /* not an error */ +      return; +   } +     /*      * XXX Move this code into a new driver fall-back function      */ @@ -2016,7 +2037,6 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,                 else {                    _mesa_problem(ctx,                                  "Color index problem in _mesa_GetTexImage"); -                  return;                 }                 _mesa_pack_index_span(ctx, width, type, dest,                                       indexRow, &ctx->Pack, @@ -2065,6 +2085,11 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,           } /* row */        } /* img */     } + +   if (ctx->Pack.BufferObj->Name) { +      ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, +                              ctx->Pack.BufferObj); +   }  } | 
