Mesa (main): mesa/st: merge st transform feedback object into gl one.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jan 20 01:28:52 UTC 2022


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Dec 15 11:03:40 2021 +1000

mesa/st: merge st transform feedback object into gl one.

This just merges the object subclass into the main class,
this was left separate to ease review.

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

---

 src/mesa/main/mtypes.h                 |   8 +++
 src/mesa/main/transformfeedback.c      |  83 +++++++++++++------------
 src/mesa/state_tracker/st_cb_xformfb.c | 110 ++++++++-------------------------
 src/mesa/state_tracker/st_cb_xformfb.h |   7 ---
 4 files changed, 78 insertions(+), 130 deletions(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index da98588ec99..57b9cfe5a6f 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1808,6 +1808,14 @@ struct gl_transform_feedback_object
     * zero.
     */
    GLsizeiptr RequestedSize[MAX_FEEDBACK_BUFFERS];
+
+   unsigned num_targets;
+   struct pipe_stream_output_target *targets[PIPE_MAX_SO_BUFFERS];
+
+   /* This encapsulates the count that can be used as a source for draw_vbo.
+    * It contains stream output targets from the last call of
+    * EndTransformFeedback for each stream. */
+   struct pipe_stream_output_target *draw_count[MAX_VERTEX_STREAMS];
 };
 
 
diff --git a/src/mesa/main/transformfeedback.c b/src/mesa/main/transformfeedback.c
index afe8093249e..7f37ae50a45 100644
--- a/src/mesa/main/transformfeedback.c
+++ b/src/mesa/main/transformfeedback.c
@@ -45,6 +45,7 @@
 #include "program/prog_parameter.h"
 
 #include "util/u_memory.h"
+#include "util/u_inlines.h"
 
 #include "state_tracker/st_cb_xformfb.h"
 #include "api_exec_decl.h"
@@ -88,6 +89,44 @@ _mesa_transform_feedback_is_using_program(struct gl_context *ctx,
    return callback_data.found;
 }
 
+static struct gl_transform_feedback_object *
+new_transform_feedback(struct gl_context *ctx, GLuint name)
+{
+   struct gl_transform_feedback_object *obj;
+
+   obj = CALLOC_STRUCT(gl_transform_feedback_object);
+   if (!obj)
+      return NULL;
+
+   obj->Name = name;
+   obj->RefCount = 1;
+   obj->EverBound = GL_FALSE;
+
+   return obj;
+}
+
+static void
+delete_transform_feedback(struct gl_context *ctx,
+                             struct gl_transform_feedback_object *obj)
+{
+   unsigned i;
+
+   for (i = 0; i < ARRAY_SIZE(obj->draw_count); i++)
+      pipe_so_target_reference(&obj->draw_count[i], NULL);
+
+   /* Unreference targets. */
+   for (i = 0; i < obj->num_targets; i++) {
+      pipe_so_target_reference(&obj->targets[i], NULL);
+   }
+
+   for (unsigned i = 0; i < ARRAY_SIZE(obj->Buffers); i++) {
+      _mesa_reference_buffer_object(ctx, &obj->Buffers[i], NULL);
+   }
+
+   free(obj->Label);
+   FREE(obj);
+}
+
 /**
  * Do reference counting of transform feedback buffers.
  */
@@ -108,7 +147,7 @@ reference_transform_feedback_object(struct gl_transform_feedback_object **ptr,
       if (oldObj->RefCount == 0) {
          GET_CURRENT_CONTEXT(ctx);
          if (ctx)
-            st_delete_transform_feedback(ctx, oldObj);
+            delete_transform_feedback(ctx, oldObj);
       }
 
       *ptr = NULL;
@@ -134,7 +173,7 @@ _mesa_init_transform_feedback(struct gl_context *ctx)
 {
    /* core mesa expects this, even a dummy one, to be available */
    ctx->TransformFeedback.DefaultObject =
-      st_new_transform_feedback(ctx, 0);
+      new_transform_feedback(ctx, 0);
 
    assert(ctx->TransformFeedback.DefaultObject->RefCount == 1);
 
@@ -161,7 +200,7 @@ delete_cb(void *data, void *userData)
    struct gl_transform_feedback_object *obj =
       (struct gl_transform_feedback_object *) data;
 
-   st_delete_transform_feedback(ctx, obj);
+   delete_transform_feedback(ctx, obj);
 }
 
 
@@ -181,44 +220,12 @@ _mesa_free_transform_feedback(struct gl_context *ctx)
    _mesa_DeleteHashTable(ctx->TransformFeedback.Objects);
 
    /* Delete the default feedback object */
-   st_delete_transform_feedback(ctx,
-                                ctx->TransformFeedback.DefaultObject);
+   delete_transform_feedback(ctx,
+                             ctx->TransformFeedback.DefaultObject);
 
    ctx->TransformFeedback.CurrentObject = NULL;
 }
 
-
-/** Initialize the fields of a gl_transform_feedback_object. */
-void
-_mesa_init_transform_feedback_object(struct gl_transform_feedback_object *obj,
-                                     GLuint name)
-{
-   obj->Name = name;
-   obj->RefCount = 1;
-   obj->EverBound = GL_FALSE;
-}
-
-/**
- * Delete a transform feedback object.
- * Called from the driver after all driver-specific clean-up
- * has been done.
- *
- * \param ctx GL context to wich transform feedback object belongs.
- * \param obj Transform feedback object due to be deleted.
- */
-void
-_mesa_delete_transform_feedback_object(struct gl_context *ctx,
-                                       struct gl_transform_feedback_object
-                                              *obj)
-{
-   for (unsigned i = 0; i < ARRAY_SIZE(obj->Buffers); i++) {
-      _mesa_reference_buffer_object(ctx, &obj->Buffers[i], NULL);
-   }
-
-   free(obj->Label);
-   FREE(obj);
-}
-
 /**
  * Fill in the correct Size value for each buffer in \c obj.
  *
@@ -1005,7 +1012,7 @@ create_transform_feedbacks(struct gl_context *ctx, GLsizei n, GLuint *ids,
       GLsizei i;
       for (i = 0; i < n; i++) {
          struct gl_transform_feedback_object *obj
-            = st_new_transform_feedback(ctx, ids[i]);
+            = new_transform_feedback(ctx, ids[i]);
          if (!obj) {
             _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", func);
             return;
diff --git a/src/mesa/state_tracker/st_cb_xformfb.c b/src/mesa/state_tracker/st_cb_xformfb.c
index d3eeceb544f..57357ec2e67 100644
--- a/src/mesa/state_tracker/st_cb_xformfb.c
+++ b/src/mesa/state_tracker/st_cb_xformfb.c
@@ -47,57 +47,6 @@
 #include "util/u_inlines.h"
 #include "cso_cache/cso_context.h"
 
-struct st_transform_feedback_object {
-   struct gl_transform_feedback_object base;
-
-   unsigned num_targets;
-   struct pipe_stream_output_target *targets[PIPE_MAX_SO_BUFFERS];
-
-   /* This encapsulates the count that can be used as a source for draw_vbo.
-    * It contains stream output targets from the last call of
-    * EndTransformFeedback for each stream. */
-   struct pipe_stream_output_target *draw_count[MAX_VERTEX_STREAMS];
-};
-
-static inline struct st_transform_feedback_object *
-st_transform_feedback_object(struct gl_transform_feedback_object *obj)
-{
-   return (struct st_transform_feedback_object *) obj;
-}
-
-struct gl_transform_feedback_object *
-st_new_transform_feedback(struct gl_context *ctx, GLuint name)
-{
-   struct st_transform_feedback_object *obj;
-
-   obj = CALLOC_STRUCT(st_transform_feedback_object);
-   if (!obj)
-      return NULL;
-
-   _mesa_init_transform_feedback_object(&obj->base, name);
-
-   return &obj->base;
-}
-
-
-void
-st_delete_transform_feedback(struct gl_context *ctx,
-                             struct gl_transform_feedback_object *obj)
-{
-   struct st_transform_feedback_object *sobj =
-         st_transform_feedback_object(obj);
-   unsigned i;
-
-   for (i = 0; i < ARRAY_SIZE(sobj->draw_count); i++)
-      pipe_so_target_reference(&sobj->draw_count[i], NULL);
-
-   /* Unreference targets. */
-   for (i = 0; i < sobj->num_targets; i++) {
-      pipe_so_target_reference(&sobj->targets[i], NULL);
-   }
-
-   _mesa_delete_transform_feedback_object(ctx, obj);
-}
 
 
 /* XXX Do we really need the mode? */
@@ -106,48 +55,46 @@ st_begin_transform_feedback(struct gl_context *ctx, GLenum mode,
                             struct gl_transform_feedback_object *obj)
 {
    struct st_context *st = st_context(ctx);
-   struct pipe_context *pipe = st->pipe;
-   struct st_transform_feedback_object *sobj =
-         st_transform_feedback_object(obj);
+   struct pipe_context *pipe = ctx->pipe;
    unsigned i, max_num_targets;
    unsigned offsets[PIPE_MAX_SO_BUFFERS] = {0};
 
-   max_num_targets = MIN2(ARRAY_SIZE(sobj->base.Buffers),
-                          ARRAY_SIZE(sobj->targets));
+   max_num_targets = MIN2(ARRAY_SIZE(obj->Buffers),
+                          ARRAY_SIZE(obj->targets));
 
    /* Convert the transform feedback state into the gallium representation. */
    for (i = 0; i < max_num_targets; i++) {
-      struct gl_buffer_object *bo = sobj->base.Buffers[i];
+      struct gl_buffer_object *bo = obj->Buffers[i];
 
       if (bo && bo->buffer) {
          unsigned stream = obj->program->sh.LinkedTransformFeedback->
             Buffers[i].Stream;
 
          /* Check whether we need to recreate the target. */
-         if (!sobj->targets[i] ||
-             sobj->targets[i] == sobj->draw_count[stream] ||
-             sobj->targets[i]->buffer != bo->buffer ||
-             sobj->targets[i]->buffer_offset != sobj->base.Offset[i] ||
-             sobj->targets[i]->buffer_size != sobj->base.Size[i]) {
+         if (!obj->targets[i] ||
+             obj->targets[i] == obj->draw_count[stream] ||
+             obj->targets[i]->buffer != bo->buffer ||
+             obj->targets[i]->buffer_offset != obj->Offset[i] ||
+             obj->targets[i]->buffer_size != obj->Size[i]) {
             /* Create a new target. */
             struct pipe_stream_output_target *so_target =
                   pipe->create_stream_output_target(pipe, bo->buffer,
-                                                    sobj->base.Offset[i],
-                                                    sobj->base.Size[i]);
+                                                    obj->Offset[i],
+                                                    obj->Size[i]);
 
-            pipe_so_target_reference(&sobj->targets[i], NULL);
-            sobj->targets[i] = so_target;
+            pipe_so_target_reference(&obj->targets[i], NULL);
+            obj->targets[i] = so_target;
          }
 
-         sobj->num_targets = i+1;
+         obj->num_targets = i+1;
       } else {
-         pipe_so_target_reference(&sobj->targets[i], NULL);
+         pipe_so_target_reference(&obj->targets[i], NULL);
       }
    }
 
    /* Start writing at the beginning of each target. */
-   cso_set_stream_outputs(st->cso_context, sobj->num_targets,
-                          sobj->targets, offsets);
+   cso_set_stream_outputs(st->cso_context, obj->num_targets,
+                          obj->targets, offsets);
 }
 
 
@@ -165,16 +112,14 @@ st_resume_transform_feedback(struct gl_context *ctx,
                              struct gl_transform_feedback_object *obj)
 {
    struct st_context *st = st_context(ctx);
-   struct st_transform_feedback_object *sobj =
-      st_transform_feedback_object(obj);
    unsigned offsets[PIPE_MAX_SO_BUFFERS];
    unsigned i;
 
    for (i = 0; i < PIPE_MAX_SO_BUFFERS; i++)
       offsets[i] = (unsigned)-1;
 
-   cso_set_stream_outputs(st->cso_context, sobj->num_targets,
-                          sobj->targets, offsets);
+   cso_set_stream_outputs(st->cso_context, obj->num_targets,
+                          obj->targets, offsets);
 }
 
 void
@@ -182,8 +127,6 @@ st_end_transform_feedback(struct gl_context *ctx,
                           struct gl_transform_feedback_object *obj)
 {
    struct st_context *st = st_context(ctx);
-   struct st_transform_feedback_object *sobj =
-         st_transform_feedback_object(obj);
    unsigned i;
 
    cso_set_stream_outputs(st->cso_context, 0, NULL, NULL);
@@ -194,18 +137,18 @@ st_end_transform_feedback(struct gl_context *ctx,
     *
     * NULL means the vertex counter is 0 (initial state).
     */
-   for (i = 0; i < ARRAY_SIZE(sobj->draw_count); i++)
-      pipe_so_target_reference(&sobj->draw_count[i], NULL);
+   for (i = 0; i < ARRAY_SIZE(obj->draw_count); i++)
+      pipe_so_target_reference(&obj->draw_count[i], NULL);
 
-   for (i = 0; i < ARRAY_SIZE(sobj->targets); i++) {
+   for (i = 0; i < ARRAY_SIZE(obj->targets); i++) {
       unsigned stream = obj->program->sh.LinkedTransformFeedback->
          Buffers[i].Stream;
 
       /* Is it not bound or already set for this stream? */
-      if (!sobj->targets[i] || sobj->draw_count[stream])
+      if (!obj->targets[i] || obj->draw_count[stream])
          continue;
 
-      pipe_so_target_reference(&sobj->draw_count[stream], sobj->targets[i]);
+      pipe_so_target_reference(&obj->draw_count[stream], obj->targets[i]);
    }
 }
 
@@ -215,9 +158,6 @@ st_transform_feedback_draw_init(struct gl_transform_feedback_object *obj,
                                 unsigned stream,
                                 struct pipe_draw_indirect_info *out)
 {
-   struct st_transform_feedback_object *sobj =
-         st_transform_feedback_object(obj);
-
-   out->count_from_stream_output = sobj->draw_count[stream];
+   out->count_from_stream_output = obj->draw_count[stream];
    return out->count_from_stream_output != NULL;
 }
diff --git a/src/mesa/state_tracker/st_cb_xformfb.h b/src/mesa/state_tracker/st_cb_xformfb.h
index b51f6018766..b2fbea58012 100644
--- a/src/mesa/state_tracker/st_cb_xformfb.h
+++ b/src/mesa/state_tracker/st_cb_xformfb.h
@@ -32,13 +32,6 @@
 struct gl_transform_feedback_object;
 struct pipe_draw_indirect_info;
 
-struct gl_transform_feedback_object *
-st_new_transform_feedback(struct gl_context *ctx, GLuint name);
-
-void
-st_delete_transform_feedback(struct gl_context *ctx,
-                             struct gl_transform_feedback_object *obj);
-
 void
 st_begin_transform_feedback(struct gl_context *ctx, GLenum mode,
                             struct gl_transform_feedback_object *obj);



More information about the mesa-commit mailing list