[Mesa-dev] [PATCH 9/9] mesa/st: take ownership rather than adding reference for new renderbuffers

Timothy Arceri tarceri at itsqueeze.com
Sat Apr 8 01:04:40 UTC 2017


This avoids locking in the reference calls and fixes a leak after the
RefCount initialisation was change from 0 to 1.

Fixes: 32141e53d1520 (mesa: tidy up renderbuffer RefCount initialisation)
---
 src/mesa/state_tracker/st_manager.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
index f469ebd..48daab6 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -305,27 +305,38 @@ st_framebuffer_add_renderbuffer(struct st_framebuffer *stfb,
    }
 
    if (format == PIPE_FORMAT_NONE)
       return FALSE;
 
    rb = st_new_renderbuffer_fb(format, stfb->iface->visual->samples, sw);
    if (!rb)
       return FALSE;
 
    if (idx != BUFFER_DEPTH) {
-      _mesa_add_renderbuffer(&stfb->Base, idx, rb);
+      _mesa_add_renderbuffer_without_ref(&stfb->Base, idx, rb);
    }
    else {
-      if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0))
-         _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, rb);
-      if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1))
-         _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, rb);
+      bool rb_ownership_taken = false;
+      if (util_format_get_component_bits(format,
+                                         UTIL_FORMAT_COLORSPACE_ZS, 0)) {
+         _mesa_add_renderbuffer_without_ref(&stfb->Base, BUFFER_DEPTH, rb);
+         rb_ownership_taken = true;
+      }
+      if (util_format_get_component_bits(format,
+                                         UTIL_FORMAT_COLORSPACE_ZS, 1)) {
+         if (rb_ownership_taken)
+            _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, rb);
+         else {
+            _mesa_add_renderbuffer_without_ref(&stfb->Base, BUFFER_STENCIL,
+                                               rb);
+         }
+      }
    }
 
    return TRUE;
 }
 
 /**
  * Intialize a struct gl_config from a visual.
  */
 static void
 st_visual_to_context_mode(const struct st_visual *visual,
-- 
2.9.3



More information about the mesa-dev mailing list