Mesa (main): mesa: add a no_error path to _mesa_handle_bind_buffer_gen

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Oct 25 20:19:55 UTC 2021


Module: Mesa
Branch: main
Commit: 00a1eda61b3962f6d2b5a512887523ab1e74813a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=00a1eda61b3962f6d2b5a512887523ab1e74813a

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Tue Oct 19 22:45:47 2021 -0400

mesa: add a no_error path to _mesa_handle_bind_buffer_gen

It only helps when it's inlined, which is true for glBindBuffer.

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13513>

---

 src/mesa/main/bufferobj.c | 88 ++++++++++++++++++++++++-----------------------
 src/mesa/main/bufferobj.h |  2 +-
 src/mesa/main/varray.c    |  4 +--
 3 files changed, 48 insertions(+), 46 deletions(-)

diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index fd26cd01718..ac4b95172dd 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -1061,11 +1061,11 @@ bool
 _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;
    }
@@ -1103,7 +1103,8 @@ _mesa_handle_bind_buffer_gen(struct gl_context *ctx,
  */
 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;
@@ -1123,7 +1124,8 @@ bind_buffer_object(struct gl_context *ctx,
       /* 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;
    }
 
@@ -1141,10 +1143,10 @@ void
 _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);
 }
 
 
@@ -1320,7 +1322,7 @@ _mesa_BindBuffer_no_error(GLenum target, GLuint buffer)
    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);
 }
 
 
@@ -1341,7 +1343,7 @@ _mesa_BindBuffer(GLenum target, GLuint buffer)
       return;
    }
 
-   bind_buffer_object(ctx, bindTarget, buffer);
+   bind_buffer_object(ctx, bindTarget, buffer, false);
 }
 
 void
@@ -1594,38 +1596,38 @@ delete_buffers(struct gl_context *ctx, GLsizei n, const GLuint *ids)
          }
 
          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) {
@@ -1643,7 +1645,7 @@ delete_buffers(struct gl_context *ctx, GLsizei n, const GLuint *ids)
          }
 
          if (ctx->UniformBuffer == bufObj) {
-            bind_buffer_object(ctx, &ctx->UniformBuffer, 0);
+            bind_buffer_object(ctx, &ctx->UniformBuffer, 0, false);
          }
 
          /* unbind SSBO binding points */
@@ -1654,7 +1656,7 @@ delete_buffers(struct gl_context *ctx, GLsizei n, const GLuint *ids)
          }
 
          if (ctx->ShaderStorageBuffer == bufObj) {
-            bind_buffer_object(ctx, &ctx->ShaderStorageBuffer, 0);
+            bind_buffer_object(ctx, &ctx->ShaderStorageBuffer, 0, false);
          }
 
          /* unbind Atomci Buffer binding points */
@@ -1665,28 +1667,28 @@ delete_buffers(struct gl_context *ctx, GLsizei n, const GLuint *ids)
          }
 
          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 */
@@ -2073,7 +2075,7 @@ _mesa_NamedBufferStorageEXT(GLuint buffer, GLsizeiptr size,
 
    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,
@@ -2327,7 +2329,7 @@ _mesa_NamedBufferDataEXT(GLuint buffer, GLsizeiptr size, const GLvoid *data,
 
    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,
@@ -2476,7 +2478,7 @@ _mesa_NamedBufferSubDataEXT(GLuint buffer, GLintptr offset,
 
    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,
@@ -2544,7 +2546,7 @@ _mesa_GetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset,
 
    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,
@@ -2708,7 +2710,7 @@ _mesa_ClearNamedBufferDataEXT(GLuint buffer, GLenum internalformat,
    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,
@@ -2794,7 +2796,7 @@ _mesa_ClearNamedBufferSubDataEXT(GLuint buffer, GLenum internalformat,
    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,
@@ -3046,7 +3048,7 @@ _mesa_GetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint *params)
 
    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, &parameter,
@@ -3136,7 +3138,7 @@ _mesa_GetNamedBufferPointervEXT(GLuint buffer, GLenum pname, GLvoid **params)
 
    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;
@@ -3262,13 +3264,13 @@ _mesa_NamedCopyBufferSubDataEXT(GLuint readBuffer, GLuint writeBuffer,
    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,
@@ -3327,7 +3329,7 @@ _mesa_InternalBufferSubDataCopyMESA(GLintptr srcBuffer, GLuint srcOffset,
    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";
@@ -3614,7 +3616,7 @@ map_named_buffer_range(GLuint buffer, GLintptr offset, GLsizeiptr length,
 
    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);
@@ -3771,7 +3773,7 @@ _mesa_MapNamedBufferEXT(GLuint buffer, GLenum access)
 
    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,
@@ -3907,7 +3909,7 @@ _mesa_FlushMappedNamedBufferRangeEXT(GLuint buffer, GLintptr offset,
 
    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,
@@ -4706,7 +4708,7 @@ bind_buffer_range(GLenum target, GLuint index, GLuint buffer, GLintptr offset,
    } 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) {
@@ -4804,7 +4806,7 @@ _mesa_BindBufferBase(GLenum target, GLuint index, GLuint buffer)
    } else {
       bufObj = _mesa_lookup_bufferobj(ctx, buffer);
       if (!_mesa_handle_bind_buffer_gen(ctx, buffer,
-                                        &bufObj, "glBindBufferBase"))
+                                        &bufObj, "glBindBufferBase", false))
          return;
 
       if (!bufObj) {
@@ -5139,7 +5141,7 @@ _mesa_NamedBufferPageCommitmentEXT(GLuint buffer, GLintptr offset,
    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:
diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h
index 198bf74a02b..f78e64205b0 100644
--- a/src/mesa/main/bufferobj.h
+++ b/src/mesa/main/bufferobj.h
@@ -71,7 +71,7 @@ extern bool
 _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);
 
 extern void
 _mesa_update_default_objects_buffer_objects(struct gl_context *ctx);
diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index 4fc805ff9f9..70f77e1625d 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -940,7 +940,7 @@ _lookup_vao_and_vbo_dsa(struct gl_context *ctx,
 
    if (buffer != 0) {
       *vbo = _mesa_lookup_bufferobj(ctx, buffer);
-      if (!_mesa_handle_bind_buffer_gen(ctx, buffer, vbo, caller))
+      if (!_mesa_handle_bind_buffer_gen(ctx, buffer, vbo, caller, false))
          return false;
 
       if (offset < 0) {
@@ -2943,7 +2943,7 @@ vertex_array_vertex_buffer(struct gl_context *ctx,
        * Otherwise, we fall back to the same compat profile behavior as other
        * object references (automatically gen it).
        */
-      if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &vbo, func))
+      if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &vbo, func, no_error))
          return;
    } else {
       /* The ARB_vertex_attrib_binding spec says:



More information about the mesa-commit mailing list