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);
BRW_STATE_VIEWPORT_COUNT,
BRW_STATE_CONSERVATIVE_RASTERIZATION,
BRW_STATE_DRAW_CALL,
+ BRW_STATE_FAST_CLEAR_COLOR,
BRW_NUM_STATE_BITS
};
#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 */
.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,
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}
};
.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,
.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,
.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,
.dirty = {
.mesa = _NEW_BUFFERS,
.brw = BRW_NEW_BATCH |
- BRW_NEW_BLORP,
+ BRW_NEW_BLORP |
+ BRW_NEW_FAST_CLEAR_COLOR,
},
.emit = update_renderbuffer_surfaces,
};
.dirty = {
.mesa = _NEW_BUFFERS,
.brw = BRW_NEW_BATCH |
+ BRW_NEW_FAST_CLEAR_COLOR |
BRW_NEW_FRAGMENT_PROGRAM |
BRW_NEW_FS_PROG_DATA,
},
.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 |
.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,
};
.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,
.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