summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2019-02-14 06:17:19 +0000
committerAlyssa Rosenzweig <[email protected]>2019-02-18 05:09:41 +0000
commitb5a01296f408441bda32f484da81620f7fc7e39f (patch)
treeb41814ff96c296484c0bee3f25143948cba2b3cd /src
parent535251487ba56c4fd98465c4682881c2b9734242 (diff)
panfrost: Fix various leaks unmapping resources
v2: Don't check for NULL before free() Signed-off-by: Alyssa Rosenzweig <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/panfrost/pan_resource.c19
-rw-r--r--src/gallium/drivers/panfrost/pan_screen.h4
2 files changed, 14 insertions, 9 deletions
diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c
index f2cff7c80df..1287193c0e9 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -287,16 +287,18 @@ panfrost_destroy_bo(struct panfrost_screen *screen, struct panfrost_bo *pbo)
{
struct panfrost_bo *bo = (struct panfrost_bo *)pbo;
- if (bo->entry[0] != NULL) {
- /* Most allocations have an entry to free */
- bo->entry[0]->freed = true;
- pb_slab_free(&screen->slabs, &bo->entry[0]->base);
+ for (int l = 0; l < MAX_MIP_LEVELS; ++l) {
+ if (bo->entry[l] != NULL) {
+ /* Most allocations have an entry to free */
+ bo->entry[l]->freed = true;
+ pb_slab_free(&screen->slabs, &bo->entry[l]->base);
+ }
}
if (bo->tiled) {
/* Tiled has a malloc'd CPU, so just plain ol' free needed */
- for (int l = 0; bo->cpu[l]; l++) {
+ for (int l = 0; l < MAX_MIP_LEVELS; ++l) {
free(bo->cpu[l]);
}
}
@@ -509,9 +511,10 @@ panfrost_slab_can_reclaim(void *priv, struct pb_slab_entry *entry)
static void
panfrost_slab_free(void *priv, struct pb_slab *slab)
{
- /* STUB */
- //struct panfrost_memory *mem = (struct panfrost_memory *) slab;
- printf("stub: Tried to free slab\n");
+ struct panfrost_memory *mem = (struct panfrost_memory *) slab;
+ struct panfrost_screen *screen = (struct panfrost_screen *) priv;
+
+ screen->driver->free_slab(screen, mem);
}
static void
diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h
index b89d921c71f..afb3d34b5b1 100644
--- a/src/gallium/drivers/panfrost/pan_screen.h
+++ b/src/gallium/drivers/panfrost/pan_screen.h
@@ -58,7 +58,9 @@ struct panfrost_driver {
int extra_flags,
int commit_count,
int extent);
- void (*enable_counters) (struct panfrost_screen *screen);
+ void (*free_slab) (struct panfrost_screen *screen,
+ struct panfrost_memory *mem);
+ void (*enable_counters) (struct panfrost_screen *screen);
};
struct panfrost_screen {