[Mesa-dev] [Mesa-stable] [PATCH 1/2] i965: Make a BRW_NEW_FAST_CLEAR_COLOR dirty bit.
Andres Gomez
agomez at igalia.com
Thu Aug 24 13:17:24 UTC 2017
Kenneth, for 17.1, this patch depends on f9fd976e8adb and others.
If you still want to add it for 17.1, I think we would need a backport.
Br.
On Thu, 2017-08-17 at 15:16 -0700, Kenneth Graunke wrote:
> 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 at lists.freedesktop.org
> ---
> src/mesa/drivers/dri/i965/brw_blorp.c | 13 ++++++++++---
> src/mesa/drivers/dri/i965/brw_context.h | 2 ++
> src/mesa/drivers/dri/i965/brw_gs_surface_state.c | 1 +
> src/mesa/drivers/dri/i965/brw_state_upload.c | 1 +
> src/mesa/drivers/dri/i965/brw_tcs_surface_state.c | 1 +
> src/mesa/drivers/dri/i965/brw_tes_surface_state.c | 1 +
> src/mesa/drivers/dri/i965/brw_vs_surface_state.c | 1 +
> src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 10 ++++++++--
> 8 files changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c b/src/mesa/drivers/dri/i965/brw_blorp.c
> index d8e48064e3a..3ea396d726e 100644
> --- a/src/mesa/drivers/dri/i965/brw_blorp.c
> +++ b/src/mesa/drivers/dri/i965/brw_blorp.c
> @@ -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);
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index d41e6aa7bde..9061dc19936 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -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 */
> diff --git a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c
> index d5a106d6bec..bcf39a88522 100644
> --- a/src/mesa/drivers/dri/i965/brw_gs_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_gs_surface_state.c
> @@ -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,
> diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c
> index 1ae45ba2ac1..9add4515b92 100644
> --- a/src/mesa/drivers/dri/i965/brw_state_upload.c
> +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
> @@ -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}
> };
>
> diff --git a/src/mesa/drivers/dri/i965/brw_tcs_surface_state.c b/src/mesa/drivers/dri/i965/brw_tcs_surface_state.c
> index 5c500d0f8d3..02f3f0e0356 100644
> --- a/src/mesa/drivers/dri/i965/brw_tcs_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_tcs_surface_state.c
> @@ -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,
> diff --git a/src/mesa/drivers/dri/i965/brw_tes_surface_state.c b/src/mesa/drivers/dri/i965/brw_tes_surface_state.c
> index 1982955be8f..2750487b811 100644
> --- a/src/mesa/drivers/dri/i965/brw_tes_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_tes_surface_state.c
> @@ -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,
> diff --git a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
> index 016da7456af..9c2184cc485 100644
> --- a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c
> @@ -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,
> diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> index 8537d6eeeb5..8aece51e9db 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -1091,7 +1091,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,
> };
> @@ -1174,6 +1175,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,
> },
> @@ -1270,6 +1272,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 |
> @@ -1310,7 +1313,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,
> };
> @@ -1523,6 +1527,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,
> @@ -1707,6 +1712,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
--
Br,
Andres
More information about the mesa-dev
mailing list