[Mesa-stable] [Mesa-dev] [PATCH] nv50, nvc0: remove IDX from bufctx immediately, to avoid conflicts with clear
Samuel Pitoiset
samuel.pitoiset at gmail.com
Mon Jun 26 20:02:42 UTC 2017
Looks like the patch is based on your bindless branch. :)
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
On 06/24/2017 07:24 PM, Ilia Mirkin wrote:
> The idxbuf could linger, and when a clear happened, which also uses the
> 3d bufctx, we could get an error trying to access it.
>
> This fixes spurious crashes/errors in CTS tests.
>
> Fixes: 61d8f3387d ("nv50,nvc0: clear index buffer bufctx bin unconditionally")
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> Cc: mesa-stable at lists.freedesktop.org
> ---
> src/gallium/drivers/nouveau/nv50/nv50_vbo.c | 9 +++++----
> src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c | 9 +++++----
> 2 files changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
> index ac7d8267861..ed041121a26 100644
> --- a/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
> +++ b/src/gallium/drivers/nouveau/nv50/nv50_vbo.c
> @@ -770,7 +770,6 @@ nv50_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
> bool tex_dirty = false;
> int s;
>
> - nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_3D_INDEX);
> if (info->index_size && !info->has_user_indices)
> BCTX_REFN(nv50->bufctx_3d, 3D_INDEX, nv04_resource(info->index.resource), RD);
>
> @@ -838,9 +837,7 @@ nv50_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
>
> if (nv50->vbo_fifo) {
> nv50_push_vbo(nv50, info);
> - push->kick_notify = nv50_default_kick_notify;
> - nouveau_pushbuf_bufctx(push, NULL);
> - return;
> + goto cleanup;
> }
>
> if (nv50->state.instance_base != info->start_instance) {
> @@ -894,9 +891,13 @@ nv50_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
> info->mode, info->start, info->count,
> info->instance_count);
> }
> +
> +cleanup:
> push->kick_notify = nv50_default_kick_notify;
>
> nv50_release_user_vbufs(nv50);
>
> nouveau_pushbuf_bufctx(push, NULL);
> +
> + nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_3D_INDEX);
> }
> diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
> index 2856b4c6096..a5671ca09ac 100644
> --- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
> +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
> @@ -921,7 +921,6 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
> struct nvc0_screen *screen = nvc0->screen;
> int s;
>
> - nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_IDX);
> nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_BINDLESS);
>
> /* NOTE: caller must ensure that (min_index + index_bias) is >= 0 */
> @@ -1040,9 +1039,7 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
>
> if (nvc0->state.vbo_mode) {
> nvc0_push_vbo(nvc0, info);
> - push->kick_notify = nvc0_default_kick_notify;
> - nouveau_pushbuf_bufctx(push, NULL);
> - return;
> + goto cleanup;
> }
>
> /* space for base instance, flush, and prim restart */
> @@ -1089,9 +1086,13 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
> info->mode, info->start, info->count,
> info->instance_count);
> }
> +
> +cleanup:
> push->kick_notify = nvc0_default_kick_notify;
>
> nvc0_release_user_vbufs(nvc0);
>
> nouveau_pushbuf_bufctx(push, NULL);
> +
> + nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_IDX);
> }
>
More information about the mesa-stable
mailing list