Path: blob/master/libmupen64plus/D3D8Interceptor/Direct3D8Functions.cpp
2 views
#include "d3d8Wrapper.h"12extern "C"3{4namespace D3D8Wrapper5{6ThreadSafePointerSet IDirect3D8::m_List;78D3D8Wrapper::IDirect3D8::IDirect3D8(D3D8Base::IDirect3D8* real) : D3D8Wrapper::IDirect3DUnknown((IUnknown*) real)9{10LOG("IDirect3D8::IDirect3D8( " << real << " )\n");11m_pD3D = real;12}1314// Tries to find the real object in the pointer set, or creates a new wrapped object15D3D8Wrapper::IDirect3D8* D3D8Wrapper::IDirect3D8::GetDirect3D(D3D8Base::IDirect3D8* pD3D)16{17LOG("IDirect3D8::GetDirect3D( " << pD3D << " )\n");18D3D8Wrapper::IDirect3D8* p = (D3D8Wrapper::IDirect3D8*) m_List.GetDataPtr(pD3D);19if( p == NULL )20{21p = new D3D8Wrapper::IDirect3D8(pD3D);22m_List.AddMember(pD3D,p);23return p;24}2526p->m_ulRef++;27return p;28}2930STDMETHODIMP_(ULONG) D3D8Wrapper::IDirect3D8::Release(THIS)31{32LOG("IDirect3D8::Release() [ " << this << " ]\n");33m_pUnk->Release();3435ULONG ulRef = --m_ulRef;3637if(ulRef == 0)38{39m_List.DeleteMember(GetDirect3D8());40delete this;41return 0L;42}43return ulRef;44}454647/*** IDirect3D8 methods ***/4849STDMETHODIMP D3D8Wrapper::IDirect3D8::GetAdapterDisplayMode(THIS_ UINT Adapter,D3D8Base::D3DDISPLAYMODE* pMode)50{51LOG("IDirect3D8::GetAdapterDisplayMode( " << Adapter << " , " << pMode << " ) [ " << this << " ]\n");52return m_pD3D->GetAdapterDisplayMode(Adapter, pMode);53}5455STDMETHODIMP D3D8Wrapper::IDirect3D8::RegisterSoftwareDevice(void* pInitializeFunction)56{57LOG("IDirect3D8::RegisterSoftwareDevice( " << pInitializeFunction << " ) [ " << this << " ]\n");58return m_pD3D->RegisterSoftwareDevice(pInitializeFunction);59}6061STDMETHODIMP_(UINT) D3D8Wrapper::IDirect3D8::GetAdapterCount(THIS)62{63LOG("IDirect3D8::GetAdapterCount() [ " << this << " ]\n");64return m_pD3D->GetAdapterCount();65}6667STDMETHODIMP D3D8Wrapper::IDirect3D8::GetAdapterIdentifier(UINT Adapter,DWORD Flags,D3D8Base::D3DADAPTER_IDENTIFIER8* pIdentifier)68{69LOG("IDirect3D8::GetAdapterIdentifier( " << Adapter << " , " << Flags << " , " << pIdentifier << " ) [ " << this << " ]\n");70return m_pD3D->GetAdapterIdentifier(Adapter,Flags,pIdentifier);71}7273STDMETHODIMP_(UINT) D3D8Wrapper::IDirect3D8::GetAdapterModeCount(UINT Adapter)74{75LOG("IDirect3D8::GetAdapterModeCount( " << Adapter << " ) [ " << this << " ]\n");76return m_pD3D->GetAdapterModeCount(Adapter);77}7879STDMETHODIMP D3D8Wrapper::IDirect3D8::EnumAdapterModes(UINT Adapter,UINT Mode,D3D8Base::D3DDISPLAYMODE* pMode)80{81LOG("IDirect3D8::EnumAdapterModes( " << Adapter << " , " << Mode << " , " << pMode << " ) [ " << this << " ]\n");82return m_pD3D->EnumAdapterModes(Adapter,Mode,pMode);83}8485STDMETHODIMP D3D8Wrapper::IDirect3D8::CheckDeviceType(UINT Adapter,D3D8Base::D3DDEVTYPE CheckType,D3D8Base::D3DFORMAT DisplayFormat,D3D8Base::D3DFORMAT BackBufferFormat,BOOL Windowed)86{87LOG("IDirect3D8::CheckDeviceType( " << Adapter << " , " << CheckType << " , " << DisplayFormat << " , " << BackBufferFormat << " , " << Windowed << " ) [ " << this << " ]\n");88return m_pD3D->CheckDeviceType(Adapter,CheckType,DisplayFormat,BackBufferFormat,Windowed);89}9091STDMETHODIMP D3D8Wrapper::IDirect3D8::CheckDeviceFormat(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,D3D8Base::D3DFORMAT AdapterFormat,DWORD Usage,D3D8Base::D3DRESOURCETYPE RType,D3D8Base::D3DFORMAT CheckFormat)92{93LOG("IDirect3D8::CheckDeviceFormat( " << Adapter << " , " << DeviceType << " , " << AdapterFormat << " , " << Usage << " , " << RType << " , " << CheckFormat << " ) [ " << this << " ]\n");94return m_pD3D->CheckDeviceFormat(Adapter,DeviceType,AdapterFormat,Usage,RType,CheckFormat);95}9697STDMETHODIMP D3D8Wrapper::IDirect3D8::CheckDeviceMultiSampleType(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,D3D8Base::D3DFORMAT SurfaceFormat,BOOL Windowed,D3D8Base::D3DMULTISAMPLE_TYPE MultiSampleType)98{99LOG("IDirect3D8::CheckDeviceMultiSampleType( " << Adapter << " , " << DeviceType << " , " << SurfaceFormat << " , " << Windowed << " , " << MultiSampleType << " ) [ " << this << " ]\n");100return m_pD3D->CheckDeviceMultiSampleType(Adapter,DeviceType,SurfaceFormat,Windowed,MultiSampleType);101}102103STDMETHODIMP D3D8Wrapper::IDirect3D8::CheckDepthStencilMatch(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,D3D8Base::D3DFORMAT AdapterFormat,D3D8Base::D3DFORMAT RenderTargetFormat,D3D8Base::D3DFORMAT DepthStencilFormat)104{105LOG("IDirect3D8::CheckDepthStencilMatch( " << Adapter << " , " << DeviceType << " , " << AdapterFormat << " , " << RenderTargetFormat << " , " << DepthStencilFormat << " ) [ " << this << " ]\n");106return m_pD3D->CheckDepthStencilMatch(Adapter,DeviceType,AdapterFormat,RenderTargetFormat,DepthStencilFormat);107}108109STDMETHODIMP D3D8Wrapper::IDirect3D8::GetDeviceCaps(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,D3D8Base::D3DCAPS8* pCaps)110{111LOG("IDirect3D8::GetDeviceCaps( " << Adapter << " , " << DeviceType << " , " << pCaps << " ) [ " << this << " ]\n");112return m_pD3D->GetDeviceCaps(Adapter,DeviceType,pCaps);113}114115STDMETHODIMP_(HMONITOR) D3D8Wrapper::IDirect3D8::GetAdapterMonitor(UINT Adapter)116{117LOG("IDirect3D8::GetAdapterMonitor( " << Adapter << " ) [ " << this << " ]\n");118return m_pD3D->GetAdapterMonitor(Adapter);119}120121STDMETHODIMP D3D8Wrapper::IDirect3D8::CreateDevice(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3D8Base::D3DPRESENT_PARAMETERS* pPresentationParameters,D3D8Wrapper::IDirect3DDevice8** ppReturnedDeviceInterface)122{123//sometimes, Intel drivers will clear the dll path. So let's save and restore it (do their job for them)124//it doesn't seem like this happens any time besides creating the D3D8 object and a device.125//If it does, then this solution isn't scalable at all.126//This is a good place to note that it appears possible that on the affected drivers, the D3D9 interface will only SetDllDirectory the first time a D3D9 object is created127char oldDllDirectory[MAX_PATH];128GetDllDirectory(MAX_PATH, oldDllDirectory);129130LOG("IDirect3D8::CreateDevice( " << Adapter << " , " << DeviceType << " , " << hFocusWindow << " , " << BehaviorFlags << " , " << pPresentationParameters << " , " << ppReturnedDeviceInterface << " ) [ " << this << " ]\n");131D3D8Base::IDirect3DDevice8* realDevice = NULL;132133HRESULT hr = m_pD3D->CreateDevice(Adapter,DeviceType,hFocusWindow,BehaviorFlags,pPresentationParameters,&realDevice);134135//restore old DLL directory136SetDllDirectory(oldDllDirectory);137138if(FAILED(hr))139{140return hr;141}142143// Wrap the real object144D3D8Wrapper::IDirect3DDevice8* wrappedDevice = D3D8Wrapper::IDirect3DDevice8::GetDirect3DDevice(realDevice);145146// Store this wrapped pointer for grabbing the screen later147last_device = wrappedDevice;148149// Create a new render target150D3D8Base::IDirect3DSurface8 *realSurface = NULL;151HRESULT hr2 = realDevice->CreateRenderTarget(pPresentationParameters->BackBufferWidth,pPresentationParameters->BackBufferHeight,D3D8Base::D3DFMT_X8R8G8B8,pPresentationParameters->MultiSampleType,FALSE,&realSurface);152153// Store a wrapped pointer to it for grabbing the screen154render_surface = D3D8Wrapper::IDirect3DSurface8::GetSurface(realSurface);155156// Return our wrapped object157*ppReturnedDeviceInterface = wrappedDevice;158159return hr;160}161162}163}164165