mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-24 06:00:22 +01:00
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:ecd6fce261("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 commit176e761513)
This commit is contained in:
parent
e8eb5e80f1
commit
3700dc5f97
1 changed files with 8 additions and 2 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue