From: Jonathan Marek Date: Mon, 21 Jan 2019 16:32:30 +0000 (-0500) Subject: freedreno: fix invalidate logic X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bcefa0f1cb99229b6dc241ff50b2c88da1dad950;p=mesa.git 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 --- 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; } } }