#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"
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.
*/
if (oldObj->RefCount == 0) {
GET_CURRENT_CONTEXT(ctx);
if (ctx)
- st_delete_transform_feedback(ctx, oldObj);
+ delete_transform_feedback(ctx, oldObj);
}
*ptr = NULL;
{
/* 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);
struct gl_transform_feedback_object *obj =
(struct gl_transform_feedback_object *) data;
- st_delete_transform_feedback(ctx, obj);
+ delete_transform_feedback(ctx, obj);
}
_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.
*
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;
#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? */
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);
}
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
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);
*
* 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]);
}
}
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;
}