[Mesa-dev] [PATCH] gallium/u_threaded: replace pipe_resource_reference with atomic_inc

Marek Olšák maraeo at gmail.com
Mon Jun 12 16:31:01 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/auxiliary/util/u_threaded_context.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c
index 3038fc6..a97f016 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.c
+++ b/src/gallium/auxiliary/util/u_threaded_context.c
@@ -195,22 +195,27 @@ _tc_sync(struct threaded_context *tc, const char *info, const char *func)
 
    tc_debug_check(tc);
 }
 
 #define tc_sync(tc) _tc_sync(tc, "", __func__)
 #define tc_sync_msg(tc, info) _tc_sync(tc, info, __func__)
 
 static void
 tc_set_resource_reference(struct pipe_resource **dst, struct pipe_resource *src)
 {
-   *dst = NULL;
-   pipe_resource_reference(dst, src);
+   /* Unexpectedly, pipe_resource_reference is a bottleneck here, taking 3.7%
+    * of CPU time in a state-heavy microbenchmark. The problem here is that
+    * pipe_resource_reference isn't inlined here.
+    */
+   *dst = src;
+   if (src)
+      p_atomic_inc(&src->reference.count);
 }
 
 void
 threaded_resource_init(struct pipe_resource *res)
 {
    struct threaded_resource *tres = threaded_resource(res);
 
    tres->latest = &tres->b;
    util_range_init(&tres->valid_buffer_range);
    tres->base_valid_buffer_range = &tres->valid_buffer_range;
-- 
2.7.4



More information about the mesa-dev mailing list