summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/freedreno
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/freedreno')
-rw-r--r--src/gallium/drivers/freedreno/freedreno_draw.c12
-rw-r--r--src/gallium/drivers/freedreno/freedreno_resource.c8
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;
}
}
}