@@ -87,6 +87,7 @@ main_sources = [ | |||
'main/multisample.c', | |||
'main/nvprogram.c', | |||
'main/pack.c', | |||
'main/pbo.c', | |||
'main/pixel.c', | |||
'main/pixelstore.c', | |||
'main/pixeltransfer.c', |
@@ -48,6 +48,7 @@ | |||
#include "main/macros.h" | |||
#include "main/matrix.h" | |||
#include "main/mipmap.h" | |||
#include "main/pbo.h" | |||
#include "main/polygon.h" | |||
#include "main/readpix.h" | |||
#include "main/scissor.h" |
@@ -31,6 +31,7 @@ | |||
#include "main/colormac.h" | |||
#include "main/mtypes.h" | |||
#include "main/macros.h" | |||
#include "main/pbo.h" | |||
#include "main/bufferobj.h" | |||
#include "main/state.h" | |||
#include "main/texobj.h" |
@@ -7,6 +7,7 @@ | |||
#include "main/bufferobj.h" | |||
#include "main/context.h" | |||
#include "main/formats.h" | |||
#include "main/pbo.h" | |||
#include "main/texcompress.h" | |||
#include "main/texstore.h" | |||
#include "main/texgetimage.h" |
@@ -27,6 +27,7 @@ | |||
**************************************************************************/ | |||
#include "main/mtypes.h" | |||
#include "main/pbo.h" | |||
#include "main/texobj.h" | |||
#include "main/texstore.h" | |||
#include "main/texcompress.h" |
@@ -35,6 +35,7 @@ | |||
#include "main/enums.h" | |||
#include "main/mfeatures.h" | |||
#include "main/mipmap.h" | |||
#include "main/pbo.h" | |||
#include "main/texcompress.h" | |||
#include "main/texstore.h" | |||
#include "main/teximage.h" |
@@ -34,6 +34,7 @@ | |||
#include "main/context.h" | |||
#include "main/mipmap.h" | |||
#include "main/mm.h" | |||
#include "main/pbo.h" | |||
#include "main/simple_list.h" | |||
#include "main/texobj.h" | |||
#include "main/texstore.h" |
@@ -41,6 +41,7 @@ | |||
#include "main/image.h" | |||
#include "main/imports.h" | |||
#include "main/mtypes.h" | |||
#include "main/pbo.h" | |||
#include "main/state.h" | |||
#include "main/texobj.h" | |||
#include "main/teximage.h" |
@@ -658,248 +658,6 @@ _mesa_update_default_objects_buffer_objects(struct gl_context *ctx) | |||
} | |||
/** | |||
* When we're about to read pixel data out of a PBO (via glDrawPixels, | |||
* glTexImage, etc) or write data into a PBO (via glReadPixels, | |||
* glGetTexImage, etc) we call this function to check that we're not | |||
* going to read out of bounds. | |||
* | |||
* XXX This would also be a convenient time to check that the PBO isn't | |||
* currently mapped. Whoever calls this function should check for that. | |||
* Remember, we can't use a PBO when it's mapped! | |||
* | |||
* If we're not using a PBO, this is a no-op. | |||
* | |||
* \param width width of image to read/write | |||
* \param height height of image to read/write | |||
* \param depth depth of image to read/write | |||
* \param format format of image to read/write | |||
* \param type datatype of image to read/write | |||
* \param ptr the user-provided pointer/offset | |||
* \return GL_TRUE if the PBO access is OK, GL_FALSE if the access would | |||
* go out of bounds. | |||
*/ | |||
GLboolean | |||
_mesa_validate_pbo_access(GLuint dimensions, | |||
const struct gl_pixelstore_attrib *pack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *ptr) | |||
{ | |||
GLvoid *start, *end; | |||
const GLubyte *sizeAddr; /* buffer size, cast to a pointer */ | |||
if (!_mesa_is_bufferobj(pack->BufferObj)) | |||
return GL_TRUE; /* no PBO, OK */ | |||
if (pack->BufferObj->Size == 0) | |||
/* no buffer! */ | |||
return GL_FALSE; | |||
/* get address of first pixel we'll read */ | |||
start = _mesa_image_address(dimensions, pack, ptr, width, height, | |||
format, type, 0, 0, 0); | |||
/* get address just past the last pixel we'll read */ | |||
end = _mesa_image_address(dimensions, pack, ptr, width, height, | |||
format, type, depth-1, height-1, width); | |||
sizeAddr = ((const GLubyte *) 0) + pack->BufferObj->Size; | |||
if ((const GLubyte *) start > sizeAddr) { | |||
/* This will catch negative values / wrap-around */ | |||
return GL_FALSE; | |||
} | |||
if ((const GLubyte *) end > sizeAddr) { | |||
/* Image read goes beyond end of buffer */ | |||
return GL_FALSE; | |||
} | |||
/* OK! */ | |||
return GL_TRUE; | |||
} | |||
/** | |||
* For commands that read from a PBO (glDrawPixels, glTexImage, | |||
* glPolygonStipple, etc), if we're reading from a PBO, map it read-only | |||
* and return the pointer into the PBO. If we're not reading from a | |||
* PBO, return \p src as-is. | |||
* If non-null return, must call _mesa_unmap_pbo_source() when done. | |||
* | |||
* \return NULL if error, else pointer to start of data | |||
*/ | |||
const GLvoid * | |||
_mesa_map_pbo_source(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack, | |||
const GLvoid *src) | |||
{ | |||
const GLubyte *buf; | |||
if (_mesa_is_bufferobj(unpack->BufferObj)) { | |||
/* unpack from PBO */ | |||
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
GL_READ_ONLY_ARB, | |||
unpack->BufferObj); | |||
if (!buf) | |||
return NULL; | |||
buf = ADD_POINTERS(buf, src); | |||
} | |||
else { | |||
/* unpack from normal memory */ | |||
buf = src; | |||
} | |||
return buf; | |||
} | |||
/** | |||
* Combine PBO-read validation and mapping. | |||
* If any GL errors are detected, they'll be recorded and NULL returned. | |||
* \sa _mesa_validate_pbo_access | |||
* \sa _mesa_map_pbo_source | |||
* A call to this function should have a matching call to | |||
* _mesa_unmap_pbo_source(). | |||
*/ | |||
const GLvoid * | |||
_mesa_map_validate_pbo_source(struct gl_context *ctx, | |||
GLuint dimensions, | |||
const struct gl_pixelstore_attrib *unpack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *ptr, | |||
const char *where) | |||
{ | |||
ASSERT(dimensions == 1 || dimensions == 2 || dimensions == 3); | |||
if (!_mesa_is_bufferobj(unpack->BufferObj)) { | |||
/* non-PBO access: no validation to be done */ | |||
return ptr; | |||
} | |||
if (!_mesa_validate_pbo_access(dimensions, unpack, | |||
width, height, depth, format, type, ptr)) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, | |||
"%s(out of bounds PBO access)", where); | |||
return NULL; | |||
} | |||
if (_mesa_bufferobj_mapped(unpack->BufferObj)) { | |||
/* buffer is already mapped - that's an error */ | |||
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(PBO is mapped)", where); | |||
return NULL; | |||
} | |||
ptr = _mesa_map_pbo_source(ctx, unpack, ptr); | |||
return ptr; | |||
} | |||
/** | |||
* Counterpart to _mesa_map_pbo_source() | |||
*/ | |||
void | |||
_mesa_unmap_pbo_source(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack) | |||
{ | |||
ASSERT(unpack != &ctx->Pack); /* catch pack/unpack mismatch */ | |||
if (_mesa_is_bufferobj(unpack->BufferObj)) { | |||
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
unpack->BufferObj); | |||
} | |||
} | |||
/** | |||
* For commands that write to a PBO (glReadPixels, glGetColorTable, etc), | |||
* if we're writing to a PBO, map it write-only and return the pointer | |||
* into the PBO. If we're not writing to a PBO, return \p dst as-is. | |||
* If non-null return, must call _mesa_unmap_pbo_dest() when done. | |||
* | |||
* \return NULL if error, else pointer to start of data | |||
*/ | |||
void * | |||
_mesa_map_pbo_dest(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *pack, | |||
GLvoid *dest) | |||
{ | |||
void *buf; | |||
if (_mesa_is_bufferobj(pack->BufferObj)) { | |||
/* pack into PBO */ | |||
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, | |||
GL_WRITE_ONLY_ARB, | |||
pack->BufferObj); | |||
if (!buf) | |||
return NULL; | |||
buf = ADD_POINTERS(buf, dest); | |||
} | |||
else { | |||
/* pack to normal memory */ | |||
buf = dest; | |||
} | |||
return buf; | |||
} | |||
/** | |||
* Combine PBO-write validation and mapping. | |||
* If any GL errors are detected, they'll be recorded and NULL returned. | |||
* \sa _mesa_validate_pbo_access | |||
* \sa _mesa_map_pbo_dest | |||
* A call to this function should have a matching call to | |||
* _mesa_unmap_pbo_dest(). | |||
*/ | |||
GLvoid * | |||
_mesa_map_validate_pbo_dest(struct gl_context *ctx, | |||
GLuint dimensions, | |||
const struct gl_pixelstore_attrib *unpack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, GLvoid *ptr, | |||
const char *where) | |||
{ | |||
ASSERT(dimensions == 1 || dimensions == 2 || dimensions == 3); | |||
if (!_mesa_is_bufferobj(unpack->BufferObj)) { | |||
/* non-PBO access: no validation to be done */ | |||
return ptr; | |||
} | |||
if (!_mesa_validate_pbo_access(dimensions, unpack, | |||
width, height, depth, format, type, ptr)) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, | |||
"%s(out of bounds PBO access)", where); | |||
return NULL; | |||
} | |||
if (_mesa_bufferobj_mapped(unpack->BufferObj)) { | |||
/* buffer is already mapped - that's an error */ | |||
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(PBO is mapped)", where); | |||
return NULL; | |||
} | |||
ptr = _mesa_map_pbo_dest(ctx, unpack, ptr); | |||
return ptr; | |||
} | |||
/** | |||
* Counterpart to _mesa_map_pbo_dest() | |||
*/ | |||
void | |||
_mesa_unmap_pbo_dest(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *pack) | |||
{ | |||
ASSERT(pack != &ctx->Unpack); /* catch pack/unpack mismatch */ | |||
if (_mesa_is_bufferobj(pack->BufferObj)) { | |||
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, pack->BufferObj); | |||
} | |||
} | |||
/** | |||
* Return the gl_buffer_object for the given ID. |
@@ -79,47 +79,6 @@ _mesa_reference_buffer_object(struct gl_context *ctx, | |||
struct gl_buffer_object **ptr, | |||
struct gl_buffer_object *bufObj); | |||
extern GLboolean | |||
_mesa_validate_pbo_access(GLuint dimensions, | |||
const struct gl_pixelstore_attrib *pack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *ptr); | |||
extern const GLvoid * | |||
_mesa_map_pbo_source(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack, | |||
const GLvoid *src); | |||
extern const GLvoid * | |||
_mesa_map_validate_pbo_source(struct gl_context *ctx, | |||
GLuint dimensions, | |||
const struct gl_pixelstore_attrib *unpack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *ptr, | |||
const char *where); | |||
extern void | |||
_mesa_unmap_pbo_source(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack); | |||
extern void * | |||
_mesa_map_pbo_dest(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *pack, | |||
GLvoid *dest); | |||
extern GLvoid * | |||
_mesa_map_validate_pbo_dest(struct gl_context *ctx, | |||
GLuint dimensions, | |||
const struct gl_pixelstore_attrib *unpack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, GLvoid *ptr, | |||
const char *where); | |||
extern void | |||
_mesa_unmap_pbo_dest(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *pack); | |||
extern void | |||
_mesa_init_buffer_object_functions(struct dd_function_table *driver); | |||
@@ -32,6 +32,7 @@ | |||
#include "mfeatures.h" | |||
#include "mtypes.h" | |||
#include "pack.h" | |||
#include "pbo.h" | |||
#include "state.h" | |||
#include "teximage.h" | |||
#include "texstate.h" |
@@ -54,6 +54,7 @@ | |||
#include "light.h" | |||
#include "macros.h" | |||
#include "pack.h" | |||
#include "pbo.h" | |||
#include "queryobj.h" | |||
#include "teximage.h" | |||
#include "mtypes.h" |
@@ -31,6 +31,7 @@ | |||
#include "feedback.h" | |||
#include "framebuffer.h" | |||
#include "mfeatures.h" | |||
#include "pbo.h" | |||
#include "readpix.h" | |||
#include "state.h" | |||
#include "dispatch.h" |
@@ -0,0 +1,372 @@ | |||
/* | |||
* Mesa 3-D graphics library | |||
* | |||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved. | |||
* Copyright (C) 2009-2011 VMware, Inc. All Rights Reserved. | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice shall be included | |||
* in all copies or substantial portions of the Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | |||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
*/ | |||
/** | |||
* \file pbo.c | |||
* \brief Functions related to Pixel Buffer Objects. | |||
*/ | |||
#include "glheader.h" | |||
#include "bufferobj.h" | |||
#include "image.h" | |||
#include "imports.h" | |||
#include "mtypes.h" | |||
#include "pbo.h" | |||
/** | |||
* When we're about to read pixel data out of a PBO (via glDrawPixels, | |||
* glTexImage, etc) or write data into a PBO (via glReadPixels, | |||
* glGetTexImage, etc) we call this function to check that we're not | |||
* going to read out of bounds. | |||
* | |||
* XXX This would also be a convenient time to check that the PBO isn't | |||
* currently mapped. Whoever calls this function should check for that. | |||
* Remember, we can't use a PBO when it's mapped! | |||
* | |||
* If we're not using a PBO, this is a no-op. | |||
* | |||
* \param width width of image to read/write | |||
* \param height height of image to read/write | |||
* \param depth depth of image to read/write | |||
* \param format format of image to read/write | |||
* \param type datatype of image to read/write | |||
* \param ptr the user-provided pointer/offset | |||
* \return GL_TRUE if the PBO access is OK, GL_FALSE if the access would | |||
* go out of bounds. | |||
*/ | |||
GLboolean | |||
_mesa_validate_pbo_access(GLuint dimensions, | |||
const struct gl_pixelstore_attrib *pack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *ptr) | |||
{ | |||
GLvoid *start, *end; | |||
const GLubyte *sizeAddr; /* buffer size, cast to a pointer */ | |||
if (!_mesa_is_bufferobj(pack->BufferObj)) | |||
return GL_TRUE; /* no PBO, OK */ | |||
if (pack->BufferObj->Size == 0) | |||
/* no buffer! */ | |||
return GL_FALSE; | |||
/* get address of first pixel we'll read */ | |||
start = _mesa_image_address(dimensions, pack, ptr, width, height, | |||
format, type, 0, 0, 0); | |||
/* get address just past the last pixel we'll read */ | |||
end = _mesa_image_address(dimensions, pack, ptr, width, height, | |||
format, type, depth-1, height-1, width); | |||
sizeAddr = ((const GLubyte *) 0) + pack->BufferObj->Size; | |||
if ((const GLubyte *) start > sizeAddr) { | |||
/* This will catch negative values / wrap-around */ | |||
return GL_FALSE; | |||
} | |||
if ((const GLubyte *) end > sizeAddr) { | |||
/* Image read goes beyond end of buffer */ | |||
return GL_FALSE; | |||
} | |||
/* OK! */ | |||
return GL_TRUE; | |||
} | |||
/** | |||
* For commands that read from a PBO (glDrawPixels, glTexImage, | |||
* glPolygonStipple, etc), if we're reading from a PBO, map it read-only | |||
* and return the pointer into the PBO. If we're not reading from a | |||
* PBO, return \p src as-is. | |||
* If non-null return, must call _mesa_unmap_pbo_source() when done. | |||
* | |||
* \return NULL if error, else pointer to start of data | |||
*/ | |||
const GLvoid * | |||
_mesa_map_pbo_source(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack, | |||
const GLvoid *src) | |||
{ | |||
const GLubyte *buf; | |||
if (_mesa_is_bufferobj(unpack->BufferObj)) { | |||
/* unpack from PBO */ | |||
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
GL_READ_ONLY_ARB, | |||
unpack->BufferObj); | |||
if (!buf) | |||
return NULL; | |||
buf = ADD_POINTERS(buf, src); | |||
} | |||
else { | |||
/* unpack from normal memory */ | |||
buf = src; | |||
} | |||
return buf; | |||
} | |||
/** | |||
* Combine PBO-read validation and mapping. | |||
* If any GL errors are detected, they'll be recorded and NULL returned. | |||
* \sa _mesa_validate_pbo_access | |||
* \sa _mesa_map_pbo_source | |||
* A call to this function should have a matching call to | |||
* _mesa_unmap_pbo_source(). | |||
*/ | |||
const GLvoid * | |||
_mesa_map_validate_pbo_source(struct gl_context *ctx, | |||
GLuint dimensions, | |||
const struct gl_pixelstore_attrib *unpack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *ptr, | |||
const char *where) | |||
{ | |||
ASSERT(dimensions == 1 || dimensions == 2 || dimensions == 3); | |||
if (!_mesa_is_bufferobj(unpack->BufferObj)) { | |||
/* non-PBO access: no validation to be done */ | |||
return ptr; | |||
} | |||
if (!_mesa_validate_pbo_access(dimensions, unpack, | |||
width, height, depth, format, type, ptr)) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, | |||
"%s(out of bounds PBO access)", where); | |||
return NULL; | |||
} | |||
if (_mesa_bufferobj_mapped(unpack->BufferObj)) { | |||
/* buffer is already mapped - that's an error */ | |||
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(PBO is mapped)", where); | |||
return NULL; | |||
} | |||
ptr = _mesa_map_pbo_source(ctx, unpack, ptr); | |||
return ptr; | |||
} | |||
/** | |||
* Counterpart to _mesa_map_pbo_source() | |||
*/ | |||
void | |||
_mesa_unmap_pbo_source(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack) | |||
{ | |||
ASSERT(unpack != &ctx->Pack); /* catch pack/unpack mismatch */ | |||
if (_mesa_is_bufferobj(unpack->BufferObj)) { | |||
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
unpack->BufferObj); | |||
} | |||
} | |||
/** | |||
* For commands that write to a PBO (glReadPixels, glGetColorTable, etc), | |||
* if we're writing to a PBO, map it write-only and return the pointer | |||
* into the PBO. If we're not writing to a PBO, return \p dst as-is. | |||
* If non-null return, must call _mesa_unmap_pbo_dest() when done. | |||
* | |||
* \return NULL if error, else pointer to start of data | |||
*/ | |||
void * | |||
_mesa_map_pbo_dest(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *pack, | |||
GLvoid *dest) | |||
{ | |||
void *buf; | |||
if (_mesa_is_bufferobj(pack->BufferObj)) { | |||
/* pack into PBO */ | |||
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, | |||
GL_WRITE_ONLY_ARB, | |||
pack->BufferObj); | |||
if (!buf) | |||
return NULL; | |||
buf = ADD_POINTERS(buf, dest); | |||
} | |||
else { | |||
/* pack to normal memory */ | |||
buf = dest; | |||
} | |||
return buf; | |||
} | |||
/** | |||
* Combine PBO-write validation and mapping. | |||
* If any GL errors are detected, they'll be recorded and NULL returned. | |||
* \sa _mesa_validate_pbo_access | |||
* \sa _mesa_map_pbo_dest | |||
* A call to this function should have a matching call to | |||
* _mesa_unmap_pbo_dest(). | |||
*/ | |||
GLvoid * | |||
_mesa_map_validate_pbo_dest(struct gl_context *ctx, | |||
GLuint dimensions, | |||
const struct gl_pixelstore_attrib *unpack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, GLvoid *ptr, | |||
const char *where) | |||
{ | |||
ASSERT(dimensions == 1 || dimensions == 2 || dimensions == 3); | |||
if (!_mesa_is_bufferobj(unpack->BufferObj)) { | |||
/* non-PBO access: no validation to be done */ | |||
return ptr; | |||
} | |||
if (!_mesa_validate_pbo_access(dimensions, unpack, | |||
width, height, depth, format, type, ptr)) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, | |||
"%s(out of bounds PBO access)", where); | |||
return NULL; | |||
} | |||
if (_mesa_bufferobj_mapped(unpack->BufferObj)) { | |||
/* buffer is already mapped - that's an error */ | |||
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(PBO is mapped)", where); | |||
return NULL; | |||
} | |||
ptr = _mesa_map_pbo_dest(ctx, unpack, ptr); | |||
return ptr; | |||
} | |||
/** | |||
* Counterpart to _mesa_map_pbo_dest() | |||
*/ | |||
void | |||
_mesa_unmap_pbo_dest(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *pack) | |||
{ | |||
ASSERT(pack != &ctx->Unpack); /* catch pack/unpack mismatch */ | |||
if (_mesa_is_bufferobj(pack->BufferObj)) { | |||
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_PACK_BUFFER_EXT, pack->BufferObj); | |||
} | |||
} | |||
/** | |||
* Check if an unpack PBO is active prior to fetching a texture image. | |||
* If so, do bounds checking and map the buffer into main memory. | |||
* Any errors detected will be recorded. | |||
* The caller _must_ call _mesa_unmap_teximage_pbo() too! | |||
*/ | |||
const GLvoid * | |||
_mesa_validate_pbo_teximage(struct gl_context *ctx, GLuint dimensions, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *pixels, | |||
const struct gl_pixelstore_attrib *unpack, | |||
const char *funcName) | |||
{ | |||
GLubyte *buf; | |||
if (!_mesa_is_bufferobj(unpack->BufferObj)) { | |||
/* no PBO */ | |||
return pixels; | |||
} | |||
if (!_mesa_validate_pbo_access(dimensions, unpack, width, height, depth, | |||
format, type, pixels)) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access)"); | |||
return NULL; | |||
} | |||
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
GL_READ_ONLY_ARB, unpack->BufferObj); | |||
if (!buf) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped)"); | |||
return NULL; | |||
} | |||
return ADD_POINTERS(buf, pixels); | |||
} | |||
/** | |||
* Check if an unpack PBO is active prior to fetching a compressed texture | |||
* image. | |||
* If so, do bounds checking and map the buffer into main memory. | |||
* Any errors detected will be recorded. | |||
* The caller _must_ call _mesa_unmap_teximage_pbo() too! | |||
*/ | |||
const GLvoid * | |||
_mesa_validate_pbo_compressed_teximage(struct gl_context *ctx, | |||
GLsizei imageSize, const GLvoid *pixels, | |||
const struct gl_pixelstore_attrib *packing, | |||
const char *funcName) | |||
{ | |||
GLubyte *buf; | |||
if (!_mesa_is_bufferobj(packing->BufferObj)) { | |||
/* not using a PBO - return pointer unchanged */ | |||
return pixels; | |||
} | |||
if ((const GLubyte *) pixels + imageSize > | |||
((const GLubyte *) 0) + packing->BufferObj->Size) { | |||
/* out of bounds read! */ | |||
_mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access)"); | |||
return NULL; | |||
} | |||
buf = (GLubyte*) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
GL_READ_ONLY_ARB, packing->BufferObj); | |||
if (!buf) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped"); | |||
return NULL; | |||
} | |||
return ADD_POINTERS(buf, pixels); | |||
} | |||
/** | |||
* This function must be called after either of the validate_pbo_*_teximage() | |||
* functions. It unmaps the PBO buffer if it was mapped earlier. | |||
*/ | |||
void | |||
_mesa_unmap_teximage_pbo(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack) | |||
{ | |||
if (_mesa_is_bufferobj(unpack->BufferObj)) { | |||
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
unpack->BufferObj); | |||
} | |||
} | |||
@@ -0,0 +1,92 @@ | |||
/* | |||
* Mesa 3-D graphics library | |||
* | |||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved. | |||
* Copyright (C) 2009-2011 VMware, Inc. All Rights Reserved. | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice shall be included | |||
* in all copies or substantial portions of the Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN | |||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |||
*/ | |||
#ifndef PBO_H | |||
#define PBO_H | |||
#include "mtypes.h" | |||
extern GLboolean | |||
_mesa_validate_pbo_access(GLuint dimensions, | |||
const struct gl_pixelstore_attrib *pack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *ptr); | |||
extern const GLvoid * | |||
_mesa_map_pbo_source(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack, | |||
const GLvoid *src); | |||
extern const GLvoid * | |||
_mesa_map_validate_pbo_source(struct gl_context *ctx, | |||
GLuint dimensions, | |||
const struct gl_pixelstore_attrib *unpack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *ptr, | |||
const char *where); | |||
extern void | |||
_mesa_unmap_pbo_source(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack); | |||
extern void * | |||
_mesa_map_pbo_dest(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *pack, | |||
GLvoid *dest); | |||
extern GLvoid * | |||
_mesa_map_validate_pbo_dest(struct gl_context *ctx, | |||
GLuint dimensions, | |||
const struct gl_pixelstore_attrib *unpack, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, GLvoid *ptr, | |||
const char *where); | |||
extern void | |||
_mesa_unmap_pbo_dest(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *pack); | |||
extern const GLvoid * | |||
_mesa_validate_pbo_teximage(struct gl_context *ctx, GLuint dimensions, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *pixels, | |||
const struct gl_pixelstore_attrib *unpack, | |||
const char *funcName); | |||
extern const GLvoid * | |||
_mesa_validate_pbo_compressed_teximage(struct gl_context *ctx, | |||
GLsizei imageSize, const GLvoid *pixels, | |||
const struct gl_pixelstore_attrib *packing, | |||
const char *funcName); | |||
extern void | |||
_mesa_unmap_teximage_pbo(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack); | |||
#endif |
@@ -35,6 +35,7 @@ | |||
#include "macros.h" | |||
#include "mfeatures.h" | |||
#include "pixel.h" | |||
#include "pbo.h" | |||
#include "mtypes.h" | |||
#include "main/dispatch.h" | |||
@@ -30,11 +30,11 @@ | |||
#include "glheader.h" | |||
#include "imports.h" | |||
#include "bufferobj.h" | |||
#include "context.h" | |||
#include "image.h" | |||
#include "enums.h" | |||
#include "pack.h" | |||
#include "pbo.h" | |||
#include "polygon.h" | |||
#include "mtypes.h" | |||
@@ -32,6 +32,7 @@ | |||
#include "formats.h" | |||
#include "image.h" | |||
#include "mtypes.h" | |||
#include "pbo.h" | |||
#include "state.h" | |||
@@ -38,6 +38,7 @@ | |||
#include "mfeatures.h" | |||
#include "mtypes.h" | |||
#include "pack.h" | |||
#include "pbo.h" | |||
#include "texgetimage.h" | |||
#include "teximage.h" | |||
@@ -61,6 +61,7 @@ | |||
#include "mfeatures.h" | |||
#include "mtypes.h" | |||
#include "pack.h" | |||
#include "pbo.h" | |||
#include "imports.h" | |||
#include "pack.h" | |||
#include "texcompress.h" | |||
@@ -4200,94 +4201,6 @@ _mesa_texstore(TEXSTORE_PARAMS) | |||
} | |||
/** | |||
* Check if an unpack PBO is active prior to fetching a texture image. | |||
* If so, do bounds checking and map the buffer into main memory. | |||
* Any errors detected will be recorded. | |||
* The caller _must_ call _mesa_unmap_teximage_pbo() too! | |||
*/ | |||
const GLvoid * | |||
_mesa_validate_pbo_teximage(struct gl_context *ctx, GLuint dimensions, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *pixels, | |||
const struct gl_pixelstore_attrib *unpack, | |||
const char *funcName) | |||
{ | |||
GLubyte *buf; | |||
if (!_mesa_is_bufferobj(unpack->BufferObj)) { | |||
/* no PBO */ | |||
return pixels; | |||
} | |||
if (!_mesa_validate_pbo_access(dimensions, unpack, width, height, depth, | |||
format, type, pixels)) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access)"); | |||
return NULL; | |||
} | |||
buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
GL_READ_ONLY_ARB, unpack->BufferObj); | |||
if (!buf) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped)"); | |||
return NULL; | |||
} | |||
return ADD_POINTERS(buf, pixels); | |||
} | |||
/** | |||
* Check if an unpack PBO is active prior to fetching a compressed texture | |||
* image. | |||
* If so, do bounds checking and map the buffer into main memory. | |||
* Any errors detected will be recorded. | |||
* The caller _must_ call _mesa_unmap_teximage_pbo() too! | |||
*/ | |||
const GLvoid * | |||
_mesa_validate_pbo_compressed_teximage(struct gl_context *ctx, | |||
GLsizei imageSize, const GLvoid *pixels, | |||
const struct gl_pixelstore_attrib *packing, | |||
const char *funcName) | |||
{ | |||
GLubyte *buf; | |||
if (!_mesa_is_bufferobj(packing->BufferObj)) { | |||
/* not using a PBO - return pointer unchanged */ | |||
return pixels; | |||
} | |||
if ((const GLubyte *) pixels + imageSize > | |||
((const GLubyte *) 0) + packing->BufferObj->Size) { | |||
/* out of bounds read! */ | |||
_mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access)"); | |||
return NULL; | |||
} | |||
buf = (GLubyte*) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
GL_READ_ONLY_ARB, packing->BufferObj); | |||
if (!buf) { | |||
_mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped"); | |||
return NULL; | |||
} | |||
return ADD_POINTERS(buf, pixels); | |||
} | |||
/** | |||
* This function must be called after either of the validate_pbo_*_teximage() | |||
* functions. It unmaps the PBO buffer if it was mapped earlier. | |||
*/ | |||
void | |||
_mesa_unmap_teximage_pbo(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack) | |||
{ | |||
if (_mesa_is_bufferobj(unpack->BufferObj)) { | |||
ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, | |||
unpack->BufferObj); | |||
} | |||
} | |||
/** Return texture size in bytes */ | |||
static GLuint | |||
texture_size(const struct gl_texture_image *texImage) |
@@ -206,22 +206,4 @@ _mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target, | |||
struct gl_texture_image *texImage); | |||
extern const GLvoid * | |||
_mesa_validate_pbo_teximage(struct gl_context *ctx, GLuint dimensions, | |||
GLsizei width, GLsizei height, GLsizei depth, | |||
GLenum format, GLenum type, const GLvoid *pixels, | |||
const struct gl_pixelstore_attrib *unpack, | |||
const char *funcName); | |||
extern const GLvoid * | |||
_mesa_validate_pbo_compressed_teximage(struct gl_context *ctx, | |||
GLsizei imageSize, const GLvoid *pixels, | |||
const struct gl_pixelstore_attrib *packing, | |||
const char *funcName); | |||
extern void | |||
_mesa_unmap_teximage_pbo(struct gl_context *ctx, | |||
const struct gl_pixelstore_attrib *unpack); | |||
#endif |
@@ -59,6 +59,7 @@ MAIN_SOURCES = \ | |||
main/multisample.c \ | |||
main/nvprogram.c \ | |||
main/pack.c \ | |||
main/pbo.c \ | |||
main/pixel.c \ | |||
main/pixelstore.c \ | |||
main/pixeltransfer.c \ |
@@ -35,6 +35,7 @@ | |||
#include "main/bufferobj.h" | |||
#include "main/macros.h" | |||
#include "main/mfeatures.h" | |||
#include "main/pbo.h" | |||
#include "program/program.h" | |||
#include "program/prog_print.h" | |||
@@ -37,6 +37,7 @@ | |||
#include "main/mfeatures.h" | |||
#include "main/mtypes.h" | |||
#include "main/pack.h" | |||
#include "main/pbo.h" | |||
#include "main/texformat.h" | |||
#include "main/texstore.h" | |||
#include "program/program.h" |
@@ -38,6 +38,7 @@ | |||
#include "main/context.h" | |||
#include "main/image.h" | |||
#include "main/pack.h" | |||
#include "main/pbo.h" | |||
#include "pipe/p_context.h" | |||
#include "pipe/p_defines.h" |
@@ -35,6 +35,7 @@ | |||
#include "main/macros.h" | |||
#include "main/mipmap.h" | |||
#include "main/pack.h" | |||
#include "main/pbo.h" | |||
#include "main/pixeltransfer.h" | |||
#include "main/texcompress.h" | |||
#include "main/texfetch.h" |
@@ -33,6 +33,7 @@ | |||
#include "main/condrender.h" | |||
#include "main/image.h" | |||
#include "main/macros.h" | |||
#include "main/pbo.h" | |||
#include "s_context.h" | |||
#include "s_span.h" |
@@ -31,6 +31,7 @@ | |||
#include "main/imports.h" | |||
#include "main/macros.h" | |||
#include "main/pack.h" | |||
#include "main/pbo.h" | |||
#include "main/pixeltransfer.h" | |||
#include "main/state.h" | |||
@@ -24,7 +24,6 @@ | |||
#include "main/glheader.h" | |||
#include "main/bufferobj.h" | |||
#include "main/colormac.h" | |||
#include "main/feedback.h" | |||
#include "main/formats.h" | |||
@@ -32,6 +31,7 @@ | |||
#include "main/imports.h" | |||
#include "main/macros.h" | |||
#include "main/pack.h" | |||
#include "main/pbo.h" | |||
#include "main/state.h" | |||
#include "s_context.h" |