diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index f6ef7fa7ed3..b481f355441 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -58,7 +58,7 @@ struct pipe_sampler_view * st_update_single_texture(struct st_context *st, GLuint texUnit, bool glsl130_or_later, - bool ignore_srgb_decode) + bool ignore_srgb_decode, bool get_reference) { struct gl_context *ctx = st->ctx; struct gl_texture_object *texObj; @@ -71,7 +71,7 @@ st_update_single_texture(struct st_context *st, GLenum target = texObj->Target; if (unlikely(target == GL_TEXTURE_BUFFER)) - return st_get_buffer_sampler_view_from_stobj(st, stObj); + return st_get_buffer_sampler_view_from_stobj(st, stObj, get_reference); if (!st_finalize_texture(ctx, st->pipe, texObj, 0) || !stObj->pt) return NULL; /* out of mem */ @@ -83,7 +83,7 @@ st_update_single_texture(struct st_context *st, return st_get_texture_sampler_view_from_stobj(st, stObj, _mesa_get_samplerobj(ctx, texUnit), glsl130_or_later, - ignore_srgb_decode); + ignore_srgb_decode, get_reference); } @@ -146,11 +146,9 @@ st_get_sampler_views(struct st_context *st, * So we simply ignore the setting entirely for samplers that are * (statically) accessed with a texelFetch function. */ - struct pipe_sampler_view *sampler_view = + sampler_views[unit] = st_update_single_texture(st, prog->SamplerUnits[unit], glsl130, - texel_fetch_samplers & bit); - sampler_views[unit] = NULL; - pipe_sampler_view_reference(&sampler_views[unit], sampler_view); + texel_fetch_samplers & bit, true); } /* For any external samplers with multiplaner YUV, stuff the additional diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 1925e6f194a..a40e0f88ce3 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -3387,9 +3387,10 @@ st_NewTextureHandle(struct gl_context *ctx, struct gl_texture_object *texObj, st_convert_sampler(st, texObj, sampObj, 0, &sampler); /* TODO: Clarify the interaction of ARB_bindless_texture and EXT_texture_sRGB_decode */ - view = st_get_texture_sampler_view_from_stobj(st, stObj, sampObj, 0, true); + view = st_get_texture_sampler_view_from_stobj(st, stObj, sampObj, 0, + true, false); } else { - view = st_get_buffer_sampler_view_from_stobj(st, stObj); + view = st_get_buffer_sampler_view_from_stobj(st, stObj, false); } return pipe->create_texture_handle(pipe, view, &sampler); diff --git a/src/mesa/state_tracker/st_sampler_view.c b/src/mesa/state_tracker/st_sampler_view.c index 800d4398c5a..8a41eafd2fd 100644 --- a/src/mesa/state_tracker/st_sampler_view.c +++ b/src/mesa/state_tracker/st_sampler_view.c @@ -41,6 +41,16 @@ #include "st_cb_bufferobjects.h" #include "st_cb_texture.h" +/* Return a sampler view while incrementing the refcount by 1. */ +static struct pipe_sampler_view * +get_sampler_view_reference(struct st_sampler_view *sv, + struct pipe_sampler_view *view) +{ + struct pipe_sampler_view *ret = NULL; + + pipe_sampler_view_reference(&ret, view); + return ret; +} /** * Set the given view as the current context's view for the texture. @@ -57,7 +67,8 @@ static struct pipe_sampler_view * st_texture_set_sampler_view(struct st_context *st, struct st_texture_object *stObj, struct pipe_sampler_view *view, - bool glsl130_or_later, bool srgb_skip_decode) + bool glsl130_or_later, bool srgb_skip_decode, + bool get_reference) { struct st_sampler_views *views; struct st_sampler_view *free = NULL; @@ -152,6 +163,9 @@ found: sv->view = view; sv->st = st; + if (get_reference) + view = get_sampler_view_reference(sv, view); + out: simple_mtx_unlock(&stObj->validate_mutex); return view; @@ -582,13 +596,13 @@ st_create_texture_sampler_view_from_stobj(struct st_context *st, return st->pipe->create_sampler_view(st->pipe, stObj->pt, &templ); } - struct pipe_sampler_view * st_get_texture_sampler_view_from_stobj(struct st_context *st, struct st_texture_object *stObj, const struct gl_sampler_object *samp, bool glsl130_or_later, - bool ignore_srgb_decode) + bool ignore_srgb_decode, + bool get_reference) { struct st_sampler_view *sv; bool srgb_skip_decode = false; @@ -619,6 +633,8 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st, assert(stObj->layer_override < 0 || (stObj->layer_override == view->u.tex.first_layer && stObj->layer_override == view->u.tex.last_layer)); + if (get_reference) + view = get_sampler_view_reference(sv, view); return view; } @@ -630,15 +646,16 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st, glsl130_or_later); view = st_texture_set_sampler_view(st, stObj, view, - glsl130_or_later, srgb_skip_decode); - + glsl130_or_later, srgb_skip_decode, + get_reference); return view; } struct pipe_sampler_view * st_get_buffer_sampler_view_from_stobj(struct st_context *st, - struct st_texture_object *stObj) + struct st_texture_object *stObj, + bool get_reference) { struct st_sampler_view *sv; struct st_buffer_object *stBuf = @@ -667,6 +684,8 @@ st_get_buffer_sampler_view_from_stobj(struct st_context *st, (unsigned) stObj->base.BufferSize); assert(view->u.buf.offset == base); assert(view->u.buf.size == size); + if (get_reference) + view = get_sampler_view_reference(sv, view); return view; } } @@ -699,7 +718,8 @@ st_get_buffer_sampler_view_from_stobj(struct st_context *st, struct pipe_sampler_view *view = st->pipe->create_sampler_view(st->pipe, buf, &templ); - view = st_texture_set_sampler_view(st, stObj, view, false, false); + view = st_texture_set_sampler_view(st, stObj, view, false, false, + get_reference); return view; } diff --git a/src/mesa/state_tracker/st_sampler_view.h b/src/mesa/state_tracker/st_sampler_view.h index 11c2f7c093e..fa8e26c9b80 100644 --- a/src/mesa/state_tracker/st_sampler_view.h +++ b/src/mesa/state_tracker/st_sampler_view.h @@ -78,10 +78,12 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st, struct st_texture_object *stObj, const struct gl_sampler_object *samp, bool glsl130_or_later, - bool ignore_srgb_decode); + bool ignore_srgb_decode, + bool get_reference); struct pipe_sampler_view * st_get_buffer_sampler_view_from_stobj(struct st_context *st, - struct st_texture_object *stObj); + struct st_texture_object *stObj, + bool get_reference); #endif /* ST_SAMPLER_VIEW_H */ diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c index f91310d23ff..e0bed2ded3d 100644 --- a/src/mesa/state_tracker/st_texture.c +++ b/src/mesa/state_tracker/st_texture.c @@ -519,7 +519,8 @@ st_create_texture_handle_from_unit(struct st_context *st, struct pipe_sampler_state sampler = {0}; /* TODO: Clarify the interaction of ARB_bindless_texture and EXT_texture_sRGB_decode */ - view = st_update_single_texture(st, texUnit, prog->sh.data->Version >= 130, true); + view = st_update_single_texture(st, texUnit, prog->sh.data->Version >= 130, + true, false); if (!view) return 0; diff --git a/src/mesa/state_tracker/st_texture.h b/src/mesa/state_tracker/st_texture.h index be92ae0ad98..9bf0661c8c1 100644 --- a/src/mesa/state_tracker/st_texture.h +++ b/src/mesa/state_tracker/st_texture.h @@ -359,7 +359,7 @@ st_convert_sampler_from_unit(const struct st_context *st, struct pipe_sampler_view * st_update_single_texture(struct st_context *st, GLuint texUnit, bool glsl130_or_later, - bool ignore_srgb_decode); + bool ignore_srgb_decode, bool get_reference); unsigned st_get_sampler_views(struct st_context *st,