From 0bd99d69431ac1df3f017858ef4332b57c347dd9 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: (cherry picked from commit 3291050cc18c4bd1b5244ca4f79a4b928f74386c) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_query.c | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 9db8dd179ef..2ab965494ee 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -274,7 +274,7 @@ "description": "zink: refcount the correct query pool", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "e5d517f36228c0788be58b00bdf23aa02f4dcf0c" }, diff --git a/src/gallium/drivers/zink/zink_query.c b/src/gallium/drivers/zink/zink_query.c index 3777a9dea93..baea768928a 100644 --- a/src/gallium/drivers/zink/zink_query.c +++ b/src/gallium/drivers/zink/zink_query.c @@ -468,20 +468,18 @@ 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); } vkq = CALLOC_STRUCT(zink_vk_query); + 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;