aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIcecream95 <[email protected]>2020-01-16 09:51:17 +1300
committerMarge Bot <[email protected]>2020-01-18 13:58:43 +0000
commit5e8386c606293de4f9cbbc2666a9e9e3758b6b29 (patch)
tree231b60c2bbaf7229911aa2eaa7e48558600ea9df /src
parentc0ba9000d21ee22a25fec0b3338ea53184dd1130 (diff)
panfrost: Compact the bo_access readers array
Previously, the array bo_access->readers was only cleared when there were no unsignaled fences, which in some situations never happened. That resulted in the array having thousands of NULL pointers, but only a handful of active readers. With this patch, all the unsignaled readers are moved to the front of the array, effectively building a new array only containing the active readers in-place. This results in the readers array usually only having a couple of elements. Reviewed-by: Boris Brezillon <[email protected]> Reviewed-by: Alyssa Rosenzweig <[email protected]> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3419> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3419>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/panfrost/pan_job.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c
index 1b7d370b998..8ec00022999 100644
--- a/src/gallium/drivers/panfrost/pan_job.c
+++ b/src/gallium/drivers/panfrost/pan_job.c
@@ -346,7 +346,9 @@ panfrost_bo_access_gc_fences(struct panfrost_context *ctx,
access->writer = NULL;
}
- unsigned nreaders = 0;
+ struct panfrost_batch_fence **readers_array = util_dynarray_begin(&access->readers);
+ struct panfrost_batch_fence **new_readers = readers_array;
+
util_dynarray_foreach(&access->readers, struct panfrost_batch_fence *,
reader) {
if (!(*reader))
@@ -356,12 +358,15 @@ panfrost_bo_access_gc_fences(struct panfrost_context *ctx,
panfrost_batch_fence_unreference(*reader);
*reader = NULL;
} else {
- nreaders++;
+ /* Build a new array of only unsignaled fences in-place */
+ *(new_readers++) = *reader;
}
}
- if (!nreaders)
- util_dynarray_clear(&access->readers);
+ if (!util_dynarray_resize(&access->readers, struct panfrost_batch_fence *,
+ new_readers - readers_array) &&
+ new_readers != readers_array)
+ unreachable("Invalid dynarray access->readers");
}
/* Collect signaled fences to keep the kernel-side syncobj-map small. The