mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
gallium: Properly handle non-contiguous used sampler view indexes
There is nothing guaranteeing that the currently used sampler view indexes will be contiguous, which means the resulting extra sampler views created by st_get_sampler_views may not be placed at the end of the resulting array. Therefore, the exact indexes of these views must be passed to the caller for releasing instead of simply assuming that they will always be placed at the end. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13363 Fixes:73da0dcddc("gallium: eliminate frontend refcounting from samplerviews") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36397> (cherry picked from commitabcd02a07d)
This commit is contained in:
parent
ff86280a22
commit
001cccae52
6 changed files with 22 additions and 22 deletions
|
|
@ -1084,7 +1084,7 @@
|
|||
"description": "gallium: Properly handle non-contiguous used sampler view indexes",
|
||||
"nominated": true,
|
||||
"nomination_type": 2,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "73da0dcddcb351f46544b207de55a4cb81654cb8",
|
||||
"notes": null
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ st_get_sampler_views(struct st_context *st,
|
|||
enum pipe_shader_type shader_stage,
|
||||
const struct gl_program *prog,
|
||||
struct pipe_sampler_view **sampler_views,
|
||||
unsigned *num_owned_views)
|
||||
unsigned *extra_sampler_views)
|
||||
{
|
||||
struct pipe_context *pipe = st->pipe;
|
||||
const GLuint old_max = st->state.num_sampler_views[shader_stage];
|
||||
|
|
@ -100,7 +100,7 @@ st_get_sampler_views(struct st_context *st,
|
|||
GLbitfield free_slots = ~prog->SamplersUsed;
|
||||
GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
|
||||
GLuint unit;
|
||||
*num_owned_views = 0;
|
||||
*extra_sampler_views = 0;
|
||||
|
||||
if (samplers_used == 0x0 && old_max == 0)
|
||||
return 0;
|
||||
|
|
@ -284,7 +284,7 @@ st_get_sampler_views(struct st_context *st,
|
|||
}
|
||||
|
||||
if (extra)
|
||||
(*num_owned_views) = extra;
|
||||
(*extra_sampler_views) |= 1 << extra;
|
||||
|
||||
num_textures = MAX2(num_textures, extra + 1);
|
||||
}
|
||||
|
|
@ -299,9 +299,9 @@ update_textures(struct st_context *st,
|
|||
{
|
||||
struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
|
||||
struct pipe_context *pipe = st->pipe;
|
||||
unsigned num_owned_views = 0;
|
||||
unsigned extra_sampler_views = 0;
|
||||
unsigned num_textures =
|
||||
st_get_sampler_views(st, shader_stage, prog, sampler_views, &num_owned_views);
|
||||
st_get_sampler_views(st, shader_stage, prog, sampler_views, &extra_sampler_views);
|
||||
|
||||
unsigned old_num_textures = st->state.num_sampler_views[shader_stage];
|
||||
unsigned num_unbind = old_num_textures > num_textures ?
|
||||
|
|
@ -313,9 +313,9 @@ update_textures(struct st_context *st,
|
|||
|
||||
/* release YUV views back to driver */
|
||||
if (pipe->sampler_view_release) {
|
||||
unsigned base_idx = num_textures - num_owned_views;
|
||||
for (unsigned i = 0; i < num_owned_views; i++)
|
||||
pipe->sampler_view_release(pipe, sampler_views[base_idx + i]);
|
||||
u_foreach_bit (i, extra_sampler_views) {
|
||||
pipe->sampler_view_release(pipe, sampler_views[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -243,10 +243,10 @@ setup_render_state(struct gl_context *ctx,
|
|||
|
||||
/* user textures, plus the bitmap texture */
|
||||
{
|
||||
unsigned num_owned_views = 0;
|
||||
unsigned extra_sampler_views = 0;
|
||||
struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
|
||||
unsigned num_views =
|
||||
st_get_sampler_views(st, PIPE_SHADER_FRAGMENT, fp, sampler_views, &num_owned_views);
|
||||
st_get_sampler_views(st, PIPE_SHADER_FRAGMENT, fp, sampler_views, &extra_sampler_views);
|
||||
|
||||
num_views = MAX2(fpv->bitmap_sampler + 1, num_views);
|
||||
sampler_views[fpv->bitmap_sampler] = sv;
|
||||
|
|
|
|||
|
|
@ -847,11 +847,11 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
|||
/* user textures, plus the drawpix textures */
|
||||
if (fpv) {
|
||||
struct pipe_sampler_view *sampler_views[PIPE_MAX_SAMPLERS];
|
||||
unsigned num_owned_views = 0;
|
||||
unsigned extra_sampler_views = 0;
|
||||
/* drawing a color image */
|
||||
unsigned num_views =
|
||||
st_get_sampler_views(st, PIPE_SHADER_FRAGMENT,
|
||||
ctx->FragmentProgram._Current, sampler_views, &num_owned_views);
|
||||
ctx->FragmentProgram._Current, sampler_views, &extra_sampler_views);
|
||||
|
||||
num_views = MAX3(fpv->drawpix_sampler + 1, fpv->pixelmap_sampler + 1,
|
||||
num_views);
|
||||
|
|
@ -864,9 +864,9 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
|||
st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = num_views;
|
||||
|
||||
/* release YUV views back to driver */
|
||||
unsigned base_idx = num_views - num_owned_views;
|
||||
for (unsigned i = 0; i < num_owned_views; i++)
|
||||
pipe->sampler_view_release(pipe, sampler_views[base_idx + i]);
|
||||
u_foreach_bit (i, extra_sampler_views) {
|
||||
pipe->sampler_view_release(pipe, sampler_views[i]);
|
||||
}
|
||||
} else {
|
||||
/* drawing a depth/stencil image */
|
||||
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num_sampler_view,
|
||||
|
|
|
|||
|
|
@ -259,9 +259,9 @@ st_feedback_draw_vbo(struct gl_context *ctx,
|
|||
|
||||
/* sampler views */
|
||||
struct pipe_sampler_view *views[PIPE_MAX_SAMPLERS];
|
||||
unsigned num_owned_views = 0;
|
||||
unsigned extra_sampler_views = 0;
|
||||
unsigned num_views =
|
||||
st_get_sampler_views(st, PIPE_SHADER_VERTEX, prog, views, &num_owned_views);
|
||||
st_get_sampler_views(st, PIPE_SHADER_VERTEX, prog, views, &extra_sampler_views);
|
||||
|
||||
draw_set_sampler_views(draw, PIPE_SHADER_VERTEX, views, num_views);
|
||||
|
||||
|
|
@ -423,9 +423,9 @@ st_feedback_draw_vbo(struct gl_context *ctx,
|
|||
draw_set_sampler_views(draw, PIPE_SHADER_VERTEX, NULL, 0);
|
||||
|
||||
/* release YUV views back to driver */
|
||||
unsigned base_idx = num_views - num_owned_views;
|
||||
for (unsigned i = 0; i < num_owned_views; i++)
|
||||
pipe->sampler_view_release(pipe, views[base_idx + i]);
|
||||
u_foreach_bit (i, extra_sampler_views) {
|
||||
pipe->sampler_view_release(pipe, views[i]);
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < prog->info.num_ssbos; i++) {
|
||||
if (ssbo_transfer[i]) {
|
||||
|
|
|
|||
|
|
@ -257,7 +257,7 @@ st_get_sampler_views(struct st_context *st,
|
|||
enum pipe_shader_type shader_stage,
|
||||
const struct gl_program *prog,
|
||||
struct pipe_sampler_view **sampler_views,
|
||||
unsigned *num_owned_views);
|
||||
unsigned *extra_sampler_views);
|
||||
|
||||
void
|
||||
st_make_bound_samplers_resident(struct st_context *st,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue