zink: refcount the correct query pool
authorSoroushIMG <soroush.kashani@imgtec.com>
Wed, 19 Apr 2023 21:10:15 +0000 (22:10 +0100)
committerMarge Bot <emma+marge@anholt.net>
Mon, 24 Apr 2023 08:28:25 +0000 (08:28 +0000)
otherwise the pool is freed before the query and zink will
give the vulkan driver NULL query pool which can make it crash.

this was seen when running the following cases with
primitivesGeneratedQueryWithRasterizerDiscard and color write
features disabled:
dEQP-GL45.functional.tessellation.invariance.outer_triangle_set.triangles_fractional_odd_spacing
dEQP-GL45.functional.tessellation.invariance.outer_triangle_set.triangles_fractional_even_spacing
dEQP-GL45.functional.tessellation.invariance.outer_triangle_set.quads_equal_spacing
dEQP-GL45.functional.tessellation.invariance.outer_triangle_set.quads_fractional_odd_spacing
dEQP-GL45.functional.tessellation.invariance.outer_triangle_set.quads_fractional_even_spacing
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_equal_spacing_ccw
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_equal_spacing_ccw_point_mode
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_equal_spacing_cw
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_equal_spacing_cw_point_mode
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_fractional_odd_spacing_ccw
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_fractional_odd_spacing_ccw_point_mode
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_fractional_odd_spacing_cw
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_fractional_odd_spacing_cw_point_mode
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_fractional_even_spacing_ccw
dEQP-GL45.functional.tessellation.invariance.tess_coord_component_range.triangles_fractional_even_spacing_ccw_point_mode

Fixes: e5d517f3622 ("zink: rework query pool overflow")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22575>

src/gallium/drivers/zink/zink_query.c

index 5713ff2..59bc575 100644 (file)
@@ -468,8 +468,6 @@ query_pool_get_range(struct zink_context *ctx, struct zink_query *q)
          vkq->pool->refcount++;
       } else {
          struct zink_query_pool *pool = find_or_allocate_qp(ctx, q, pool_idx);
-         pool->refcount++;
-         pool->last_range++;
          if (pool->last_range == NUM_QUERIES) {
             list_del(&pool->list);
             pool = find_or_allocate_qp(ctx, q, pool_idx);
@@ -480,12 +478,12 @@ query_pool_get_range(struct zink_context *ctx, struct zink_query *q)
             return;
          }
 
+         pool->refcount++;
          vkq->refcount = 1;
          vkq->needs_reset = true;
          vkq->pool = pool;
          vkq->started = false;
-         vkq->query_id = pool->last_range;
-
+         vkq->query_id = pool->last_range++;
       }
       unref_vk_query(ctx, start->vkq[i]);
       start->vkq[i] = vkq;