From 3291050cc18c4bd1b5244ca4f79a4b928f74386c Mon Sep 17 00:00:00 2001 From: SoroushIMG Date: Wed, 19 Apr 2023 22:10:15 +0100 Subject: [PATCH] zink: refcount the correct query pool 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: --- src/gallium/drivers/zink/zink_query.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c index 5713ff2f719..59bc5757f58 100644 --- a/src/gallium/drivers/zink/zink_query.c +++ b/src/gallium/drivers/zink/zink_query.c @@ -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;