[Mesa-dev] [PATCH 67/84] st/nine: Comment and simplify iunknown

Axel Davy axel.davy at ens.fr
Wed Dec 7 22:55:40 UTC 2016


The behaviour is a bit less obscure now.

Signed-off-by: Axel Davy <axel.davy at ens.fr>
---
 src/gallium/state_trackers/nine/iunknown.c |  9 ++-------
 src/gallium/state_trackers/nine/iunknown.h | 30 ++++++++++++++++--------------
 2 files changed, 18 insertions(+), 21 deletions(-)

diff --git a/src/gallium/state_trackers/nine/iunknown.c b/src/gallium/state_trackers/nine/iunknown.c
index 28e4756..eae4997 100644
--- a/src/gallium/state_trackers/nine/iunknown.c
+++ b/src/gallium/state_trackers/nine/iunknown.c
@@ -110,9 +110,6 @@ NineUnknown_AddRef( struct NineUnknown *This )
     if (r == 1) {
         if (This->device)
             NineUnknown_AddRef(NineUnknown(This->device));
-        /* This shouldn't be necessary:
-        if (This->container)
-            NineUnknown_Bind(NineUnknown(This->container)); */
     }
     return r;
 }
@@ -130,10 +127,8 @@ NineUnknown_Release( struct NineUnknown *This )
             if (NineUnknown_Release(NineUnknown(This->device)) == 0)
                 return r; /* everything's gone */
         }
-        if (This->container) {
-            /* NineUnknown_Unbind(NineUnknown(This->container)); */
-        } else
-        if (This->bind == 0) {
+        /* Containers (here with !forward) take care of item destruction */
+        if (!This->container && This->bind == 0) {
             This->dtor(This);
         }
     }
diff --git a/src/gallium/state_trackers/nine/iunknown.h b/src/gallium/state_trackers/nine/iunknown.h
index dd1dab9..f827b13 100644
--- a/src/gallium/state_trackers/nine/iunknown.h
+++ b/src/gallium/state_trackers/nine/iunknown.h
@@ -49,7 +49,12 @@ struct NineUnknown
     int32_t bind; /* internal bind count */
     boolean forward; /* whether to forward references to the container */
 
-    struct NineUnknown *container; /* referenced if (refs | bind) */
+    /* container: for surfaces and volumes only.
+     * Can be a texture, a volume texture or a swapchain.
+     * forward is set to false for the swapchain case.
+     * Refs are passed to the container if forward is set.
+     * The container has bind increased if the object has non null bind. */
+    struct NineUnknown *container;
     struct NineDevice9 *device;    /* referenced if (refs) */
 
     const GUID **guids; /* for QueryInterface */
@@ -130,10 +135,10 @@ NineUnknown_Bind( struct NineUnknown *This )
 {
     UINT b = p_atomic_inc_return(&This->bind);
     assert(b);
-    if (b == 1 && This->container) {
-        if (This->container != NineUnknown(This->device))
-            NineUnknown_Bind(This->container);
-    }
+
+    if (b == 1 && This->container)
+        NineUnknown_Bind(This->container);
+
     return b;
 }
 
@@ -141,15 +146,12 @@ static inline UINT
 NineUnknown_Unbind( struct NineUnknown *This )
 {
     UINT b = p_atomic_dec_return(&This->bind);
-    if (!b) {
-        if (This->container) {
-            if (This->container != NineUnknown(This->device))
-                NineUnknown_Unbind(This->container);
-        } else
-        if (This->refs == 0) {
-            This->dtor(This);
-        }
-    }
+
+    if (b == 0 && This->container)
+        NineUnknown_Unbind(This->container);
+    else if (b == 0 && This->refs == 0)
+        This->dtor(This);
+
     return b;
 }
 
-- 
2.10.2



More information about the mesa-dev mailing list