diff options
author | Lucas Stach <[email protected]> | 2018-11-14 14:51:49 +0100 |
---|---|---|
committer | Lucas Stach <[email protected]> | 2018-11-19 15:48:10 +0100 |
commit | 8ca8a6a7b13798fa494c10890b2336c08c9e44aa (patch) | |
tree | 17139c26e68158a33e82f94058bc6abbe8f0cdc2 /src/gallium/drivers/etnaviv/etnaviv_context.c | |
parent | 8706204074755279041ff5f119186862a57863fa (diff) |
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
difference.
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
buffer.
Signed-off-by: Lucas Stach <[email protected]>
Reviewed-by: Philipp Zabel <[email protected]>
Diffstat (limited to 'src/gallium/drivers/etnaviv/etnaviv_context.c')
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_context.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index 3038d210e10..1c305d82a0f 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -60,6 +60,9 @@ etna_context_destroy(struct pipe_context *pctx) { struct etna_context *ctx = etna_context(pctx); + if (ctx->dummy_rt) + etna_bo_del(ctx->dummy_rt); + if (ctx->primconvert) util_primconvert_destroy(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); list_inithead(&ctx->active_hw_queries); + /* create dummy RT buffer, used when rendering with no color buffer */ + ctx->dummy_rt = etna_bo_new(ctx->screen->dev, 64 * 64 * 4, + DRM_ETNA_GEM_CACHE_WC); + if (!ctx->dummy_rt) + goto fail; + + ctx->dummy_rt_reloc.bo = ctx->dummy_rt; + ctx->dummy_rt_reloc.offset = 0; + ctx->dummy_rt_reloc.flags = ETNA_RELOC_READ | ETNA_RELOC_WRITE; + return pctx; fail: |