Mesa (staging/22.0): llvmpipe: handle sampling from 2d views of 3d images

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 6 16:57:59 UTC 2022


Module: Mesa
Branch: staging/22.0
Commit: f86fd2309e56904789986ad333e9d1eb8a24058e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f86fd2309e56904789986ad333e9d1eb8a24058e

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Mar 24 09:04:14 2022 -0400

llvmpipe: handle sampling from 2d views of 3d images

this is seldom used but is required by KHR_gl_texture_3D_image

cc: mesa-stable

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15583>
(cherry picked from commit fe7c3eba335db0d510364281bc2875a9171796ac)

---

 .pick_status.json                               | 2 +-
 src/gallium/drivers/llvmpipe/lp_setup.c         | 8 ++++++--
 src/gallium/drivers/llvmpipe/lp_state_cs.c      | 8 ++++++--
 src/gallium/drivers/llvmpipe/lp_state_sampler.c | 1 +
 4 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 5d8a3dec2b2..4fcd86dbd55 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1684,7 +1684,7 @@
         "description": "llvmpipe: handle sampling from 2d views of 3d images",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "because_sha": null
     },
     {
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index c2a4617c313..cf5870ca2d8 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -1035,7 +1035,8 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
                   if (res->target == PIPE_TEXTURE_1D_ARRAY ||
                       res->target == PIPE_TEXTURE_2D_ARRAY ||
                       res->target == PIPE_TEXTURE_CUBE ||
-                      res->target == PIPE_TEXTURE_CUBE_ARRAY) {
+                      res->target == PIPE_TEXTURE_CUBE_ARRAY ||
+                      (res->target == PIPE_TEXTURE_3D && view->target == PIPE_TEXTURE_2D)) {
                      /*
                       * For array textures, we don't have first_layer, instead
                       * adjust last_layer (stored as depth) plus the mip level offsets
@@ -1052,7 +1053,10 @@ lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
                         assert(jit_tex->depth % 6 == 0);
                      }
                      assert(view->u.tex.first_layer <= view->u.tex.last_layer);
-                     assert(view->u.tex.last_layer < res->array_size);
+                     if (res->target == PIPE_TEXTURE_3D)
+                        assert(view->u.tex.last_layer < res->depth0);
+                     else
+                        assert(view->u.tex.last_layer < res->array_size);
                   }
                }
                else {
diff --git a/src/gallium/drivers/llvmpipe/lp_state_cs.c b/src/gallium/drivers/llvmpipe/lp_state_cs.c
index fb86e544ca8..df7d440d4da 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_cs.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_cs.c
@@ -985,7 +985,8 @@ lp_csctx_set_sampler_views(struct lp_cs_context *csctx,
                   if (res->target == PIPE_TEXTURE_1D_ARRAY ||
                       res->target == PIPE_TEXTURE_2D_ARRAY ||
                       res->target == PIPE_TEXTURE_CUBE ||
-                      res->target == PIPE_TEXTURE_CUBE_ARRAY) {
+                      res->target == PIPE_TEXTURE_CUBE_ARRAY ||
+                      (res->target == PIPE_TEXTURE_3D && view->target == PIPE_TEXTURE_2D)) {
                      /*
                       * For array textures, we don't have first_layer, instead
                       * adjust last_layer (stored as depth) plus the mip level offsets
@@ -1002,7 +1003,10 @@ lp_csctx_set_sampler_views(struct lp_cs_context *csctx,
                         assert(jit_tex->depth % 6 == 0);
                      }
                      assert(view->u.tex.first_layer <= view->u.tex.last_layer);
-                     assert(view->u.tex.last_layer < res->array_size);
+                     if (res->target == PIPE_TEXTURE_3D)
+                        assert(view->u.tex.last_layer < res->depth0);
+                     else
+                        assert(view->u.tex.last_layer < res->array_size);
                   }
                }
                else {
diff --git a/src/gallium/drivers/llvmpipe/lp_state_sampler.c b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
index b5e8c31c729..77bede56d6f 100644
--- a/src/gallium/drivers/llvmpipe/lp_state_sampler.c
+++ b/src/gallium/drivers/llvmpipe/lp_state_sampler.c
@@ -231,6 +231,7 @@ llvmpipe_create_sampler_view(struct pipe_context *pipe,
             assert(texture->target == PIPE_TEXTURE_1D);
          else if (view->target == PIPE_TEXTURE_2D)
             assert(texture->target == PIPE_TEXTURE_2D_ARRAY ||
+                   texture->target == PIPE_TEXTURE_3D ||
                    texture->target == PIPE_TEXTURE_CUBE ||
                    texture->target == PIPE_TEXTURE_CUBE_ARRAY);
          else if (view->target == PIPE_TEXTURE_2D_ARRAY)



More information about the mesa-commit mailing list