i965/meta: Split conversion of color and setting it
authorTopi Pohjolainen <topi.pohjolainen@intel.com>
Sun, 12 Jun 2016 17:49:54 +0000 (20:49 +0300)
committerTopi Pohjolainen <topi.pohjolainen@intel.com>
Wed, 23 Nov 2016 09:06:53 +0000 (11:06 +0200)
And fix a mangled comment while at it.

v2 (Ben): Return the converted color.

Signed-off-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_blorp.c
src/mesa/drivers/dri/i965/brw_meta_util.c
src/mesa/drivers/dri/i965/brw_meta_util.h

index 120b89ae6d6bb073db494e2b993ae41277908764..56a30b4d552b6b3127a0e3133cb832ff8ebe19d0 100644 (file)
@@ -817,12 +817,17 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
                                           brw, irb->mt);
 
    if (can_fast_clear) {
+      union gl_color_union override_color =
+         brw_meta_convert_fast_clear_color(brw, irb->mt,
+                                           &ctx->Color.ClearColor);
+
       /* Record the clear color in the miptree so that it will be
        * programmed in SURFACE_STATE by later rendering and resolve
        * operations.
        */
       const bool color_updated = brw_meta_set_fast_clear_color(
-                                    brw, irb->mt, &ctx->Color.ClearColor);
+                                    brw, &irb->mt->gen9_fast_clear_color,
+                                    &override_color);
 
       /* If the buffer is already in INTEL_FAST_CLEAR_STATE_CLEAR, the clear
        * is redundant and can be skipped.
index 499b6eacc0c95e2ab936b1c6279cb1789a3287d8..6d6b6923f141ffea7b3ac1aa385c575175b76ece 100644 (file)
@@ -372,13 +372,11 @@ brw_is_color_fast_clear_compatible(struct brw_context *brw,
 /**
  * Convert the given color to a bitfield suitable for ORing into DWORD 7 of
  * SURFACE_STATE (DWORD 12-15 on SKL+).
- *
- * Returned boolean tells if the given color differs from the stored.
  */
-bool
-brw_meta_set_fast_clear_color(struct brw_context *brw,
-                              struct intel_mipmap_tree *mt,
-                              const union gl_color_union *color)
+union gl_color_union
+brw_meta_convert_fast_clear_color(const struct brw_context *brw,
+                                  const struct intel_mipmap_tree *mt,
+                                  const union gl_color_union *color)
 {
    union gl_color_union override_color = *color;
 
@@ -410,7 +408,7 @@ brw_meta_set_fast_clear_color(struct brw_context *brw,
          override_color.f[3] = 1.0f;
    }
 
-   /* Handle linearSRGB conversion */
+   /* Handle linear to SRGB conversion */
    if (brw->ctx.Color.sRGBEnabled &&
        _mesa_get_srgb_format_linear(mt->format) != mt->format) {
       for (int i = 0; i < 3; i++) {
@@ -419,24 +417,33 @@ brw_meta_set_fast_clear_color(struct brw_context *brw,
       }
    }
 
+   return override_color;
+}
+
+/* Returned boolean tells if the given color differs from the current. */
+bool
+brw_meta_set_fast_clear_color(struct brw_context *brw,
+                              union gl_color_union *curr_color,
+                              const union gl_color_union *new_color)
+{
    bool updated;
+
    if (brw->gen >= 9) {
-      updated = memcmp(&mt->gen9_fast_clear_color, &override_color,
-                       sizeof(mt->gen9_fast_clear_color));
-      mt->gen9_fast_clear_color = override_color;
+      updated = memcmp(curr_color, new_color, sizeof(*curr_color));
+      *curr_color = *new_color;
    } else {
-      const uint32_t old_color_value = mt->fast_clear_color_value;
+      const uint32_t old_color_value = *(uint32_t *)curr_color;
+      uint32_t adjusted = 0;
 
-      mt->fast_clear_color_value = 0;
       for (int i = 0; i < 4; i++) {
          /* Testing for non-0 works for integer and float colors */
-         if (override_color.f[i] != 0.0f) {
-             mt->fast_clear_color_value |=
-                1 << (GEN7_SURFACE_CLEAR_COLOR_SHIFT + (3 - i));
+         if (new_color->f[i] != 0.0f) {
+            adjusted |= 1 << (GEN7_SURFACE_CLEAR_COLOR_SHIFT + (3 - i));
          }
       }
 
-      updated = (old_color_value != mt->fast_clear_color_value);
+      updated = (old_color_value != adjusted);
+      *(uint32_t *)curr_color = adjusted;
    }
 
    return updated;
index b9c4eac9c6c3c07a24d7d9bfe05dde1f5beaca5c..93bc72cf258226a6766a2a71372909dad649f840 100644 (file)
@@ -42,10 +42,15 @@ brw_meta_mirror_clip_and_scissor(const struct gl_context *ctx,
                                  GLfloat *dstX1, GLfloat *dstY1,
                                  bool *mirror_x, bool *mirror_y);
 
+union gl_color_union
+brw_meta_convert_fast_clear_color(const struct brw_context *brw,
+                                  const struct intel_mipmap_tree *mt,
+                                  const union gl_color_union *color);
+
 bool
 brw_meta_set_fast_clear_color(struct brw_context *brw,
-                              struct intel_mipmap_tree *mt,
-                              const union gl_color_union *color);
+                              union gl_color_union *curr_color,
+                              const union gl_color_union *new_color);
 
 bool
 brw_is_color_fast_clear_compatible(struct brw_context *brw,