i965: Enable fast clears for multi-lod
[mesa.git] / src / mesa / drivers / dri / i965 / intel_mipmap_tree.c
index d061cd43f5729e174ce0b4799c2aa42a91a4119a..a9b350e25e84747ebb67adb4aa5753cbec7c7ba3 100644 (file)
@@ -201,21 +201,6 @@ intel_miptree_supports_non_msrt_fast_clear(struct brw_context *brw,
    if (brw->gen < 8 && (mip_mapped || arrayed))
       return false;
 
-   /* Not implemented yet. */
-   if (mip_mapped) {
-      perf_debug("Multi-LOD fast clear - giving up (%dx%dx%d).\n",
-                 mt->logical_width0, mt->logical_height0, mt->last_level);
-      return false;
-   }
-
-   /* Not implemented yet. */
-   if (arrayed) {
-      perf_debug("Layered fast clear - giving up. (%dx%d%d)\n",
-                 mt->logical_width0, mt->logical_height0,
-                 mt->physical_depth0);
-      return false;
-   }
-
    /* There's no point in using an MCS buffer if the surface isn't in a
     * renderable format.
     */
@@ -1577,7 +1562,7 @@ intel_miptree_alloc_mcs(struct brw_context *brw,
 
    /* Multisampled miptrees are only supported for single level. */
    assert(mt->first_level == 0);
-   intel_miptree_set_fast_clear_state(mt, mt->first_level, 0,
+   intel_miptree_set_fast_clear_state(brw, mt, mt->first_level, 0,
                                       mt->logical_depth0,
                                       INTEL_FAST_CLEAR_STATE_CLEAR);
 
@@ -2164,28 +2149,31 @@ intel_miptree_get_fast_clear_state(const struct intel_mipmap_tree *mt,
 }
 
 static void
-intel_miptree_check_color_resolve(const struct intel_mipmap_tree *mt,
+intel_miptree_check_color_resolve(const struct brw_context *brw,
+                                  const struct intel_mipmap_tree *mt,
                                   unsigned level, unsigned layer)
 {
    if (mt->no_ccs || !mt->mcs_buf)
       return;
 
-   /* Fast color clear is not supported for mipmapped surfaces. */
-   assert(level == 0 && mt->first_level == 0 && mt->last_level == 0);
+   /* Fast color clear is supported for mipmapped surfaces only on Gen8+. */
+   assert(brw->gen >= 8 ||
+          (level == 0 && mt->first_level == 0 && mt->last_level == 0));
 
    /* Compression of arrayed msaa surfaces is supported. */
    if (mt->num_samples > 1)
       return;
 
-   /* Fast color clear is not supported for non-msaa arrays. */
-   assert(layer == 0 && mt->logical_depth0 == 1);
+   /* Fast color clear is supported for non-msaa arrays only on Gen8+. */
+   assert(brw->gen >= 8 || (layer == 0 && mt->logical_depth0 == 1));
 
    (void)level;
    (void)layer;
 }
 
 void
-intel_miptree_set_fast_clear_state(struct intel_mipmap_tree *mt,
+intel_miptree_set_fast_clear_state(const struct brw_context *brw,
+                                   struct intel_mipmap_tree *mt,
                                    unsigned level,
                                    unsigned first_layer,
                                    unsigned num_layers,
@@ -2196,7 +2184,7 @@ intel_miptree_set_fast_clear_state(struct intel_mipmap_tree *mt,
     */
    assert(new_state != INTEL_FAST_CLEAR_STATE_RESOLVED);
 
-   intel_miptree_check_color_resolve(mt, level, first_layer);
+   intel_miptree_check_color_resolve(brw, mt, level, first_layer);
 
    assert(first_layer + num_layers <= mt->physical_depth0);
 
@@ -2234,7 +2222,7 @@ intel_miptree_used_for_rendering(const struct brw_context *brw,
       if (is_lossless_compressed ||
           fast_clear_state == INTEL_FAST_CLEAR_STATE_CLEAR) {
          intel_miptree_set_fast_clear_state(
-            mt, level, start_layer + i, 1,
+            brw, mt, level, start_layer + i, 1,
             INTEL_FAST_CLEAR_STATE_UNRESOLVED);
       }
    }
@@ -2271,13 +2259,13 @@ intel_miptree_resolve_color(struct brw_context *brw,
                             unsigned start_layer, unsigned num_layers,
                             int flags)
 {
-   intel_miptree_check_color_resolve(mt, level, start_layer);
+   intel_miptree_check_color_resolve(brw, mt, level, start_layer);
 
    if (!intel_miptree_needs_color_resolve(brw, mt, flags))
       return false;
 
-   /* For now arrayed fast clear is not supported. */
-   assert(num_layers == 1);
+   /* Arrayed fast clear is only supported for gen8+. */
+   assert(brw->gen >= 8 || num_layers == 1);
 
    bool resolved = false;
    for (unsigned i = 0; i < num_layers; ++i) {
@@ -2333,7 +2321,7 @@ intel_miptree_make_shareable(struct brw_context *brw,
     * pixel data is stored.  Fortunately this code path should never be
     * reached for multisample buffers.
     */
-   assert(mt->msaa_layout == INTEL_MSAA_LAYOUT_NONE);
+   assert(mt->msaa_layout == INTEL_MSAA_LAYOUT_NONE || mt->num_samples <= 1);
 
    if (mt->mcs_buf) {
       intel_miptree_all_slices_resolve_color(brw, mt, 0);