Module: Mesa
Branch: main
Commit: ffd91ee7a87f588ea9d1f2f6ced4a59bde142cb2
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ffd91ee7a87f588ea9d1f2f6ced4a59bde142cb2

Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Feb 10 09:36:30 2023 -0500

zink: fix descriptor pool free iterating

these arrays are sparsely allocated, and using pop() on them will
fail to access some elements

Fixes: cf7c17a7af3 ("zink: rework descriptor pool overflow")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21246>

---

 src/gallium/drivers/zink/zink_descriptors.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_descriptors.c 
b/src/gallium/drivers/zink/zink_descriptors.c
index 68f0ef07fe0..a8782cab657 100644
--- a/src/gallium/drivers/zink/zink_descriptors.c
+++ b/src/gallium/drivers/zink/zink_descriptors.c
@@ -1406,11 +1406,11 @@ void
 zink_batch_descriptor_deinit(struct zink_screen *screen, struct 
zink_batch_state *bs)
 {
    for (unsigned i = 0; i < ZINK_DESCRIPTOR_BASE_TYPES; i++) {
-      while (util_dynarray_contains(&bs->dd.pools[i], struct 
zink_descriptor_pool_multi *)) {
-         struct zink_descriptor_pool_multi *mpool = 
util_dynarray_pop(&bs->dd.pools[i], struct zink_descriptor_pool_multi *);
-         if (mpool) {
-            deinit_multi_pool_overflow(screen, mpool);
-            multi_pool_destroy(screen, mpool);
+      for (unsigned j = 0; j < bs->dd.pools[i].capacity / sizeof(struct 
zink_descriptor_pool_multi *); j++) {
+         struct zink_descriptor_pool_multi **mppool = 
util_dynarray_element(&bs->dd.pools[i], struct zink_descriptor_pool_multi *, j);
+         if (mppool && *mppool) {
+            deinit_multi_pool_overflow(screen, *mppool);
+            multi_pool_destroy(screen, *mppool);
          }
       }
       util_dynarray_fini(&bs->dd.pools[i]);

Reply via email to