1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5 * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 * OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26 27 28#ifndef BUFFEROBJ_H 29#define BUFFEROBJ_H 30 31#include <stdbool.h> 32#include "mtypes.h" 33 34 35/* 36 * Internal functions 37 */ 38 39 40/** Is the given buffer object currently mapped by the GL user? */ 41static inline GLboolean 42_mesa_bufferobj_mapped(const struct gl_buffer_object *obj, 43 gl_map_buffer_index index) 44{ 45 return obj->Mappings[index].Pointer != NULL; 46} 47 48/** 49 * Check whether the given buffer object is illegally mapped prior to 50 * drawing from (or reading back to) the buffer. 51 * Note that it's legal for a buffer to be mapped at draw/readback time 52 * if it was mapped persistently (See GL_ARB_buffer_storage spec). 53 * \return true if the buffer is illegally mapped, false otherwise 54 */ 55static inline bool 56_mesa_check_disallowed_mapping(const struct gl_buffer_object *obj) 57{ 58 return _mesa_bufferobj_mapped(obj, MAP_USER) && 59 !(obj->Mappings[MAP_USER].AccessFlags & 60 GL_MAP_PERSISTENT_BIT); 61} 62 63 64extern void 65_mesa_init_buffer_objects(struct gl_context *ctx); 66 67extern void 68_mesa_free_buffer_objects(struct gl_context *ctx); 69 70extern bool 71_mesa_handle_bind_buffer_gen(struct gl_context *ctx, 72 GLuint buffer, 73 struct gl_buffer_object **buf_handle, 74 const char *caller); 75 76extern void 77_mesa_update_default_objects_buffer_objects(struct gl_context *ctx); 78 79 80extern struct gl_buffer_object * 81_mesa_lookup_bufferobj(struct gl_context *ctx, GLuint buffer); 82 83extern struct gl_buffer_object * 84_mesa_lookup_bufferobj_locked(struct gl_context *ctx, GLuint buffer); 85 86extern struct gl_buffer_object * 87_mesa_lookup_bufferobj_err(struct gl_context *ctx, GLuint buffer, 88 const char *caller); 89 90extern struct gl_buffer_object * 91_mesa_multi_bind_lookup_bufferobj(struct gl_context *ctx, 92 const GLuint *buffers, 93 GLuint index, const char *caller, 94 bool *error); 95 96extern void 97_mesa_initialize_buffer_object(struct gl_context *ctx, 98 struct gl_buffer_object *obj, 99 GLuint name); 100 101extern void 102_mesa_delete_buffer_object(struct gl_context *ctx, 103 struct gl_buffer_object *bufObj); 104 105extern void 106_mesa_reference_buffer_object_(struct gl_context *ctx, 107 struct gl_buffer_object **ptr, 108 struct gl_buffer_object *bufObj, 109 bool shared_binding); 110 111/** 112 * Assign a buffer into a pointer with reference counting. The destination 113 * must be private within a context. 114 */ 115static inline void 116_mesa_reference_buffer_object(struct gl_context *ctx, 117 struct gl_buffer_object **ptr, 118 struct gl_buffer_object *bufObj) 119{ 120 if (*ptr != bufObj) 121 _mesa_reference_buffer_object_(ctx, ptr, bufObj, false); 122} 123 124/** 125 * Assign a buffer into a pointer with reference counting. The destination 126 * must be shareable among multiple contexts. 127 */ 128static inline void 129_mesa_reference_buffer_object_shared(struct gl_context *ctx, 130 struct gl_buffer_object **ptr, 131 struct gl_buffer_object *bufObj) 132{ 133 if (*ptr != bufObj) 134 _mesa_reference_buffer_object_(ctx, ptr, bufObj, true); 135} 136 137extern GLuint 138_mesa_total_buffer_object_memory(struct gl_context *ctx); 139 140extern void 141_mesa_init_buffer_object_functions(struct dd_function_table *driver); 142 143extern void 144_mesa_buffer_data(struct gl_context *ctx, struct gl_buffer_object *bufObj, 145 GLenum target, GLsizeiptr size, const GLvoid *data, 146 GLenum usage, const char *func); 147 148extern void 149_mesa_buffer_sub_data(struct gl_context *ctx, struct gl_buffer_object *bufObj, 150 GLintptr offset, GLsizeiptr size, const GLvoid *data); 151 152extern void 153_mesa_buffer_unmap_all_mappings(struct gl_context *ctx, 154 struct gl_buffer_object *bufObj); 155 156extern void 157_mesa_ClearBufferSubData_sw(struct gl_context *ctx, 158 GLintptr offset, GLsizeiptr size, 159 const GLvoid *clearValue, 160 GLsizeiptr clearValueSize, 161 struct gl_buffer_object *bufObj); 162 163/* 164 * API functions 165 */ 166void GLAPIENTRY 167_mesa_BindBuffer_no_error(GLenum target, GLuint buffer); 168 169void GLAPIENTRY 170_mesa_BindBuffer(GLenum target, GLuint buffer); 171 172void 173_mesa_InternalBindElementBuffer(struct gl_context *ctx, 174 struct gl_buffer_object *buf); 175 176void GLAPIENTRY 177_mesa_DeleteBuffers_no_error(GLsizei n, const GLuint * buffer); 178 179void GLAPIENTRY 180_mesa_DeleteBuffers(GLsizei n, const GLuint * buffer); 181 182void GLAPIENTRY 183_mesa_GenBuffers_no_error(GLsizei n, GLuint *buffers); 184 185void GLAPIENTRY 186_mesa_GenBuffers(GLsizei n, GLuint *buffers); 187 188void GLAPIENTRY 189_mesa_CreateBuffers_no_error(GLsizei n, GLuint *buffers); 190 191void GLAPIENTRY 192_mesa_CreateBuffers(GLsizei n, GLuint *buffers); 193 194GLboolean GLAPIENTRY 195_mesa_IsBuffer(GLuint buffer); 196 197void GLAPIENTRY 198_mesa_BufferStorage_no_error(GLenum target, GLsizeiptr size, 199 const GLvoid *data, GLbitfield flags); 200void GLAPIENTRY 201_mesa_BufferStorage(GLenum target, GLsizeiptr size, const GLvoid *data, 202 GLbitfield flags); 203void GLAPIENTRY 204_mesa_NamedBufferStorageEXT(GLuint buffer, GLsizeiptr size, 205 const GLvoid *data, GLbitfield flags); 206void GLAPIENTRY 207_mesa_BufferStorageMemEXT(GLenum target, GLsizeiptr size, 208 GLuint memory, GLuint64 offset); 209void GLAPIENTRY 210_mesa_BufferStorageMemEXT_no_error(GLenum target, GLsizeiptr size, 211 GLuint memory, GLuint64 offset); 212void GLAPIENTRY 213_mesa_NamedBufferStorage_no_error(GLuint buffer, GLsizeiptr size, 214 const GLvoid *data, GLbitfield flags); 215void GLAPIENTRY 216_mesa_NamedBufferStorage(GLuint buffer, GLsizeiptr size, const GLvoid *data, 217 GLbitfield flags); 218void GLAPIENTRY 219_mesa_NamedBufferStorageMemEXT(GLuint buffer, GLsizeiptr size, 220 GLuint memory, GLuint64 offset); 221void GLAPIENTRY 222_mesa_NamedBufferStorageMemEXT_no_error(GLuint buffer, GLsizeiptr size, 223 GLuint memory, GLuint64 offset); 224 225void GLAPIENTRY 226_mesa_BufferData_no_error(GLenum target, GLsizeiptr size, 227 const GLvoid *data, GLenum usage); 228 229void GLAPIENTRY 230_mesa_BufferData(GLenum target, GLsizeiptr size, 231 const GLvoid *data, GLenum usage); 232 233void GLAPIENTRY 234_mesa_NamedBufferData_no_error(GLuint buffer, GLsizeiptr size, 235 const GLvoid *data, GLenum usage); 236 237void GLAPIENTRY 238_mesa_NamedBufferData(GLuint buffer, GLsizeiptr size, 239 const GLvoid *data, GLenum usage); 240void GLAPIENTRY 241_mesa_NamedBufferDataEXT(GLuint buffer, GLsizeiptr size, 242 const GLvoid *data, GLenum usage); 243 244void GLAPIENTRY 245_mesa_BufferSubData_no_error(GLenum target, GLintptr offset, 246 GLsizeiptr size, const GLvoid *data); 247void GLAPIENTRY 248_mesa_BufferSubData(GLenum target, GLintptr offset, 249 GLsizeiptr size, const GLvoid *data); 250 251void GLAPIENTRY 252_mesa_NamedBufferSubData_no_error(GLuint buffer, GLintptr offset, 253 GLsizeiptr size, const GLvoid *data); 254void GLAPIENTRY 255_mesa_NamedBufferSubData(GLuint buffer, GLintptr offset, 256 GLsizeiptr size, const GLvoid *data); 257void GLAPIENTRY 258_mesa_NamedBufferSubDataEXT(GLuint buffer, GLintptr offset, 259 GLsizeiptr size, const GLvoid *data); 260 261void GLAPIENTRY 262_mesa_GetBufferSubData(GLenum target, GLintptr offset, 263 GLsizeiptr size, GLvoid *data); 264 265void GLAPIENTRY 266_mesa_GetNamedBufferSubData(GLuint buffer, GLintptr offset, 267 GLsizeiptr size, GLvoid *data); 268 269void GLAPIENTRY 270_mesa_GetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, 271 GLsizeiptr size, GLvoid *data); 272 273void GLAPIENTRY 274_mesa_ClearBufferData_no_error(GLenum target, GLenum internalformat, 275 GLenum format, GLenum type, const GLvoid *data); 276 277void GLAPIENTRY 278_mesa_ClearBufferData(GLenum target, GLenum internalformat, 279 GLenum format, GLenum type, 280 const GLvoid *data); 281 282void GLAPIENTRY 283_mesa_ClearNamedBufferData_no_error(GLuint buffer, GLenum internalformat, 284 GLenum format, GLenum type, 285 const GLvoid *data); 286 287void GLAPIENTRY 288_mesa_ClearNamedBufferData(GLuint buffer, GLenum internalformat, 289 GLenum format, GLenum type, 290 const GLvoid *data); 291 292void GLAPIENTRY 293_mesa_ClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat, 294 GLenum format, GLenum type, 295 const GLvoid *data); 296 297void GLAPIENTRY 298_mesa_ClearBufferSubData_no_error(GLenum target, GLenum internalformat, 299 GLintptr offset, GLsizeiptr size, 300 GLenum format, GLenum type, 301 const GLvoid *data); 302 303void GLAPIENTRY 304_mesa_ClearBufferSubData(GLenum target, GLenum internalformat, 305 GLintptr offset, GLsizeiptr size, 306 GLenum format, GLenum type, 307 const GLvoid *data); 308 309void GLAPIENTRY 310_mesa_ClearNamedBufferSubData_no_error(GLuint buffer, GLenum internalformat, 311 GLintptr offset, GLsizeiptr size, 312 GLenum format, GLenum type, 313 const GLvoid *data); 314 315void GLAPIENTRY 316_mesa_ClearNamedBufferSubData(GLuint buffer, GLenum internalformat, 317 GLintptr offset, GLsizeiptr size, 318 GLenum format, GLenum type, 319 const GLvoid *data); 320 321void GLAPIENTRY 322_mesa_ClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat, 323 GLintptr offset, GLsizeiptr size, 324 GLenum format, GLenum type, 325 const GLvoid *data); 326 327GLboolean GLAPIENTRY 328_mesa_UnmapBuffer_no_error(GLenum target); 329GLboolean GLAPIENTRY 330_mesa_UnmapBuffer(GLenum target); 331 332GLboolean GLAPIENTRY 333_mesa_UnmapNamedBufferEXT_no_error(GLuint buffer); 334GLboolean GLAPIENTRY 335_mesa_UnmapNamedBufferEXT(GLuint buffer); 336 337void GLAPIENTRY 338_mesa_GetBufferParameteriv(GLenum target, GLenum pname, GLint *params); 339 340void GLAPIENTRY 341_mesa_GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params); 342 343void GLAPIENTRY 344_mesa_GetNamedBufferParameteriv(GLuint buffer, GLenum pname, GLint *params); 345 346void GLAPIENTRY 347_mesa_GetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint *params); 348 349void GLAPIENTRY 350_mesa_GetNamedBufferParameteri64v(GLuint buffer, GLenum pname, 351 GLint64 *params); 352 353void GLAPIENTRY 354_mesa_GetBufferPointerv(GLenum target, GLenum pname, GLvoid **params); 355 356void GLAPIENTRY 357_mesa_GetNamedBufferPointerv(GLuint buffer, GLenum pname, GLvoid **params); 358 359void GLAPIENTRY 360_mesa_GetNamedBufferPointervEXT(GLuint buffer, GLenum pname, GLvoid **params); 361 362void GLAPIENTRY 363_mesa_CopyBufferSubData_no_error(GLenum readTarget, GLenum writeTarget, 364 GLintptr readOffset, GLintptr writeOffset, 365 GLsizeiptr size); 366void GLAPIENTRY 367_mesa_CopyBufferSubData(GLenum readTarget, GLenum writeTarget, 368 GLintptr readOffset, GLintptr writeOffset, 369 GLsizeiptr size); 370 371void GLAPIENTRY 372_mesa_NamedCopyBufferSubDataEXT(GLuint readBuffer, GLuint writeBuffer, 373 GLintptr readOffset, GLintptr writeOffset, 374 GLsizeiptr size); 375 376void GLAPIENTRY 377_mesa_CopyNamedBufferSubData_no_error(GLuint readBuffer, GLuint writeBuffer, 378 GLintptr readOffset, 379 GLintptr writeOffset, GLsizeiptr size); 380void GLAPIENTRY 381_mesa_CopyNamedBufferSubData(GLuint readBuffer, GLuint writeBuffer, 382 GLintptr readOffset, GLintptr writeOffset, 383 GLsizeiptr size); 384void GLAPIENTRY 385_mesa_InternalBufferSubDataCopyMESA(GLintptr srcBuffer, GLuint srcOffset, 386 GLuint dstTargetOrName, GLintptr dstOffset, 387 GLsizeiptr size, GLboolean named, 388 GLboolean ext_dsa); 389 390void * GLAPIENTRY 391_mesa_MapBufferRange_no_error(GLenum target, GLintptr offset, 392 GLsizeiptr length, GLbitfield access); 393void * GLAPIENTRY 394_mesa_MapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, 395 GLbitfield access); 396 397void * GLAPIENTRY 398_mesa_MapNamedBufferRange_no_error(GLuint buffer, GLintptr offset, 399 GLsizeiptr length, GLbitfield access); 400void * GLAPIENTRY 401_mesa_MapNamedBufferRange(GLuint buffer, GLintptr offset, GLsizeiptr length, 402 GLbitfield access); 403void * GLAPIENTRY 404_mesa_MapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, 405 GLsizeiptr length, GLbitfield access); 406 407void * GLAPIENTRY 408_mesa_MapBuffer_no_error(GLenum target, GLenum access); 409void * GLAPIENTRY 410_mesa_MapBuffer(GLenum target, GLenum access); 411 412void * GLAPIENTRY 413_mesa_MapNamedBuffer_no_error(GLuint buffer, GLenum access); 414void * GLAPIENTRY 415_mesa_MapNamedBuffer(GLuint buffer, GLenum access); 416void * GLAPIENTRY 417_mesa_MapNamedBufferEXT(GLuint buffer, GLenum access); 418 419void GLAPIENTRY 420_mesa_FlushMappedBufferRange_no_error(GLenum target, GLintptr offset, 421 GLsizeiptr length); 422void GLAPIENTRY 423_mesa_FlushMappedBufferRange(GLenum target, 424 GLintptr offset, GLsizeiptr length); 425 426void GLAPIENTRY 427_mesa_FlushMappedNamedBufferRange_no_error(GLuint buffer, GLintptr offset, 428 GLsizeiptr length); 429void GLAPIENTRY 430_mesa_FlushMappedNamedBufferRange(GLuint buffer, GLintptr offset, 431 GLsizeiptr length); 432 433void GLAPIENTRY 434_mesa_FlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset, 435 GLsizeiptr length); 436 437void GLAPIENTRY 438_mesa_BindBufferRange_no_error(GLenum target, GLuint index, GLuint buffer, 439 GLintptr offset, GLsizeiptr size); 440void GLAPIENTRY 441_mesa_BindBufferRange(GLenum target, GLuint index, 442 GLuint buffer, GLintptr offset, GLsizeiptr size); 443 444void GLAPIENTRY 445_mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer); 446 447void GLAPIENTRY 448_mesa_BindBuffersRange(GLenum target, GLuint first, GLsizei count, 449 const GLuint *buffers, 450 const GLintptr *offsets, const GLsizeiptr *sizes); 451void GLAPIENTRY 452_mesa_BindBuffersBase(GLenum target, GLuint first, GLsizei count, 453 const GLuint *buffers); 454 455void GLAPIENTRY 456_mesa_InvalidateBufferSubData_no_error(GLuint buffer, GLintptr offset, 457 GLsizeiptr length); 458 459void GLAPIENTRY 460_mesa_InvalidateBufferSubData(GLuint buffer, GLintptr offset, 461 GLsizeiptr length); 462 463void GLAPIENTRY 464_mesa_InvalidateBufferData_no_error(GLuint buffer); 465 466void GLAPIENTRY 467_mesa_InvalidateBufferData(GLuint buffer); 468 469void GLAPIENTRY 470_mesa_BufferPageCommitmentARB(GLenum target, GLintptr offset, GLsizeiptr size, 471 GLboolean commit); 472 473void GLAPIENTRY 474_mesa_NamedBufferPageCommitmentARB(GLuint buffer, GLintptr offset, 475 GLsizeiptr size, GLboolean commit); 476 477void GLAPIENTRY 478_mesa_NamedBufferPageCommitmentEXT(GLuint buffer, GLintptr offset, 479 GLsizeiptr size, GLboolean commit); 480 481#endif 482