OSDN Git Service

st/nine: Comment and simplify iunknown
authorAxel Davy <axel.davy@ens.fr>
Sat, 3 Dec 2016 18:37:06 +0000 (19:37 +0100)
committerAxel Davy <axel.davy@ens.fr>
Tue, 20 Dec 2016 22:47:08 +0000 (23:47 +0100)
The behaviour is a bit less obscure now.

Signed-off-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/iunknown.c
src/gallium/state_trackers/nine/iunknown.h

index 28e4756..eae4997 100644 (file)
@@ -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);
         }
     }
index dd1dab9..f827b13 100644 (file)
@@ -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;
 }