Commit 8ca8a6a7 authored by Lucas Stach's avatar Lucas Stach

etnaviv: use dummy RT buffer when rendering without color buffer

At least GC2000 seems to push some dirt from the PE color cache into
the last bound render target when drawing depth only. Newer cores
seem to behave properly and don't do this, but I have found no way
to fix it on GC2000. Flushes and stalls don't seem to make any

In order to stop the core from pushing the dirt into a precious real
render target, plug in dummy buffer when rendering without a color
Signed-off-by: Lucas Stach's avatarLucas Stach <>
Reviewed-by: default avatarPhilipp Zabel <>
parent 87062040
......@@ -60,6 +60,9 @@ etna_context_destroy(struct pipe_context *pctx)
struct etna_context *ctx = etna_context(pctx);
if (ctx->dummy_rt)
if (ctx->primconvert)
......@@ -486,6 +489,16 @@ etna_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
slab_create_child(&ctx->transfer_pool, &screen->transfer_pool);
/* create dummy RT buffer, used when rendering with no color buffer */
ctx->dummy_rt = etna_bo_new(ctx->screen->dev, 64 * 64 * 4,
if (!ctx->dummy_rt)
goto fail;
ctx-> = ctx->dummy_rt;
ctx->dummy_rt_reloc.offset = 0;
ctx->dummy_rt_reloc.flags = ETNA_RELOC_READ | ETNA_RELOC_WRITE;
return pctx;
......@@ -190,6 +190,9 @@ struct etna_context {
/* list of active hardware queries */
struct list_head active_hw_queries;
struct etna_bo *dummy_rt;
struct etna_reloc dummy_rt_reloc;
static inline struct etna_context *
......@@ -191,8 +191,9 @@ etna_set_framebuffer_state(struct pipe_context *pctx,
cs-> = NULL;
cs-> = NULL;
for (int i = 0; i < ETNA_MAX_PIXELPIPES; i++)
cs->PE_COLOR_ADDR = ctx->dummy_rt_reloc;
for (int i = 0; i < ctx->specs.pixel_pipes; i++)
cs->PE_PIPE_COLOR_ADDR[i] = ctx->dummy_rt_reloc;
if (sv->zsbuf != NULL) {
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment