Lines Matching refs:ctx
78 _mesa_bufferobj_subdata(struct gl_context *ctx,
113 struct pipe_context *pipe = ctx->pipe;
126 bufferobj_get_subdata(struct gl_context *ctx,
144 pipe_buffer_read(ctx->pipe, obj->buffer,
149 _mesa_bufferobj_get_subdata(struct gl_context *ctx,
154 bufferobj_get_subdata(ctx, offset, size, data, obj);
260 bufferobj_data(struct gl_context *ctx,
270 struct pipe_context *pipe = ctx->pipe;
364 obj->private_refcount_ctx = ctx;
371 ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;
373 ctx->NewDriverState |= ST_NEW_UNIFORM_BUFFER;
375 ctx->NewDriverState |= ST_NEW_STORAGE_BUFFER;
377 ctx->NewDriverState |= ST_NEW_SAMPLER_VIEWS | ST_NEW_IMAGE_UNITS;
379 ctx->NewDriverState |= ctx->DriverFlags.NewAtomicBuffer;
388 * Called via ctx->Driver.BufferData().
392 _mesa_bufferobj_data(struct gl_context *ctx,
400 return bufferobj_data(ctx, target, size, data, NULL, 0, usage, storageFlags, obj);
404 bufferobj_data_mem(struct gl_context *ctx,
412 return bufferobj_data(ctx, target, size, NULL, memObj, offset, usage, GL_DYNAMIC_STORAGE_BIT, bufObj);
470 _mesa_bufferobj_map_range(struct gl_context *ctx,
475 struct pipe_context *pipe = ctx->pipe;
491 if (unlikely(ctx->st_opts->ignore_map_unsynchronized)) {
496 if (ctx->Const.ForceMapBufferSynchronized)
518 _mesa_bufferobj_flush_mapped_range(struct gl_context *ctx,
523 struct pipe_context *pipe = ctx->pipe;
544 _mesa_bufferobj_unmap(struct gl_context *ctx, struct gl_buffer_object *obj,
547 struct pipe_context *pipe = ctx->pipe;
564 bufferobj_copy_subdata(struct gl_context *ctx,
570 struct pipe_context *pipe = ctx->pipe;
588 clear_buffer_subdata_sw(struct gl_context *ctx,
597 dest = _mesa_bufferobj_map_range(ctx, offset, size,
603 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glClearBuffer[Sub]Data");
610 _mesa_bufferobj_unmap(ctx, bufObj, MAP_INTERNAL);
619 _mesa_bufferobj_unmap(ctx, bufObj, MAP_INTERNAL);
628 buffer_usage_warning(struct gl_context *ctx, GLuint *id, const char *fmt, ...)
633 _mesa_gl_vdebugf(ctx, id,
660 * \param ctx the GL context
666 get_buffer_target(struct gl_context *ctx, GLenum target)
669 if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) {
676 if (!ctx->Extensions.EXT_pixel_buffer_object)
686 return &ctx->Array.ArrayBufferObj;
688 return &ctx->Array.VAO->IndexBufferObj;
690 return &ctx->Pack.BufferObj;
692 return &ctx->Unpack.BufferObj;
694 return &ctx->CopyReadBuffer;
696 return &ctx->CopyWriteBuffer;
698 if (_mesa_has_ARB_query_buffer_object(ctx))
699 return &ctx->QueryBuffer;
702 if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_draw_indirect) ||
703 _mesa_is_gles31(ctx)) {
704 return &ctx->DrawIndirectBuffer;
708 if (_mesa_has_ARB_indirect_parameters(ctx)) {
709 return &ctx->ParameterBuffer;
713 if (_mesa_has_compute_shaders(ctx)) {
714 return &ctx->DispatchIndirectBuffer;
718 if (ctx->Extensions.EXT_transform_feedback) {
719 return &ctx->TransformFeedback.CurrentBuffer;
723 if (_mesa_has_ARB_texture_buffer_object(ctx) ||
724 _mesa_has_OES_texture_buffer(ctx)) {
725 return &ctx->Texture.BufferObject;
729 if (ctx->Extensions.ARB_uniform_buffer_object) {
730 return &ctx->UniformBuffer;
734 if (ctx->Extensions.ARB_shader_storage_buffer_object || _mesa_is_gles31(ctx)) {
735 return &ctx->ShaderStorageBuffer;
739 if (ctx->Extensions.ARB_shader_atomic_counters || _mesa_is_gles31(ctx)) {
740 return &ctx->AtomicBuffer;
744 if (ctx->Extensions.AMD_pinned_memory) {
745 return &ctx->ExternalVirtualMemoryBuffer;
757 * \param ctx the GL context
764 get_buffer(struct gl_context *ctx, const char *func, GLenum target,
767 struct gl_buffer_object **bufObj = get_buffer_target(ctx, target);
770 _mesa_error(ctx, GL_INVALID_ENUM, "%s(target)", func);
775 _mesa_error(ctx, error, "%s(no buffer bound)", func);
788 simplified_access_mode(struct gl_context *ctx, GLbitfield access)
818 return _mesa_is_gles(ctx) ? GL_WRITE_ONLY : GL_READ_WRITE;
857 * \param ctx GL context.
869 buffer_object_subdata_range_good(struct gl_context *ctx,
875 _mesa_error(ctx, GL_INVALID_VALUE, "%s(size < 0)", caller);
880 _mesa_error(ctx, GL_INVALID_VALUE, "%s(offset < 0)", caller);
885 _mesa_error(ctx, GL_INVALID_VALUE,
898 _mesa_error(ctx, GL_INVALID_OPERATION,
906 _mesa_error(ctx, GL_INVALID_OPERATION,
922 * \param ctx GL context.
934 validate_clear_buffer_format(struct gl_context *ctx,
942 mesaFormat = _mesa_validate_texbuffer_format(ctx, internalformat);
944 _mesa_error(ctx, GL_INVALID_ENUM,
955 _mesa_error(ctx, GL_INVALID_OPERATION,
961 _mesa_error(ctx, GL_INVALID_VALUE,
966 errorFormatType = _mesa_error_check_format_and_type(ctx, format, type);
968 _mesa_error(ctx, GL_INVALID_VALUE,
980 * \param ctx GL context.
992 convert_clear_buffer_data(struct gl_context *ctx,
999 if (_mesa_texstore(ctx, 1, internalformatBase, internalformat,
1001 format, type, data, &ctx->Unpack)) {
1005 _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
1036 _mesa_delete_buffer_object(struct gl_context *ctx,
1040 _mesa_buffer_unmap_all_mappings(ctx, bufObj);
1063 _mesa_reference_buffer_object_(struct gl_context *ctx,
1078 if (shared_binding || ctx != oldObj->Ctx) {
1080 _mesa_delete_buffer_object(ctx, oldObj);
1082 } else if (ctx == oldObj->Ctx) {
1094 if (shared_binding || ctx != bufObj->Ctx)
1096 else if (ctx == bufObj->Ctx)
1140 _mesa_total_buffer_object_memory(struct gl_context *ctx)
1144 _mesa_HashWalkMaybeLocked(ctx->Shared->BufferObjects, count_buffer_size,
1145 &total, ctx->BufferObjectsLocked);
1154 _mesa_init_buffer_objects( struct gl_context *ctx )
1159 _mesa_reference_buffer_object(ctx,
1160 &ctx->UniformBufferBindings[i].BufferObject,
1162 ctx->UniformBufferBindings[i].Offset = -1;
1163 ctx->UniformBufferBindings[i].Size = -1;
1167 _mesa_reference_buffer_object(ctx,
1168 &ctx->ShaderStorageBufferBindings[i].BufferObject,
1170 ctx->ShaderStorageBufferBindings[i].Offset = -1;
1171 ctx->ShaderStorageBufferBindings[i].Size = -1;
1175 _mesa_reference_buffer_object(ctx,
1176 &ctx->AtomicBufferBindings[i].BufferObject,
1178 ctx->AtomicBufferBindings[i].Offset = 0;
1179 ctx->AtomicBufferBindings[i].Size = 0;
1188 detach_ctx_from_buffer(struct gl_context *ctx, struct gl_buffer_object *buf)
1190 assert(buf->Ctx == ctx);
1201 _mesa_reference_buffer_object(ctx, &buf, NULL);
1217 unreference_zombie_buffers_for_ctx(struct gl_context *ctx)
1220 set_foreach(ctx->Shared->ZombieBufferObjects, entry) {
1223 if (buf->Ctx == ctx) {
1224 _mesa_set_remove(ctx->Shared->ZombieBufferObjects, entry);
1225 detach_ctx_from_buffer(ctx, buf);
1243 struct gl_context *ctx = (struct gl_context *)userData;
1246 if (buf->Ctx == ctx) {
1254 _mesa_reference_buffer_object(ctx, &buf, NULL);
1259 _mesa_free_buffer_objects( struct gl_context *ctx )
1263 _mesa_reference_buffer_object(ctx, &ctx->Array.ArrayBufferObj, NULL);
1265 _mesa_reference_buffer_object(ctx, &ctx->CopyReadBuffer, NULL);
1266 _mesa_reference_buffer_object(ctx, &ctx->CopyWriteBuffer, NULL);
1268 _mesa_reference_buffer_object(ctx, &ctx->UniformBuffer, NULL);
1270 _mesa_reference_buffer_object(ctx, &ctx->ShaderStorageBuffer, NULL);
1272 _mesa_reference_buffer_object(ctx, &ctx->AtomicBuffer, NULL);
1274 _mesa_reference_buffer_object(ctx, &ctx->DrawIndirectBuffer, NULL);
1276 _mesa_reference_buffer_object(ctx, &ctx->ParameterBuffer, NULL);
1278 _mesa_reference_buffer_object(ctx, &ctx->DispatchIndirectBuffer, NULL);
1280 _mesa_reference_buffer_object(ctx, &ctx->QueryBuffer, NULL);
1283 _mesa_reference_buffer_object(ctx,
1284 &ctx->UniformBufferBindings[i].BufferObject,
1289 _mesa_reference_buffer_object(ctx,
1290 &ctx->ShaderStorageBufferBindings[i].BufferObject,
1295 _mesa_reference_buffer_object(ctx,
1296 &ctx->AtomicBufferBindings[i].BufferObject,
1300 _mesa_HashLockMutex(ctx->Shared->BufferObjects);
1301 unreference_zombie_buffers_for_ctx(ctx);
1302 _mesa_HashWalkLocked(ctx->Shared->BufferObjects,
1303 detach_unrefcounted_buffer_from_ctx, ctx);
1304 _mesa_HashUnlockMutex(ctx->Shared->BufferObjects);
1308 _mesa_bufferobj_alloc(struct gl_context *ctx, GLuint id)
1331 new_gl_buffer_object(struct gl_context *ctx, GLuint id)
1333 struct gl_buffer_object *buf = _mesa_bufferobj_alloc(ctx, id);
1335 buf->Ctx = ctx;
1341 _mesa_handle_bind_buffer_gen(struct gl_context *ctx,
1348 if (!no_error && !buf && (ctx->API == API_OPENGL_CORE)) {
1349 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-gen name)", caller);
1357 *buf_handle = new_gl_buffer_object(ctx, buffer);
1359 _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller);
1362 _mesa_HashLockMaybeLocked(ctx->Shared->BufferObjects,
1363 ctx->BufferObjectsLocked);
1364 _mesa_HashInsertLocked(ctx->Shared->BufferObjects, buffer,
1372 unreference_zombie_buffers_for_ctx(ctx);
1373 _mesa_HashUnlockMaybeLocked(ctx->Shared->BufferObjects,
1374 ctx->BufferObjectsLocked);
1385 bind_buffer_object(struct gl_context *ctx,
1405 newBufObj = _mesa_lookup_bufferobj(ctx, buffer);
1406 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
1413 _mesa_reference_buffer_object(ctx, bindTarget, newBufObj);
1423 _mesa_update_default_objects_buffer_objects(struct gl_context *ctx)
1426 bind_buffer_object(ctx, &ctx->Array.ArrayBufferObj, 0, false);
1427 bind_buffer_object(ctx, &ctx->Array.VAO->IndexBufferObj, 0, false);
1428 bind_buffer_object(ctx, &ctx->Pack.BufferObj, 0, false);
1429 bind_buffer_object(ctx, &ctx->Unpack.BufferObj, 0, false);
1439 _mesa_lookup_bufferobj(struct gl_context *ctx, GLuint buffer)
1445 _mesa_HashLookupMaybeLocked(ctx->Shared->BufferObjects, buffer,
1446 ctx->BufferObjectsLocked);
1451 _mesa_lookup_bufferobj_locked(struct gl_context *ctx, GLuint buffer)
1457 _mesa_HashLookupLocked(ctx->Shared->BufferObjects, buffer);
1466 _mesa_lookup_bufferobj_err(struct gl_context *ctx, GLuint buffer,
1471 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
1473 _mesa_error(ctx, GL_INVALID_OPERATION,
1496 * _mesa_HashLockMutex(ctx->Shared->BufferObjects).
1499 _mesa_multi_bind_lookup_bufferobj(struct gl_context *ctx,
1509 bufObj = _mesa_lookup_bufferobj_locked(ctx, buffers[index]);
1523 _mesa_error(ctx, GL_INVALID_OPERATION,
1542 unbind(struct gl_context *ctx,
1547 _mesa_bind_vertex_buffer(ctx, vao, index, NULL,
1554 _mesa_buffer_unmap_all_mappings(struct gl_context *ctx,
1559 _mesa_bufferobj_unmap(ctx, bufObj, i);
1574 GET_CURRENT_CONTEXT(ctx);
1576 struct gl_buffer_object **bindTarget = get_buffer_target(ctx, target);
1577 bind_buffer_object(ctx, bindTarget, buffer, true);
1584 GET_CURRENT_CONTEXT(ctx);
1587 _mesa_debug(ctx, "glBindBuffer(%s, %u)\n",
1591 struct gl_buffer_object **bindTarget = get_buffer_target(ctx, target);
1593 _mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferARB(target %s)",
1598 bind_buffer_object(ctx, bindTarget, buffer, false);
1602 _mesa_InternalBindElementBuffer(struct gl_context *ctx,
1606 get_buffer_target(ctx, GL_ELEMENT_ARRAY_BUFFER);
1609 _mesa_reference_buffer_object(ctx, bindTarget, NULL);
1621 set_buffer_binding(struct gl_context *ctx,
1628 _mesa_reference_buffer_object(ctx, &binding->BufferObject, bufObj);
1642 set_buffer_multi_binding(struct gl_context *ctx,
1658 bufObj = _mesa_multi_bind_lookup_bufferobj(ctx, buffers, idx, caller,
1665 set_buffer_binding(ctx, binding, bufObj, -1, -1, !range, usage);
1667 set_buffer_binding(ctx, binding, bufObj, offset, size, !range, usage);
1671 bind_buffer(struct gl_context *ctx,
1687 FLUSH_VERTICES(ctx, 0, 0);
1688 ctx->NewDriverState |= driver_state;
1690 set_buffer_binding(ctx, binding, bufObj, offset, size, autoSize, usage);
1701 bind_uniform_buffer(struct gl_context *ctx,
1708 bind_buffer(ctx, &ctx->UniformBufferBindings[index],
1722 bind_shader_storage_buffer(struct gl_context *ctx,
1729 bind_buffer(ctx, &ctx->ShaderStorageBufferBindings[index],
1743 bind_atomic_buffer(struct gl_context *ctx, unsigned index,
1747 bind_buffer(ctx, &ctx->AtomicBufferBindings[index],
1749 ctx->DriverFlags.NewAtomicBuffer,
1758 bind_buffer_base_uniform_buffer(struct gl_context *ctx,
1762 if (index >= ctx->Const.MaxUniformBufferBindings) {
1763 _mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferBase(index=%d)", index);
1767 _mesa_reference_buffer_object(ctx, &ctx->UniformBuffer, bufObj);
1770 bind_uniform_buffer(ctx, index, bufObj, -1, -1, GL_TRUE);
1772 bind_uniform_buffer(ctx, index, bufObj, 0, 0, GL_TRUE);
1780 bind_buffer_base_shader_storage_buffer(struct gl_context *ctx,
1784 if (index >= ctx->Const.MaxShaderStorageBufferBindings) {
1785 _mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferBase(index=%d)", index);
1789 _mesa_reference_buffer_object(ctx, &ctx->ShaderStorageBuffer, bufObj);
1792 bind_shader_storage_buffer(ctx, index, bufObj, -1, -1, GL_TRUE);
1794 bind_shader_storage_buffer(ctx, index, bufObj, 0, 0, GL_TRUE);
1802 bind_buffer_base_atomic_buffer(struct gl_context *ctx,
1806 if (index >= ctx->Const.MaxAtomicBufferBindings) {
1807 _mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferBase(index=%d)", index);
1811 _mesa_reference_buffer_object(ctx, &ctx->AtomicBuffer, bufObj);
1814 bind_atomic_buffer(ctx, index, bufObj, -1, -1, GL_TRUE);
1816 bind_atomic_buffer(ctx, index, bufObj, 0, 0, GL_TRUE);
1826 delete_buffers(struct gl_context *ctx, GLsizei n, const GLuint *ids)
1828 FLUSH_VERTICES(ctx, 0, 0);
1830 _mesa_HashLockMaybeLocked(ctx->Shared->BufferObjects,
1831 ctx->BufferObjectsLocked);
1832 unreference_zombie_buffers_for_ctx(ctx);
1836 _mesa_lookup_bufferobj_locked(ctx, ids[i]);
1838 struct gl_vertex_array_object *vao = ctx->Array.VAO;
1843 _mesa_buffer_unmap_all_mappings(ctx, bufObj);
1847 unbind(ctx, vao, j, bufObj);
1850 if (ctx->Array.ArrayBufferObj == bufObj) {
1851 bind_buffer_object(ctx, &ctx->Array.ArrayBufferObj, 0, false);
1854 bind_buffer_object(ctx, &vao->IndexBufferObj, 0, false);
1858 if (ctx->DrawIndirectBuffer == bufObj) {
1859 bind_buffer_object(ctx, &ctx->DrawIndirectBuffer, 0, false);
1863 if (ctx->ParameterBuffer == bufObj) {
1864 bind_buffer_object(ctx, &ctx->ParameterBuffer, 0, false);
1868 if (ctx->DispatchIndirectBuffer == bufObj) {
1869 bind_buffer_object(ctx, &ctx->DispatchIndirectBuffer, 0, false);
1873 if (ctx->CopyReadBuffer == bufObj) {
1874 bind_buffer_object(ctx, &ctx->CopyReadBuffer, 0, false);
1876 if (ctx->CopyWriteBuffer == bufObj) {
1877 bind_buffer_object(ctx, &ctx->CopyWriteBuffer, 0, false);
1881 if (ctx->TransformFeedback.CurrentBuffer == bufObj) {
1882 bind_buffer_object(ctx, &ctx->TransformFeedback.CurrentBuffer, 0, false);
1885 if (ctx->TransformFeedback.CurrentObject->Buffers[j] == bufObj) {
1886 _mesa_bind_buffer_base_transform_feedback(ctx,
1887 ctx->TransformFeedback.CurrentObject,
1893 for (j = 0; j < ctx->Const.MaxUniformBufferBindings; j++) {
1894 if (ctx->UniformBufferBindings[j].BufferObject == bufObj) {
1895 bind_buffer_base_uniform_buffer(ctx, j, NULL);
1899 if (ctx->UniformBuffer == bufObj) {
1900 bind_buffer_object(ctx, &ctx->UniformBuffer, 0, false);
1904 for (j = 0; j < ctx->Const.MaxShaderStorageBufferBindings; j++) {
1905 if (ctx->ShaderStorageBufferBindings[j].BufferObject == bufObj) {
1906 bind_buffer_base_shader_storage_buffer(ctx, j, NULL);
1910 if (ctx->ShaderStorageBuffer == bufObj) {
1911 bind_buffer_object(ctx, &ctx->ShaderStorageBuffer, 0, false);
1915 for (j = 0; j < ctx->Const.MaxAtomicBufferBindings; j++) {
1916 if (ctx->AtomicBufferBindings[j].BufferObject == bufObj) {
1917 bind_buffer_base_atomic_buffer(ctx, j, NULL);
1921 if (ctx->AtomicBuffer == bufObj) {
1922 bind_buffer_object(ctx, &ctx->AtomicBuffer, 0, false);
1926 if (ctx->Pack.BufferObj == bufObj) {
1927 bind_buffer_object(ctx, &ctx->Pack.BufferObj, 0, false);
1929 if (ctx->Unpack.BufferObj == bufObj) {
1930 bind_buffer_object(ctx, &ctx->Unpack.BufferObj, 0, false);
1933 if (ctx->Texture.BufferObject == bufObj) {
1934 bind_buffer_object(ctx, &ctx->Texture.BufferObject, 0, false);
1937 if (ctx->ExternalVirtualMemoryBuffer == bufObj) {
1938 bind_buffer_object(ctx, &ctx->ExternalVirtualMemoryBuffer, 0, false);
1942 if (ctx->QueryBuffer == bufObj) {
1943 bind_buffer_object(ctx, &ctx->QueryBuffer, 0, false);
1947 _mesa_HashRemoveLocked(ctx->Shared->BufferObjects, ids[i]);
1965 if (bufObj->Ctx == ctx) {
1966 detach_ctx_from_buffer(ctx, bufObj);
1969 _mesa_set_add(ctx->Shared->ZombieBufferObjects, bufObj);
1972 _mesa_reference_buffer_object(ctx, &bufObj, NULL);
1976 _mesa_HashUnlockMaybeLocked(ctx->Shared->BufferObjects,
1977 ctx->BufferObjectsLocked);
1984 GET_CURRENT_CONTEXT(ctx);
1985 delete_buffers(ctx, n, ids);
1992 GET_CURRENT_CONTEXT(ctx);
1995 _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteBuffersARB(n)");
1999 delete_buffers(ctx, n, ids);
2009 create_buffers(struct gl_context *ctx, GLsizei n, GLuint *buffers, bool dsa)
2019 _mesa_HashLockMaybeLocked(ctx->Shared->BufferObjects,
2020 ctx->BufferObjectsLocked);
2027 unreference_zombie_buffers_for_ctx(ctx);
2029 _mesa_HashFindFreeKeys(ctx->Shared->BufferObjects, buffers, n);
2037 buf = new_gl_buffer_object(ctx, buffers[i]);
2039 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCreateBuffers");
2040 _mesa_HashUnlockMaybeLocked(ctx->Shared->BufferObjects,
2041 ctx->BufferObjectsLocked);
2048 _mesa_HashInsertLocked(ctx->Shared->BufferObjects, buffers[i], buf, true);
2051 _mesa_HashUnlockMaybeLocked(ctx->Shared->BufferObjects,
2052 ctx->BufferObjectsLocked);
2057 create_buffers_err(struct gl_context *ctx, GLsizei n, GLuint *buffers, bool dsa)
2062 _mesa_debug(ctx, "%s(%d)\n", func, n);
2065 _mesa_error(ctx, GL_INVALID_VALUE, "%s(n %d < 0)", func, n);
2069 create_buffers(ctx, n, buffers, dsa);
2081 GET_CURRENT_CONTEXT(ctx);
2082 create_buffers(ctx, n, buffers, false);
2089 GET_CURRENT_CONTEXT(ctx);
2090 create_buffers_err(ctx, n, buffers, false);
2102 GET_CURRENT_CONTEXT(ctx);
2103 create_buffers(ctx, n, buffers, true);
2110 GET_CURRENT_CONTEXT(ctx);
2111 create_buffers_err(ctx, n, buffers, true);
2126 GET_CURRENT_CONTEXT(ctx);
2127 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
2129 bufObj = _mesa_lookup_bufferobj(ctx, id);
2136 validate_buffer_storage(struct gl_context *ctx,
2141 _mesa_error(ctx, GL_INVALID_VALUE, "%s(size <= 0)", func);
2152 if (ctx->Extensions.ARB_sparse_buffer)
2156 _mesa_error(ctx, GL_INVALID_VALUE, "%s(invalid flag bits set)", func);
2168 _mesa_error(ctx, GL_INVALID_VALUE, "%s(SPARSE_STORAGE and READ/WRITE)", func);
2174 _mesa_error(ctx, GL_INVALID_VALUE,
2180 _mesa_error(ctx, GL_INVALID_VALUE,
2186 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(immutable)", func);
2195 buffer_storage(struct gl_context *ctx, struct gl_buffer_object *bufObj,
2203 _mesa_buffer_unmap_all_mappings(ctx, bufObj);
2205 FLUSH_VERTICES(ctx, 0, 0);
2212 res = bufferobj_data_mem(ctx, target, size, memObj, offset,
2216 res = _mesa_bufferobj_data(ctx, target, size, data, GL_DYNAMIC_DRAW,
2226 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", func);
2229 _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
2241 GET_CURRENT_CONTEXT(ctx);
2247 if (!ctx->Extensions.EXT_memory_object) {
2248 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(unsupported)", func);
2258 _mesa_error(ctx, GL_INVALID_VALUE, "%s(memory == 0)", func);
2262 memObj = _mesa_lookup_memory_object(ctx, memory);
2272 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no associated memory)",
2280 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2282 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, func);
2288 struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target);
2291 bufObj = get_buffer(ctx, func, target, GL_INVALID_OPERATION);
2297 if (no_error || validate_buffer_storage(ctx, bufObj, size, flags, func))
2298 buffer_storage(ctx, bufObj, memObj, target, size, data, flags, offset, func);
2323 GET_CURRENT_CONTEXT(ctx);
2325 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2326 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
2395 buffer_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
2402 _mesa_debug(ctx, "%s(%s, %ld, %p, %s)\n",
2411 _mesa_error(ctx, GL_INVALID_VALUE, "%s(size < 0)", func);
2417 valid_usage = (ctx->API != API_OPENGLES);
2429 valid_usage = _mesa_is_desktop_gl(ctx) || _mesa_is_gles3(ctx);
2437 _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid usage: %s)", func,
2443 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(immutable)", func);
2449 _mesa_buffer_unmap_all_mappings(ctx, bufObj);
2451 FLUSH_VERTICES(ctx, 0, 0);
2465 if (!_mesa_bufferobj_data(ctx, target, size, data, usage,
2478 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", func);
2481 _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
2487 buffer_data_error(struct gl_context *ctx, struct gl_buffer_object *bufObj,
2491 buffer_data(ctx, bufObj, target, size, data, usage, func, false);
2495 buffer_data_no_error(struct gl_context *ctx, struct gl_buffer_object *bufObj,
2499 buffer_data(ctx, bufObj, target, size, data, usage, func, true);
2503 _mesa_buffer_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
2507 buffer_data_error(ctx, bufObj, target, size, data, usage, func);
2514 GET_CURRENT_CONTEXT(ctx);
2516 struct gl_buffer_object **bufObj = get_buffer_target(ctx, target);
2517 buffer_data_no_error(ctx, *bufObj, target, size, data, usage,
2525 GET_CURRENT_CONTEXT(ctx);
2528 bufObj = get_buffer(ctx, "glBufferData", target, GL_INVALID_OPERATION);
2532 _mesa_buffer_data(ctx, bufObj, target, size, data, usage,
2540 GET_CURRENT_CONTEXT(ctx);
2542 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2543 buffer_data_no_error(ctx, bufObj, GL_NONE, size, data, usage,
2551 GET_CURRENT_CONTEXT(ctx);
2554 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, "glNamedBufferData");
2561 _mesa_buffer_data(ctx, bufObj, GL_NONE, size, data, usage,
2569 GET_CURRENT_CONTEXT(ctx);
2573 _mesa_error(ctx, GL_INVALID_OPERATION,
2578 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2579 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
2583 _mesa_buffer_data(ctx, bufObj, GL_NONE, size, data, usage,
2588 validate_buffer_sub_data(struct gl_context *ctx,
2593 if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size,
2601 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", func);
2611 BUFFER_USAGE_WARNING(ctx,
2625 * \param ctx GL context.
2634 _mesa_buffer_sub_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
2644 _mesa_bufferobj_subdata(ctx, offset, size, data, bufObj);
2653 GET_CURRENT_CONTEXT(ctx);
2658 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2660 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, func);
2666 struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target);
2669 bufObj = get_buffer(ctx, func, target, GL_INVALID_OPERATION);
2675 if (no_error || validate_buffer_sub_data(ctx, bufObj, offset, size, func))
2676 _mesa_buffer_sub_data(ctx, bufObj, offset, size, data);
2717 GET_CURRENT_CONTEXT(ctx);
2721 _mesa_error(ctx, GL_INVALID_OPERATION,
2726 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2727 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
2731 if (validate_buffer_sub_data(ctx, bufObj, offset, size,
2733 _mesa_buffer_sub_data(ctx, bufObj, offset, size, data);
2742 GET_CURRENT_CONTEXT(ctx);
2745 bufObj = get_buffer(ctx, "glGetBufferSubData", target,
2750 if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size, false,
2755 bufferobj_get_subdata(ctx, offset, size, data, bufObj);
2762 GET_CURRENT_CONTEXT(ctx);
2765 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer,
2770 if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size, false,
2775 bufferobj_get_subdata(ctx, offset, size, data, bufObj);
2783 GET_CURRENT_CONTEXT(ctx);
2787 _mesa_error(ctx, GL_INVALID_OPERATION,
2792 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2793 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
2797 if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size, false,
2802 bufferobj_get_subdata(ctx, offset, size, data, bufObj);
2809 clear_buffer_sub_data(struct gl_context *ctx, struct gl_buffer_object *bufObj,
2819 if (!no_error && !buffer_object_subdata_range_good(ctx, bufObj, offset, size,
2825 mesaFormat = _mesa_get_texbuffer_format(ctx, internalformat);
2827 mesaFormat = validate_clear_buffer_format(ctx, internalformat,
2837 _mesa_error(ctx, GL_INVALID_VALUE,
2849 if (!ctx->pipe->clear_buffer) {
2850 clear_buffer_subdata_sw(ctx, offset, size,
2857 else if (!convert_clear_buffer_data(ctx, mesaFormat, clearValue,
2862 ctx->pipe->clear_buffer(ctx->pipe, bufObj->buffer, offset, size,
2867 clear_buffer_sub_data_error(struct gl_context *ctx,
2873 clear_buffer_sub_data(ctx, bufObj, internalformat, offset, size, format,
2879 clear_buffer_sub_data_no_error(struct gl_context *ctx,
2886 clear_buffer_sub_data(ctx, bufObj, internalformat, offset, size, format,
2895 GET_CURRENT_CONTEXT(ctx);
2897 struct gl_buffer_object **bufObj = get_buffer_target(ctx, target);
2898 clear_buffer_sub_data_no_error(ctx, *bufObj, internalformat, 0,
2908 GET_CURRENT_CONTEXT(ctx);
2911 bufObj = get_buffer(ctx, "glClearBufferData", target, GL_INVALID_VALUE);
2915 clear_buffer_sub_data_error(ctx, bufObj, internalformat, 0, bufObj->Size,
2925 GET_CURRENT_CONTEXT(ctx);
2927 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2928 clear_buffer_sub_data_no_error(ctx, bufObj, internalformat, 0, bufObj->Size,
2938 GET_CURRENT_CONTEXT(ctx);
2941 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, "glClearNamedBufferData");
2945 clear_buffer_sub_data_error(ctx, bufObj, internalformat, 0, bufObj->Size,
2955 GET_CURRENT_CONTEXT(ctx);
2956 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
2957 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
2961 clear_buffer_sub_data_error(ctx, bufObj, internalformat, 0, bufObj->Size,
2973 GET_CURRENT_CONTEXT(ctx);
2975 struct gl_buffer_object **bufObj = get_buffer_target(ctx, target);
2976 clear_buffer_sub_data_no_error(ctx, *bufObj, internalformat, offset, size,
2988 GET_CURRENT_CONTEXT(ctx);
2991 bufObj = get_buffer(ctx, "glClearBufferSubData", target, GL_INVALID_VALUE);
2995 clear_buffer_sub_data_error(ctx, bufObj, internalformat, offset, size,
3007 GET_CURRENT_CONTEXT(ctx);
3009 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3010 clear_buffer_sub_data_no_error(ctx, bufObj, internalformat, offset, size,
3022 GET_CURRENT_CONTEXT(ctx);
3025 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer,
3030 clear_buffer_sub_data_error(ctx, bufObj, internalformat, offset, size,
3041 GET_CURRENT_CONTEXT(ctx);
3042 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3043 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
3047 clear_buffer_sub_data_error(ctx, bufObj, internalformat, offset, size,
3053 unmap_buffer(struct gl_context *ctx, struct gl_buffer_object *bufObj)
3055 GLboolean status = _mesa_bufferobj_unmap(ctx, bufObj, MAP_USER);
3065 validate_and_unmap_buffer(struct gl_context *ctx,
3069 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
3072 _mesa_error(ctx, GL_INVALID_OPERATION,
3085 _mesa_warning(ctx, "Out of bounds buffer object write detected"
3113 return unmap_buffer(ctx, bufObj);
3119 GET_CURRENT_CONTEXT(ctx);
3120 struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target);
3123 return unmap_buffer(ctx, bufObj);
3129 GET_CURRENT_CONTEXT(ctx);
3132 bufObj = get_buffer(ctx, "glUnmapBuffer", target, GL_INVALID_OPERATION);
3136 return validate_and_unmap_buffer(ctx, bufObj, "glUnmapBuffer");
3142 GET_CURRENT_CONTEXT(ctx);
3143 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3145 return unmap_buffer(ctx, bufObj);
3151 GET_CURRENT_CONTEXT(ctx);
3155 _mesa_error(ctx, GL_INVALID_OPERATION,
3160 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, "glUnmapNamedBuffer");
3164 return validate_and_unmap_buffer(ctx, bufObj, "glUnmapNamedBuffer");
3169 get_buffer_parameter(struct gl_context *ctx,
3181 *params = simplified_access_mode(ctx,
3188 if (!ctx->Extensions.ARB_map_buffer_range)
3193 if (!ctx->Extensions.ARB_map_buffer_range)
3198 if (!ctx->Extensions.ARB_map_buffer_range)
3203 if (!ctx->Extensions.ARB_buffer_storage)
3208 if (!ctx->Extensions.ARB_buffer_storage)
3219 _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid pname: %s)", func,
3227 GET_CURRENT_CONTEXT(ctx);
3231 bufObj = get_buffer(ctx, "glGetBufferParameteriv", target,
3236 if (!get_buffer_parameter(ctx, bufObj, pname, ¶meter,
3246 GET_CURRENT_CONTEXT(ctx);
3250 bufObj = get_buffer(ctx, "glGetBufferParameteri64v", target,
3255 if (!get_buffer_parameter(ctx, bufObj, pname, ¶meter,
3265 GET_CURRENT_CONTEXT(ctx);
3269 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer,
3274 if (!get_buffer_parameter(ctx, bufObj, pname, ¶meter,
3284 GET_CURRENT_CONTEXT(ctx);
3289 _mesa_error(ctx, GL_INVALID_OPERATION,
3294 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3295 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
3299 if (!get_buffer_parameter(ctx, bufObj, pname, ¶meter,
3310 GET_CURRENT_CONTEXT(ctx);
3314 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer,
3319 if (!get_buffer_parameter(ctx, bufObj, pname, ¶meter,
3330 GET_CURRENT_CONTEXT(ctx);
3334 _mesa_error(ctx, GL_INVALID_ENUM, "glGetBufferPointerv(pname != "
3339 bufObj = get_buffer(ctx, "glGetBufferPointerv", target,
3350 GET_CURRENT_CONTEXT(ctx);
3354 _mesa_error(ctx, GL_INVALID_ENUM, "glGetNamedBufferPointerv(pname != "
3359 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer,
3370 GET_CURRENT_CONTEXT(ctx);
3374 _mesa_error(ctx, GL_INVALID_OPERATION,
3379 _mesa_error(ctx, GL_INVALID_ENUM, "glGetNamedBufferPointervEXT(pname != "
3384 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3385 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
3393 copy_buffer_sub_data(struct gl_context *ctx, struct gl_buffer_object *src,
3398 _mesa_error(ctx, GL_INVALID_OPERATION,
3404 _mesa_error(ctx, GL_INVALID_OPERATION,
3410 _mesa_error(ctx, GL_INVALID_VALUE,
3416 _mesa_error(ctx, GL_INVALID_VALUE,
3422 _mesa_error(ctx, GL_INVALID_VALUE,
3428 _mesa_error(ctx, GL_INVALID_VALUE,
3435 _mesa_error(ctx, GL_INVALID_VALUE,
3450 _mesa_error(ctx, GL_INVALID_VALUE,
3456 bufferobj_copy_subdata(ctx, src, dst, readOffset, writeOffset, size);
3464 GET_CURRENT_CONTEXT(ctx);
3466 struct gl_buffer_object **src_ptr = get_buffer_target(ctx, readTarget);
3469 struct gl_buffer_object **dst_ptr = get_buffer_target(ctx, writeTarget);
3472 bufferobj_copy_subdata(ctx, src, dst, readOffset, writeOffset,
3481 GET_CURRENT_CONTEXT(ctx);
3484 src = get_buffer(ctx, "glCopyBufferSubData", readTarget,
3489 dst = get_buffer(ctx, "glCopyBufferSubData", writeTarget,
3494 copy_buffer_sub_data(ctx, src, dst, readOffset, writeOffset, size,
3503 GET_CURRENT_CONTEXT(ctx);
3506 src = _mesa_lookup_bufferobj(ctx, readBuffer);
3507 if (!_mesa_handle_bind_buffer_gen(ctx, readBuffer,
3512 dst = _mesa_lookup_bufferobj(ctx, writeBuffer);
3513 if (!_mesa_handle_bind_buffer_gen(ctx, writeBuffer,
3518 copy_buffer_sub_data(ctx, src, dst, readOffset, writeOffset, size,
3527 GET_CURRENT_CONTEXT(ctx);
3529 struct gl_buffer_object *src = _mesa_lookup_bufferobj(ctx, readBuffer);
3530 struct gl_buffer_object *dst = _mesa_lookup_bufferobj(ctx, writeBuffer);
3532 bufferobj_copy_subdata(ctx, src, dst, readOffset, writeOffset,
3541 GET_CURRENT_CONTEXT(ctx);
3544 src = _mesa_lookup_bufferobj_err(ctx, readBuffer,
3549 dst = _mesa_lookup_bufferobj_err(ctx, writeBuffer,
3554 copy_buffer_sub_data(ctx, src, dst, readOffset, writeOffset, size,
3564 GET_CURRENT_CONTEXT(ctx);
3572 dst = _mesa_lookup_bufferobj(ctx, dstTargetOrName);
3573 if (!_mesa_handle_bind_buffer_gen(ctx, dstTargetOrName, &dst, func, false))
3577 dst = _mesa_lookup_bufferobj_err(ctx, dstTargetOrName, func);
3583 dst = get_buffer(ctx, func, dstTargetOrName, GL_INVALID_OPERATION);
3588 if (!validate_buffer_sub_data(ctx, dst, dstOffset, size, func))
3591 bufferobj_copy_subdata(ctx, src, dst, srcOffset, dstOffset, size);
3595 _mesa_reference_buffer_object(ctx, &src, NULL);
3599 validate_map_buffer_range(struct gl_context *ctx,
3606 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, false);
3609 _mesa_error(ctx, GL_INVALID_VALUE,
3615 _mesa_error(ctx, GL_INVALID_VALUE,
3632 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(length = 0)", func);
3643 if (ctx->Extensions.ARB_buffer_storage) {
3650 _mesa_error(ctx, GL_INVALID_VALUE,
3656 _mesa_error(ctx, GL_INVALID_OPERATION,
3665 _mesa_error(ctx, GL_INVALID_OPERATION,
3672 _mesa_error(ctx, GL_INVALID_OPERATION,
3679 _mesa_error(ctx, GL_INVALID_OPERATION,
3686 _mesa_error(ctx, GL_INVALID_OPERATION,
3693 _mesa_error(ctx, GL_INVALID_OPERATION,
3700 _mesa_error(ctx, GL_INVALID_OPERATION,
3706 _mesa_error(ctx, GL_INVALID_VALUE,
3714 _mesa_error(ctx, GL_INVALID_OPERATION,
3724 BUFFER_USAGE_WARNING(ctx,
3736 map_buffer_range(struct gl_context *ctx, struct gl_buffer_object *bufObj,
3741 _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s(buffer size = 0)", func);
3745 void *map = _mesa_bufferobj_map_range(ctx, offset, length, access, bufObj,
3748 _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s(map failed)", func);
3798 GET_CURRENT_CONTEXT(ctx);
3800 struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target);
3803 return map_buffer_range(ctx, bufObj, offset, length, access,
3811 GET_CURRENT_CONTEXT(ctx);
3814 if (!ctx->Extensions.ARB_map_buffer_range) {
3815 _mesa_error(ctx, GL_INVALID_OPERATION,
3820 bufObj = get_buffer(ctx, "glMapBufferRange", target, GL_INVALID_OPERATION);
3824 if (!validate_map_buffer_range(ctx, bufObj, offset, length, access,
3828 return map_buffer_range(ctx, bufObj, offset, length, access,
3836 GET_CURRENT_CONTEXT(ctx);
3837 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3839 return map_buffer_range(ctx, bufObj, offset, length, access,
3847 GET_CURRENT_CONTEXT(ctx);
3850 if (!ctx->Extensions.ARB_map_buffer_range) {
3851 _mesa_error(ctx, GL_INVALID_OPERATION,
3857 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3858 if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &bufObj, func, false))
3861 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, func);
3866 if (!validate_map_buffer_range(ctx, bufObj, offset, length, access, func))
3869 return map_buffer_range(ctx, bufObj, offset, length, access, func);
3876 GET_CURRENT_CONTEXT(ctx);
3878 _mesa_error(ctx, GL_INVALID_OPERATION,
3901 get_map_buffer_access_flags(struct gl_context *ctx, GLenum access,
3907 return _mesa_is_desktop_gl(ctx);
3913 return _mesa_is_desktop_gl(ctx);
3923 GET_CURRENT_CONTEXT(ctx);
3926 get_map_buffer_access_flags(ctx, access, &accessFlags);
3928 struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target);
3931 return map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
3938 GET_CURRENT_CONTEXT(ctx);
3942 if (!get_map_buffer_access_flags(ctx, access, &accessFlags)) {
3943 _mesa_error(ctx, GL_INVALID_ENUM, "glMapBuffer(invalid access)");
3947 bufObj = get_buffer(ctx, "glMapBuffer", target, GL_INVALID_OPERATION);
3951 if (!validate_map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
3955 return map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
3962 GET_CURRENT_CONTEXT(ctx);
3965 get_map_buffer_access_flags(ctx, access, &accessFlags);
3967 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
3969 return map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
3976 GET_CURRENT_CONTEXT(ctx);
3980 if (!get_map_buffer_access_flags(ctx, access, &accessFlags)) {
3981 _mesa_error(ctx, GL_INVALID_ENUM, "glMapNamedBuffer(invalid access)");
3985 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, "glMapNamedBuffer");
3989 if (!validate_map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
3993 return map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
4000 GET_CURRENT_CONTEXT(ctx);
4004 _mesa_error(ctx, GL_INVALID_OPERATION,
4008 if (!get_map_buffer_access_flags(ctx, access, &accessFlags)) {
4009 _mesa_error(ctx, GL_INVALID_ENUM, "glMapNamedBufferEXT(invalid access)");
4013 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
4014 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
4018 if (!validate_map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
4022 return map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
4027 flush_mapped_buffer_range(struct gl_context *ctx,
4032 if (!ctx->Extensions.ARB_map_buffer_range) {
4033 _mesa_error(ctx, GL_INVALID_OPERATION,
4039 _mesa_error(ctx, GL_INVALID_VALUE,
4045 _mesa_error(ctx, GL_INVALID_VALUE,
4052 _mesa_error(ctx, GL_INVALID_OPERATION,
4059 _mesa_error(ctx, GL_INVALID_OPERATION,
4065 _mesa_error(ctx, GL_INVALID_VALUE,
4074 _mesa_bufferobj_flush_mapped_range(ctx, offset, length, bufObj,
4082 GET_CURRENT_CONTEXT(ctx);
4083 struct gl_buffer_object **bufObjPtr = get_buffer_target(ctx, target);
4086 _mesa_bufferobj_flush_mapped_range(ctx, offset, length, bufObj,
4094 GET_CURRENT_CONTEXT(ctx);
4097 bufObj = get_buffer(ctx, "glFlushMappedBufferRange", target,
4102 flush_mapped_buffer_range(ctx, bufObj, offset, length,
4110 GET_CURRENT_CONTEXT(ctx);
4111 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
4113 _mesa_bufferobj_flush_mapped_range(ctx, offset, length, bufObj,
4121 GET_CURRENT_CONTEXT(ctx);
4124 bufObj = _mesa_lookup_bufferobj_err(ctx, buffer,
4129 flush_mapped_buffer_range(ctx, bufObj, offset, length,
4137 GET_CURRENT_CONTEXT(ctx);
4141 _mesa_error(ctx, GL_INVALID_OPERATION,
4146 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
4147 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
4151 flush_mapped_buffer_range(ctx, bufObj, offset, length,
4156 bind_buffer_range_uniform_buffer(struct gl_context *ctx, GLuint index,
4165 _mesa_reference_buffer_object(ctx, &ctx->UniformBuffer, bufObj);
4166 bind_uniform_buffer(ctx, index, bufObj, offset, size, GL_FALSE);
4177 bind_buffer_range_uniform_buffer_err(struct gl_context *ctx, GLuint index,
4181 if (index >= ctx->Const.MaxUniformBufferBindings) {
4182 _mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferRange(index=%d)", index);
4186 if (offset & (ctx->Const.UniformBufferOffsetAlignment - 1)) {
4187 _mesa_error(ctx, GL_INVALID_VALUE,
4189 ctx->Const.UniformBufferOffsetAlignment);
4193 bind_buffer_range_uniform_buffer(ctx, index, bufObj, offset, size);
4197 bind_buffer_range_shader_storage_buffer(struct gl_context *ctx,
4208 _mesa_reference_buffer_object(ctx, &ctx->ShaderStorageBuffer, bufObj);
4209 bind_shader_storage_buffer(ctx, index, bufObj, offset, size, GL_FALSE);
4220 bind_buffer_range_shader_storage_buffer_err(struct gl_context *ctx,
4225 if (index >= ctx->Const.MaxShaderStorageBufferBindings) {
4226 _mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferRange(index=%d)", index);
4230 if (offset & (ctx->Const.ShaderStorageBufferOffsetAlignment - 1)) {
4231 _mesa_error(ctx, GL_INVALID_VALUE,
4233 ctx->Const.ShaderStorageBufferOffsetAlignment);
4237 bind_buffer_range_shader_storage_buffer(ctx, index, bufObj, offset, size);
4241 bind_buffer_range_atomic_buffer(struct gl_context *ctx, GLuint index,
4250 _mesa_reference_buffer_object(ctx, &ctx->AtomicBuffer, bufObj);
4251 bind_atomic_buffer(ctx, index, bufObj, offset, size, GL_FALSE);
4262 bind_buffer_range_atomic_buffer_err(struct gl_context *ctx,
4267 if (index >= ctx->Const.MaxAtomicBufferBindings) {
4268 _mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferRange(index=%d)", index);
4273 _mesa_error(ctx, GL_INVALID_VALUE,
4279 bind_buffer_range_atomic_buffer(ctx, index, bufObj, offset, size);
4283 bind_buffers_check_offset_and_size(struct gl_context *ctx,
4294 _mesa_error(ctx, GL_INVALID_VALUE,
4306 _mesa_error(ctx, GL_INVALID_VALUE,
4316 error_check_bind_uniform_buffers(struct gl_context *ctx,
4320 if (!ctx->Extensions.ARB_uniform_buffer_object) {
4321 _mesa_error(ctx, GL_INVALID_ENUM,
4332 if (first + count > ctx->Const.MaxUniformBufferBindings) {
4333 _mesa_error(ctx, GL_INVALID_OPERATION,
4337 ctx->Const.MaxUniformBufferBindings);
4345 error_check_bind_shader_storage_buffers(struct gl_context *ctx,
4349 if (!ctx->Extensions.ARB_shader_storage_buffer_object) {
4350 _mesa_error(ctx, GL_INVALID_ENUM,
4361 if (first + count > ctx->Const.MaxShaderStorageBufferBindings) {
4362 _mesa_error(ctx, GL_INVALID_OPERATION,
4366 ctx->Const.MaxShaderStorageBufferBindings);
4378 unbind_uniform_buffers(struct gl_context *ctx, GLuint first, GLsizei count)
4381 set_buffer_binding(ctx, &ctx->UniformBufferBindings[first + i],
4390 unbind_shader_storage_buffers(struct gl_context *ctx, GLuint first,
4394 set_buffer_binding(ctx, &ctx->ShaderStorageBufferBindings[first + i],
4399 bind_uniform_buffers(struct gl_context *ctx, GLuint first, GLsizei count,
4405 if (!error_check_bind_uniform_buffers(ctx, first, count, caller))
4409 FLUSH_VERTICES(ctx, 0, 0);
4410 ctx->NewDriverState |= ST_NEW_UNIFORM_BUFFER;
4421 unbind_uniform_buffers(ctx, first, count);
4444 _mesa_HashLockMaybeLocked(ctx->Shared->BufferObjects,
4445 ctx->BufferObjectsLocked);
4449 &ctx->UniformBufferBindings[first + i];
4454 if (!bind_buffers_check_offset_and_size(ctx, i, offsets, sizes))
4476 if (offsets[i] & (ctx->Const.UniformBufferOffsetAlignment - 1)) {
4477 _mesa_error(ctx, GL_INVALID_VALUE,
4483 ctx->Const.UniformBufferOffsetAlignment);
4491 set_buffer_multi_binding(ctx, buffers, i, caller,
4496 _mesa_HashUnlockMaybeLocked(ctx->Shared->BufferObjects,
4497 ctx->BufferObjectsLocked);
4501 bind_shader_storage_buffers(struct gl_context *ctx, GLuint first,
4508 if (!error_check_bind_shader_storage_buffers(ctx, first, count, caller))
4512 FLUSH_VERTICES(ctx, 0, 0);
4513 ctx->NewDriverState |= ST_NEW_STORAGE_BUFFER;
4524 unbind_shader_storage_buffers(ctx, first, count);
4547 _mesa_HashLockMaybeLocked(ctx->Shared->BufferObjects,
4548 ctx->BufferObjectsLocked);
4552 &ctx->ShaderStorageBufferBindings[first + i];
4557 if (!bind_buffers_check_offset_and_size(ctx, i, offsets, sizes))
4579 if (offsets[i] & (ctx->Const.ShaderStorageBufferOffsetAlignment - 1)) {
4580 _mesa_error(ctx, GL_INVALID_VALUE,
4586 ctx->Const.ShaderStorageBufferOffsetAlignment);
4594 set_buffer_multi_binding(ctx, buffers, i, caller,
4599 _mesa_HashUnlockMaybeLocked(ctx->Shared->BufferObjects,
4600 ctx->BufferObjectsLocked);
4604 error_check_bind_xfb_buffers(struct gl_context *ctx,
4608 if (!ctx->Extensions.EXT_transform_feedback) {
4609 _mesa_error(ctx, GL_INVALID_ENUM,
4626 _mesa_error(ctx, GL_INVALID_OPERATION,
4638 if (first + count > ctx->Const.MaxTransformFeedbackBuffers) {
4639 _mesa_error(ctx, GL_INVALID_OPERATION,
4643 ctx->Const.MaxTransformFeedbackBuffers);
4655 unbind_xfb_buffers(struct gl_context *ctx,
4660 _mesa_set_transform_feedback_binding(ctx, tfObj, first + i,
4665 bind_xfb_buffers(struct gl_context *ctx,
4674 ctx->TransformFeedback.CurrentObject;
4676 if (!error_check_bind_xfb_buffers(ctx, tfObj, first, count, caller))
4680 FLUSH_VERTICES(ctx, 0, 0);
4691 unbind_xfb_buffers(ctx, tfObj, first, count);
4714 _mesa_HashLockMaybeLocked(ctx->Shared->BufferObjects,
4715 ctx->BufferObjectsLocked);
4725 if (!bind_buffers_check_offset_and_size(ctx, i, offsets, sizes))
4747 _mesa_error(ctx, GL_INVALID_VALUE,
4756 _mesa_error(ctx, GL_INVALID_VALUE,
4772 bufObj = _mesa_multi_bind_lookup_bufferobj(ctx, buffers, i, caller,
4778 _mesa_set_transform_feedback_binding(ctx, tfObj, index, bufObj,
4782 _mesa_HashUnlockMaybeLocked(ctx->Shared->BufferObjects,
4783 ctx->BufferObjectsLocked);
4787 error_check_bind_atomic_buffers(struct gl_context *ctx,
4791 if (!ctx->Extensions.ARB_shader_atomic_counters) {
4792 _mesa_error(ctx, GL_INVALID_ENUM,
4803 if (first + count > ctx->Const.MaxAtomicBufferBindings) {
4804 _mesa_error(ctx, GL_INVALID_OPERATION,
4807 caller, first, count, ctx->Const.MaxAtomicBufferBindings);
4819 unbind_atomic_buffers(struct gl_context *ctx, GLuint first, GLsizei count)
4822 set_buffer_binding(ctx, &ctx->AtomicBufferBindings[first + i],
4827 bind_atomic_buffers(struct gl_context *ctx,
4836 if (!error_check_bind_atomic_buffers(ctx, first, count, caller))
4840 FLUSH_VERTICES(ctx, 0, 0);
4841 ctx->NewDriverState |= ctx->DriverFlags.NewAtomicBuffer;
4852 unbind_atomic_buffers(ctx, first, count);
4875 _mesa_HashLockMaybeLocked(ctx->Shared->BufferObjects,
4876 ctx->BufferObjectsLocked);
4880 &ctx->AtomicBufferBindings[first + i];
4885 if (!bind_buffers_check_offset_and_size(ctx, i, offsets, sizes))
4907 _mesa_error(ctx, GL_INVALID_VALUE,
4919 set_buffer_multi_binding(ctx, buffers, i, caller,
4924 _mesa_HashUnlockMaybeLocked(ctx->Shared->BufferObjects,
4925 ctx->BufferObjectsLocked);
4932 GET_CURRENT_CONTEXT(ctx);
4936 _mesa_debug(ctx, "glBindBufferRange(%s, %u, %u, %lu, %lu)\n",
4944 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
4945 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
4950 _mesa_error(ctx, GL_INVALID_OPERATION,
4959 _mesa_bind_buffer_range_xfb(ctx, ctx->TransformFeedback.CurrentObject,
4963 bind_buffer_range_uniform_buffer(ctx, index, bufObj, offset, size);
4966 bind_buffer_range_shader_storage_buffer(ctx, index, bufObj, offset,
4970 bind_buffer_range_atomic_buffer(ctx, index, bufObj, offset, size);
4978 _mesa_error(ctx, GL_INVALID_VALUE, "glBindBufferRange(size=%d)",
4986 if (!_mesa_validate_buffer_range_xfb(ctx,
4987 ctx->TransformFeedback.CurrentObject,
4992 _mesa_bind_buffer_range_xfb(ctx, ctx->TransformFeedback.CurrentObject,
4996 bind_buffer_range_uniform_buffer_err(ctx, index, bufObj, offset,
5000 bind_buffer_range_shader_storage_buffer_err(ctx, index, bufObj,
5004 bind_buffer_range_atomic_buffer_err(ctx, index, bufObj,
5008 _mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferRange(target)");
5031 GET_CURRENT_CONTEXT(ctx);
5035 _mesa_debug(ctx, "glBindBufferBase(%s, %u, %u)\n",
5042 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
5043 if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
5048 _mesa_error(ctx, GL_INVALID_OPERATION,
5082 _mesa_bind_buffer_base_transform_feedback(ctx,
5083 ctx->TransformFeedback.CurrentObject,
5087 bind_buffer_base_uniform_buffer(ctx, index, bufObj);
5090 bind_buffer_base_shader_storage_buffer(ctx, index, bufObj);
5093 bind_buffer_base_atomic_buffer(ctx, index, bufObj);
5096 _mesa_error(ctx, GL_INVALID_ENUM, "glBindBufferBase(target)");
5106 GET_CURRENT_CONTEXT(ctx);
5109 _mesa_debug(ctx, "glBindBuffersRange(%s, %u, %d, %p, %p, %p)\n",
5116 bind_xfb_buffers(ctx, first, count, buffers, true, offsets, sizes,
5120 bind_uniform_buffers(ctx, first, count, buffers, true, offsets, sizes,
5124 bind_shader_storage_buffers(ctx, first, count, buffers, true, offsets, sizes,
5128 bind_atomic_buffers(ctx, first, count, buffers, true, offsets, sizes,
5132 _mesa_error(ctx, GL_INVALID_ENUM, "glBindBuffersRange(target=%s)",
5142 GET_CURRENT_CONTEXT(ctx);
5145 _mesa_debug(ctx, "glBindBuffersBase(%s, %u, %d, %p)\n",
5151 bind_xfb_buffers(ctx, first, count, buffers, false, NULL, NULL,
5155 bind_uniform_buffers(ctx, first, count, buffers, false, NULL, NULL,
5159 bind_shader_storage_buffers(ctx, first, count, buffers, false, NULL, NULL,
5163 bind_atomic_buffers(ctx, first, count, buffers, false, NULL, NULL,
5167 _mesa_error(ctx, GL_INVALID_ENUM, "glBindBuffersBase(target=%s)",
5177 bufferobj_invalidate(struct gl_context *ctx,
5182 struct pipe_context *pipe = ctx->pipe;
5196 invalidate_buffer_subdata(struct gl_context *ctx,
5200 if (ctx->has_invalidate_buffer)
5201 bufferobj_invalidate(ctx, bufObj, offset, length);
5208 GET_CURRENT_CONTEXT(ctx);
5210 struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
5211 invalidate_buffer_subdata(ctx, bufObj, offset, length);
5218 GET_CURRENT_CONTEXT(ctx);
5228 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
5230 _mesa_error(ctx, GL_INVALID_VALUE,
5243 _mesa_error(ctx, GL_INVALID_VALUE,
5257 _mesa_error(ctx, GL_INVALID_OPERATION,
5263 invalidate_buffer_subdata(ctx, bufObj, offset, length);
5269 GET_CURRENT_CONTEXT(ctx);
5271 struct gl_buffer_object *bufObj =_mesa_lookup_bufferobj(ctx, buffer);
5272 invalidate_buffer_subdata(ctx, bufObj, 0, bufObj->Size);
5278 GET_CURRENT_CONTEXT(ctx);
5287 bufObj = _mesa_lookup_bufferobj(ctx, buffer);
5289 _mesa_error(ctx, GL_INVALID_VALUE,
5303 _mesa_error(ctx, GL_INVALID_OPERATION,
5309 invalidate_buffer_subdata(ctx, bufObj, 0, bufObj->Size);
5313 buffer_page_commitment(struct gl_context *ctx,
5319 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(not a sparse buffer object)",
5326 _mesa_error(ctx, GL_INVALID_VALUE, "%s(out of bounds)",
5338 if (offset % ctx->Const.SparseBufferPageSize != 0) {
5339 _mesa_error(ctx, GL_INVALID_VALUE, "%s(offset not aligned to page size)",
5344 if (size % ctx->Const.SparseBufferPageSize != 0 &&
5346 _mesa_error(ctx, GL_INVALID_VALUE, "%s(size not aligned to page size)",
5351 struct pipe_context *pipe = ctx->pipe;
5357 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBufferPageCommitmentARB(out of memory)");
5365 GET_CURRENT_CONTEXT(ctx);
5368 bufferObj = get_buffer(ctx, "glBufferPageCommitmentARB", target,
5373 buffer_page_commitment(ctx, bufferObj, offset, size, commit,
5381 GET_CURRENT_CONTEXT(ctx);
5384 bufferObj = _mesa_lookup_bufferobj(ctx, buffer);
5387 _mesa_error(ctx, GL_INVALID_VALUE,
5393 buffer_page_commitment(ctx, bufferObj, offset, size, commit,
5401 GET_CURRENT_CONTEXT(ctx);
5406 bufferObj = _mesa_lookup_bufferobj(ctx, buffer);
5407 if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &bufferObj,
5417 _mesa_error(ctx, GL_INVALID_OPERATION,
5421 buffer_page_commitment(ctx, bufferObj, offset, size, commit,