Module: Mesa Branch: main Commit: 8eae3434019085018a8792cf98681788bf76d9c5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8eae3434019085018a8792cf98681788bf76d9c5
Author: Erik Faye-Lund <[email protected]> Date: Wed Jul 14 10:17:41 2021 +0200 lavapipe: tolerate NULL sampler-buffer view descriptors Reviewed-by: Dave Airlie <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16137> --- src/gallium/frontends/lavapipe/lvp_execute.c | 30 ++++++++++++++++------------ 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 2565fa09555..7eeae8059f6 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -1161,22 +1161,26 @@ static void fill_sampler_buffer_view_stage(struct rendering_state *state, sv_idx += array_idx; sv_idx += dyn_info->stage[stage].sampler_view_count; struct lvp_buffer_view *bv = descriptor->buffer_view; - struct pipe_sampler_view templ; - memset(&templ, 0, sizeof(templ)); - templ.target = PIPE_BUFFER; - templ.swizzle_r = PIPE_SWIZZLE_X; - templ.swizzle_g = PIPE_SWIZZLE_Y; - templ.swizzle_b = PIPE_SWIZZLE_Z; - templ.swizzle_a = PIPE_SWIZZLE_W; - templ.format = bv->pformat; - templ.u.buf.offset = bv->offset + bv->buffer->offset; - templ.u.buf.size = bv->range == VK_WHOLE_SIZE ? (bv->buffer->size - bv->offset) : bv->range; - templ.texture = bv->buffer->bo; - templ.context = state->pctx; if (state->sv[p_stage][sv_idx]) pipe_sampler_view_reference(&state->sv[p_stage][sv_idx], NULL); - state->sv[p_stage][sv_idx] = state->pctx->create_sampler_view(state->pctx, bv->buffer->bo, &templ); + + if (bv) { + struct pipe_sampler_view templ; + memset(&templ, 0, sizeof(templ)); + templ.target = PIPE_BUFFER; + templ.swizzle_r = PIPE_SWIZZLE_X; + templ.swizzle_g = PIPE_SWIZZLE_Y; + templ.swizzle_b = PIPE_SWIZZLE_Z; + templ.swizzle_a = PIPE_SWIZZLE_W; + templ.format = bv->pformat; + templ.u.buf.offset = bv->offset + bv->buffer->offset; + templ.u.buf.size = bv->range == VK_WHOLE_SIZE ? (bv->buffer->size - bv->offset) : bv->range; + templ.texture = bv->buffer->bo; + templ.context = state->pctx; + state->sv[p_stage][sv_idx] = state->pctx->create_sampler_view(state->pctx, bv->buffer->bo, &templ); + } + if (state->num_sampler_views[p_stage] <= sv_idx) state->num_sampler_views[p_stage] = sv_idx + 1; state->sv_dirty[p_stage] = true;
