From 2519237c2495adb9564062eed6b9cd225b886dc0 Mon Sep 17 00:00:00 2001
From: Jason Ekstrand <jason.ekstrand@intel.com>
Date: Mon, 12 Sep 2016 11:46:22 -0700
Subject: intel/blorp: Handle the 512 layers restriction on Sandy Bridge

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
---
 src/intel/blorp/blorp.c       |  6 ++++++
 src/intel/blorp/blorp_clear.c | 17 +++++++++++++----
 2 files changed, 19 insertions(+), 4 deletions(-)

(limited to 'src/intel')

diff --git a/src/intel/blorp/blorp.c b/src/intel/blorp/blorp.c
index 17c1ff4c134..8dfebbcb2ad 100644
--- a/src/intel/blorp/blorp.c
+++ b/src/intel/blorp/blorp.c
@@ -139,6 +139,12 @@ brw_blorp_surface_info_init(struct blorp_context *blorp,
       info->view.array_len -= info->view.base_array_layer;
       info->z_offset = 0;
    }
+
+   /* Sandy Bridge has a limit of a maximum of 512 layers for layered
+    * rendering.
+    */
+   if (is_render_target && blorp->isl_dev->info->gen == 6)
+      info->view.array_len = MIN2(info->view.array_len, 512);
 }
 
 
diff --git a/src/intel/blorp/blorp_clear.c b/src/intel/blorp/blorp_clear.c
index cba48234f96..2213ada2c6c 100644
--- a/src/intel/blorp/blorp_clear.c
+++ b/src/intel/blorp/blorp_clear.c
@@ -246,7 +246,6 @@ blorp_clear(struct blorp_batch *batch,
 {
    struct blorp_params params;
    blorp_params_init(&params);
-   params.num_layers = num_layers;
 
    params.x0 = x0;
    params.y0 = y0;
@@ -278,10 +277,20 @@ blorp_clear(struct blorp_batch *batch,
    blorp_params_get_clear_kernel(batch->blorp, &params,
                                  use_simd16_replicated_data);
 
-   brw_blorp_surface_info_init(batch->blorp, &params.dst, surf, level,
-                               start_layer, format, true);
+   while (num_layers > 0) {
+      brw_blorp_surface_info_init(batch->blorp, &params.dst, surf, level,
+                                  start_layer, format, true);
 
-   batch->blorp->exec(batch, &params);
+      /* We may be restricted on the number of layers we can bind at any one
+       * time.  In particular, Sandy Bridge has a maximum number of layers of
+       * 512 but a maximum 3D texture size is much larger.
+       */
+      params.num_layers = MIN2(params.dst.view.array_len, num_layers);
+      batch->blorp->exec(batch, &params);
+
+      start_layer += params.num_layers;
+      num_layers -= params.num_layers;
+   }
 }
 
 void
-- 
cgit v1.2.3