diff options
author | Michel Dänzer <[email protected]> | 2017-06-13 12:02:59 +0900 |
---|---|---|
committer | Michel Dänzer <[email protected]> | 2017-06-15 11:24:59 +0900 |
commit | 176e761513f9f9502248c0c8dad133d2d9f28d2d (patch) | |
tree | bd705b102af98028f26b1a0f9296d4e591bdc623 /src/gallium/auxiliary/util | |
parent | 1c00af4264d795bf1fb3d13b7a966722a5984c4a (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 <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/util')
-rw-r--r-- | src/gallium/auxiliary/util/u_inlines.h | 10 |
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 6a3d5043cf2..4fc683a5745 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; } |