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:
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user