From d269634fcd8c32e648ecef4e9c5386bad165569c Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 31 Mar 2020 15:26:18 +1000 Subject: [PATCH] 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 Part-of: --- src/gallium/drivers/llvmpipe/lp_scene.c | 11 +++++++---- src/gallium/drivers/llvmpipe/lp_scene.h | 3 ++- src/gallium/drivers/llvmpipe/lp_setup.c | 6 +++++- src/gallium/drivers/llvmpipe/lp_setup_context.h | 3 +++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c index 49db1832ead..5cd6438403d 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.c +++ b/src/gallium/drivers/llvmpipe/lp_scene.c @@ -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); } diff --git a/src/gallium/drivers/llvmpipe/lp_scene.h b/src/gallium/drivers/llvmpipe/lp_scene.h index a089e6a4983..95735998680 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.h +++ b/src/gallium/drivers/llvmpipe/lp_scene.h @@ -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); diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index c2a4617c313..243c56a8544 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -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; } diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h index 6764e8ae5a1..20cbc6baa13 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_context.h +++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h @@ -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 */