diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index 614a058f968..38d5232dd9b 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -1061,7 +1061,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 @@ -1078,7 +1079,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 53fb7074b15..74c0c981bd9 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_cs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_cs.c @@ -1011,7 +1011,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 @@ -1028,7 +1029,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)