diff options
author | Brian Paul <[email protected]> | 2004-10-31 15:39:04 +0000 |
---|---|---|
committer | Brian Paul <[email protected]> | 2004-10-31 15:39:04 +0000 |
commit | 355467bed8cf34cf5967c7be3c5f1b87ff08f845 (patch) | |
tree | 8911b6e824ea657194bb0a867aadab89be3468f9 /src/mesa/swrast/s_bitmap.c | |
parent | c6136ea62c40e24bb571105a73eca1f5b1e95318 (diff) |
Allow the software fallback glDrawPixels, glReadPixels, glBitmap commands to
work with real, hardware-based PBOs in the future by mapping/unmapping the
PBO buffer as needed.
Diffstat (limited to 'src/mesa/swrast/s_bitmap.c')
-rw-r--r-- | src/mesa/swrast/s_bitmap.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/src/mesa/swrast/s_bitmap.c b/src/mesa/swrast/s_bitmap.c index 8bd9854f0ca..be728911b69 100644 --- a/src/mesa/swrast/s_bitmap.c +++ b/src/mesa/swrast/s_bitmap.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. * @@ -29,6 +29,7 @@ */ #include "glheader.h" +#include "bufferobj.h" #include "image.h" #include "macros.h" #include "pixel.h" @@ -54,13 +55,24 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, ASSERT(ctx->RenderMode == GL_RENDER); - bitmap = (const GLubyte *) _swrast_validate_pbo_access(unpack, width, - height, 1, - GL_COLOR_INDEX, GL_BITMAP, - (GLvoid *) bitmap); - if (!bitmap) { - /* XXX GL_INVALID_OPERATION? */ - return; + if (unpack->BufferObj->Name) { + /* unpack from PBO */ + GLubyte *buf; + if (!_mesa_validate_pbo_access(unpack, width, height, 1, + GL_COLOR_INDEX, GL_BITMAP, + (GLvoid *) bitmap)) { + _mesa_error(ctx, GL_INVALID_OPERATION,"glBitmap(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, "glBitmap(PBO is mapped)"); + return; + } + bitmap = ADD_POINTERS(buf, bitmap); } RENDER_START(swrast,ctx); @@ -153,6 +165,12 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py, } RENDER_FINISH(swrast,ctx); + + if (unpack->BufferObj->Name) { + /* done with PBO so unmap it now */ + ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, + unpack->BufferObj); + } } |