summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/ilo
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2013-06-07 13:11:49 +0800
committerChia-I Wu <[email protected]>2013-06-07 13:23:43 +0800
commit7142da6dd1b12f203a7daaa7d79235da8b5bc721 (patch)
tree938892e0fef57d277b38307f337b71d33210d113 /src/gallium/drivers/ilo
parent09f62a13fcddd237e7a3aef6185377f9a585a332 (diff)
ilo: use slab allocator for transfers
Slab allocator is perfect for transfer. Improved OpenArena performance by 1% with several casual runs.
Diffstat (limited to 'src/gallium/drivers/ilo')
-rw-r--r--src/gallium/drivers/ilo/ilo_context.c5
-rw-r--r--src/gallium/drivers/ilo/ilo_context.h3
-rw-r--r--src/gallium/drivers/ilo/ilo_transfer.c31
-rw-r--r--src/gallium/drivers/ilo/ilo_transfer.h28
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);