[Mesa-dev] [PATCH] r600g: workaround hyperz lockup on evergreen

Marek Olšák maraeo at gmail.com
Fri Feb 22 14:47:08 PST 2013


This looks good. One minor nit: zwritemask should be in
r600_db_misc_state instead of r600_context.

Marek

On Fri, Feb 22, 2013 at 5:20 PM,  <j.glisse at gmail.com> wrote:
> From: Jerome Glisse <jglisse at redhat.com>
>
> This work around disable hyperz if write to zbuffer is disabled. Somehow
> using hyperz when not writting to the zbuffer trigger GPU lockup. See :
>
> https://bugs.freedesktop.org/show_bug.cgi?id=60848
>
> Candidate for 9.1
>
> Signed-off-by: Jerome Glisse <jglisse at redhat.com>
> ---
>  src/gallium/drivers/r600/evergreen_state.c   | 10 +++++++++-
>  src/gallium/drivers/r600/r600_pipe.h         |  4 +++-
>  src/gallium/drivers/r600/r600_state.c        |  1 +
>  src/gallium/drivers/r600/r600_state_common.c | 10 ++++++++++
>  4 files changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
> index 4a91942..2e301bc 100644
> --- a/src/gallium/drivers/r600/evergreen_state.c
> +++ b/src/gallium/drivers/r600/evergreen_state.c
> @@ -858,6 +858,7 @@ static void *evergreen_create_dsa_state(struct pipe_context *ctx,
>         dsa->valuemask[1] = state->stencil[1].valuemask;
>         dsa->writemask[0] = state->stencil[0].writemask;
>         dsa->writemask[1] = state->stencil[1].writemask;
> +       dsa->zwritemask = state->depth.writemask;
>
>         db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) |
>                 S_028800_Z_WRITE_ENABLE(state->depth.writemask) |
> @@ -2286,7 +2287,14 @@ static void evergreen_emit_db_misc_state(struct r600_context *rctx, struct r600_
>                 }
>                 db_render_override |= S_02800C_NOOP_CULL_DISABLE(1);
>         }
> -       if (rctx->db_state.rsurf && rctx->db_state.rsurf->htile_enabled) {
> +       /* FIXME we should be able to use hyperz even if we are not writing to
> +        * zbuffer but somehow this trigger GPU lockup. See :
> +        *
> +        * https://bugs.freedesktop.org/show_bug.cgi?id=60848
> +        *
> +        * Disable hyperz for now if not writing to zbuffer.
> +        */
> +       if (rctx->db_state.rsurf && rctx->db_state.rsurf->htile_enabled && rctx->zwritemask) {
>                 /* FORCE_OFF means HiZ/HiS are determined by DB_SHADER_CONTROL */
>                 db_render_override |= S_02800C_FORCE_HIZ_ENABLE(V_02800C_FORCE_OFF);
>                 /* This is to fix a lockup when hyperz and alpha test are enabled at
> diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
> index de9c205..5ebf98a 100644
> --- a/src/gallium/drivers/r600/r600_pipe.h
> +++ b/src/gallium/drivers/r600/r600_pipe.h
> @@ -298,7 +298,8 @@ struct r600_dsa_state {
>         unsigned                        alpha_ref;
>         ubyte                           valuemask[2];
>         ubyte                           writemask[2];
> -       unsigned                        sx_alpha_test_control;
> +       unsigned                        zwritemask;
> +       unsigned                        sx_alpha_test_control;
>  };
>
>  struct r600_pipe_shader;
> @@ -513,6 +514,7 @@ struct r600_context {
>         bool                            alpha_to_one;
>         bool                            force_blend_disable;
>         boolean                         dual_src_blend;
> +       unsigned                        zwritemask;
>
>         /* Index buffer. */
>         struct pipe_index_buffer        index_buffer;
> diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
> index c6559bb..2d3ec93 100644
> --- a/src/gallium/drivers/r600/r600_state.c
> +++ b/src/gallium/drivers/r600/r600_state.c
> @@ -842,6 +842,7 @@ static void *r600_create_dsa_state(struct pipe_context *ctx,
>         dsa->valuemask[1] = state->stencil[1].valuemask;
>         dsa->writemask[0] = state->stencil[0].writemask;
>         dsa->writemask[1] = state->stencil[1].writemask;
> +       dsa->zwritemask = state->depth.writemask;
>
>         db_depth_control = S_028800_Z_ENABLE(state->depth.enabled) |
>                 S_028800_Z_WRITE_ENABLE(state->depth.writemask) |
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index c4bd758..52b7d55 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -284,6 +284,16 @@ static void r600_bind_dsa_state(struct pipe_context *ctx, void *state)
>         ref.valuemask[1] = dsa->valuemask[1];
>         ref.writemask[0] = dsa->writemask[0];
>         ref.writemask[1] = dsa->writemask[1];
> +       if (rctx->zwritemask != dsa->zwritemask) {
> +               rctx->zwritemask = dsa->zwritemask;
> +               if (rctx->chip_class >= EVERGREEN) {
> +                       /* work around some issue when not writting to zbuffer
> +                        * we are having lockup on evergreen so do not enable
> +                        * hyperz when not writting zbuffer
> +                        */
> +                       rctx->db_misc_state.atom.dirty = true;
> +               }
> +       }
>
>         r600_set_stencil_ref(ctx, &ref);
>
> --
> 1.7.11.7
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list