mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 11:48:06 +02:00
Removed _swrast_validate_pbo_access().
In x11 driver, map/unmap PBO as needed in DrawPixels functions.
This commit is contained in:
parent
355467bed8
commit
ba164c4614
3 changed files with 52 additions and 35 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue