i965: emit BRW_NEW_AUX_STATE when we change the fast clear value
authorIago Toral Quiroga <itoral@igalia.com>
Fri, 15 Sep 2017 07:06:11 +0000 (09:06 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Mon, 18 Sep 2017 08:47:51 +0000 (10:47 +0200)
v2: rename intel_miptree_set_clear_value to intel_miptree_set_clear_color
    (Jason)

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_blorp.c
src/mesa/drivers/dri/i965/brw_clear.c
src/mesa/drivers/dri/i965/intel_mipmap_tree.h

index d89b3ee4f08288e831586e10b6f9bbe66eb7b37d..835dbd2af36ecce4fd5f3eb0b9672e9808b7f093 100644 (file)
@@ -853,8 +853,8 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
          brw_meta_convert_fast_clear_color(brw, irb->mt,
                                            &ctx->Color.ClearColor);
 
-      bool same_clear_color = memcmp(&irb->mt->fast_clear_color,
-                                     &clear_color, sizeof(clear_color)) == 0;
+      bool same_clear_color =
+         !intel_miptree_set_clear_color(ctx, irb->mt, clear_color);
 
       /* If the buffer is already in INTEL_FAST_CLEAR_STATE_CLEAR, the clear
        * is redundant and can be skipped.
@@ -862,14 +862,6 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
       if (aux_state == ISL_AUX_STATE_CLEAR && same_clear_color)
          return;
 
-      irb->mt->fast_clear_color = clear_color;
-
-      /* If the clear color has changed, we need to emit a new SURFACE_STATE
-       * on the next draw call.
-       */
-      if (!same_clear_color)
-         ctx->NewDriverState |= BRW_NEW_AUX_STATE;
-
       DBG("%s (fast) to mt %p level %d layers %d+%d\n", __FUNCTION__,
           irb->mt, irb->mt_level, irb->mt_layer, num_layers);
 
index b9e087ce33b84b53b45a51e57947a4e13e5c1d4e..fe8634b3b347fa629049479c86dc13f58f06a151 100644 (file)
@@ -212,7 +212,7 @@ brw_fast_clear_depth(struct gl_context *ctx)
          }
       }
 
-      mt->fast_clear_color.f32[0] = clear_value;
+      intel_miptree_set_depth_clear_value(ctx, mt, clear_value);
    }
 
    bool need_clear = false;
index e2b23c5aadd8110fd318d65cf18b84ceed01268f..2fce28c524b33f67b67e814fc4b2c33beb449076 100644 (file)
@@ -50,6 +50,7 @@
 #include "isl/isl.h"
 #include "blorp/blorp.h"
 #include "brw_bufmgr.h"
+#include "brw_context.h"
 #include <GL/internal/dri_interface.h>
 
 #ifdef __cplusplus
@@ -710,6 +711,33 @@ bool
 intel_miptree_sample_with_hiz(struct brw_context *brw,
                               struct intel_mipmap_tree *mt);
 
+
+static inline bool
+intel_miptree_set_clear_color(struct gl_context *ctx,
+                              struct intel_mipmap_tree *mt,
+                              union isl_color_value clear_color)
+{
+   if (memcmp(&mt->fast_clear_color, &clear_color, sizeof(clear_color)) != 0) {
+      mt->fast_clear_color = clear_color;
+      ctx->NewDriverState |= BRW_NEW_AUX_STATE;
+      return true;
+   }
+   return false;
+}
+
+static inline bool
+intel_miptree_set_depth_clear_value(struct gl_context *ctx,
+                                    struct intel_mipmap_tree *mt,
+                                    float clear_value)
+{
+   if (mt->fast_clear_color.f32[0] != clear_value) {
+      mt->fast_clear_color.f32[0] = clear_value;
+      ctx->NewDriverState |= BRW_NEW_AUX_STATE;
+      return true;
+   }
+   return false;
+}
+
 #ifdef __cplusplus
 }
 #endif