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