zink: rework/improve descriptor pool overflow handling on batch reset
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 12 Oct 2022 14:48:14 +0000 (10:48 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 13 Oct 2022 03:02:59 +0000 (03:02 +0000)
commit43dcdf33654d52624e6afb0444b71de85bcf5448
treeeb344e3888ff0c223acf127345e3852a15a2a32b
parent340cfa1001eabb81812ad4c311c75e7279d3feb3
zink: rework/improve descriptor pool overflow handling on batch reset

the existing model for descriptor pools works thusly:
* allocate pool
  * when possible, reuse existing pool from overflow array
* when pool is full, append to overflow array
* on batch reset, cycle the overflow arrays to enable reuse

the problem with this is it uses two separate arrays for overflow, and these arrays
are cycled but never consolidated, leading to wasted memory allocations for whichever
array is not currently being recycled

to resolve this, make the following changes to batch resets:
* set the recycle index to whichever overflow array is smaller
* copy the elements from the smaller array to the larger array (consolidate)
* set the number of elements in the smaller array to 0

this leads to always appending to an empty array while the array containing all the
"free" pools is always the one that's available for recycled use

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19053>
src/gallium/drivers/zink/zink_descriptors.c