From 7142da6dd1b12f203a7daaa7d79235da8b5bc721 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 7 Jun 2013 13:11:49 +0800 Subject: [PATCH] ilo: use slab allocator for transfers Slab allocator is perfect for transfer. Improved OpenArena performance by 1% with several casual runs. --- src/gallium/drivers/ilo/ilo_context.c | 5 +++++ src/gallium/drivers/ilo/ilo_context.h | 3 +++ src/gallium/drivers/ilo/ilo_transfer.c | 31 +++----------------------- src/gallium/drivers/ilo/ilo_transfer.h | 28 +++++++++++++++++++++++ 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/gallium/drivers/ilo/ilo_context.c b/src/gallium/drivers/ilo/ilo_context.c index a3b1c5e4d92..46d360a7b4a 100644 --- a/src/gallium/drivers/ilo/ilo_context.c +++ b/src/gallium/drivers/ilo/ilo_context.c @@ -96,6 +96,8 @@ ilo_context_destroy(struct pipe_context *pipe) if (ilo->last_cp_bo) ilo->last_cp_bo->unreference(ilo->last_cp_bo); + util_slab_destroy(&ilo->transfer_mempool); + if (ilo->blitter) util_blitter_destroy(ilo->blitter); if (ilo->hw3d) @@ -134,6 +136,9 @@ ilo_context_create(struct pipe_screen *screen, void *priv) ilo_cp_set_flush_callback(ilo->cp, ilo_context_cp_flushed, (void *) ilo); + util_slab_create(&ilo->transfer_mempool, + sizeof(struct ilo_transfer), 64, UTIL_SLAB_SINGLETHREADED); + ilo->dirty = ILO_DIRTY_ALL; ilo->base.screen = screen; diff --git a/src/gallium/drivers/ilo/ilo_context.h b/src/gallium/drivers/ilo/ilo_context.h index b05ffe4ad93..02c4c0a8ec1 100644 --- a/src/gallium/drivers/ilo/ilo_context.h +++ b/src/gallium/drivers/ilo/ilo_context.h @@ -29,6 +29,7 @@ #define ILO_CONTEXT_H #include "pipe/p_context.h" +#include "util/u_slab.h" #include "ilo_gpe.h" #include "ilo_common.h" @@ -50,6 +51,8 @@ struct ilo_context { struct ilo_cp *cp; struct intel_bo *last_cp_bo; + struct util_slab_mempool transfer_mempool; + struct ilo_shader_cache *shader_cache; struct ilo_3d *hw3d; struct blitter_context *blitter; diff --git a/src/gallium/drivers/ilo/ilo_transfer.c b/src/gallium/drivers/ilo/ilo_transfer.c index 4d6e3262a99..5bdace2da81 100644 --- a/src/gallium/drivers/ilo/ilo_transfer.c +++ b/src/gallium/drivers/ilo/ilo_transfer.c @@ -34,32 +34,6 @@ #include "ilo_resource.h" #include "ilo_transfer.h" -enum ilo_transfer_map_method { - /* map() / map_gtt() / map_unsynchronized() */ - ILO_TRANSFER_MAP_CPU, - ILO_TRANSFER_MAP_GTT, - ILO_TRANSFER_MAP_UNSYNC, - - /* use staging system buffer */ - ILO_TRANSFER_MAP_SW_CONVERT, - ILO_TRANSFER_MAP_SW_ZS, -}; - -struct ilo_transfer { - struct pipe_transfer base; - - enum ilo_transfer_map_method method; - void *ptr; - - void *staging_sys; -}; - -static inline struct ilo_transfer * -ilo_transfer(struct pipe_transfer *transfer) -{ - return (struct ilo_transfer *) transfer; -} - static bool is_bo_busy(struct ilo_context *ilo, struct intel_bo *bo, bool *need_flush) { @@ -993,7 +967,8 @@ ilo_transfer_unmap(struct pipe_context *pipe, tex_unmap(ilo, xfer); pipe_resource_reference(&xfer->base.resource, NULL); - FREE(xfer); + + util_slab_free(&ilo->transfer_mempool, xfer); } static void * @@ -1008,7 +983,7 @@ ilo_transfer_map(struct pipe_context *pipe, struct ilo_transfer *xfer; bool success; - xfer = MALLOC_STRUCT(ilo_transfer); + xfer = util_slab_alloc(&ilo->transfer_mempool); if (!xfer) { *transfer = NULL; return NULL; diff --git a/src/gallium/drivers/ilo/ilo_transfer.h b/src/gallium/drivers/ilo/ilo_transfer.h index 25bcc442ffc..3ba4bacf749 100644 --- a/src/gallium/drivers/ilo/ilo_transfer.h +++ b/src/gallium/drivers/ilo/ilo_transfer.h @@ -28,10 +28,38 @@ #ifndef ILO_TRANSFER_H #define ILO_TRANSFER_H +#include "pipe/p_state.h" + #include "ilo_common.h" +enum ilo_transfer_map_method { + /* map() / map_gtt() / map_unsynchronized() */ + ILO_TRANSFER_MAP_CPU, + ILO_TRANSFER_MAP_GTT, + ILO_TRANSFER_MAP_UNSYNC, + + /* use staging system buffer */ + ILO_TRANSFER_MAP_SW_CONVERT, + ILO_TRANSFER_MAP_SW_ZS, +}; + +struct ilo_transfer { + struct pipe_transfer base; + + enum ilo_transfer_map_method method; + void *ptr; + + void *staging_sys; +}; + struct ilo_context; +static inline struct ilo_transfer * +ilo_transfer(struct pipe_transfer *transfer) +{ + return (struct ilo_transfer *) transfer; +} + void ilo_init_transfer_functions(struct ilo_context *ilo); -- 2.30.2