diff --git a/.pick_status.json b/.pick_status.json index f32a645b9fe..36a12a06b95 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -4,7 +4,7 @@ "description": "etnaviv: properly reference flush_resources", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "7b9d8d1936d72af6fd1bfd30afed354bb76b4c0c" }, diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index f66587711bc..436d690d300 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -517,6 +517,7 @@ etna_flush(struct pipe_context *pctx, struct pipe_fence_handle **fence, struct pipe_resource *prsc = (struct pipe_resource *)entry->key; pctx->flush_resource(pctx, prsc); + pipe_resource_reference(&prsc, NULL); } _mesa_set_clear(ctx->flush_resources, NULL); diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c index 6cc7d92cdde..6bc836459eb 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_state.c @@ -793,8 +793,14 @@ etna_record_flush_resources(struct etna_context *ctx) if (fb->nr_cbufs > 0) { struct etna_surface *surf = etna_surface(fb->cbufs[0]); - if (!etna_resource(surf->prsc)->explicit_flush) - _mesa_set_add(ctx->flush_resources, surf->prsc); + if (!etna_resource(surf->prsc)->explicit_flush) { + bool found; + + _mesa_set_search_or_add(ctx->flush_resources, surf->prsc, &found); + + if (!found) + pipe_reference(NULL, &surf->prsc->reference); + } } return true;