diff options
author | Jonathan Marek <[email protected]> | 2019-01-21 11:32:30 -0500 |
---|---|---|
committer | Rob Clark <[email protected]> | 2019-01-29 20:22:32 +0000 |
commit | bcefa0f1cb99229b6dc241ff50b2c88da1dad950 (patch) | |
tree | cd813af252cdbef678e6653409503af5d9a5e7bd /src | |
parent | 786f9639d62efc7df8e83d75e4e00f96e29c2ce8 (diff) |
freedreno: fix invalidate logic
Set dirty bits on invalidate to trigger invalidate logic in fd_draw_vbo.
Also, resource_written for color needs to be after the invalidate logic.
Signed-off-by: Jonathan Marek <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_draw.c | 12 | ||||
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_resource.c | 8 |
2 files changed, 10 insertions, 10 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index 8b4073da476..c35b0d9f4a1 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -165,15 +165,6 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) } } - if (ctx->dirty & FD_DIRTY_FRAMEBUFFER) { - for (i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) - continue; - - resource_written(batch, pfb->cbufs[i]->texture); - } - } - if (fd_logicop_enabled(ctx)) batch->gmem_reason |= FD_GMEM_LOGICOP_ENABLED; @@ -195,6 +186,9 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info) if (fd_blend_enabled(ctx, i)) batch->gmem_reason |= FD_GMEM_BLEND_ENABLED; + + if (ctx->dirty & FD_DIRTY_FRAMEBUFFER) + resource_written(batch, pfb->cbufs[i]->texture); } /* Mark SSBOs as being written.. we don't actually know which ones are diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 9adc3ce1d11..ce8e4480be1 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -1188,24 +1188,30 @@ fd_blitter_pipe_end(struct fd_context *ctx) static void fd_invalidate_resource(struct pipe_context *pctx, struct pipe_resource *prsc) { + struct fd_context *ctx = fd_context(pctx); struct fd_resource *rsc = fd_resource(prsc); /* * TODO I guess we could track that the resource is invalidated and * use that as a hint to realloc rather than stall in _transfer_map(), * even in the non-DISCARD_WHOLE_RESOURCE case? + * + * Note: we set dirty bits to trigger invalidate logic fd_draw_vbo */ if (rsc->write_batch) { struct fd_batch *batch = rsc->write_batch; struct pipe_framebuffer_state *pfb = &batch->framebuffer; - if (pfb->zsbuf && pfb->zsbuf->texture == prsc) + if (pfb->zsbuf && pfb->zsbuf->texture == prsc) { batch->resolve &= ~(FD_BUFFER_DEPTH | FD_BUFFER_STENCIL); + ctx->dirty |= FD_DIRTY_ZSA; + } for (unsigned i = 0; i < pfb->nr_cbufs; i++) { if (pfb->cbufs[i] && pfb->cbufs[i]->texture == prsc) { batch->resolve &= ~(PIPE_CLEAR_COLOR0 << i); + ctx->dirty |= FD_DIRTY_FRAMEBUFFER; } } } |