Removed _swrast_validate_pbo_access().

In x11 driver, map/unmap PBO as needed in DrawPixels functions.
This commit is contained in:
Brian Paul 2004-10-31 15:49:59 +00:00
parent 355467bed8
commit ba164c4614
3 changed files with 52 additions and 35 deletions

View file

@ -843,10 +843,27 @@ xmesa_DrawPixels_8R8G8B( GLcontext *ctx,
int srcY = unpack->SkipRows;
int rowLength = unpack->RowLength ? unpack->RowLength : width;
pixels = _swrast_validate_pbo_access(unpack, width, height, 1,
format, type, (GLvoid *) pixels);
if (!pixels)
return;
if (unpack->BufferObj->Name) {
/* unpack from PBO */
GLubyte *buf;
if (!_mesa_validate_pbo_access(unpack, width, height, 1,
format, type, pixels)) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glDrawPixels(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,
"glDrawPixels(PBO is mapped)");
return;
}
pixels = ADD_POINTERS(buf, pixels);
}
if (_swrast_clip_pixelrect(ctx, &dstX, &dstY, &w, &h, &srcX, &srcY)) {
/* This is a little tricky since all coordinates up to now have
@ -872,6 +889,11 @@ xmesa_DrawPixels_8R8G8B( GLcontext *ctx,
dstY = FLIP(xmesa->xm_draw_buffer, dstY) - h + 1;
XPutImage(dpy, buffer, gc, &ximage, 0, 0, dstX, dstY, w, h);
}
if (unpack->BufferObj->Name) {
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
unpack->BufferObj);
}
}
else {
/* software fallback */
@ -924,10 +946,27 @@ xmesa_DrawPixels_5R6G5B( GLcontext *ctx,
int srcY = unpack->SkipRows;
int rowLength = unpack->RowLength ? unpack->RowLength : width;
pixels = _swrast_validate_pbo_access(unpack, width, height, 1,
format, type, (GLvoid *) pixels);
if (!pixels)
return;
if (unpack->BufferObj->Name) {
/* unpack from PBO */
GLubyte *buf;
if (!_mesa_validate_pbo_access(unpack, width, height, 1,
format, type, pixels)) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glDrawPixels(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,
"glDrawPixels(PBO is mapped)");
return;
}
pixels = ADD_POINTERS(buf, pixels);
}
if (_swrast_clip_pixelrect(ctx, &dstX, &dstY, &w, &h, &srcX, &srcY)) {
/* This is a little tricky since all coordinates up to now have
@ -953,6 +992,11 @@ xmesa_DrawPixels_5R6G5B( GLcontext *ctx,
dstY = FLIP(xmesa->xm_draw_buffer, dstY) - h + 1;
XPutImage(dpy, buffer, gc, &ximage, 0, 0, dstX, dstY, w, h);
}
if (unpack->BufferObj->Name) {
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT,
unpack->BufferObj);
}
}
else {
/* software fallback */

View file

@ -771,25 +771,3 @@ _swrast_print_vertex( GLcontext *ctx, const SWvertex *v )
_mesa_debug(ctx, "\n");
}
}
/**
* Validate access to a PBO to be sure we're not going to read/write
* out of buffer bounds.
*/
GLvoid *
_swrast_validate_pbo_access(const struct gl_pixelstore_attrib *pack,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type, GLvoid *ptr)
{
if (pack->BufferObj->Name == 0) {
/* no PBO */
return ptr;
}
else if (_mesa_validate_pbo_access(pack, width, height, depth, format,
type, ptr)) {
return ADD_POINTERS(pack->BufferObj->Data, ptr);
}
/* bad access! */
return NULL;
}

View file

@ -201,11 +201,6 @@ extern void
_swrast_print_vertex( GLcontext *ctx, const SWvertex *v );
extern GLvoid *
_swrast_validate_pbo_access(const struct gl_pixelstore_attrib *pack,
GLsizei width, GLsizei height, GLsizei depth,
GLenum format, GLenum type, GLvoid *ptr);
/*
* Imaging fallbacks (a better solution should be found, perhaps
* moving all the imaging fallback code to a new module)