st/nine: Comment and simplify iunknown
The behaviour is a bit less obscure now. Signed-off-by: Axel Davy <axel.davy@ens.fr>
This commit is contained in:
parent
098ba64c4c
commit
2fc8ef1401
|
@ -110,9 +110,6 @@ NineUnknown_AddRef( struct NineUnknown *This )
|
||||||
if (r == 1) {
|
if (r == 1) {
|
||||||
if (This->device)
|
if (This->device)
|
||||||
NineUnknown_AddRef(NineUnknown(This->device));
|
NineUnknown_AddRef(NineUnknown(This->device));
|
||||||
/* This shouldn't be necessary:
|
|
||||||
if (This->container)
|
|
||||||
NineUnknown_Bind(NineUnknown(This->container)); */
|
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@ -130,10 +127,8 @@ NineUnknown_Release( struct NineUnknown *This )
|
||||||
if (NineUnknown_Release(NineUnknown(This->device)) == 0)
|
if (NineUnknown_Release(NineUnknown(This->device)) == 0)
|
||||||
return r; /* everything's gone */
|
return r; /* everything's gone */
|
||||||
}
|
}
|
||||||
if (This->container) {
|
/* Containers (here with !forward) take care of item destruction */
|
||||||
/* NineUnknown_Unbind(NineUnknown(This->container)); */
|
if (!This->container && This->bind == 0) {
|
||||||
} else
|
|
||||||
if (This->bind == 0) {
|
|
||||||
This->dtor(This);
|
This->dtor(This);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,12 @@ struct NineUnknown
|
||||||
int32_t bind; /* internal bind count */
|
int32_t bind; /* internal bind count */
|
||||||
boolean forward; /* whether to forward references to the container */
|
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) */
|
struct NineDevice9 *device; /* referenced if (refs) */
|
||||||
|
|
||||||
const GUID **guids; /* for QueryInterface */
|
const GUID **guids; /* for QueryInterface */
|
||||||
|
@ -130,10 +135,10 @@ NineUnknown_Bind( struct NineUnknown *This )
|
||||||
{
|
{
|
||||||
UINT b = p_atomic_inc_return(&This->bind);
|
UINT b = p_atomic_inc_return(&This->bind);
|
||||||
assert(b);
|
assert(b);
|
||||||
if (b == 1 && This->container) {
|
|
||||||
if (This->container != NineUnknown(This->device))
|
if (b == 1 && This->container)
|
||||||
NineUnknown_Bind(This->container);
|
NineUnknown_Bind(This->container);
|
||||||
}
|
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,15 +146,12 @@ static inline UINT
|
||||||
NineUnknown_Unbind( struct NineUnknown *This )
|
NineUnknown_Unbind( struct NineUnknown *This )
|
||||||
{
|
{
|
||||||
UINT b = p_atomic_dec_return(&This->bind);
|
UINT b = p_atomic_dec_return(&This->bind);
|
||||||
if (!b) {
|
|
||||||
if (This->container) {
|
if (b == 0 && This->container)
|
||||||
if (This->container != NineUnknown(This->device))
|
NineUnknown_Unbind(This->container);
|
||||||
NineUnknown_Unbind(This->container);
|
else if (b == 0 && This->refs == 0)
|
||||||
} else
|
This->dtor(This);
|
||||||
if (This->refs == 0) {
|
|
||||||
This->dtor(This);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue