Mesa (master): st/mesa: unbind sampler views, images, and vertex buffers after meta ops
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Jan 15 10:07:39 UTC 2021
Module: Mesa
Branch: master
Commit: 8436d9c5940969e5ee56c745a79fe09fe228b6e4
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8436d9c5940969e5ee56c745a79fe09fe228b6e4
Author: Marek Olšák <marek.olsak at amd.com>
Date: Mon Jan 11 10:33:54 2021 -0500
st/mesa: unbind sampler views, images, and vertex buffers after meta ops
v2: use a null array to unbind sampler views
Reviewed-by: Eric Anholt <eric at anholt.net> (v1)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8180>
---
src/mesa/state_tracker/st_cb_bitmap.c | 14 ++++++++++++++
src/mesa/state_tracker/st_cb_drawpixels.c | 13 +++++++++++++
src/mesa/state_tracker/st_cb_drawtex.c | 1 +
src/mesa/state_tracker/st_cb_readpixels.c | 12 ++++++++++++
src/mesa/state_tracker/st_cb_texture.c | 11 +++++++++++
src/mesa/state_tracker/st_draw.c | 1 +
src/mesa/state_tracker/st_pbo.c | 1 +
7 files changed, 53 insertions(+)
diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c
index 6bff3f7f693..32fcd8a49df 100644
--- a/src/mesa/state_tracker/st_cb_bitmap.c
+++ b/src/mesa/state_tracker/st_cb_bitmap.c
@@ -248,6 +248,8 @@ setup_render_state(struct gl_context *ctx,
sizeof(sampler_views));
sampler_views[fpv->bitmap_sampler] = sv;
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, sampler_views);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] =
+ MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num);
}
/* viewport state: viewport matching window dims */
@@ -270,9 +272,19 @@ restore_render_state(struct gl_context *ctx)
{
struct st_context *st = st_context(ctx);
struct cso_context *cso = st->cso_context;
+ struct pipe_context *pipe = st->pipe;
cso_restore_state(cso);
+ /* Unbind all because st/mesa won't do it if the current shader doesn't
+ * use them.
+ */
+ static struct pipe_sampler_view *null[PIPE_MAX_SAMPLERS];
+ pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT],
+ null);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = 0;
+
st->dirty |= ST_NEW_VERTEX_ARRAYS |
ST_NEW_FS_SAMPLER_VIEWS;
}
@@ -763,6 +775,8 @@ st_DrawAtlasBitmaps(struct gl_context *ctx,
u_upload_unmap(pipe->stream_uploader);
cso_set_vertex_buffers(st->cso_context, 0, 1, &vb);
+ st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1);
+
cso_draw_arrays(st->cso_context, PIPE_PRIM_QUADS, 0, num_verts);
out:
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index 4aa2258263b..0564a694d44 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -882,9 +882,13 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
if (sv[1])
sampler_views[fpv->pixelmap_sampler] = sv[1];
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num, sampler_views);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] =
+ MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num);
} else {
/* drawing a depth/stencil image */
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, num_sampler_view, sv);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] =
+ MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], num_sampler_view);
}
/* viewport state: viewport matching window dims */
@@ -933,6 +937,15 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
/* restore state */
cso_restore_state(cso);
+ /* Unbind all because st/mesa won't do it if the current shader doesn't
+ * use them.
+ */
+ static struct pipe_sampler_view *null[PIPE_MAX_SAMPLERS];
+ pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT],
+ null);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = 0;
+
st->dirty |= ST_NEW_VERTEX_ARRAYS |
ST_NEW_FS_SAMPLER_VIEWS;
}
diff --git a/src/mesa/state_tracker/st_cb_drawtex.c b/src/mesa/state_tracker/st_cb_drawtex.c
index 56b4f05269d..88865cd5e27 100644
--- a/src/mesa/state_tracker/st_cb_drawtex.c
+++ b/src/mesa/state_tracker/st_cb_drawtex.c
@@ -338,6 +338,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
PIPE_PRIM_TRIANGLE_FAN,
4, /* verts */
numAttribs); /* attribs/vert */
+ st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1);
pipe_resource_reference(&vbuffer, NULL);
diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c
index 0db77cf497b..cc346117ecb 100644
--- a/src/mesa/state_tracker/st_cb_readpixels.c
+++ b/src/mesa/state_tracker/st_cb_readpixels.c
@@ -190,6 +190,8 @@ try_pbo_readpixels(struct st_context *st, struct st_renderbuffer *strb,
goto fail;
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, &sampler_view);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] =
+ MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], 1);
pipe_sampler_view_reference(&sampler_view, NULL);
@@ -253,6 +255,16 @@ try_pbo_readpixels(struct st_context *st, struct st_renderbuffer *strb,
fail:
cso_restore_state(cso);
+ /* Unbind all because st/mesa won't do it if the current shader doesn't
+ * use them.
+ */
+ static struct pipe_sampler_view *null[PIPE_MAX_SAMPLERS];
+ pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT],
+ null);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = 0;
+ pipe->set_shader_images(pipe, PIPE_SHADER_FRAGMENT, 0, 1, NULL);
+
st->dirty |= ST_NEW_FS_CONSTANTS |
ST_NEW_FS_IMAGES |
ST_NEW_FS_SAMPLER_VIEWS |
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index cce9d523e3f..f20afbacdb4 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1313,6 +1313,8 @@ try_pbo_upload_common(struct gl_context *ctx,
goto fail;
pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, &sampler_view);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] =
+ MAX2(st->state.num_sampler_views[PIPE_SHADER_FRAGMENT], 1);
pipe_sampler_view_reference(&sampler_view, NULL);
}
@@ -1349,6 +1351,15 @@ try_pbo_upload_common(struct gl_context *ctx,
fail:
cso_restore_state(cso);
+ /* Unbind all because st/mesa won't do it if the current shader doesn't
+ * use them.
+ */
+ static struct pipe_sampler_view *null[PIPE_MAX_SAMPLERS];
+ pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0,
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT],
+ null);
+ st->state.num_sampler_views[PIPE_SHADER_FRAGMENT] = 0;
+
st->dirty |= ST_NEW_VERTEX_ARRAYS |
ST_NEW_FS_CONSTANTS |
ST_NEW_FS_SAMPLER_VIEWS;
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index c11934c0a39..c95fbd411ad 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -543,6 +543,7 @@ st_draw_quad(struct st_context *st,
u_upload_unmap(st->pipe->stream_uploader);
cso_set_vertex_buffers(st->cso_context, 0, 1, &vb);
+ st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1);
if (num_instances > 1) {
cso_draw_arrays_instanced(st->cso_context, PIPE_PRIM_TRIANGLE_FAN, 0, 4,
diff --git a/src/mesa/state_tracker/st_pbo.c b/src/mesa/state_tracker/st_pbo.c
index e20de8baada..627e62e6ac2 100644
--- a/src/mesa/state_tracker/st_pbo.c
+++ b/src/mesa/state_tracker/st_pbo.c
@@ -256,6 +256,7 @@ st_pbo_draw(struct st_context *st, const struct st_pbo_addresses *addr,
cso_set_vertex_elements(cso, &velem);
cso_set_vertex_buffers(cso, 0, 1, &vbo);
+ st->last_num_vbuffers = MAX2(st->last_num_vbuffers, 1);
pipe_resource_reference(&vbo.buffer.resource, NULL);
}
More information about the mesa-commit
mailing list