diff options
author | Icecream95 <[email protected]> | 2020-01-16 09:51:17 +1300 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-01-18 13:58:43 +0000 |
commit | 5e8386c606293de4f9cbbc2666a9e9e3758b6b29 (patch) | |
tree | 231b60c2bbaf7229911aa2eaa7e48558600ea9df /src | |
parent | c0ba9000d21ee22a25fec0b3338ea53184dd1130 (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.c | 13 |
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 |