From b51e40ebdecea4bfe0afa8200d068fc35798596f Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 19 May 2022 10:57:40 +0200 Subject: [PATCH] st/mesa: use mutex in st_get_texture_sampler_view_from_stobj MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit st_texture_release_all_sampler_views uses the validate_mutex, but st_get_texture_sampler_view_from_stobj didn't. Since they both modify stObj->view we could have threadA in st_get_texture_sampler_view_from_stobj with a non-NULL sv, so expecting sv->view to be non-NULL, while threadB was in st_texture_release_all_sampler_views clearing sv->view. It's also needed to protect st_sampler_view::private_refcount, which is supposed to be used from the owning context thread, but can also be used by any context in st_texture_release_all_sampler_views. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6088 Fixes: ef5d4274132 ("st/mesa: add a mechanism to bypass atomics when binding sampler views") Reviewed-by: Marek Olšák Part-of: --- src/mesa/state_tracker/st_sampler_view.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c index 969cfa90d72..c3f665b7921 100644 --- a/src/mesa/state_tracker/st_sampler_view.c +++ b/src/mesa/state_tracker/st_sampler_view.c @@ -87,14 +87,15 @@ st_texture_set_sampler_view(struct st_context *st, struct gl_texture_object *stObj, struct pipe_sampler_view *view, bool glsl130_or_later, bool srgb_skip_decode, - bool get_reference) + bool get_reference, bool locked) { struct st_sampler_views *views; struct st_sampler_view *free = NULL; struct st_sampler_view *sv; GLuint i; - simple_mtx_lock(&stObj->validate_mutex); + if (!locked) + simple_mtx_lock(&stObj->validate_mutex); views = stObj->sampler_views; for (i = 0; i < views->count; ++i) { @@ -187,7 +188,8 @@ found: view = get_sampler_view_reference(sv, view); out: - simple_mtx_unlock(&stObj->validate_mutex); + if (!locked) + simple_mtx_unlock(&stObj->validate_mutex); return view; } @@ -633,6 +635,7 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st, if (!ignore_srgb_decode && samp->Attrib.sRGBDecode == GL_SKIP_DECODE_EXT) srgb_skip_decode = true; + simple_mtx_lock(&texObj->validate_mutex); sv = st_texture_get_current_sampler_view(st, texObj); if (sv && @@ -658,6 +661,7 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st, texObj->layer_override == view->u.tex.last_layer)); if (get_reference) view = get_sampler_view_reference(sv, view); + simple_mtx_unlock(&texObj->validate_mutex); return view; } @@ -670,7 +674,9 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st, view = st_texture_set_sampler_view(st, texObj, view, glsl130_or_later, srgb_skip_decode, - get_reference); + get_reference, true); + simple_mtx_unlock(&texObj->validate_mutex); + return view; } @@ -742,7 +748,7 @@ st_get_buffer_sampler_view_from_stobj(struct st_context *st, st->pipe->create_sampler_view(st->pipe, buf, &templ); view = st_texture_set_sampler_view(st, texObj, view, false, false, - get_reference); + get_reference, false); return view; }