#include "glheader.h"
#include "hash.h"
#include "imports.h"
#include "image.h"
#include "context.h"
#include "bufferobj.h"
Defines | |
#define | DEFAULT_ACCESS (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT) |
Functions | |
static INLINE struct gl_buffer_object * | get_buffer (GLcontext *ctx, GLenum target) |
Get the buffer object bound to the specified target in a GL context. | |
static GLenum | simplified_access_mode (GLbitfield access) |
Convert a GLbitfield describing the mapped buffer access flags into one of GL_READ_WRITE, GL_READ_ONLY, or GL_WRITE_ONLY. | |
static struct gl_buffer_object * | buffer_object_subdata_range_good (GLcontext *ctx, GLenum target, GLintptrARB offset, GLsizeiptrARB size, const char *caller) |
Tests the subdata range parameters and sets the GL error code for glBufferSubDataARB and glGetBufferSubDataARB . | |
static struct gl_buffer_object * | _mesa_new_buffer_object (GLcontext *ctx, GLuint name, GLenum target) |
Allocate and initialize a new buffer object. | |
static void | _mesa_delete_buffer_object (GLcontext *ctx, struct gl_buffer_object *bufObj) |
Delete a buffer object. | |
void | _mesa_reference_buffer_object (GLcontext *ctx, struct gl_buffer_object **ptr, struct gl_buffer_object *bufObj) |
Set ptr to bufObj w/ reference counting. | |
void | _mesa_initialize_buffer_object (struct gl_buffer_object *obj, GLuint name, GLenum target) |
Initialize a buffer object to default values. | |
static GLboolean | _mesa_buffer_data (GLcontext *ctx, GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage, struct gl_buffer_object *bufObj) |
Allocate space for and store data in a buffer object. | |
static void | _mesa_buffer_subdata (GLcontext *ctx, GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data, struct gl_buffer_object *bufObj) |
Replace data in a subrange of buffer object. | |
static void | _mesa_buffer_get_subdata (GLcontext *ctx, GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data, struct gl_buffer_object *bufObj) |
Retrieve data from a subrange of buffer object. | |
static void * | _mesa_buffer_map (GLcontext *ctx, GLenum target, GLenum access, struct gl_buffer_object *bufObj) |
Default callback for dd_function_tabel::MapBuffer() . | |
static void * | _mesa_buffer_map_range (GLcontext *ctx, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access, struct gl_buffer_object *bufObj) |
Default fallback for dd_function_table::MapBufferRange() . | |
static void | _mesa_buffer_flush_mapped_range (GLcontext *ctx, GLenum target, GLintptr offset, GLsizeiptr length, struct gl_buffer_object *obj) |
Default fallback for dd_function_table::FlushMappedBufferRange() . | |
static GLboolean | _mesa_buffer_unmap (GLcontext *ctx, GLenum target, struct gl_buffer_object *bufObj) |
Default callback for dd_function_table::MapBuffer() . | |
static void | _mesa_copy_buffer_subdata (GLcontext *ctx, struct gl_buffer_object *src, struct gl_buffer_object *dst, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) |
Default fallback for dd_function_table::CopyBufferSubData() . | |
void | _mesa_init_buffer_objects (GLcontext *ctx) |
Initialize the state associated with buffer objects. | |
static void | bind_buffer_object (GLcontext *ctx, GLenum target, GLuint buffer) |
Bind the specified target to buffer for the specified context. | |
void | _mesa_update_default_objects_buffer_objects (GLcontext *ctx) |
Update the default buffer objects in the given context to reference those specified in the shared state and release those referencing the old shared state. | |
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) |
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. | |
const GLvoid * | _mesa_map_pbo_source (GLcontext *ctx, const struct gl_pixelstore_attrib *unpack, const GLvoid *src) |
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. | |
const GLvoid * | _mesa_map_validate_pbo_source (GLcontext *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) |
Combine PBO-read validation and mapping. | |
void | _mesa_unmap_pbo_source (GLcontext *ctx, const struct gl_pixelstore_attrib *unpack) |
Counterpart to _mesa_map_pbo_source(). | |
void * | _mesa_map_pbo_dest (GLcontext *ctx, const struct gl_pixelstore_attrib *pack, GLvoid *dest) |
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. | |
GLvoid * | _mesa_map_validate_pbo_dest (GLcontext *ctx, GLuint dimensions, const struct gl_pixelstore_attrib *unpack, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid *ptr, const char *where) |
Combine PBO-write validation and mapping. | |
void | _mesa_unmap_pbo_dest (GLcontext *ctx, const struct gl_pixelstore_attrib *pack) |
Counterpart to _mesa_map_pbo_dest(). | |
struct gl_buffer_object * | _mesa_lookup_bufferobj (GLcontext *ctx, GLuint buffer) |
Return the gl_buffer_object for the given ID. | |
static void | unbind (GLcontext *ctx, struct gl_buffer_object **ptr, struct gl_buffer_object *obj) |
If *ptr points to obj, set ptr = the Null/default buffer object. | |
void | _mesa_init_buffer_object_functions (struct dd_function_table *driver) |
Plug default/fallback buffer object functions into the device driver hooks. | |
void GLAPIENTRY | _mesa_BindBufferARB (GLenum target, GLuint buffer) |
void GLAPIENTRY | _mesa_DeleteBuffersARB (GLsizei n, const GLuint *ids) |
Delete a set of buffer objects. | |
void GLAPIENTRY | _mesa_GenBuffersARB (GLsizei n, GLuint *buffer) |
Generate a set of unique buffer object IDs and store them in buffer . | |
GLboolean GLAPIENTRY | _mesa_IsBufferARB (GLuint id) |
Determine if ID is the name of a buffer object. | |
void GLAPIENTRY | _mesa_BufferDataARB (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage) |
void GLAPIENTRY | _mesa_BufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data) |
void GLAPIENTRY | _mesa_GetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data) |
void *GLAPIENTRY | _mesa_MapBufferARB (GLenum target, GLenum access) |
GLboolean GLAPIENTRY | _mesa_UnmapBufferARB (GLenum target) |
void GLAPIENTRY | _mesa_GetBufferParameterivARB (GLenum target, GLenum pname, GLint *params) |
void GLAPIENTRY | _mesa_GetBufferPointervARB (GLenum target, GLenum pname, GLvoid **params) |
void GLAPIENTRY | _mesa_CopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size) |
void *GLAPIENTRY | _mesa_MapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) |
See GL_ARB_map_buffer_range spec. | |
void GLAPIENTRY | _mesa_FlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length) |
See GL_ARB_map_buffer_range spec. |
#define DEFAULT_ACCESS (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT) |
void GLAPIENTRY _mesa_BindBufferARB | ( | GLenum | target, | |
GLuint | buffer | |||
) |
static GLboolean _mesa_buffer_data | ( | GLcontext * | ctx, | |
GLenum | target, | |||
GLsizeiptrARB | size, | |||
const GLvoid * | data, | |||
GLenum | usage, | |||
struct gl_buffer_object * | bufObj | |||
) | [static] |
Allocate space for and store data in a buffer object.
Any data that was previously stored in the buffer object is lost. If data
is NULL
, memory will be allocated, but no copy will occur.
This is the default callback for dd_function_table::BufferData()
Note that all GL error checking will have been done already.
ctx | GL context. | |
target | Buffer object target on which to operate. | |
size | Size, in bytes, of the new data store. | |
data | Pointer to the data to store in the buffer object. This pointer may be NULL . | |
usage | Hints about how the data will be used. | |
bufObj | Object to be used. |
static void _mesa_buffer_flush_mapped_range | ( | GLcontext * | ctx, | |
GLenum | target, | |||
GLintptr | offset, | |||
GLsizeiptr | length, | |||
struct gl_buffer_object * | obj | |||
) | [static] |
Default fallback for dd_function_table::FlushMappedBufferRange()
.
Called via glFlushMappedBufferRange().
static void _mesa_buffer_get_subdata | ( | GLcontext * | ctx, | |
GLenum | target, | |||
GLintptrARB | offset, | |||
GLsizeiptrARB | size, | |||
GLvoid * | data, | |||
struct gl_buffer_object * | bufObj | |||
) | [static] |
Retrieve data from a subrange of buffer object.
If the data range specified by size
+ offset
extends beyond the end of the buffer or if data
is NULL
, no copy is performed.
This is the default callback for dd_function_table::GetBufferSubData()
Note that all GL error checking will have been done already.
ctx | GL context. | |
target | Buffer object target on which to operate. | |
offset | Offset of the first byte to be fetched. | |
size | Size, in bytes, of the data range. | |
data | Destination for data | |
bufObj | Object to be used. |
static void* _mesa_buffer_map | ( | GLcontext * | ctx, | |
GLenum | target, | |||
GLenum | access, | |||
struct gl_buffer_object * | bufObj | |||
) | [static] |
Default callback for dd_function_tabel::MapBuffer()
.
The function parameters will have been already tested for errors.
ctx | GL context. | |
target | Buffer object target on which to operate. | |
access | Information about how the buffer will be accessed. | |
bufObj | Object to be mapped. |
static void* _mesa_buffer_map_range | ( | GLcontext * | ctx, | |
GLenum | target, | |||
GLintptr | offset, | |||
GLsizeiptr | length, | |||
GLbitfield | access, | |||
struct gl_buffer_object * | bufObj | |||
) | [static] |
Default fallback for dd_function_table::MapBufferRange()
.
Called via glMapBufferRange().
static void _mesa_buffer_subdata | ( | GLcontext * | ctx, | |
GLenum | target, | |||
GLintptrARB | offset, | |||
GLsizeiptrARB | size, | |||
const GLvoid * | data, | |||
struct gl_buffer_object * | bufObj | |||
) | [static] |
Replace data in a subrange of buffer object.
If the data range specified by size
+ offset
extends beyond the end of the buffer or if data
is NULL
, no copy is performed.
This is the default callback for dd_function_table::BufferSubData()
Note that all GL error checking will have been done already.
ctx | GL context. | |
target | Buffer object target on which to operate. | |
offset | Offset of the first byte to be modified. | |
size | Size, in bytes, of the data range. | |
data | Pointer to the data to store in the buffer object. | |
bufObj | Object to be used. |
static GLboolean _mesa_buffer_unmap | ( | GLcontext * | ctx, | |
GLenum | target, | |||
struct gl_buffer_object * | bufObj | |||
) | [static] |
Default callback for dd_function_table::MapBuffer()
.
The input parameters will have been already tested for errors.
void GLAPIENTRY _mesa_BufferDataARB | ( | GLenum | target, | |
GLsizeiptrARB | size, | |||
const GLvoid * | data, | |||
GLenum | usage | |||
) |
void GLAPIENTRY _mesa_BufferSubDataARB | ( | GLenum | target, | |
GLintptrARB | offset, | |||
GLsizeiptrARB | size, | |||
const GLvoid * | data | |||
) |
static void _mesa_copy_buffer_subdata | ( | GLcontext * | ctx, | |
struct gl_buffer_object * | src, | |||
struct gl_buffer_object * | dst, | |||
GLintptr | readOffset, | |||
GLintptr | writeOffset, | |||
GLsizeiptr | size | |||
) | [static] |
Default fallback for dd_function_table::CopyBufferSubData()
.
Called via glCopyBuffserSubData().
void GLAPIENTRY _mesa_CopyBufferSubData | ( | GLenum | readTarget, | |
GLenum | writeTarget, | |||
GLintptr | readOffset, | |||
GLintptr | writeOffset, | |||
GLsizeiptr | size | |||
) |
static void _mesa_delete_buffer_object | ( | GLcontext * | ctx, | |
struct gl_buffer_object * | bufObj | |||
) | [static] |
Delete a buffer object.
Default callback for the dd_function_table::DeleteBuffer()
hook.
void GLAPIENTRY _mesa_DeleteBuffersARB | ( | GLsizei | n, | |
const GLuint * | ids | |||
) |
Delete a set of buffer objects.
n | Number of buffer objects to delete. | |
ids | Array of n buffer object IDs. |
void GLAPIENTRY _mesa_FlushMappedBufferRange | ( | GLenum | target, | |
GLintptr | offset, | |||
GLsizeiptr | length | |||
) |
See GL_ARB_map_buffer_range spec.
void GLAPIENTRY _mesa_GenBuffersARB | ( | GLsizei | n, | |
GLuint * | buffer | |||
) |
Generate a set of unique buffer object IDs and store them in buffer
.
n | Number of IDs to generate. | |
buffer | Array of n locations to store the IDs. |
void GLAPIENTRY _mesa_GetBufferParameterivARB | ( | GLenum | target, | |
GLenum | pname, | |||
GLint * | params | |||
) |
void GLAPIENTRY _mesa_GetBufferPointervARB | ( | GLenum | target, | |
GLenum | pname, | |||
GLvoid ** | params | |||
) |
void GLAPIENTRY _mesa_GetBufferSubDataARB | ( | GLenum | target, | |
GLintptrARB | offset, | |||
GLsizeiptrARB | size, | |||
void * | data | |||
) |
void _mesa_init_buffer_object_functions | ( | struct dd_function_table * | driver | ) |
Plug default/fallback buffer object functions into the device driver hooks.
void _mesa_init_buffer_objects | ( | GLcontext * | ctx | ) |
Initialize the state associated with buffer objects.
void _mesa_initialize_buffer_object | ( | struct gl_buffer_object * | obj, | |
GLuint | name, | |||
GLenum | target | |||
) |
Initialize a buffer object to default values.
GLboolean GLAPIENTRY _mesa_IsBufferARB | ( | GLuint | id | ) |
Determine if ID is the name of a buffer object.
id | ID of the potential buffer object. |
GL_TRUE
if id
is the name of a buffer object, GL_FALSE
otherwise. struct gl_buffer_object* _mesa_lookup_bufferobj | ( | GLcontext * | ctx, | |
GLuint | buffer | |||
) | [read] |
Return the gl_buffer_object for the given ID.
Always return NULL for ID 0.
void* _mesa_map_pbo_dest | ( | GLcontext * | ctx, | |
const struct gl_pixelstore_attrib * | pack, | |||
GLvoid * | dest | |||
) |
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 dst
as-is. If non-null return, must call _mesa_unmap_pbo_dest() when done.
const GLvoid* _mesa_map_pbo_source | ( | GLcontext * | ctx, | |
const struct gl_pixelstore_attrib * | unpack, | |||
const GLvoid * | src | |||
) |
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 src
as-is. If non-null return, must call _mesa_unmap_pbo_source() when done.
GLvoid* _mesa_map_validate_pbo_dest | ( | GLcontext * | ctx, | |
GLuint | dimensions, | |||
const struct gl_pixelstore_attrib * | unpack, | |||
GLsizei | width, | |||
GLsizei | height, | |||
GLsizei | depth, | |||
GLenum | format, | |||
GLenum | type, | |||
GLvoid * | ptr, | |||
const char * | where | |||
) |
Combine PBO-write validation and mapping.
If any GL errors are detected, they'll be recorded and NULL returned.
_mesa_map_pbo_dest A call to this function should have a matching call to _mesa_unmap_pbo_dest().
const GLvoid* _mesa_map_validate_pbo_source | ( | GLcontext * | 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 | |||
) |
Combine PBO-read validation and mapping.
If any GL errors are detected, they'll be recorded and NULL returned.
_mesa_map_pbo_source A call to this function should have a matching call to _mesa_unmap_pbo_source().
void* GLAPIENTRY _mesa_MapBufferARB | ( | GLenum | target, | |
GLenum | access | |||
) |
void* GLAPIENTRY _mesa_MapBufferRange | ( | GLenum | target, | |
GLintptr | offset, | |||
GLsizeiptr | length, | |||
GLbitfield | access | |||
) |
See GL_ARB_map_buffer_range spec.
static struct gl_buffer_object* _mesa_new_buffer_object | ( | GLcontext * | ctx, | |
GLuint | name, | |||
GLenum | target | |||
) | [static, read] |
Allocate and initialize a new buffer object.
Default callback for the dd_function_table::NewBufferObject()
hook.
void _mesa_reference_buffer_object | ( | GLcontext * | ctx, | |
struct gl_buffer_object ** | ptr, | |||
struct gl_buffer_object * | bufObj | |||
) |
Set ptr to bufObj w/ reference counting.
void _mesa_unmap_pbo_dest | ( | GLcontext * | ctx, | |
const struct gl_pixelstore_attrib * | pack | |||
) |
Counterpart to _mesa_map_pbo_dest().
void _mesa_unmap_pbo_source | ( | GLcontext * | ctx, | |
const struct gl_pixelstore_attrib * | unpack | |||
) |
Counterpart to _mesa_map_pbo_source().
GLboolean GLAPIENTRY _mesa_UnmapBufferARB | ( | GLenum | target | ) |
void _mesa_update_default_objects_buffer_objects | ( | GLcontext * | ctx | ) |
Update the default buffer objects in the given context to reference those specified in the shared state and release those referencing the old shared state.
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 | |||
) |
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.
width | width of image to read/write | |
height | height of image to read/write | |
depth | depth of image to read/write | |
format | format of image to read/write | |
type | datatype of image to read/write | |
ptr | the user-provided pointer/offset |
static void bind_buffer_object | ( | GLcontext * | ctx, | |
GLenum | target, | |||
GLuint | buffer | |||
) | [static] |
Bind the specified target to buffer for the specified context.
static struct gl_buffer_object* buffer_object_subdata_range_good | ( | GLcontext * | ctx, | |
GLenum | target, | |||
GLintptrARB | offset, | |||
GLsizeiptrARB | size, | |||
const char * | caller | |||
) | [static, read] |
Tests the subdata range parameters and sets the GL error code for glBufferSubDataARB
and glGetBufferSubDataARB
.
ctx | GL context. | |
target | Buffer object target on which to operate. | |
offset | Offset of the first byte of the subdata range. | |
size | Size, in bytes, of the subdata range. | |
caller | Name of calling function for recording errors. |
target
in the specified context or NULL
if any of the parameter or state conditions for glBufferSubDataARB
or glGetBufferSubDataARB
are invalid.static INLINE struct gl_buffer_object* get_buffer | ( | GLcontext * | ctx, | |
GLenum | target | |||
) | [static, read] |
Get the buffer object bound to the specified target in a GL context.
ctx | GL context | |
target | Buffer object target to be retrieved. Currently this must be either GL_ARRAY_BUFFER or GL_ELEMENT_ARRAY_BUFFER . |
target
in the specified context or NULL
if target
is invalid. static GLenum simplified_access_mode | ( | GLbitfield | access | ) | [static] |
Convert a GLbitfield describing the mapped buffer access flags into one of GL_READ_WRITE, GL_READ_ONLY, or GL_WRITE_ONLY.
static void unbind | ( | GLcontext * | ctx, | |
struct gl_buffer_object ** | ptr, | |||
struct gl_buffer_object * | obj | |||
) | [static] |
If *ptr points to obj, set ptr = the Null/default buffer object.
This is a helper for buffer object deletion. The GL spec says that deleting a buffer object causes it to get unbound from all arrays in the current context.