From ba43727af6632a1ca40ab30debc1c19e904fe068 Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Wed, 20 Aug 2025 10:18:13 +0200 Subject: [PATCH] gallium: Set and count all extra samplers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After the commit mentioned below the `extra` variable only holds the last added extra sampler. For 3-plane formats this results in one extra sampler being leaked. Add the bits for each extra sampler instead. Fixes: abcd02a07db (gallium: Properly handle non-contiguous used sampler view indexes) Signed-off-by: Robert Mader Reviewed-by: Marek Olšák Tested-by: Matthias Reichl Part-of: (cherry picked from commit 25fe82630a629d0fb2e86a32124af4ff41ba1086) --- .pick_status.json | 2 +- src/mesa/state_tracker/st_atom_texture.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index aebda264977..c4033f1cd15 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -6144,7 +6144,7 @@ "description": "gallium: Set and count all extra samplers", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "abcd02a07db11b8cb56ca5de754efa3355eeb2cb", "notes": null diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index 27c9e6eb7f7..142f550f1c6 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -187,6 +187,7 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; case PIPE_FORMAT_NV12: if (stObj->pt->format == PIPE_FORMAT_R8_G8B8_420_UNORM) @@ -199,6 +200,7 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; case PIPE_FORMAT_NV21: if (stObj->pt->format == PIPE_FORMAT_R8_B8G8_420_UNORM) @@ -211,6 +213,7 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; case PIPE_FORMAT_P010: case PIPE_FORMAT_P012: @@ -222,6 +225,7 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; case PIPE_FORMAT_IYUV: if (stObj->pt->format == PIPE_FORMAT_R8_G8_B8_420_UNORM || @@ -234,9 +238,11 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; case PIPE_FORMAT_Y10X6_U10X6_V10X6_420_UNORM: case PIPE_FORMAT_Y10X6_U10X6_V10X6_422_UNORM: @@ -252,9 +258,11 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; case PIPE_FORMAT_YUYV: case PIPE_FORMAT_YVYU: @@ -270,6 +278,7 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; case PIPE_FORMAT_UYVY: case PIPE_FORMAT_VYUY: @@ -285,6 +294,7 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; case PIPE_FORMAT_Y210: case PIPE_FORMAT_Y212: @@ -296,14 +306,12 @@ st_get_sampler_views(struct st_context *st, extra = u_bit_scan(&free_slots); sampler_views[extra] = pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl); + (*extra_sampler_views) |= 1 << extra; break; default: break; } - if (extra) - (*extra_sampler_views) |= 1 << extra; - num_textures = MAX2(num_textures, extra + 1); }