intel/blorp: Take a fast_clear_op in ccs_resolve
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 25 Oct 2016 17:48:12 +0000 (10:48 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 17 Nov 2016 20:03:24 +0000 (12:03 -0800)
Eventually, we may want to just have a single blorp_ccs_op function that
does both clears and resolves.  For now we'll stick to just making the
ccs_resolve function we have now a bit more configurable.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/intel/blorp/blorp.h
src/intel/blorp/blorp_clear.c
src/intel/blorp/blorp_priv.h
src/mesa/drivers/dri/i965/brw_blorp.c

index 4e5a3a33ad6f31ffb7892378f12c53143806981f..823475b6075adfcf29c9ca67371e897d159c0420 100644 (file)
@@ -167,10 +167,18 @@ blorp_clear_attachments(struct blorp_batch *batch,
                         bool clear_depth, float depth_value,
                         uint8_t stencil_mask, uint8_t stencil_value);
 
+enum blorp_fast_clear_op {
+   BLORP_FAST_CLEAR_OP_NONE = 0,
+   BLORP_FAST_CLEAR_OP_CLEAR,
+   BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL,
+   BLORP_FAST_CLEAR_OP_RESOLVE_FULL,
+};
+
 void
 blorp_ccs_resolve(struct blorp_batch *batch,
                   struct blorp_surf *surf, uint32_t level, uint32_t layer,
-                  enum isl_format format);
+                  enum isl_format format,
+                  enum blorp_fast_clear_op resolve_op);
 
 /**
  * For an overview of the HiZ operations, see the following sections of the
index 5c40e2f0557408dc2b495931b54851b886af005e..83ec57e556c38de7ee9e27c96b8fd50db89c5103 100644 (file)
@@ -543,7 +543,8 @@ blorp_clear_attachments(struct blorp_batch *batch,
 void
 blorp_ccs_resolve(struct blorp_batch *batch,
                   struct blorp_surf *surf, uint32_t level, uint32_t layer,
-                  enum isl_format format)
+                  enum isl_format format,
+                  enum blorp_fast_clear_op resolve_op)
 {
    struct blorp_params params;
    blorp_params_init(&params);
@@ -586,14 +587,13 @@ blorp_ccs_resolve(struct blorp_batch *batch,
    params.y1 = ALIGN(params.y1, y_scaledown) / y_scaledown;
 
    if (batch->blorp->isl_dev->info->gen >= 9) {
-      if (params.dst.aux_usage == ISL_AUX_USAGE_CCS_E)
-         params.fast_clear_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
-      else
-         params.fast_clear_op = BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL;
+      assert(resolve_op == BLORP_FAST_CLEAR_OP_RESOLVE_FULL ||
+             resolve_op == BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL);
    } else {
       /* Broadwell and earlier do not have a partial resolve */
-      params.fast_clear_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
+      assert(resolve_op == BLORP_FAST_CLEAR_OP_RESOLVE_FULL);
    }
+   params.fast_clear_op = resolve_op;
 
    /* Note: there is no need to initialize push constants because it doesn't
     * matter what data gets dispatched to the render target.  However, we must
index 71805ade1578433cf3bafab757901efe1db03d50..409c69d2332f30fef3d05a23ff6f98d58c6f9846 100644 (file)
@@ -44,13 +44,6 @@ enum {
    BLORP_NUM_BT_ENTRIES
 };
 
-enum blorp_fast_clear_op {
-   BLORP_FAST_CLEAR_OP_NONE = 0,
-   BLORP_FAST_CLEAR_OP_CLEAR,
-   BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL,
-   BLORP_FAST_CLEAR_OP_RESOLVE_FULL,
-};
-
 struct brw_blorp_surface_info
 {
    bool enabled;
index 2771f1466db420e04b536a4bdfb8b7b642dfd2b5..95a2bb7bb3c9300a88352f23f14b5d5094220e3f 100644 (file)
@@ -943,10 +943,23 @@ brw_blorp_resolve_color(struct brw_context *brw, struct intel_mipmap_tree *mt)
    unsigned level = 0;
    blorp_surf_for_miptree(brw, &surf, mt, true, &level, isl_tmp);
 
+   enum blorp_fast_clear_op resolve_op;
+   if (brw->gen >= 9) {
+      if (surf.aux_usage == ISL_AUX_USAGE_CCS_E)
+         resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
+      else
+         resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL;
+   } else {
+      assert(surf.aux_usage == ISL_AUX_USAGE_CCS_D);
+      /* Broadwell and earlier do not have a partial resolve */
+      resolve_op = BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
+   }
+
    struct blorp_batch batch;
    blorp_batch_init(&brw->blorp, &batch, brw, 0);
    blorp_ccs_resolve(&batch, &surf, 0 /* level */, 0 /* layer */,
-                     brw_blorp_to_isl_format(brw, format, true));
+                     brw_blorp_to_isl_format(brw, format, true),
+                     resolve_op);
    blorp_batch_finish(&batch);
 
    mt->fast_clear_state = INTEL_FAST_CLEAR_STATE_RESOLVED;