llvmpipe/scene: move to slab allocated objects for scenes.

Currently we only allocate one scene, but I'd like to increase that
so move it to a slab allocator.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14923>
This commit is contained in:
Dave Airlie 2020-03-31 15:26:18 +10:00 committed by Marge Bot
parent d89f91d54c
commit d269634fcd
4 changed files with 17 additions and 6 deletions

View File

@ -37,6 +37,7 @@
#include "lp_context.h"
#include "lp_state_fs.h"
#include "lp_setup_context.h"
#define RESOURCE_REF_SZ 32
@ -61,13 +62,15 @@ struct shader_ref {
* \param queue the queue to put newly rendered/emptied scenes into
*/
struct lp_scene *
lp_scene_create( struct pipe_context *pipe )
lp_scene_create( struct lp_setup_context *setup )
{
struct lp_scene *scene = CALLOC_STRUCT(lp_scene);
struct lp_scene *scene = slab_alloc_st(&setup->scene_slab);
if (!scene)
return NULL;
scene->pipe = pipe;
memset(scene, 0, sizeof(struct lp_scene));
scene->pipe = setup->pipe;
scene->setup = setup;
scene->data.head = &scene->data.first;
(void) mtx_init(&scene->mutex, mtx_plain);
@ -100,7 +103,7 @@ lp_scene_destroy(struct lp_scene *scene)
lp_fence_reference(&scene->fence, NULL);
mtx_destroy(&scene->mutex);
assert(scene->data.head == &scene->data.first);
FREE(scene);
slab_free_st(&scene->setup->scene_slab, scene);
}

View File

@ -140,6 +140,7 @@ struct lp_scene_surface {
struct lp_scene {
struct pipe_context *pipe;
struct lp_fence *fence;
struct lp_setup_context *setup;
/* The queries still active at end of scene */
struct llvmpipe_query *active_queries[LP_MAX_ACTIVE_BINNED_QUERIES];
@ -199,7 +200,7 @@ struct lp_scene {
struct lp_scene *lp_scene_create(struct pipe_context *pipe);
struct lp_scene *lp_scene_create(struct lp_setup_context *setup);
void lp_scene_destroy(struct lp_scene *scene);

View File

@ -1544,6 +1544,7 @@ lp_setup_destroy( struct lp_setup_context *setup )
lp_scene_destroy(scene);
}
slab_destroy(&setup->scene_slab);
lp_fence_reference(&setup->last_fence, NULL);
FREE( setup );
@ -1584,9 +1585,12 @@ lp_setup_create( struct pipe_context *pipe,
draw_set_rasterize_stage(draw, setup->vbuf);
draw_set_render(draw, &setup->base);
slab_create(&setup->scene_slab,
sizeof(struct lp_scene),
MAX_SCENES);
/* create some empty scenes */
for (i = 0; i < MAX_SCENES; i++) {
setup->scenes[i] = lp_scene_create( pipe );
setup->scenes[i] = lp_scene_create( setup );
if (!setup->scenes[i]) {
goto no_scenes;
}

View File

@ -43,6 +43,7 @@
#include "draw/draw_vbuf.h"
#include "util/u_rect.h"
#include "util/u_pack_color.h"
#include "util/slab.h"
#define LP_SETUP_NEW_FS 0x01
#define LP_SETUP_NEW_CONSTANTS 0x02
@ -89,6 +90,8 @@ struct lp_setup_context
struct draw_stage *vbuf;
unsigned num_threads;
unsigned scene_idx;
struct slab_mempool scene_slab;
struct lp_scene *scenes[MAX_SCENES]; /**< all the scenes */
struct lp_scene *scene; /**< current scene being built */