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

2013-02-22 Thread j . glisse
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

2013-02-22 Thread Alex Deucher
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

2013-02-22 Thread Marek Olšák
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;
 +   }
 +   }