glGetTexImage() now works with PBOs.

This commit is contained in:
Brian Paul
2004-10-31 16:24:32 +00:00
parent c0ebc4931a
commit b46712ca9d

View File

@@ -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);
}
}