bs->fence.completed = true;
pop_batch_state(ctx);
zink_reset_batch_state(ctx, bs);
- util_dynarray_append(&ctx->free_batch_states, struct zink_batch_state *, bs);
+ if (ctx->last_free_batch_state)
+ ctx->last_free_batch_state->next = bs;
+ else
+ ctx->free_batch_states = bs;
+ ctx->last_free_batch_state = bs;
}
}
struct zink_screen *screen = zink_screen(ctx->base.screen);
struct zink_batch_state *bs = NULL;
- if (util_dynarray_num_elements(&ctx->free_batch_states, struct zink_batch_state*))
- bs = util_dynarray_pop(&ctx->free_batch_states, struct zink_batch_state*);
+ if (ctx->free_batch_states) {
+ bs = ctx->free_batch_states;
+ ctx->free_batch_states = bs->next;
+ if (bs == ctx->last_free_batch_state)
+ ctx->last_free_batch_state = NULL;
+ }
if (!bs && ctx->batch_states) {
/* states are stored sequentially, so if the first one doesn't work, none of them will */
if (zink_screen_check_last_finished(screen, ctx->batch_states->fence.batch_id) ||
/* this is batch init, so create a few more states for later use */
for (int i = 0; i < 3; i++) {
struct zink_batch_state *state = create_batch_state(ctx);
- util_dynarray_append(&ctx->free_batch_states, struct zink_batch_state *, state);
+ if (ctx->last_free_batch_state)
+ ctx->last_free_batch_state->next = state;
+ else
+ ctx->free_batch_states = state;
+ ctx->last_free_batch_state = state;
}
}
bs = create_batch_state(ctx);
pop_batch_state(ctx);
zink_reset_batch_state(ctx, bs);
- util_dynarray_append(&ctx->free_batch_states, struct zink_batch_state *, bs);
+ if (ctx->last_free_batch_state)
+ ctx->last_free_batch_state->next = bs;
+ else
+ ctx->free_batch_states = bs;
+ ctx->last_free_batch_state = bs;
}
if (ctx->batch_states_count > 50)
ctx->oom_flush = true;
zink_batch_state_destroy(screen, bs);
bs = bs_next;
}
- util_dynarray_foreach(&ctx->free_batch_states, struct zink_batch_state*, bs) {
- zink_clear_batch_state(ctx, *bs);
- zink_batch_state_destroy(screen, *bs);
+ bs = ctx->free_batch_states;
+ while (bs) {
+ struct zink_batch_state *bs_next = bs->next;
+ zink_clear_batch_state(ctx, bs);
+ zink_batch_state_destroy(screen, bs);
+ bs = bs_next;
}
for (unsigned i = 0; i < 2; i++) {
ctx->need_barriers[0] = &ctx->update_barriers[0][0];
ctx->need_barriers[1] = &ctx->update_barriers[1][0];
- util_dynarray_init(&ctx->free_batch_states, ctx);
-
slab_create_child(&ctx->transfer_pool, &screen->transfer_pool);
slab_create_child(&ctx->transfer_pool_unsync, &screen->transfer_pool);