Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

216 lines
5.8 KiB

/*==========================================================================;
*
* Copyright (C) 1995 Microsoft Corporation. All Rights Reserved.
*
* File: d3diunk.c
* Content: Direct3D IUnknown
*@@BEGIN_MSINTERNAL
*
* $Id$
*
* History:
* Date By Reason
* ==== == ======
* 07/12/95 stevela Merged Colin's changes.
* 27/08/96 stevela Ifdefed out the Close of gHEvent. We're using
* DirectDraw's critical section.
*@@END_MSINTERNAL
*
***************************************************************************/
#include "pch.cpp"
#pragma hdrstop
/*
* If we are built with aggregation enabled then we actually need two
* different Direct3D QueryInterface, AddRef and Releases. One which
* does the right thing on the Direct3D object and one which simply
* punts to the owning interface.
*/
/*
* CDirect3DUnk::QueryInterface
*/
#undef DPF_MODNAME
#define DPF_MODNAME "Direct3D::QueryInterface"
HRESULT D3DAPI CDirect3DUnk::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
// Release in the destructor
if( !VALID_OUTPTR( ppvObj ) )
{
D3D_ERR( "Invalid obj ptr" );
return DDERR_INVALIDPARAMS;
}
*ppvObj = NULL;
D3D_INFO(3, "Direct3D IUnknown QueryInterface");
if(IsEqualIID(riid, IID_IUnknown))
{
/*
* Asking for IUnknown and we are IUnknown so just bump the
* reference count and return this interface.
* NOTE: Must AddRef through the interface being returned.
*/
pD3DI->AddRef();
// explicit ::CDirect3D disambiguation required since there are multiple IUnknown DIRECT3DI inherits from
*ppvObj = static_cast<LPVOID>(static_cast<LPUNKNOWN>(static_cast<DIRECT3DI*>(pD3DI)));
}
else if (IsEqualIID(riid, IID_IDirect3D7))
{
pD3DI->AddRef();
// No disambiguation required. Only one IDirect3D3 base for DIRECT3DI
*ppvObj = static_cast<LPVOID>(static_cast<LPDIRECT3D7>(pD3DI));
}
else
{
/*
* Don't understand this interface. Fail.
* NOTE: Used to return DDERR_GENERIC. Now return
* E_NOINTERFACE.
*/
return (E_NOINTERFACE);
}
return (D3D_OK);
} /* CDirect3DUnk::QueryInterface */
/*
* CDirect3DUnk::AddRef
*/
#undef DPF_MODNAME
#define DPF_MODNAME "CDirect3DUnk::AddRef"
ULONG D3DAPI CDirect3DUnk::AddRef()
{
CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
// Release in the destructor
refCnt++;
D3D_INFO(3, "Direct3D IUnknown AddRef: Reference count = %d", refCnt);
return (refCnt);
} /* CDirect3DUnk::AddRef */
/*
* CDirect3DUnk::Release
*/
#undef DPF_MODNAME
#define DPF_MODNAME "CDirect3DUnk::Release"
ULONG D3DAPI CDirect3DUnk::Release()
{
CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
// Release in the destructor
/*
* decrement the ref count. if we hit 0, free the object
*/
refCnt--;
D3D_INFO(3, "Direct3D IUnknown Release: Reference count = %d", refCnt);
if( refCnt == 0 )
{
delete pD3DI; // Delete Parent object
return 0;
}
return refCnt;
} /* D3DIUnknown_Release */
DIRECT3DI::~DIRECT3DI()
{
D3D_INFO(3, "Release Direct3D Object");
#if COLLECTSTATS
if(m_hFont)
{
DeleteObject(m_hFont);
}
#endif
delete lpTextureManager;
/*
* free up all allocated Buckets
*/
#if DBG
/* this->lpFreeList must have all the buckets that are allocated */
if (this->lpFreeList || this->lpBufferList)
{
int i,j;
LPD3DBUCKET temp;
for (i=0,temp=this->lpFreeList;temp;i++) temp=temp->next;
for (j=0,temp=this->lpBufferList;temp;j++) temp=temp->next;
D3D_INFO(4,"D3D Release: recovered %d buckets in lpFreeList in %d buffers",i,j);
DDASSERT(j*(D3DBUCKETBUFFERSIZE-1)==i);
}
#endif //DBG
while (this->lpBufferList)
{
LPD3DBUCKET temp=this->lpBufferList;
this->lpBufferList=temp->next;
D3DFree(temp->lpBuffer);
D3D_INFO(4,"D3D Release:lpBufferList %d bytes freed",D3DBUCKETBUFFERSIZE*sizeof(D3DBUCKET));
}
this->lpFreeList=NULL;
}
/*
* DIRECT3DI::QueryInterface
*/
#undef DPF_MODNAME
#define DPF_MODNAME "DIRECT3DI::QueryInterface"
HRESULT D3DAPI DIRECT3DI::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
HRESULT ret;
CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
if( !VALID_OUTPTR( ppvObj ) )
{
D3D_ERR( "Invalid obj ptr" );
return DDERR_INVALIDPARAMS;
}
*ppvObj = NULL;
ret = this->lpOwningIUnknown->QueryInterface(riid, ppvObj);
return ret;
}
/*
* DIRECT3DI::AddRef
*/
#undef DPF_MODNAME
#define DPF_MODNAME "DIRECT3DI::AddRef"
ULONG D3DAPI DIRECT3DI::AddRef()
{
CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
// Release in the destructor
/*
* Punt to the owning interface.
*/
return this->lpOwningIUnknown->AddRef();
}
/*
* DIRECT3DI::Release
*/
#undef DPF_MODNAME
#define DPF_MODNAME "DIRECT3DI::Release"
ULONG D3DAPI DIRECT3DI::Release()
{
CLockD3D lockObject(DPF_MODNAME, REMIND("")); // Takes D3D lock.
// Release in the destructor
/*
* Punt to the owning interface.
*/
return this->lpOwningIUnknown->Release();
}