Mesa (main): mesa/st: start moving bufferobject alloc/free/reference to main.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 15 14:02:49 UTC 2021


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Dec  9 11:58:35 2021 +1000

mesa/st: start moving bufferobject alloc/free/reference to main.

This moves these out of the state tracker code

Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14133>

---

 src/mesa/main/bufferobj.c                    | 39 +++++++++++++++++--
 src/mesa/main/bufferobj.h                    | 36 ++++++++++++++++++
 src/mesa/main/glthread_bufferobj.c           |  7 ++--
 src/mesa/state_tracker/st_atom_array.cpp     |  4 +-
 src/mesa/state_tracker/st_atom_constbuf.c    |  3 +-
 src/mesa/state_tracker/st_cb_bufferobjects.c | 57 +---------------------------
 src/mesa/state_tracker/st_cb_bufferobjects.h | 34 -----------------
 src/mesa/state_tracker/st_draw.c             |  2 +-
 src/mesa/vbo/vbo_exec_api.c                  |  2 +-
 src/mesa/vbo/vbo_save_api.c                  |  4 +-
 10 files changed, 85 insertions(+), 103 deletions(-)

diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index 5a086acf224..15d70b077fc 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -52,6 +52,7 @@
 
 #include "state_tracker/st_cb_bufferobjects.h"
 
+#include "util/u_inlines.h"
 /* Debug flags */
 /*#define VBO_DEBUG*/
 /*#define BOUNDS_CHECK*/
@@ -453,6 +454,26 @@ convert_clear_buffer_data(struct gl_context *ctx,
    }
 }
 
+void
+mesa_buffer_object_release_buffer(struct gl_buffer_object *obj)
+{
+   if (!obj->buffer)
+      return;
+
+   /* Subtract the remaining private references before unreferencing
+    * the buffer. See the header file for explanation.
+    */
+   if (obj->private_refcount) {
+      assert(obj->private_refcount > 0);
+      p_atomic_add(&obj->buffer->reference.count,
+                   -obj->private_refcount);
+      obj->private_refcount = 0;
+   }
+   obj->private_refcount_ctx = NULL;
+
+   pipe_resource_reference(&obj->buffer, NULL);
+}
+
 /**
  * Delete a buffer object.
  *
@@ -462,7 +483,9 @@ void
 _mesa_delete_buffer_object(struct gl_context *ctx,
                            struct gl_buffer_object *bufObj)
 {
-   (void) ctx;
+   assert(bufObj->RefCount == 0);
+   _mesa_buffer_unmap_all_mappings(ctx, bufObj);
+   mesa_buffer_object_release_buffer(bufObj);
 
    vbo_delete_minmax_cache(bufObj);
    align_free(bufObj->Data);
@@ -501,7 +524,7 @@ _mesa_reference_buffer_object_(struct gl_context *ctx,
        */
       if (shared_binding || ctx != oldObj->Ctx) {
          if (p_atomic_dec_zero(&oldObj->RefCount)) {
-            st_bufferobj_free(ctx, oldObj);
+            _mesa_delete_buffer_object(ctx, oldObj);
          }
       } else if (ctx == oldObj->Ctx) {
          /* Update the private ref count. */
@@ -801,6 +824,16 @@ _mesa_free_buffer_objects( struct gl_context *ctx )
    _mesa_HashUnlockMutex(ctx->Shared->BufferObjects);
 }
 
+struct gl_buffer_object *
+_mesa_internal_buffer_object_alloc(struct gl_context *ctx, GLuint id)
+{
+   struct gl_buffer_object *buf = CALLOC_STRUCT(gl_buffer_object);
+   if (!buf)
+      return NULL;
+
+   _mesa_initialize_buffer_object(ctx, buf, id);
+   return buf;
+}
 /**
  * Create a buffer object that will be backed by an OpenGL buffer ID
  * where the creating context will hold one global buffer reference instead
@@ -811,7 +844,7 @@ _mesa_free_buffer_objects( struct gl_context *ctx )
 static struct gl_buffer_object *
 new_gl_buffer_object(struct gl_context *ctx, GLuint id)
 {
-   struct gl_buffer_object *buf = st_bufferobj_alloc(ctx, id);
+   struct gl_buffer_object *buf = _mesa_internal_buffer_object_alloc(ctx, id);
 
    buf->Ctx = ctx;
    buf->RefCount++; /* global buffer reference held by the context */
diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h
index 66b954a960a..23d7d26789e 100644
--- a/src/mesa/main/bufferobj.h
+++ b/src/mesa/main/bufferobj.h
@@ -36,6 +36,42 @@
  * Internal functions
  */
 
+static inline struct pipe_resource *
+_mesa_get_buffer_object_reference(struct gl_context *ctx, struct gl_buffer_object *obj)
+{
+   if (unlikely(!obj))
+      return NULL;
+
+   struct pipe_resource *buffer = obj->buffer;
+
+   if (unlikely(!buffer))
+      return NULL;
+
+   /* Only one context is using the fast path. All other contexts must use
+    * the slow path.
+    */
+   if (unlikely(obj->private_refcount_ctx != ctx)) {
+      p_atomic_inc(&buffer->reference.count);
+      return buffer;
+   }
+
+   if (unlikely(obj->private_refcount <= 0)) {
+      assert(obj->private_refcount == 0);
+
+      /* This is the number of atomic increments we will skip. */
+      obj->private_refcount = 100000000;
+      p_atomic_add(&buffer->reference.count, obj->private_refcount);
+   }
+
+   /* Return a buffer reference while decrementing the private refcount. */
+   obj->private_refcount--;
+   return buffer;
+}
+
+struct gl_buffer_object *
+_mesa_internal_buffer_object_alloc(struct gl_context *ctx, GLuint id);
+void
+mesa_buffer_object_release_buffer(struct gl_buffer_object *obj);
 
 /** Is the given buffer object currently mapped by the GL user? */
 static inline GLboolean
diff --git a/src/mesa/main/glthread_bufferobj.c b/src/mesa/main/glthread_bufferobj.c
index 2818ee7a4c1..03879de1d1d 100644
--- a/src/mesa/main/glthread_bufferobj.c
+++ b/src/mesa/main/glthread_bufferobj.c
@@ -36,7 +36,8 @@ new_upload_buffer(struct gl_context *ctx, GLsizeiptr size, uint8_t **ptr)
 {
    assert(ctx->GLThread.SupportsBufferUploads);
 
-   struct gl_buffer_object *obj = st_bufferobj_alloc(ctx, -1);
+   struct gl_buffer_object *obj =
+      _mesa_internal_buffer_object_alloc(ctx, -1);
    if (!obj)
       return NULL;
 
@@ -46,7 +47,7 @@ new_upload_buffer(struct gl_context *ctx, GLsizeiptr size, uint8_t **ptr)
                           GL_WRITE_ONLY,
                           GL_CLIENT_STORAGE_BIT | GL_MAP_WRITE_BIT,
                           obj)) {
-      st_bufferobj_free(ctx, obj);
+      _mesa_delete_buffer_object(ctx, obj);
       return NULL;
    }
 
@@ -56,7 +57,7 @@ new_upload_buffer(struct gl_context *ctx, GLsizeiptr size, uint8_t **ptr)
                                  MESA_MAP_THREAD_SAFE_BIT,
                                  obj, MAP_GLTHREAD);
    if (!*ptr) {
-      st_bufferobj_free(ctx, obj);
+      _mesa_delete_buffer_object(ctx, obj);
       return NULL;
    }
 
diff --git a/src/mesa/state_tracker/st_atom_array.cpp b/src/mesa/state_tracker/st_atom_array.cpp
index ec5892ed25e..6d0618182fc 100644
--- a/src/mesa/state_tracker/st_atom_array.cpp
+++ b/src/mesa/state_tracker/st_atom_array.cpp
@@ -109,7 +109,7 @@ setup_arrays(struct st_context *st,
          /* Set the vertex buffer. */
          if (binding->BufferObj) {
             vbuffer[bufidx].buffer.resource =
-               st_get_buffer_reference(ctx, binding->BufferObj);
+               _mesa_get_buffer_object_reference(ctx, binding->BufferObj);
             vbuffer[bufidx].is_user_buffer = false;
             vbuffer[bufidx].buffer_offset = binding->Offset +
                                             attrib->RelativeOffset;
@@ -142,7 +142,7 @@ setup_arrays(struct st_context *st,
       if (binding->BufferObj) {
          /* Set the binding */
          vbuffer[bufidx].buffer.resource =
-            st_get_buffer_reference(ctx, binding->BufferObj);
+            _mesa_get_buffer_object_reference(ctx, binding->BufferObj);
          vbuffer[bufidx].is_user_buffer = false;
          vbuffer[bufidx].buffer_offset = _mesa_draw_binding_offset(binding);
       } else {
diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c
index 923e67b505f..2542695700e 100644
--- a/src/mesa/state_tracker/st_atom_constbuf.c
+++ b/src/mesa/state_tracker/st_atom_constbuf.c
@@ -41,6 +41,7 @@
 #include "util/u_upload_mgr.h"
 #include "cso_cache/cso_context.h"
 
+#include "main/bufferobj.h"
 #include "st_debug.h"
 #include "st_context.h"
 #include "st_atom.h"
@@ -272,7 +273,7 @@ st_bind_ubos(struct st_context *st, struct gl_program *prog,
       binding =
          &st->ctx->UniformBufferBindings[prog->sh.UniformBlocks[i]->Binding];
 
-      cb.buffer = st_get_buffer_reference(st->ctx, binding->BufferObject);
+      cb.buffer = _mesa_get_buffer_object_reference(st->ctx, binding->BufferObject);
 
       if (cb.buffer) {
          cb.buffer_offset = binding->Offset;
diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c b/src/mesa/state_tracker/st_cb_bufferobjects.c
index 4ad457684a1..aa08c537e09 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.c
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
@@ -50,61 +50,6 @@
 #include "util/u_inlines.h"
 
 
-/**
- * There is some duplication between mesa's bufferobjects and our
- * bufmgr buffers.  Both have an integer handle and a hashtable to
- * lookup an opaque structure.  It would be nice if the handles and
- * internal structure where somehow shared.
- */
-struct gl_buffer_object *
-st_bufferobj_alloc(struct gl_context *ctx, GLuint name)
-{
-   struct gl_buffer_object *obj = ST_CALLOC_STRUCT(gl_buffer_object);
-
-   if (!obj)
-      return NULL;
-
-   _mesa_initialize_buffer_object(ctx, obj, name);
-
-   return obj;
-}
-
-
-static void
-release_buffer(struct gl_buffer_object *obj)
-{
-   if (!obj->buffer)
-      return;
-
-   /* Subtract the remaining private references before unreferencing
-    * the buffer. See the header file for explanation.
-    */
-   if (obj->private_refcount) {
-      assert(obj->private_refcount > 0);
-      p_atomic_add(&obj->buffer->reference.count,
-                   -obj->private_refcount);
-      obj->private_refcount = 0;
-   }
-   obj->private_refcount_ctx = NULL;
-
-   pipe_resource_reference(&obj->buffer, NULL);
-}
-
-
-/**
- * Deallocate/free a vertex/pixel buffer object.
- * Called via glDeleteBuffersARB().
- */
-void st_bufferobj_free(struct gl_context *ctx, struct gl_buffer_object *obj)
-{
-   assert(obj->RefCount == 0);
-   _mesa_buffer_unmap_all_mappings(ctx, obj);
-   release_buffer(obj);
-   _mesa_delete_buffer_object(ctx, obj);
-}
-
-
-
 /**
  * Replace data in a subrange of buffer object.  If the data range
  * specified by size + offset extends beyond the end of the buffer or
@@ -343,7 +288,7 @@ bufferobj_data(struct gl_context *ctx,
    obj->Usage = usage;
    obj->StorageFlags = storageFlags;
 
-   release_buffer(obj);
+   mesa_buffer_object_release_buffer(obj);
 
    unsigned bindings = buffer_target_to_bind_flags(target);
 
diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.h b/src/mesa/state_tracker/st_cb_bufferobjects.h
index e37987d5577..004a7ee8db2 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.h
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.h
@@ -43,40 +43,6 @@ extern void
 st_init_bufferobject_functions(struct pipe_screen *screen,
                                struct dd_function_table *functions);
 
-static inline struct pipe_resource *
-st_get_buffer_reference(struct gl_context *ctx, struct gl_buffer_object *obj)
-{
-   if (unlikely(!obj))
-      return NULL;
-
-   struct pipe_resource *buffer = obj->buffer;
-
-   if (unlikely(!buffer))
-      return NULL;
-
-   /* Only one context is using the fast path. All other contexts must use
-    * the slow path.
-    */
-   if (unlikely(obj->private_refcount_ctx != ctx)) {
-      p_atomic_inc(&buffer->reference.count);
-      return buffer;
-   }
-
-   if (unlikely(obj->private_refcount <= 0)) {
-      assert(obj->private_refcount == 0);
-
-      /* This is the number of atomic increments we will skip. */
-      obj->private_refcount = 100000000;
-      p_atomic_add(&buffer->reference.count, obj->private_refcount);
-   }
-
-   /* Return a buffer reference while decrementing the private refcount. */
-   obj->private_refcount--;
-   return buffer;
-}
-
-struct gl_buffer_object *st_bufferobj_alloc(struct gl_context *ctx, GLuint name);
-void st_bufferobj_free(struct gl_context *ctx, struct gl_buffer_object *obj);
 void st_bufferobj_subdata(struct gl_context *ctx,
                           GLintptrARB offset,
                           GLsizeiptrARB size,
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index 4a171d6a8d9..d783c30c2c6 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -154,7 +154,7 @@ prepare_indexed_draw(/* pass both st and ctx to reduce dereferences */
              * the threaded batch buffer.
              */
             info->index.resource =
-               st_get_buffer_reference(ctx, info->index.gl_bo);
+               _mesa_get_buffer_object_reference(ctx, info->index.gl_bo);
             info->take_index_buffer_ownership = true;
          } else {
             info->index.resource = info->index.gl_bo->buffer;
diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
index 287b9f1b30f..871fec36938 100644
--- a/src/mesa/vbo/vbo_exec_api.c
+++ b/src/mesa/vbo/vbo_exec_api.c
@@ -1097,7 +1097,7 @@ vbo_exec_vtx_init(struct vbo_exec_context *exec)
 {
    struct gl_context *ctx = gl_context_from_vbo_exec(exec);
 
-   exec->vtx.bufferobj = st_bufferobj_alloc(ctx, IMM_BUFFER_NAME);
+   exec->vtx.bufferobj = _mesa_internal_buffer_object_alloc(ctx, IMM_BUFFER_NAME);
 
    exec->vtx.enabled = u_bit_consecutive64(0, VBO_ATTRIB_MAX); /* reset all */
    vbo_reset_all_attr(exec);
diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c
index 066c5640b69..0a3d758ec65 100644
--- a/src/mesa/vbo/vbo_save_api.c
+++ b/src/mesa/vbo/vbo_save_api.c
@@ -768,7 +768,7 @@ compile_vertex_list(struct gl_context *ctx)
    if (total_bytes_needed > available_bytes) {
       if (save->current_bo)
          _mesa_reference_buffer_object(ctx, &save->current_bo, NULL);
-      save->current_bo = st_bufferobj_alloc(ctx, VBO_BUF_ID + 1);
+      save->current_bo = _mesa_internal_buffer_object_alloc(ctx, VBO_BUF_ID + 1);
       bool success = st_bufferobj_data(ctx,
                                        GL_ELEMENT_ARRAY_BUFFER_ARB,
                                        MAX2(total_bytes_needed, VBO_SAVE_BUFFER_SIZE),
@@ -901,7 +901,7 @@ end:
    node->draw_begins = node->cold->prims[0].begin;
 
    if (!save->current_bo) {
-      save->current_bo = st_bufferobj_alloc(ctx, VBO_BUF_ID + 1);
+      save->current_bo = _mesa_internal_buffer_object_alloc(ctx, VBO_BUF_ID + 1);
       bool success = st_bufferobj_data(ctx,
                                        GL_ELEMENT_ARRAY_BUFFER_ARB,
                                        VBO_SAVE_BUFFER_SIZE,



More information about the mesa-commit mailing list