mesa: move PBO-related functions into a new file
This commit is contained in:
@@ -87,6 +87,7 @@ main_sources = [
|
|||||||
'main/multisample.c',
|
'main/multisample.c',
|
||||||
'main/nvprogram.c',
|
'main/nvprogram.c',
|
||||||
'main/pack.c',
|
'main/pack.c',
|
||||||
|
'main/pbo.c',
|
||||||
'main/pixel.c',
|
'main/pixel.c',
|
||||||
'main/pixelstore.c',
|
'main/pixelstore.c',
|
||||||
'main/pixeltransfer.c',
|
'main/pixeltransfer.c',
|
||||||
|
@@ -48,6 +48,7 @@
|
|||||||
#include "main/macros.h"
|
#include "main/macros.h"
|
||||||
#include "main/matrix.h"
|
#include "main/matrix.h"
|
||||||
#include "main/mipmap.h"
|
#include "main/mipmap.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/polygon.h"
|
#include "main/polygon.h"
|
||||||
#include "main/readpix.h"
|
#include "main/readpix.h"
|
||||||
#include "main/scissor.h"
|
#include "main/scissor.h"
|
||||||
|
@@ -31,6 +31,7 @@
|
|||||||
#include "main/colormac.h"
|
#include "main/colormac.h"
|
||||||
#include "main/mtypes.h"
|
#include "main/mtypes.h"
|
||||||
#include "main/macros.h"
|
#include "main/macros.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/bufferobj.h"
|
#include "main/bufferobj.h"
|
||||||
#include "main/state.h"
|
#include "main/state.h"
|
||||||
#include "main/texobj.h"
|
#include "main/texobj.h"
|
||||||
|
@@ -7,6 +7,7 @@
|
|||||||
#include "main/bufferobj.h"
|
#include "main/bufferobj.h"
|
||||||
#include "main/context.h"
|
#include "main/context.h"
|
||||||
#include "main/formats.h"
|
#include "main/formats.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/texcompress.h"
|
#include "main/texcompress.h"
|
||||||
#include "main/texstore.h"
|
#include "main/texstore.h"
|
||||||
#include "main/texgetimage.h"
|
#include "main/texgetimage.h"
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "main/mtypes.h"
|
#include "main/mtypes.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/texobj.h"
|
#include "main/texobj.h"
|
||||||
#include "main/texstore.h"
|
#include "main/texstore.h"
|
||||||
#include "main/texcompress.h"
|
#include "main/texcompress.h"
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include "main/enums.h"
|
#include "main/enums.h"
|
||||||
#include "main/mfeatures.h"
|
#include "main/mfeatures.h"
|
||||||
#include "main/mipmap.h"
|
#include "main/mipmap.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/texcompress.h"
|
#include "main/texcompress.h"
|
||||||
#include "main/texstore.h"
|
#include "main/texstore.h"
|
||||||
#include "main/teximage.h"
|
#include "main/teximage.h"
|
||||||
|
@@ -34,6 +34,7 @@
|
|||||||
#include "main/context.h"
|
#include "main/context.h"
|
||||||
#include "main/mipmap.h"
|
#include "main/mipmap.h"
|
||||||
#include "main/mm.h"
|
#include "main/mm.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/simple_list.h"
|
#include "main/simple_list.h"
|
||||||
#include "main/texobj.h"
|
#include "main/texobj.h"
|
||||||
#include "main/texstore.h"
|
#include "main/texstore.h"
|
||||||
|
@@ -41,6 +41,7 @@
|
|||||||
#include "main/image.h"
|
#include "main/image.h"
|
||||||
#include "main/imports.h"
|
#include "main/imports.h"
|
||||||
#include "main/mtypes.h"
|
#include "main/mtypes.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/state.h"
|
#include "main/state.h"
|
||||||
#include "main/texobj.h"
|
#include "main/texobj.h"
|
||||||
#include "main/teximage.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.
|
* 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 **ptr,
|
||||||
struct gl_buffer_object *bufObj);
|
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
|
extern void
|
||||||
_mesa_init_buffer_object_functions(struct dd_function_table *driver);
|
_mesa_init_buffer_object_functions(struct dd_function_table *driver);
|
||||||
|
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
#include "mfeatures.h"
|
#include "mfeatures.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
#include "pack.h"
|
#include "pack.h"
|
||||||
|
#include "pbo.h"
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
#include "teximage.h"
|
#include "teximage.h"
|
||||||
#include "texstate.h"
|
#include "texstate.h"
|
||||||
|
@@ -54,6 +54,7 @@
|
|||||||
#include "light.h"
|
#include "light.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#include "pack.h"
|
#include "pack.h"
|
||||||
|
#include "pbo.h"
|
||||||
#include "queryobj.h"
|
#include "queryobj.h"
|
||||||
#include "teximage.h"
|
#include "teximage.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
|
@@ -31,6 +31,7 @@
|
|||||||
#include "feedback.h"
|
#include "feedback.h"
|
||||||
#include "framebuffer.h"
|
#include "framebuffer.h"
|
||||||
#include "mfeatures.h"
|
#include "mfeatures.h"
|
||||||
|
#include "pbo.h"
|
||||||
#include "readpix.h"
|
#include "readpix.h"
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
#include "dispatch.h"
|
#include "dispatch.h"
|
||||||
|
372
src/mesa/main/pbo.c
Normal file
372
src/mesa/main/pbo.c
Normal file
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
92
src/mesa/main/pbo.h
Normal file
92
src/mesa/main/pbo.h
Normal file
@@ -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 "macros.h"
|
||||||
#include "mfeatures.h"
|
#include "mfeatures.h"
|
||||||
#include "pixel.h"
|
#include "pixel.h"
|
||||||
|
#include "pbo.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
#include "main/dispatch.h"
|
#include "main/dispatch.h"
|
||||||
|
|
||||||
|
@@ -30,11 +30,11 @@
|
|||||||
|
|
||||||
#include "glheader.h"
|
#include "glheader.h"
|
||||||
#include "imports.h"
|
#include "imports.h"
|
||||||
#include "bufferobj.h"
|
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "enums.h"
|
#include "enums.h"
|
||||||
#include "pack.h"
|
#include "pack.h"
|
||||||
|
#include "pbo.h"
|
||||||
#include "polygon.h"
|
#include "polygon.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
|
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
#include "formats.h"
|
#include "formats.h"
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
|
#include "pbo.h"
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
|
|
||||||
|
|
||||||
|
@@ -38,6 +38,7 @@
|
|||||||
#include "mfeatures.h"
|
#include "mfeatures.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
#include "pack.h"
|
#include "pack.h"
|
||||||
|
#include "pbo.h"
|
||||||
#include "texgetimage.h"
|
#include "texgetimage.h"
|
||||||
#include "teximage.h"
|
#include "teximage.h"
|
||||||
|
|
||||||
|
@@ -61,6 +61,7 @@
|
|||||||
#include "mfeatures.h"
|
#include "mfeatures.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
#include "pack.h"
|
#include "pack.h"
|
||||||
|
#include "pbo.h"
|
||||||
#include "imports.h"
|
#include "imports.h"
|
||||||
#include "pack.h"
|
#include "pack.h"
|
||||||
#include "texcompress.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 */
|
/** Return texture size in bytes */
|
||||||
static GLuint
|
static GLuint
|
||||||
texture_size(const struct gl_texture_image *texImage)
|
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);
|
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
|
#endif
|
||||||
|
@@ -59,6 +59,7 @@ MAIN_SOURCES = \
|
|||||||
main/multisample.c \
|
main/multisample.c \
|
||||||
main/nvprogram.c \
|
main/nvprogram.c \
|
||||||
main/pack.c \
|
main/pack.c \
|
||||||
|
main/pbo.c \
|
||||||
main/pixel.c \
|
main/pixel.c \
|
||||||
main/pixelstore.c \
|
main/pixelstore.c \
|
||||||
main/pixeltransfer.c \
|
main/pixeltransfer.c \
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include "main/bufferobj.h"
|
#include "main/bufferobj.h"
|
||||||
#include "main/macros.h"
|
#include "main/macros.h"
|
||||||
#include "main/mfeatures.h"
|
#include "main/mfeatures.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "program/program.h"
|
#include "program/program.h"
|
||||||
#include "program/prog_print.h"
|
#include "program/prog_print.h"
|
||||||
|
|
||||||
|
@@ -37,6 +37,7 @@
|
|||||||
#include "main/mfeatures.h"
|
#include "main/mfeatures.h"
|
||||||
#include "main/mtypes.h"
|
#include "main/mtypes.h"
|
||||||
#include "main/pack.h"
|
#include "main/pack.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/texformat.h"
|
#include "main/texformat.h"
|
||||||
#include "main/texstore.h"
|
#include "main/texstore.h"
|
||||||
#include "program/program.h"
|
#include "program/program.h"
|
||||||
|
@@ -38,6 +38,7 @@
|
|||||||
#include "main/context.h"
|
#include "main/context.h"
|
||||||
#include "main/image.h"
|
#include "main/image.h"
|
||||||
#include "main/pack.h"
|
#include "main/pack.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
|
|
||||||
#include "pipe/p_context.h"
|
#include "pipe/p_context.h"
|
||||||
#include "pipe/p_defines.h"
|
#include "pipe/p_defines.h"
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include "main/macros.h"
|
#include "main/macros.h"
|
||||||
#include "main/mipmap.h"
|
#include "main/mipmap.h"
|
||||||
#include "main/pack.h"
|
#include "main/pack.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/pixeltransfer.h"
|
#include "main/pixeltransfer.h"
|
||||||
#include "main/texcompress.h"
|
#include "main/texcompress.h"
|
||||||
#include "main/texfetch.h"
|
#include "main/texfetch.h"
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
#include "main/condrender.h"
|
#include "main/condrender.h"
|
||||||
#include "main/image.h"
|
#include "main/image.h"
|
||||||
#include "main/macros.h"
|
#include "main/macros.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
|
|
||||||
#include "s_context.h"
|
#include "s_context.h"
|
||||||
#include "s_span.h"
|
#include "s_span.h"
|
||||||
|
@@ -31,6 +31,7 @@
|
|||||||
#include "main/imports.h"
|
#include "main/imports.h"
|
||||||
#include "main/macros.h"
|
#include "main/macros.h"
|
||||||
#include "main/pack.h"
|
#include "main/pack.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/pixeltransfer.h"
|
#include "main/pixeltransfer.h"
|
||||||
#include "main/state.h"
|
#include "main/state.h"
|
||||||
|
|
||||||
|
@@ -24,7 +24,6 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "main/glheader.h"
|
#include "main/glheader.h"
|
||||||
#include "main/bufferobj.h"
|
|
||||||
#include "main/colormac.h"
|
#include "main/colormac.h"
|
||||||
#include "main/feedback.h"
|
#include "main/feedback.h"
|
||||||
#include "main/formats.h"
|
#include "main/formats.h"
|
||||||
@@ -32,6 +31,7 @@
|
|||||||
#include "main/imports.h"
|
#include "main/imports.h"
|
||||||
#include "main/macros.h"
|
#include "main/macros.h"
|
||||||
#include "main/pack.h"
|
#include "main/pack.h"
|
||||||
|
#include "main/pbo.h"
|
||||||
#include "main/state.h"
|
#include "main/state.h"
|
||||||
|
|
||||||
#include "s_context.h"
|
#include "s_context.h"
|
||||||
|
Reference in New Issue
Block a user