i965: Make a BRW_NEW_FAST_CLEAR_COLOR dirty bit.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 16 Aug 2017 23:04:22 +0000 (16:04 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 23 Aug 2017 18:55:17 +0000 (11:55 -0700)
When changing fast clear colors, we need to emit new SURFACE_STATE
with the updated color at the next draw call.

Most things work today because the atoms that handle SURFACE_STATE
for images (mutable images, textures, render targets) also listen to
BRW_NEW_BLORP, causing us to re-emit these on every BLORP operation.
However, this is overkill - most BLORP operations don't require us
to re-emit SURFACE_STATE.

One case where this is broken today is a fast clear to a different
color followed by a non-coherent framebuffer fetch.  The renderbuffer
read atom doesn't listen to BRW_NEW_BLORP, and would not get the new
fast clear color.

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/mesa/drivers/dri/i965/brw_blorp.c
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_gs_surface_state.c
src/mesa/drivers/dri/i965/brw_state_upload.c
src/mesa/drivers/dri/i965/brw_tcs_surface_state.c
src/mesa/drivers/dri/i965/brw_tes_surface_state.c
src/mesa/drivers/dri/i965/brw_vs_surface_state.c
src/mesa/drivers/dri/i965/brw_wm_surface_state.c

index d8e48064e3a6f88e27ebd1cd4afe1ea1400f3266..3ea396d726e2a218f05c4547dac8ee561d678da7 100644 (file)
@@ -819,16 +819,23 @@ 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;
+
       /* If the buffer is already in INTEL_FAST_CLEAR_STATE_CLEAR, the clear
        * is redundant and can be skipped.
        */
-      if (aux_state == ISL_AUX_STATE_CLEAR &&
-          memcmp(&irb->mt->fast_clear_color,
-                 &clear_color, sizeof(clear_color)) == 0)
+      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_FAST_CLEAR_COLOR;
+
       DBG("%s (fast) to mt %p level %d layers %d+%d\n", __FUNCTION__,
           irb->mt, irb->mt_level, irb->mt_layer, num_layers);
 
index a227a61f654acb03d8b57eca474fed874d6cb23e..932240bfc505e7ad5ca62c2af1892347cd968733 100644 (file)
@@ -215,6 +215,7 @@ enum brw_state_id {
    BRW_STATE_VIEWPORT_COUNT,
    BRW_STATE_CONSERVATIVE_RASTERIZATION,
    BRW_STATE_DRAW_CALL,
+   BRW_STATE_FAST_CLEAR_COLOR,
    BRW_NUM_STATE_BITS
 };
 
@@ -306,6 +307,7 @@ enum brw_state_id {
 #define BRW_NEW_BLORP                   (1ull << BRW_STATE_BLORP)
 #define BRW_NEW_CONSERVATIVE_RASTERIZATION (1ull << BRW_STATE_CONSERVATIVE_RASTERIZATION)
 #define BRW_NEW_DRAW_CALL               (1ull << BRW_STATE_DRAW_CALL)
+#define BRW_NEW_FAST_CLEAR_COLOR        (1ull << BRW_STATE_FAST_CLEAR_COLOR)
 
 struct brw_state_flags {
    /** State update flags signalled by mesa internals */
index d5a106d6bec1de4fcd68a46ae5e042fef7d92ebf..bcf39a885227c67503acd79ad41a4c73a2829dc7 100644 (file)
@@ -133,6 +133,7 @@ const struct brw_tracked_state brw_gs_image_surfaces = {
       .mesa = _NEW_TEXTURE,
       .brw = BRW_NEW_BATCH |
              BRW_NEW_BLORP |
+             BRW_NEW_FAST_CLEAR_COLOR |
              BRW_NEW_GEOMETRY_PROGRAM |
              BRW_NEW_GS_PROG_DATA |
              BRW_NEW_IMAGE_UNITS,
index 1ae45ba2ac1c2c52daff9d3a7a852f47caf89eb2..9add4515b928256695032bda54f77505ae058d1e 100644 (file)
@@ -350,6 +350,7 @@ static struct dirty_bit_map brw_bits[] = {
    DEFINE_BIT(BRW_NEW_VIEWPORT_COUNT),
    DEFINE_BIT(BRW_NEW_CONSERVATIVE_RASTERIZATION),
    DEFINE_BIT(BRW_NEW_DRAW_CALL),
+   DEFINE_BIT(BRW_NEW_FAST_CLEAR_COLOR),
    {0, 0, 0}
 };
 
index 5c500d0f8d35f6375c598d01da2fbdcdc8b5c697..02f3f0e0356901cf9dfc0aba45493867b61b2fbf 100644 (file)
@@ -133,6 +133,7 @@ const struct brw_tracked_state brw_tcs_image_surfaces = {
    .dirty = {
       .brw = BRW_NEW_BATCH |
              BRW_NEW_BLORP |
+             BRW_NEW_FAST_CLEAR_COLOR |
              BRW_NEW_IMAGE_UNITS |
              BRW_NEW_TCS_PROG_DATA |
              BRW_NEW_TESS_PROGRAMS,
index 1982955be8f6e3894c161e633aa717ed0bf4be94..2750487b811a65eee484e8aec7cae7bbf37b15da 100644 (file)
@@ -133,6 +133,7 @@ const struct brw_tracked_state brw_tes_image_surfaces = {
    .dirty = {
       .brw = BRW_NEW_BATCH |
              BRW_NEW_BLORP |
+             BRW_NEW_FAST_CLEAR_COLOR |
              BRW_NEW_IMAGE_UNITS |
              BRW_NEW_TESS_PROGRAMS |
              BRW_NEW_TES_PROG_DATA,
index 016da7456af2d81d02665e97b324d1ae0bf2a802..9c2184cc4856921c8441611a2655394efda5617d 100644 (file)
@@ -198,6 +198,7 @@ const struct brw_tracked_state brw_vs_image_surfaces = {
       .mesa = _NEW_TEXTURE,
       .brw = BRW_NEW_BATCH |
              BRW_NEW_BLORP |
+             BRW_NEW_FAST_CLEAR_COLOR |
              BRW_NEW_IMAGE_UNITS |
              BRW_NEW_VERTEX_PROGRAM |
              BRW_NEW_VS_PROG_DATA,
index ab55eee1ce43c6e7cf25347f5d95602a468b3b5f..7ae982d77117789702aed10efdfde05ef85e06b9 100644 (file)
@@ -1065,7 +1065,8 @@ const struct brw_tracked_state gen6_renderbuffer_surfaces = {
    .dirty = {
       .mesa = _NEW_BUFFERS,
       .brw = BRW_NEW_BATCH |
-             BRW_NEW_BLORP,
+             BRW_NEW_BLORP |
+             BRW_NEW_FAST_CLEAR_COLOR,
    },
    .emit = update_renderbuffer_surfaces,
 };
@@ -1150,6 +1151,7 @@ const struct brw_tracked_state brw_renderbuffer_read_surfaces = {
    .dirty = {
       .mesa = _NEW_BUFFERS,
       .brw = BRW_NEW_BATCH |
+             BRW_NEW_FAST_CLEAR_COLOR |
              BRW_NEW_FRAGMENT_PROGRAM |
              BRW_NEW_FS_PROG_DATA,
    },
@@ -1246,6 +1248,7 @@ const struct brw_tracked_state brw_texture_surfaces = {
       .mesa = _NEW_TEXTURE,
       .brw = BRW_NEW_BATCH |
              BRW_NEW_BLORP |
+             BRW_NEW_FAST_CLEAR_COLOR |
              BRW_NEW_FRAGMENT_PROGRAM |
              BRW_NEW_FS_PROG_DATA |
              BRW_NEW_GEOMETRY_PROGRAM |
@@ -1286,7 +1289,8 @@ const struct brw_tracked_state brw_cs_texture_surfaces = {
       .mesa = _NEW_TEXTURE,
       .brw = BRW_NEW_BATCH |
              BRW_NEW_BLORP |
-             BRW_NEW_COMPUTE_PROGRAM,
+             BRW_NEW_COMPUTE_PROGRAM |
+             BRW_NEW_FAST_CLEAR_COLOR,
    },
    .emit = brw_update_cs_texture_surfaces,
 };
@@ -1499,6 +1503,7 @@ const struct brw_tracked_state brw_cs_image_surfaces = {
       .brw = BRW_NEW_BATCH |
              BRW_NEW_BLORP |
              BRW_NEW_CS_PROG_DATA |
+             BRW_NEW_FAST_CLEAR_COLOR |
              BRW_NEW_IMAGE_UNITS
    },
    .emit = brw_upload_cs_image_surfaces,
@@ -1683,6 +1688,7 @@ const struct brw_tracked_state brw_wm_image_surfaces = {
       .mesa = _NEW_TEXTURE,
       .brw = BRW_NEW_BATCH |
              BRW_NEW_BLORP |
+             BRW_NEW_FAST_CLEAR_COLOR |
              BRW_NEW_FRAGMENT_PROGRAM |
              BRW_NEW_FS_PROG_DATA |
              BRW_NEW_IMAGE_UNITS