st/mesa: sink refcounting from st_get_sampler_views into st_sampler_view.c

Do it deeper in the sampler view return path. It minimizes the deltas
for the next commit.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11428>
This commit is contained in:
Marek Olšák
2021-06-06 05:23:30 -04:00
committed by Marge Bot
parent 8fe705b6b4
commit 798518e510
6 changed files with 42 additions and 20 deletions

View File

@@ -58,7 +58,7 @@
struct pipe_sampler_view * struct pipe_sampler_view *
st_update_single_texture(struct st_context *st, st_update_single_texture(struct st_context *st,
GLuint texUnit, bool glsl130_or_later, 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_context *ctx = st->ctx;
struct gl_texture_object *texObj; struct gl_texture_object *texObj;
@@ -71,7 +71,7 @@ st_update_single_texture(struct st_context *st,
GLenum target = texObj->Target; GLenum target = texObj->Target;
if (unlikely(target == GL_TEXTURE_BUFFER)) 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) if (!st_finalize_texture(ctx, st->pipe, texObj, 0) || !stObj->pt)
return NULL; /* out of mem */ 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, return st_get_texture_sampler_view_from_stobj(st, stObj,
_mesa_get_samplerobj(ctx, texUnit), _mesa_get_samplerobj(ctx, texUnit),
glsl130_or_later, 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 * So we simply ignore the setting entirely for samplers that are
* (statically) accessed with a texelFetch function. * (statically) accessed with a texelFetch function.
*/ */
struct pipe_sampler_view *sampler_view = sampler_views[unit] =
st_update_single_texture(st, prog->SamplerUnits[unit], glsl130, st_update_single_texture(st, prog->SamplerUnits[unit], glsl130,
texel_fetch_samplers & bit); texel_fetch_samplers & bit, true);
sampler_views[unit] = NULL;
pipe_sampler_view_reference(&sampler_views[unit], sampler_view);
} }
/* For any external samplers with multiplaner YUV, stuff the additional /* For any external samplers with multiplaner YUV, stuff the additional

View File

@@ -3387,9 +3387,10 @@ st_NewTextureHandle(struct gl_context *ctx, struct gl_texture_object *texObj,
st_convert_sampler(st, texObj, sampObj, 0, &sampler); st_convert_sampler(st, texObj, sampObj, 0, &sampler);
/* TODO: Clarify the interaction of ARB_bindless_texture and EXT_texture_sRGB_decode */ /* 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 { } 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); return pipe->create_texture_handle(pipe, view, &sampler);

View File

@@ -41,6 +41,16 @@
#include "st_cb_bufferobjects.h" #include "st_cb_bufferobjects.h"
#include "st_cb_texture.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. * 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, st_texture_set_sampler_view(struct st_context *st,
struct st_texture_object *stObj, struct st_texture_object *stObj,
struct pipe_sampler_view *view, 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_views *views;
struct st_sampler_view *free = NULL; struct st_sampler_view *free = NULL;
@@ -152,6 +163,9 @@ found:
sv->view = view; sv->view = view;
sv->st = st; sv->st = st;
if (get_reference)
view = get_sampler_view_reference(sv, view);
out: out:
simple_mtx_unlock(&stObj->validate_mutex); simple_mtx_unlock(&stObj->validate_mutex);
return view; 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); return st->pipe->create_sampler_view(st->pipe, stObj->pt, &templ);
} }
struct pipe_sampler_view * struct pipe_sampler_view *
st_get_texture_sampler_view_from_stobj(struct st_context *st, st_get_texture_sampler_view_from_stobj(struct st_context *st,
struct st_texture_object *stObj, struct st_texture_object *stObj,
const struct gl_sampler_object *samp, const struct gl_sampler_object *samp,
bool glsl130_or_later, bool glsl130_or_later,
bool ignore_srgb_decode) bool ignore_srgb_decode,
bool get_reference)
{ {
struct st_sampler_view *sv; struct st_sampler_view *sv;
bool srgb_skip_decode = false; 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 || assert(stObj->layer_override < 0 ||
(stObj->layer_override == view->u.tex.first_layer && (stObj->layer_override == view->u.tex.first_layer &&
stObj->layer_override == view->u.tex.last_layer)); stObj->layer_override == view->u.tex.last_layer));
if (get_reference)
view = get_sampler_view_reference(sv, view);
return view; return view;
} }
@@ -630,15 +646,16 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
glsl130_or_later); glsl130_or_later);
view = st_texture_set_sampler_view(st, stObj, view, 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; return view;
} }
struct pipe_sampler_view * struct pipe_sampler_view *
st_get_buffer_sampler_view_from_stobj(struct st_context *st, 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_sampler_view *sv;
struct st_buffer_object *stBuf = struct st_buffer_object *stBuf =
@@ -667,6 +684,8 @@ st_get_buffer_sampler_view_from_stobj(struct st_context *st,
(unsigned) stObj->base.BufferSize); (unsigned) stObj->base.BufferSize);
assert(view->u.buf.offset == base); assert(view->u.buf.offset == base);
assert(view->u.buf.size == size); assert(view->u.buf.size == size);
if (get_reference)
view = get_sampler_view_reference(sv, view);
return view; return view;
} }
} }
@@ -699,7 +718,8 @@ st_get_buffer_sampler_view_from_stobj(struct st_context *st,
struct pipe_sampler_view *view = struct pipe_sampler_view *view =
st->pipe->create_sampler_view(st->pipe, buf, &templ); 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; return view;
} }

View File

@@ -78,10 +78,12 @@ st_get_texture_sampler_view_from_stobj(struct st_context *st,
struct st_texture_object *stObj, struct st_texture_object *stObj,
const struct gl_sampler_object *samp, const struct gl_sampler_object *samp,
bool glsl130_or_later, bool glsl130_or_later,
bool ignore_srgb_decode); bool ignore_srgb_decode,
bool get_reference);
struct pipe_sampler_view * struct pipe_sampler_view *
st_get_buffer_sampler_view_from_stobj(struct st_context *st, 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 */ #endif /* ST_SAMPLER_VIEW_H */

View File

@@ -519,7 +519,8 @@ st_create_texture_handle_from_unit(struct st_context *st,
struct pipe_sampler_state sampler = {0}; struct pipe_sampler_state sampler = {0};
/* TODO: Clarify the interaction of ARB_bindless_texture and EXT_texture_sRGB_decode */ /* 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) if (!view)
return 0; return 0;

View File

@@ -359,7 +359,7 @@ st_convert_sampler_from_unit(const struct st_context *st,
struct pipe_sampler_view * struct pipe_sampler_view *
st_update_single_texture(struct st_context *st, st_update_single_texture(struct st_context *st,
GLuint texUnit, bool glsl130_or_later, GLuint texUnit, bool glsl130_or_later,
bool ignore_srgb_decode); bool ignore_srgb_decode, bool get_reference);
unsigned unsigned
st_get_sampler_views(struct st_context *st, st_get_sampler_views(struct st_context *st,