summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/drivers/x11/xm_dd.c60
-rw-r--r--src/mesa/swrast/s_context.c22
-rw-r--r--src/mesa/swrast/swrast.h5
3 files changed, 52 insertions, 35 deletions
diff --git a/src/mesa/drivers/x11/xm_dd.c b/src/mesa/drivers/x11/xm_dd.c
index db94e40c211..a83c5ec3ec8 100644
--- a/src/mesa/drivers/x11/xm_dd.c
+++ b/src/mesa/drivers/x11/xm_dd.c
@@ -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 */
diff --git a/src/mesa/swrast/s_context.c b/src/mesa/swrast/s_context.c
index e9755e91997..a8716d80f50 100644
--- a/src/mesa/swrast/s_context.c
+++ b/src/mesa/swrast/s_context.c
@@ -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;
-}
diff --git a/src/mesa/swrast/swrast.h b/src/mesa/swrast/swrast.h
index 7d8cf8c7a8a..8f249d94280 100644
--- a/src/mesa/swrast/swrast.h
+++ b/src/mesa/swrast/swrast.h
@@ -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)