iris: slab allocate transfers
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 6 Jul 2018 18:29:51 +0000 (11:29 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:07 +0000 (10:26 -0800)
apparently we need this for u_threaded_context

src/gallium/drivers/iris/iris_context.c
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_resource.c
src/gallium/drivers/iris/iris_resource.h
src/gallium/drivers/iris/iris_screen.c
src/gallium/drivers/iris/iris_screen.h

index 155d3932cb68e21f805f15aa1a1e703cb22ab2ab..9d0ec83afb499791023c6457fb1ff1e2c297b51b 100644 (file)
@@ -84,6 +84,8 @@ iris_destroy_context(struct pipe_context *ctx)
    u_upload_destroy(ice->state.surface_uploader);
    u_upload_destroy(ice->state.dynamic_uploader);
 
+   slab_destroy_child(&ice->transfer_pool);
+
    iris_batch_free(&ice->render_batch);
 
    ralloc_free(ice);
@@ -138,6 +140,8 @@ iris_create_context(struct pipe_screen *pscreen, void *priv, unsigned flags)
    iris_init_program_cache(ice);
    iris_init_border_color_pool(ice);
 
+   slab_create_child(&ice->transfer_pool, &screen->transfer_pool);
+
    ice->state.surface_uploader =
       u_upload_create(&ice->ctx, 16384, PIPE_BIND_CUSTOM, PIPE_USAGE_IMMUTABLE,
                       IRIS_RESOURCE_FLAG_SURFACE_MEMZONE);
index 6f3112ab4aff9ed1fed390d28dab00ecbcc2b63c..4d1b616750a5fe13c434ff4a1b332631c2c27362 100644 (file)
@@ -229,6 +229,8 @@ struct iris_context {
 
    struct pipe_debug_callback dbg;
 
+   struct slab_child_pool transfer_pool;
+
    struct iris_vtable vtbl;
 
    struct {
index 9327fbc66720fc920304b9fccf8ea884533390dc..3a16e54b2b305e9e1895595b29cee7196d53891c 100644 (file)
@@ -394,18 +394,6 @@ iris_resource_get_handle(struct pipe_screen *pscreen,
    return false;
 }
 
-struct iris_transfer {
-   struct pipe_transfer base;
-   struct pipe_debug_callback *dbg;
-   void *buffer;
-   void *ptr;
-
-   /** Stride of the temporary image (not the actual surface) */
-   int temp_stride;
-
-   void (*unmap)(struct iris_transfer *);
-};
-
 /* Compute extent parameters for use with tiled_memcpy functions.
  * xs are in units of bytes and ys are in units of strides.
  */
@@ -535,7 +523,7 @@ iris_transfer_map(struct pipe_context *ctx,
    if ((usage & PIPE_TRANSFER_DONTBLOCK) && iris_bo_busy(res->bo))
       return NULL;
 
-   struct iris_transfer *map = calloc(1, sizeof(struct iris_transfer));
+   struct iris_transfer *map = slab_alloc(&ice->transfer_pool);
    struct pipe_transfer *xfer = &map->base;
 
    // PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE
@@ -544,6 +532,7 @@ iris_transfer_map(struct pipe_context *ctx,
    if (!map)
       return NULL;
 
+   memset(map, 0, sizeof(*map));
    map->dbg = &ice->dbg;
 
    pipe_resource_reference(&xfer->resource, resource);
@@ -578,15 +567,16 @@ iris_transfer_flush_region(struct pipe_context *pipe,
 }
 
 static void
-iris_transfer_unmap(struct pipe_context *pipe, struct pipe_transfer *xfer)
+iris_transfer_unmap(struct pipe_context *ctx, struct pipe_transfer *xfer)
 {
+   struct iris_context *ice = (struct iris_context *)ctx;
    struct iris_transfer *map = (void *) xfer;
 
    if (map->unmap)
       map->unmap(map);
 
    pipe_resource_reference(&xfer->resource, NULL);
-   free(map);
+   slab_free(&ice->transfer_pool, map);
 }
 
 static void
index 3280dc1c49cd8adf2d15fe1f0f3871fe5dd55018..22817193795b8c96dee7c945df46a677bc77a428 100644 (file)
@@ -61,4 +61,16 @@ struct iris_surface {
    struct iris_state_ref surface_state;
 };
 
+struct iris_transfer {
+   struct pipe_transfer base;
+   struct pipe_debug_callback *dbg;
+   void *buffer;
+   void *ptr;
+
+   /** Stride of the temporary image (not the actual surface) */
+   int temp_stride;
+
+   void (*unmap)(struct iris_transfer *);
+};
+
 #endif
index 98bbd680e8ab8ebbc0ebf6f2304e64f2aeea7245..0401bd230bf6f1553e929860d5e5fd0531ec7872 100644 (file)
@@ -547,6 +547,9 @@ iris_screen_create(int fd)
    screen->compiler->shader_debug_log = iris_shader_debug_log;
    screen->compiler->shader_perf_log = iris_shader_perf_log;
 
+   slab_create_parent(&screen->transfer_pool,
+                      sizeof(struct iris_transfer), 64);
+
    struct pipe_screen *pscreen = &screen->base;
 
    iris_init_screen_resource_functions(pscreen);
index a06d2c34391988d0892e2d8e3a8143fae39dbe0c..4798f2255db81e4ceddeb4785d93dedf381cc42d 100644 (file)
@@ -38,6 +38,9 @@ struct iris_bo;
 
 struct iris_screen {
    struct pipe_screen base;
+
+   struct slab_parent_pool transfer_pool;
+
    int fd;
    int pci_id;