_mesa_handle_bind_buffer_gen(struct gl_context *ctx,
GLuint buffer,
struct gl_buffer_object **buf_handle,
- const char *caller)
+ const char *caller, bool no_error)
{
struct gl_buffer_object *buf = *buf_handle;
- if (!buf && (ctx->API == API_OPENGL_CORE)) {
+ if (!no_error && !buf && (ctx->API == API_OPENGL_CORE)) {
_mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-gen name)", caller);
return false;
}
*/
static void
bind_buffer_object(struct gl_context *ctx,
- struct gl_buffer_object **bindTarget, GLuint buffer)
+ struct gl_buffer_object **bindTarget, GLuint buffer,
+ bool no_error)
{
struct gl_buffer_object *oldBufObj;
struct gl_buffer_object *newBufObj = NULL;
/* non-default buffer object */
newBufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &newBufObj, "glBindBuffer"))
+ &newBufObj, "glBindBuffer",
+ no_error))
return;
}
_mesa_update_default_objects_buffer_objects(struct gl_context *ctx)
{
/* Bind 0 to remove references to those in the shared context hash table. */
- bind_buffer_object(ctx, &ctx->Array.ArrayBufferObj, 0);
- bind_buffer_object(ctx, &ctx->Array.VAO->IndexBufferObj, 0);
- bind_buffer_object(ctx, &ctx->Pack.BufferObj, 0);
- bind_buffer_object(ctx, &ctx->Unpack.BufferObj, 0);
+ bind_buffer_object(ctx, &ctx->Array.ArrayBufferObj, 0, false);
+ bind_buffer_object(ctx, &ctx->Array.VAO->IndexBufferObj, 0, false);
+ bind_buffer_object(ctx, &ctx->Pack.BufferObj, 0, false);
+ bind_buffer_object(ctx, &ctx->Unpack.BufferObj, 0, false);
}
GET_CURRENT_CONTEXT(ctx);
struct gl_buffer_object **bindTarget = get_buffer_target(ctx, target);
- bind_buffer_object(ctx, bindTarget, buffer);
+ bind_buffer_object(ctx, bindTarget, buffer, true);
}
return;
}
- bind_buffer_object(ctx, bindTarget, buffer);
+ bind_buffer_object(ctx, bindTarget, buffer, false);
}
void
}
if (ctx->Array.ArrayBufferObj == bufObj) {
- bind_buffer_object(ctx, &ctx->Array.ArrayBufferObj, 0);
+ bind_buffer_object(ctx, &ctx->Array.ArrayBufferObj, 0, false);
}
if (vao->IndexBufferObj == bufObj) {
- bind_buffer_object(ctx, &vao->IndexBufferObj, 0);
+ bind_buffer_object(ctx, &vao->IndexBufferObj, 0, false);
}
/* unbind ARB_draw_indirect binding point */
if (ctx->DrawIndirectBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->DrawIndirectBuffer, 0);
+ bind_buffer_object(ctx, &ctx->DrawIndirectBuffer, 0, false);
}
/* unbind ARB_indirect_parameters binding point */
if (ctx->ParameterBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->ParameterBuffer, 0);
+ bind_buffer_object(ctx, &ctx->ParameterBuffer, 0, false);
}
/* unbind ARB_compute_shader binding point */
if (ctx->DispatchIndirectBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->DispatchIndirectBuffer, 0);
+ bind_buffer_object(ctx, &ctx->DispatchIndirectBuffer, 0, false);
}
/* unbind ARB_copy_buffer binding points */
if (ctx->CopyReadBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->CopyReadBuffer, 0);
+ bind_buffer_object(ctx, &ctx->CopyReadBuffer, 0, false);
}
if (ctx->CopyWriteBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->CopyWriteBuffer, 0);
+ bind_buffer_object(ctx, &ctx->CopyWriteBuffer, 0, false);
}
/* unbind transform feedback binding points */
if (ctx->TransformFeedback.CurrentBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->TransformFeedback.CurrentBuffer, 0);
+ bind_buffer_object(ctx, &ctx->TransformFeedback.CurrentBuffer, 0, false);
}
for (j = 0; j < MAX_FEEDBACK_BUFFERS; j++) {
if (ctx->TransformFeedback.CurrentObject->Buffers[j] == bufObj) {
}
if (ctx->UniformBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->UniformBuffer, 0);
+ bind_buffer_object(ctx, &ctx->UniformBuffer, 0, false);
}
/* unbind SSBO binding points */
}
if (ctx->ShaderStorageBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->ShaderStorageBuffer, 0);
+ bind_buffer_object(ctx, &ctx->ShaderStorageBuffer, 0, false);
}
/* unbind Atomci Buffer binding points */
}
if (ctx->AtomicBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->AtomicBuffer, 0);
+ bind_buffer_object(ctx, &ctx->AtomicBuffer, 0, false);
}
/* unbind any pixel pack/unpack pointers bound to this buffer */
if (ctx->Pack.BufferObj == bufObj) {
- bind_buffer_object(ctx, &ctx->Pack.BufferObj, 0);
+ bind_buffer_object(ctx, &ctx->Pack.BufferObj, 0, false);
}
if (ctx->Unpack.BufferObj == bufObj) {
- bind_buffer_object(ctx, &ctx->Unpack.BufferObj, 0);
+ bind_buffer_object(ctx, &ctx->Unpack.BufferObj, 0, false);
}
if (ctx->Texture.BufferObject == bufObj) {
- bind_buffer_object(ctx, &ctx->Texture.BufferObject, 0);
+ bind_buffer_object(ctx, &ctx->Texture.BufferObject, 0, false);
}
if (ctx->ExternalVirtualMemoryBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->ExternalVirtualMemoryBuffer, 0);
+ bind_buffer_object(ctx, &ctx->ExternalVirtualMemoryBuffer, 0, false);
}
/* unbind query buffer binding point */
if (ctx->QueryBuffer == bufObj) {
- bind_buffer_object(ctx, &ctx->QueryBuffer, 0);
+ bind_buffer_object(ctx, &ctx->QueryBuffer, 0, false);
}
/* The ID is immediately freed for re-use */
struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glNamedBufferStorageEXT"))
+ &bufObj, "glNamedBufferStorageEXT", false))
return;
inlined_buffer_storage(GL_NONE, buffer, size, data, flags, GL_NONE, 0,
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glNamedBufferDataEXT"))
+ &bufObj, "glNamedBufferDataEXT", false))
return;
_mesa_buffer_data(ctx, bufObj, GL_NONE, size, data, usage,
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glNamedBufferSubDataEXT"))
+ &bufObj, "glNamedBufferSubDataEXT", false))
return;
if (validate_buffer_sub_data(ctx, bufObj, offset, size,
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glGetNamedBufferSubDataEXT"))
+ &bufObj, "glGetNamedBufferSubDataEXT", false))
return;
if (!buffer_object_subdata_range_good(ctx, bufObj, offset, size, false,
GET_CURRENT_CONTEXT(ctx);
struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glClearNamedBufferDataEXT"))
+ &bufObj, "glClearNamedBufferDataEXT", false))
return;
clear_buffer_sub_data_error(ctx, bufObj, internalformat, 0, bufObj->Size,
GET_CURRENT_CONTEXT(ctx);
struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glClearNamedBufferSubDataEXT"))
+ &bufObj, "glClearNamedBufferSubDataEXT", false))
return;
clear_buffer_sub_data_error(ctx, bufObj, internalformat, offset, size,
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glGetNamedBufferParameterivEXT"))
+ &bufObj, "glGetNamedBufferParameterivEXT", false))
return;
if (!get_buffer_parameter(ctx, bufObj, pname, ¶meter,
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glGetNamedBufferPointervEXT"))
+ &bufObj, "glGetNamedBufferPointervEXT", false))
return;
*params = bufObj->Mappings[MAP_USER].Pointer;
src = _mesa_lookup_bufferobj(ctx, readBuffer);
if (!_mesa_handle_bind_buffer_gen(ctx, readBuffer,
&src,
- "glNamedCopyBufferSubDataEXT"))
+ "glNamedCopyBufferSubDataEXT", false))
return;
dst = _mesa_lookup_bufferobj(ctx, writeBuffer);
if (!_mesa_handle_bind_buffer_gen(ctx, writeBuffer,
&dst,
- "glNamedCopyBufferSubDataEXT"))
+ "glNamedCopyBufferSubDataEXT", false))
return;
copy_buffer_sub_data(ctx, src, dst, readOffset, writeOffset, size,
if (named && ext_dsa) {
func = "glNamedBufferSubDataEXT";
dst = _mesa_lookup_bufferobj(ctx, dstTargetOrName);
- if (!_mesa_handle_bind_buffer_gen(ctx, dstTargetOrName, &dst, func))
+ if (!_mesa_handle_bind_buffer_gen(ctx, dstTargetOrName, &dst, func, false))
goto done;
} else if (named) {
func = "glNamedBufferSubData";
if (dsa_ext) {
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
- if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &bufObj, func))
+ if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &bufObj, func, false))
return NULL;
} else {
bufObj = _mesa_lookup_bufferobj_err(ctx, buffer, func);
struct gl_buffer_object *bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glMapNamedBufferEXT"))
+ &bufObj, "glMapNamedBufferEXT", false))
return NULL;
if (!validate_map_buffer_range(ctx, bufObj, 0, bufObj->Size, accessFlags,
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glFlushMappedNamedBufferRangeEXT"))
+ &bufObj, "glFlushMappedNamedBufferRangeEXT", false))
return;
flush_mapped_buffer_range(ctx, bufObj, offset, length,
} else {
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glBindBufferRange"))
+ &bufObj, "glBindBufferRange", false))
return;
if (!no_error && !bufObj) {
} else {
bufObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
- &bufObj, "glBindBufferBase"))
+ &bufObj, "glBindBufferBase", false))
return;
if (!bufObj) {
if (buffer != 0) {
bufferObj = _mesa_lookup_bufferobj(ctx, buffer);
if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &bufferObj,
- "glNamedBufferPageCommitmentEXT"))
+ "glNamedBufferPageCommitmentEXT", false))
return;
} else {
/* GL_EXT_direct_state_access says about NamedBuffer* functions: