Module: Mesa Branch: staging/22.0 Commit: f86fd2309e56904789986ad333e9d1eb8a24058e URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=f86fd2309e56904789986ad333e9d1eb8a24058e
Author: Mike Blumenkrantz <[email protected]> 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 <[email protected]> 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)
