On Tue, Sep 25, 2012 at 7:46 PM, Marek Olšák <mar...@gmail.com> wrote: > This fixes rare graphical corruption. > > NOTE: This is a candidate for the stable branches. > --- > src/gallium/drivers/r600/evergreen_state.c | 4 ++++ > src/gallium/drivers/r600/r600.h | 1 + > src/gallium/drivers/r600/r600_hw_context.c | 6 ++++++ > src/gallium/drivers/r600/r600_hw_context_priv.h | 2 +- > src/gallium/drivers/r600/r600d.h | 1 + > 5 files changed, 13 insertions(+), 1 deletion(-) > > diff --git a/src/gallium/drivers/r600/evergreen_state.c > b/src/gallium/drivers/r600/evergreen_state.c > index 98dbb2f..7bedfec 100644 > --- a/src/gallium/drivers/r600/evergreen_state.c > +++ b/src/gallium/drivers/r600/evergreen_state.c > @@ -1458,6 +1458,10 @@ static void evergreen_set_framebuffer_state(struct > pipe_context *ctx, > > if (rctx->framebuffer.state.nr_cbufs) { > rctx->flags |= R600_CONTEXT_CB_FLUSH; > + > + if (rctx->framebuffer.state.cbufs[0]->texture->nr_samples > > 1) { > + rctx->flags |= R600_CONTEXT_FLUSH_AND_INV_CB_META; > + } > } > if (rctx->framebuffer.state.zsbuf) { > rctx->flags |= R600_CONTEXT_DB_FLUSH; > diff --git a/src/gallium/drivers/r600/r600.h b/src/gallium/drivers/r600/r600.h > index 83d21a4..7d43416 100644 > --- a/src/gallium/drivers/r600/r600.h > +++ b/src/gallium/drivers/r600/r600.h > @@ -190,6 +190,7 @@ struct r600_so_target { > #define R600_CONTEXT_WAIT_IDLE (1 << 7) > #define R600_CONTEXT_FLUSH_AND_INV (1 << 8) > #define R600_CONTEXT_HTILE_ERRATA (1 << 9) > +#define R600_CONTEXT_FLUSH_AND_INV_CB_META (1 << 10) > > struct r600_context; > struct r600_screen; > diff --git a/src/gallium/drivers/r600/r600_hw_context.c > b/src/gallium/drivers/r600/r600_hw_context.c > index 38dd7b6..aab0b8b 100644 > --- a/src/gallium/drivers/r600/r600_hw_context.c > +++ b/src/gallium/drivers/r600/r600_hw_context.c > @@ -684,6 +684,12 @@ void r600_flush_emit(struct r600_context *rctx) > cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_PS_PARTIAL_FLUSH) > | EVENT_INDEX(4); > } > > + if (rctx->chip_class >= EVERGREEN && > + (rctx->flags & R600_CONTEXT_FLUSH_AND_INV_CB_META)) { > + cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0); > + cs->buf[cs->cdw++] = > EVENT_TYPE(EVENT_TYPE_FLUSH_AND_INV_CB_META) | EVENT_INDEX(0); > + } > + > if (rctx->flags & R600_CONTEXT_FLUSH_AND_INV) { > cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0); > cs->buf[cs->cdw++] = > EVENT_TYPE(EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0); > diff --git a/src/gallium/drivers/r600/r600_hw_context_priv.h > b/src/gallium/drivers/r600/r600_hw_context_priv.h > index 83474b0..85fd74d 100644 > --- a/src/gallium/drivers/r600/r600_hw_context_priv.h > +++ b/src/gallium/drivers/r600/r600_hw_context_priv.h > @@ -29,7 +29,7 @@ > #include "r600_pipe.h" > > /* the number of CS dwords for flushing and drawing */ > -#define R600_MAX_FLUSH_CS_DWORDS 44 > +#define R600_MAX_FLUSH_CS_DWORDS 46 > #define R600_MAX_DRAW_CS_DWORDS 34 > > /* these flags are used in register flags and added into block flags */ > diff --git a/src/gallium/drivers/r600/r600d.h > b/src/gallium/drivers/r600/r600d.h > index cf0059a..e96ef7e 100644 > --- a/src/gallium/drivers/r600/r600d.h > +++ b/src/gallium/drivers/r600/r600d.h > @@ -119,6 +119,7 @@ > #define EVENT_TYPE_CACHE_FLUSH_AND_INV_EVENT 0x16 > #define EVENT_TYPE_SO_VGTSTREAMOUT_FLUSH 0x1f > #define EVENT_TYPE_SAMPLE_STREAMOUTSTATS 0x20 > +#define EVENT_TYPE_FLUSH_AND_INV_CB_META 46 /* evergreen only */
This actually exists on r7xx as well. 7xx has the following additional events compared to 6xx: 43 - FLUSH_AND_INV_DB_DATA_TS 44 - FLUSH_AND_INV_DB_META 45 - FLUSH_AND_INV_CB_DATA_TS 46 - FLUSH_AND_INV_CB_META > #define EVENT_TYPE(x) ((x) << 0) > #define EVENT_INDEX(x) ((x) << 8) > /* 0 - any non-TS event > -- > 1.7.9.5 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev