Re: [Mesa-dev] [PATCH 03/32] i965/blorp: Do flushes around depth resolves

2017-07-20 Thread Jason Ekstrand
On Thu, Jul 20, 2017 at 2:38 AM, Pohjolainen, Topi <
topi.pohjolai...@gmail.com> wrote:

> On Wed, Jul 19, 2017 at 02:01:29PM -0700, Jason Ekstrand wrote:
> > It turns out that if you have rendering in-flight with CCS_E enabled and
> > you go to do a depth resolve without flushing, the CCS data may never
> > hit the memory.
> > ---
> >  src/mesa/drivers/dri/i965/brw_blorp.c | 150
> --
> >  1 file changed, 72 insertions(+), 78 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c
> b/src/mesa/drivers/dri/i965/brw_blorp.c
> > index 5335fae..efa3b39 100644
> > --- a/src/mesa/drivers/dri/i965/brw_blorp.c
> > +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
> > @@ -1079,51 +1079,48 @@ intel_hiz_exec(struct brw_context *brw, struct
> intel_mipmap_tree *mt,
> > __func__, opname, mt, level, start_layer, start_layer +
> num_layers - 1);
> >
> > /* The following stalls and flushes are only documented to be
> required for
> > -* HiZ clear operations.  However, they also seem to be required for
> the
> > -* HiZ resolve operation which is basically the same as a fast clear
> only a
> > -* different value is written into the HiZ surface.
> > +* HiZ clear operations.  However, they also seem to be required for
> > +* resolve operations.
>
> How would feel putting some of the rational in the commit message here?
> Sounds
> valuable.
>

Hrm... I can, but I think the problem is most likely more general than
CCS_E.  The fact that CCS_E happens to show it off doesn't mean that's why
we need to do it.


> >  */
> > -   if (op == BLORP_HIZ_OP_DEPTH_CLEAR || op ==
> BLORP_HIZ_OP_HIZ_RESOLVE) {
> > -  if (brw->gen == 6) {
> > - /* From the Sandy Bridge PRM, volume 2 part 1, page 313:
> > -  *
> > -  *   "If other rendering operations have preceded this clear, a
> > -  *   PIPE_CONTROL with write cache flush enabled and Z-inhibit
> > -  *   disabled must be issued before the rectangle primitive
> used for
> > -  *   the depth buffer clear operation.
> > -  */
> > -  brw_emit_pipe_control_flush(brw,
> > -  PIPE_CONTROL_RENDER_TARGET_FLUSH
> |
> > -  PIPE_CONTROL_DEPTH_CACHE_FLUSH |
> > -  PIPE_CONTROL_CS_STALL);
> > -  } else if (brw->gen >= 7) {
> > - /*
> > -  * From the Ivybridge PRM, volume 2, "Depth Buffer Clear":
> > -  *
> > -  *   If other rendering operations have preceded this clear, a
> > -  *   PIPE_CONTROL with depth cache flush enabled, Depth Stall
> bit
> > -  *   enabled must be issued before the rectangle primitive
> used for
> > -  *   the depth buffer clear operation.
> > -  *
> > -  * Same applies for Gen8 and Gen9.
> > -  *
> > -  * In addition, from the Ivybridge PRM, volume 2, 1.10.4.1
> > -  * PIPE_CONTROL, Depth Cache Flush Enable:
> > -  *
> > -  *   This bit must not be set when Depth Stall Enable bit is
> set in
> > -  *   this packet.
> > -  *
> > -  * This is confirmed to hold for real, HSW gets immediate gpu
> hangs.
> > -  *
> > -  * Therefore issue two pipe control flushes, one for cache
> flush and
> > -  * another for depth stall.
> > -  */
> > -  brw_emit_pipe_control_flush(brw,
> > -  PIPE_CONTROL_DEPTH_CACHE_FLUSH |
> > -  PIPE_CONTROL_CS_STALL);
> > +   if (brw->gen == 6) {
> > +  /* From the Sandy Bridge PRM, volume 2 part 1, page 313:
> > +   *
> > +   *   "If other rendering operations have preceded this clear, a
> > +   *   PIPE_CONTROL with write cache flush enabled and Z-inhibit
> > +   *   disabled must be issued before the rectangle primitive used
> for
> > +   *   the depth buffer clear operation.
> > +   */
> > +   brw_emit_pipe_control_flush(brw,
> > +   PIPE_CONTROL_RENDER_TARGET_FLUSH |
> > +   PIPE_CONTROL_DEPTH_CACHE_FLUSH |
> > +   PIPE_CONTROL_CS_STALL);
> > +   } else if (brw->gen >= 7) {
> > +  /*
> > +   * From the Ivybridge PRM, volume 2, "Depth Buffer Clear":
> > +   *
> > +   *   If other rendering operations have preceded this clear, a
> > +   *   PIPE_CONTROL with depth cache flush enabled, Depth Stall bit
> > +   *   enabled must be issued before the rectangle primitive used
> for
> > +   *   the depth buffer clear operation.
> > +   *
> > +   * Same applies for Gen8 and Gen9.
> > +   *
> > +   * In addition, from the Ivybridge PRM, volume 2, 1.10.4.1
> > +   * PIPE_CONTROL, Depth Cache Flush Enable:
> > +   *
> > +   *   This bit must not be set when Depth Stall Enable bit is set
> in
> 

Re: [Mesa-dev] [PATCH 03/32] i965/blorp: Do flushes around depth resolves

2017-07-20 Thread Pohjolainen, Topi
On Wed, Jul 19, 2017 at 02:01:29PM -0700, Jason Ekstrand wrote:
> It turns out that if you have rendering in-flight with CCS_E enabled and
> you go to do a depth resolve without flushing, the CCS data may never
> hit the memory.
> ---
>  src/mesa/drivers/dri/i965/brw_blorp.c | 150 
> --
>  1 file changed, 72 insertions(+), 78 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c 
> b/src/mesa/drivers/dri/i965/brw_blorp.c
> index 5335fae..efa3b39 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp.c
> +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
> @@ -1079,51 +1079,48 @@ intel_hiz_exec(struct brw_context *brw, struct 
> intel_mipmap_tree *mt,
> __func__, opname, mt, level, start_layer, start_layer + num_layers - 
> 1);
>  
> /* The following stalls and flushes are only documented to be required for
> -* HiZ clear operations.  However, they also seem to be required for the
> -* HiZ resolve operation which is basically the same as a fast clear only 
> a
> -* different value is written into the HiZ surface.
> +* HiZ clear operations.  However, they also seem to be required for
> +* resolve operations.

How would feel putting some of the rational in the commit message here? Sounds
valuable.

>  */
> -   if (op == BLORP_HIZ_OP_DEPTH_CLEAR || op == BLORP_HIZ_OP_HIZ_RESOLVE) {
> -  if (brw->gen == 6) {
> - /* From the Sandy Bridge PRM, volume 2 part 1, page 313:
> -  *
> -  *   "If other rendering operations have preceded this clear, a
> -  *   PIPE_CONTROL with write cache flush enabled and Z-inhibit
> -  *   disabled must be issued before the rectangle primitive used for
> -  *   the depth buffer clear operation.
> -  */
> -  brw_emit_pipe_control_flush(brw,
> -  PIPE_CONTROL_RENDER_TARGET_FLUSH |
> -  PIPE_CONTROL_DEPTH_CACHE_FLUSH |
> -  PIPE_CONTROL_CS_STALL);
> -  } else if (brw->gen >= 7) {
> - /*
> -  * From the Ivybridge PRM, volume 2, "Depth Buffer Clear":
> -  *
> -  *   If other rendering operations have preceded this clear, a
> -  *   PIPE_CONTROL with depth cache flush enabled, Depth Stall bit
> -  *   enabled must be issued before the rectangle primitive used for
> -  *   the depth buffer clear operation.
> -  *
> -  * Same applies for Gen8 and Gen9.
> -  *
> -  * In addition, from the Ivybridge PRM, volume 2, 1.10.4.1
> -  * PIPE_CONTROL, Depth Cache Flush Enable:
> -  *
> -  *   This bit must not be set when Depth Stall Enable bit is set in
> -  *   this packet.
> -  *
> -  * This is confirmed to hold for real, HSW gets immediate gpu hangs.
> -  *
> -  * Therefore issue two pipe control flushes, one for cache flush and
> -  * another for depth stall.
> -  */
> -  brw_emit_pipe_control_flush(brw,
> -  PIPE_CONTROL_DEPTH_CACHE_FLUSH |
> -  PIPE_CONTROL_CS_STALL);
> +   if (brw->gen == 6) {
> +  /* From the Sandy Bridge PRM, volume 2 part 1, page 313:
> +   *
> +   *   "If other rendering operations have preceded this clear, a
> +   *   PIPE_CONTROL with write cache flush enabled and Z-inhibit
> +   *   disabled must be issued before the rectangle primitive used for
> +   *   the depth buffer clear operation.
> +   */
> +   brw_emit_pipe_control_flush(brw,
> +   PIPE_CONTROL_RENDER_TARGET_FLUSH |
> +   PIPE_CONTROL_DEPTH_CACHE_FLUSH |
> +   PIPE_CONTROL_CS_STALL);
> +   } else if (brw->gen >= 7) {
> +  /*
> +   * From the Ivybridge PRM, volume 2, "Depth Buffer Clear":
> +   *
> +   *   If other rendering operations have preceded this clear, a
> +   *   PIPE_CONTROL with depth cache flush enabled, Depth Stall bit
> +   *   enabled must be issued before the rectangle primitive used for
> +   *   the depth buffer clear operation.
> +   *
> +   * Same applies for Gen8 and Gen9.
> +   *
> +   * In addition, from the Ivybridge PRM, volume 2, 1.10.4.1
> +   * PIPE_CONTROL, Depth Cache Flush Enable:
> +   *
> +   *   This bit must not be set when Depth Stall Enable bit is set in
> +   *   this packet.
> +   *
> +   * This is confirmed to hold for real, HSW gets immediate gpu hangs.
> +   *
> +   * Therefore issue two pipe control flushes, one for cache flush and
> +   * another for depth stall.
> +   */
> +   brw_emit_pipe_control_flush(brw,
> +   PIPE_CONTROL_DEPTH_CACHE_FLUSH |
> +   PIPE_CONTROL_CS_STALL);
>  
> -  

[Mesa-dev] [PATCH 03/32] i965/blorp: Do flushes around depth resolves

2017-07-19 Thread Jason Ekstrand
It turns out that if you have rendering in-flight with CCS_E enabled and
you go to do a depth resolve without flushing, the CCS data may never
hit the memory.
---
 src/mesa/drivers/dri/i965/brw_blorp.c | 150 --
 1 file changed, 72 insertions(+), 78 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c 
b/src/mesa/drivers/dri/i965/brw_blorp.c
index 5335fae..efa3b39 100644
--- a/src/mesa/drivers/dri/i965/brw_blorp.c
+++ b/src/mesa/drivers/dri/i965/brw_blorp.c
@@ -1079,51 +1079,48 @@ intel_hiz_exec(struct brw_context *brw, struct 
intel_mipmap_tree *mt,
__func__, opname, mt, level, start_layer, start_layer + num_layers - 1);
 
/* The following stalls and flushes are only documented to be required for
-* HiZ clear operations.  However, they also seem to be required for the
-* HiZ resolve operation which is basically the same as a fast clear only a
-* different value is written into the HiZ surface.
+* HiZ clear operations.  However, they also seem to be required for
+* resolve operations.
 */
-   if (op == BLORP_HIZ_OP_DEPTH_CLEAR || op == BLORP_HIZ_OP_HIZ_RESOLVE) {
-  if (brw->gen == 6) {
- /* From the Sandy Bridge PRM, volume 2 part 1, page 313:
-  *
-  *   "If other rendering operations have preceded this clear, a
-  *   PIPE_CONTROL with write cache flush enabled and Z-inhibit
-  *   disabled must be issued before the rectangle primitive used for
-  *   the depth buffer clear operation.
-  */
-  brw_emit_pipe_control_flush(brw,
-  PIPE_CONTROL_RENDER_TARGET_FLUSH |
-  PIPE_CONTROL_DEPTH_CACHE_FLUSH |
-  PIPE_CONTROL_CS_STALL);
-  } else if (brw->gen >= 7) {
- /*
-  * From the Ivybridge PRM, volume 2, "Depth Buffer Clear":
-  *
-  *   If other rendering operations have preceded this clear, a
-  *   PIPE_CONTROL with depth cache flush enabled, Depth Stall bit
-  *   enabled must be issued before the rectangle primitive used for
-  *   the depth buffer clear operation.
-  *
-  * Same applies for Gen8 and Gen9.
-  *
-  * In addition, from the Ivybridge PRM, volume 2, 1.10.4.1
-  * PIPE_CONTROL, Depth Cache Flush Enable:
-  *
-  *   This bit must not be set when Depth Stall Enable bit is set in
-  *   this packet.
-  *
-  * This is confirmed to hold for real, HSW gets immediate gpu hangs.
-  *
-  * Therefore issue two pipe control flushes, one for cache flush and
-  * another for depth stall.
-  */
-  brw_emit_pipe_control_flush(brw,
-  PIPE_CONTROL_DEPTH_CACHE_FLUSH |
-  PIPE_CONTROL_CS_STALL);
+   if (brw->gen == 6) {
+  /* From the Sandy Bridge PRM, volume 2 part 1, page 313:
+   *
+   *   "If other rendering operations have preceded this clear, a
+   *   PIPE_CONTROL with write cache flush enabled and Z-inhibit
+   *   disabled must be issued before the rectangle primitive used for
+   *   the depth buffer clear operation.
+   */
+   brw_emit_pipe_control_flush(brw,
+   PIPE_CONTROL_RENDER_TARGET_FLUSH |
+   PIPE_CONTROL_DEPTH_CACHE_FLUSH |
+   PIPE_CONTROL_CS_STALL);
+   } else if (brw->gen >= 7) {
+  /*
+   * From the Ivybridge PRM, volume 2, "Depth Buffer Clear":
+   *
+   *   If other rendering operations have preceded this clear, a
+   *   PIPE_CONTROL with depth cache flush enabled, Depth Stall bit
+   *   enabled must be issued before the rectangle primitive used for
+   *   the depth buffer clear operation.
+   *
+   * Same applies for Gen8 and Gen9.
+   *
+   * In addition, from the Ivybridge PRM, volume 2, 1.10.4.1
+   * PIPE_CONTROL, Depth Cache Flush Enable:
+   *
+   *   This bit must not be set when Depth Stall Enable bit is set in
+   *   this packet.
+   *
+   * This is confirmed to hold for real, HSW gets immediate gpu hangs.
+   *
+   * Therefore issue two pipe control flushes, one for cache flush and
+   * another for depth stall.
+   */
+   brw_emit_pipe_control_flush(brw,
+   PIPE_CONTROL_DEPTH_CACHE_FLUSH |
+   PIPE_CONTROL_CS_STALL);
 
-  brw_emit_pipe_control_flush(brw, PIPE_CONTROL_DEPTH_STALL);
-  }
+   brw_emit_pipe_control_flush(brw, PIPE_CONTROL_DEPTH_STALL);
}
 
 
@@ -1140,42 +1137,39 @@ intel_hiz_exec(struct brw_context *brw, struct 
intel_mipmap_tree *mt,
blorp_batch_finish();
 
/* The following stalls and flushes are only documented to be required for
-* HiZ clear