[Mesa-dev] [PATCH] r600g: workaround hyperz lockup on evergreen
From: Jerome Glisse jgli...@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 jgli...@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 { unsignedalpha_ref; ubyte valuemask[2]; ubyte writemask[2]; - unsignedsx_alpha_test_control; + unsignedzwritemask; + unsignedsx_alpha_test_control; }; struct r600_pipe_shader; @@ -513,6 +514,7 @@ struct r600_context { boolalpha_to_one; boolforce_blend_disable; boolean dual_src_blend; + unsignedzwritemask; /* Index buffer. */ struct pipe_index_bufferindex_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@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH] r600g: workaround hyperz lockup on evergreen
On Fri, Feb 22, 2013 at 11:20 AM, j.gli...@gmail.com wrote: From: Jerome Glisse jgli...@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 jgli...@redhat.com Reviewed-by: Alex Deucher alexander.deuc...@amd.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 { unsignedalpha_ref; ubyte valuemask[2]; ubyte writemask[2]; - unsignedsx_alpha_test_control; + unsignedzwritemask; + unsignedsx_alpha_test_control; }; struct r600_pipe_shader; @@ -513,6 +514,7 @@ struct r600_context { boolalpha_to_one; boolforce_blend_disable; boolean dual_src_blend; + unsignedzwritemask; /* Index buffer. */ struct pipe_index_bufferindex_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
Re: [Mesa-dev] [PATCH] r600g: workaround hyperz lockup on evergreen
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.gli...@gmail.com wrote: From: Jerome Glisse jgli...@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 jgli...@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 { unsignedalpha_ref; ubyte valuemask[2]; ubyte writemask[2]; - unsignedsx_alpha_test_control; + unsignedzwritemask; + unsignedsx_alpha_test_control; }; struct r600_pipe_shader; @@ -513,6 +514,7 @@ struct r600_context { boolalpha_to_one; boolforce_blend_disable; boolean dual_src_blend; + unsignedzwritemask; /* Index buffer. */ struct pipe_index_bufferindex_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; + } + }