summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2017-06-13 12:02:59 +0900
committerAndres Gomez <agomez@igalia.com>2017-06-28 20:17:12 +0300
commit3700dc5f9719313aabbace50eb7c2f4009906fe5 (patch)
tree189f951240c6546251d30207bb6467ac6ce32c5e
parente8eb5e80f162dc40b48eb20b844a3190c5b2b86c (diff)
gallium/util: Break recursion in pipe_resource_reference
It calling itself recursively prevented it from being inlined, resulting in a copy being generated in every compilation unit referencing it. This bloated the text segment of the Gallium mega-driver *_dri.so by ~4%, and might also have impacted performance. Fixes: ecd6fce2611e ("mesa/st: support lowering multi-planar YUV") v2: * Add comment above pipe_resource_next_reference [Samuel Pitoiset] v3: * Use loop to unreference the full chain of resources referenced via the next members [Timothy Arceri] v4: * Stop chasing ->next chain at the first sub-resource which isn't destroyed [Nicolai Hähnle] Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> Reviewed-by: Marek Olšák <marek.olsak@amd.com> (cherry picked from commit 176e761513f9f9502248c0c8dad133d2d9f28d2d)
-rw-r--r--src/gallium/auxiliary/util/u_inlines.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h
index 6bc5e6660f9..1ca3e533606 100644
--- a/src/gallium/auxiliary/util/u_inlines.h
+++ b/src/gallium/auxiliary/util/u_inlines.h
@@ -137,8 +137,14 @@ pipe_resource_reference(struct pipe_resource **ptr, struct pipe_resource *tex)
if (pipe_reference_described(&(*ptr)->reference, &tex->reference,
(debug_reference_descriptor)debug_describe_resource)) {
- pipe_resource_reference(&old_tex->next, NULL);
- old_tex->screen->resource_destroy(old_tex->screen, old_tex);
+ /* Avoid recursion, which would prevent inlining this function */
+ do {
+ struct pipe_resource *next = old_tex->next;
+
+ old_tex->screen->resource_destroy(old_tex->screen, old_tex);
+ old_tex = next;
+ } while (pipe_reference_described(&old_tex->reference, NULL,
+ (debug_reference_descriptor)debug_describe_resource));
}
*ptr = tex;
}