Mesa (main): virgl: obtain supported number of shader sampler views from host

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Nov 8 19:59:40 UTC 2021


Module: Mesa
Branch: main
Commit: 63c4c559cbce22102bdac695db1cb1bf229f68c3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=63c4c559cbce22102bdac695db1cb1bf229f68c3

Author: Gert Wollny <gert.wollny at collabora.com>
Date:   Wed Nov  3 14:54:21 2021 +0100

virgl: obtain supported number of shader sampler views from host

Modern games may use more than 16 sampler views, so get what the host
actually supports, and default to 16 on old hosts that don't pass the
value.

Since the possible maximal value of PIPE_MAX_SHADER_SAMPLER_VIEWS doesn't
fit into an uint32_t remove the binding flags, they were only used for
releasing the sampler views, and this can be achieved differently.

v2: Fix compilation error

Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
Reviewed-by: John Bates <jbates at chromium.org> (v1)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13646>

---

 src/gallium/drivers/virgl/virgl_context.c | 23 ++++++++++-------------
 src/gallium/drivers/virgl/virgl_context.h |  3 +--
 src/gallium/drivers/virgl/virgl_screen.c  |  3 ++-
 src/gallium/drivers/virgl/virgl_winsys.h  |  1 +
 src/virtio/virtio-gpu/virgl_hw.h          |  1 +
 5 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c
index 8970c4f37d1..cd6097084b2 100644
--- a/src/gallium/drivers/virgl/virgl_context.c
+++ b/src/gallium/drivers/virgl/virgl_context.c
@@ -202,14 +202,12 @@ static void virgl_attach_res_sampler_views(struct virgl_context *vctx,
    struct virgl_winsys *vws = virgl_screen(vctx->base.screen)->vws;
    const struct virgl_shader_binding_state *binding =
       &vctx->shader_bindings[shader_type];
-   uint32_t remaining_mask = binding->view_enabled_mask;
-   struct virgl_resource *res;
 
-   while (remaining_mask) {
-      int i = u_bit_scan(&remaining_mask);
-      assert(binding->views[i] && binding->views[i]->texture);
-      res = virgl_resource(binding->views[i]->texture);
-      vws->emit_res(vws, vctx->cbuf, res->hw_res, FALSE);
+   for (int i = 0; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; ++i) {
+      if (binding->views[i] && binding->views[i]->texture) {
+         struct virgl_resource *res = virgl_resource(binding->views[i]->texture);
+         vws->emit_res(vws, vctx->cbuf, res->hw_res, FALSE);
+      }
    }
 }
 
@@ -1033,7 +1031,6 @@ static void virgl_set_sampler_views(struct pipe_context *ctx,
    struct virgl_shader_binding_state *binding =
       &vctx->shader_bindings[shader_type];
 
-   binding->view_enabled_mask &= ~u_bit_consecutive(start_slot, num_views);
    for (unsigned i = 0; i < num_views; i++) {
       unsigned idx = start_slot + i;
       if (views && views[i]) {
@@ -1046,7 +1043,6 @@ static void virgl_set_sampler_views(struct pipe_context *ctx,
          } else {
             pipe_sampler_view_reference(&binding->views[idx], views[i]);
          }
-         binding->view_enabled_mask |= 1 << idx;
       } else {
          pipe_sampler_view_reference(&binding->views[idx], NULL);
       }
@@ -1426,10 +1422,11 @@ virgl_release_shader_binding(struct virgl_context *vctx,
    struct virgl_shader_binding_state *binding =
       &vctx->shader_bindings[shader_type];
 
-   while (binding->view_enabled_mask) {
-      int i = u_bit_scan(&binding->view_enabled_mask);
-      pipe_sampler_view_reference(
-            (struct pipe_sampler_view **)&binding->views[i], NULL);
+   for (int i = 0; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; ++i) {
+      if (binding->views[i]) {
+         pipe_sampler_view_reference(
+                  (struct pipe_sampler_view **)&binding->views[i], NULL);
+      }
    }
 
    while (binding->ubo_enabled_mask) {
diff --git a/src/gallium/drivers/virgl/virgl_context.h b/src/gallium/drivers/virgl/virgl_context.h
index 455af6240d5..c84b992f20b 100644
--- a/src/gallium/drivers/virgl/virgl_context.h
+++ b/src/gallium/drivers/virgl/virgl_context.h
@@ -53,8 +53,7 @@ struct virgl_rasterizer_state {
 };
 
 struct virgl_shader_binding_state {
-   struct pipe_sampler_view *views[16];
-   uint32_t view_enabled_mask;
+   struct pipe_sampler_view *views[PIPE_MAX_SHADER_SAMPLER_VIEWS];
 
    struct pipe_constant_buffer ubos[PIPE_MAX_CONSTANT_BUFFERS];
    uint32_t ubo_enabled_mask;
diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c
index ad2022caa24..45458ab1a71 100644
--- a/src/gallium/drivers/virgl/virgl_screen.c
+++ b/src/gallium/drivers/virgl/virgl_screen.c
@@ -412,7 +412,8 @@ virgl_get_shader_param(struct pipe_screen *screen,
       case PIPE_SHADER_CAP_SUBROUTINES:
          return 1;
       case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
-            return 16;
+         return MIN2(vscreen->caps.caps.v2.max_shader_sampler_views,
+                     PIPE_MAX_SHADER_SAMPLER_VIEWS);
       case PIPE_SHADER_CAP_INTEGERS:
          return vscreen->caps.caps.v1.glsl_level >= 130;
       case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h
index 0754e0d608e..dfbd10f4261 100644
--- a/src/gallium/drivers/virgl/virgl_winsys.h
+++ b/src/gallium/drivers/virgl/virgl_winsys.h
@@ -171,6 +171,7 @@ static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps)
    caps->caps.v2.max_compute_work_group_invocations = 0;
    caps->caps.v2.max_compute_shared_memory_size = 0;
    caps->caps.v2.host_feature_check_version = 0;
+   caps->caps.v2.max_shader_sampler_views = 16;
 }
 
 extern enum virgl_formats pipe_to_virgl_format(enum pipe_format format);
diff --git a/src/virtio/virtio-gpu/virgl_hw.h b/src/virtio/virtio-gpu/virgl_hw.h
index 55f974d7883..88f3209be1e 100644
--- a/src/virtio/virtio-gpu/virgl_hw.h
+++ b/src/virtio/virtio-gpu/virgl_hw.h
@@ -598,6 +598,7 @@ struct virgl_caps_v2 {
         uint32_t max_video_memory;
         char renderer[64];
         float max_anisotropy;
+        uint32_t max_shader_sampler_views;
 };
 
 union virgl_caps {



More information about the mesa-commit mailing list