freedreno/gmem: fix hw binning hangs with large render targets
authorRob Clark <robdclark@gmail.com>
Tue, 16 May 2017 12:37:50 +0000 (08:37 -0400)
committerRob Clark <robdclark@gmail.com>
Tue, 16 May 2017 20:34:21 +0000 (16:34 -0400)
On all 3 gens, we have 4 bits for width and height in the VSC pipe
config.  And overflow results in setting width and/or height to zero
which causes hangs.

Signed-off-by: Rob Clark <robdclark@gmail.com>
src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
src/gallium/drivers/freedreno/a4xx/fd4_gmem.c
src/gallium/drivers/freedreno/a5xx/fd5_gmem.c

index 0ec769b9d6d86e952b8e119c468b8882320310f2..151ecfbf6139c097ce62da92773d6ae437b152a2 100644 (file)
@@ -152,6 +152,9 @@ use_hw_binning(struct fd_batch *batch)
        if ((gmem->maxpw * gmem->maxph) > 32)
                return false;
 
+       if ((gmem->maxpw > 15) || (gmem->maxph > 15))
+               return false;
+
        return fd_binning_enabled && ((gmem->nbins_x * gmem->nbins_y) > 2);
 }
 
index 5b7dc0320458cf5acf6e349889c60c644aeb81f8..49476d8636df3b4f9b9c3505f93038a5fb6246f0 100644 (file)
@@ -135,10 +135,11 @@ static bool
 use_hw_binning(struct fd_batch *batch)
 {
        struct fd_gmem_stateobj *gmem = &batch->ctx->gmem;
-       struct pipe_framebuffer_state *pfb = &batch->framebuffer;
 
-       /* this seems to be a hw bug.. but this hack fixes piglit fbo-maxsize: */
-       if ((pfb->width > 4096) && (pfb->height > 4096))
+       if ((gmem->maxpw * gmem->maxph) > 32)
+               return false;
+
+       if ((gmem->maxpw > 15) || (gmem->maxph > 15))
                return false;
 
        return fd_binning_enabled && ((gmem->nbins_x * gmem->nbins_y) > 2);
index 1a451811451038dceaa6636ea663e313165baf10..7fb0191fed8575393356b84b05f0afda120b714d 100644 (file)
@@ -212,6 +212,12 @@ use_hw_binning(struct fd_batch *batch)
 {
        struct fd_gmem_stateobj *gmem = &batch->ctx->gmem;
 
+       if ((gmem->maxpw * gmem->maxph) > 32)
+               return false;
+
+       if ((gmem->maxpw > 15) || (gmem->maxph > 15))
+               return false;
+
        return fd_binning_enabled && ((gmem->nbins_x * gmem->nbins_y) > 2) &&
                        (batch->num_draws > 0);
 }