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