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; }