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