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:
parent
d89f91d54c
commit
d269634fcd
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue