Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libmupen64plus/D3D8Interceptor/Direct3D8Functions.cpp
2 views
1
#include "d3d8Wrapper.h"
2
3
extern "C"
4
{
5
namespace D3D8Wrapper
6
{
7
ThreadSafePointerSet IDirect3D8::m_List;
8
9
D3D8Wrapper::IDirect3D8::IDirect3D8(D3D8Base::IDirect3D8* real) : D3D8Wrapper::IDirect3DUnknown((IUnknown*) real)
10
{
11
LOG("IDirect3D8::IDirect3D8( " << real << " )\n");
12
m_pD3D = real;
13
}
14
15
// Tries to find the real object in the pointer set, or creates a new wrapped object
16
D3D8Wrapper::IDirect3D8* D3D8Wrapper::IDirect3D8::GetDirect3D(D3D8Base::IDirect3D8* pD3D)
17
{
18
LOG("IDirect3D8::GetDirect3D( " << pD3D << " )\n");
19
D3D8Wrapper::IDirect3D8* p = (D3D8Wrapper::IDirect3D8*) m_List.GetDataPtr(pD3D);
20
if( p == NULL )
21
{
22
p = new D3D8Wrapper::IDirect3D8(pD3D);
23
m_List.AddMember(pD3D,p);
24
return p;
25
}
26
27
p->m_ulRef++;
28
return p;
29
}
30
31
STDMETHODIMP_(ULONG) D3D8Wrapper::IDirect3D8::Release(THIS)
32
{
33
LOG("IDirect3D8::Release() [ " << this << " ]\n");
34
m_pUnk->Release();
35
36
ULONG ulRef = --m_ulRef;
37
38
if(ulRef == 0)
39
{
40
m_List.DeleteMember(GetDirect3D8());
41
delete this;
42
return 0L;
43
}
44
return ulRef;
45
}
46
47
48
/*** IDirect3D8 methods ***/
49
50
STDMETHODIMP D3D8Wrapper::IDirect3D8::GetAdapterDisplayMode(THIS_ UINT Adapter,D3D8Base::D3DDISPLAYMODE* pMode)
51
{
52
LOG("IDirect3D8::GetAdapterDisplayMode( " << Adapter << " , " << pMode << " ) [ " << this << " ]\n");
53
return m_pD3D->GetAdapterDisplayMode(Adapter, pMode);
54
}
55
56
STDMETHODIMP D3D8Wrapper::IDirect3D8::RegisterSoftwareDevice(void* pInitializeFunction)
57
{
58
LOG("IDirect3D8::RegisterSoftwareDevice( " << pInitializeFunction << " ) [ " << this << " ]\n");
59
return m_pD3D->RegisterSoftwareDevice(pInitializeFunction);
60
}
61
62
STDMETHODIMP_(UINT) D3D8Wrapper::IDirect3D8::GetAdapterCount(THIS)
63
{
64
LOG("IDirect3D8::GetAdapterCount() [ " << this << " ]\n");
65
return m_pD3D->GetAdapterCount();
66
}
67
68
STDMETHODIMP D3D8Wrapper::IDirect3D8::GetAdapterIdentifier(UINT Adapter,DWORD Flags,D3D8Base::D3DADAPTER_IDENTIFIER8* pIdentifier)
69
{
70
LOG("IDirect3D8::GetAdapterIdentifier( " << Adapter << " , " << Flags << " , " << pIdentifier << " ) [ " << this << " ]\n");
71
return m_pD3D->GetAdapterIdentifier(Adapter,Flags,pIdentifier);
72
}
73
74
STDMETHODIMP_(UINT) D3D8Wrapper::IDirect3D8::GetAdapterModeCount(UINT Adapter)
75
{
76
LOG("IDirect3D8::GetAdapterModeCount( " << Adapter << " ) [ " << this << " ]\n");
77
return m_pD3D->GetAdapterModeCount(Adapter);
78
}
79
80
STDMETHODIMP D3D8Wrapper::IDirect3D8::EnumAdapterModes(UINT Adapter,UINT Mode,D3D8Base::D3DDISPLAYMODE* pMode)
81
{
82
LOG("IDirect3D8::EnumAdapterModes( " << Adapter << " , " << Mode << " , " << pMode << " ) [ " << this << " ]\n");
83
return m_pD3D->EnumAdapterModes(Adapter,Mode,pMode);
84
}
85
86
STDMETHODIMP D3D8Wrapper::IDirect3D8::CheckDeviceType(UINT Adapter,D3D8Base::D3DDEVTYPE CheckType,D3D8Base::D3DFORMAT DisplayFormat,D3D8Base::D3DFORMAT BackBufferFormat,BOOL Windowed)
87
{
88
LOG("IDirect3D8::CheckDeviceType( " << Adapter << " , " << CheckType << " , " << DisplayFormat << " , " << BackBufferFormat << " , " << Windowed << " ) [ " << this << " ]\n");
89
return m_pD3D->CheckDeviceType(Adapter,CheckType,DisplayFormat,BackBufferFormat,Windowed);
90
}
91
92
STDMETHODIMP D3D8Wrapper::IDirect3D8::CheckDeviceFormat(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,D3D8Base::D3DFORMAT AdapterFormat,DWORD Usage,D3D8Base::D3DRESOURCETYPE RType,D3D8Base::D3DFORMAT CheckFormat)
93
{
94
LOG("IDirect3D8::CheckDeviceFormat( " << Adapter << " , " << DeviceType << " , " << AdapterFormat << " , " << Usage << " , " << RType << " , " << CheckFormat << " ) [ " << this << " ]\n");
95
return m_pD3D->CheckDeviceFormat(Adapter,DeviceType,AdapterFormat,Usage,RType,CheckFormat);
96
}
97
98
STDMETHODIMP D3D8Wrapper::IDirect3D8::CheckDeviceMultiSampleType(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,D3D8Base::D3DFORMAT SurfaceFormat,BOOL Windowed,D3D8Base::D3DMULTISAMPLE_TYPE MultiSampleType)
99
{
100
LOG("IDirect3D8::CheckDeviceMultiSampleType( " << Adapter << " , " << DeviceType << " , " << SurfaceFormat << " , " << Windowed << " , " << MultiSampleType << " ) [ " << this << " ]\n");
101
return m_pD3D->CheckDeviceMultiSampleType(Adapter,DeviceType,SurfaceFormat,Windowed,MultiSampleType);
102
}
103
104
STDMETHODIMP D3D8Wrapper::IDirect3D8::CheckDepthStencilMatch(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,D3D8Base::D3DFORMAT AdapterFormat,D3D8Base::D3DFORMAT RenderTargetFormat,D3D8Base::D3DFORMAT DepthStencilFormat)
105
{
106
LOG("IDirect3D8::CheckDepthStencilMatch( " << Adapter << " , " << DeviceType << " , " << AdapterFormat << " , " << RenderTargetFormat << " , " << DepthStencilFormat << " ) [ " << this << " ]\n");
107
return m_pD3D->CheckDepthStencilMatch(Adapter,DeviceType,AdapterFormat,RenderTargetFormat,DepthStencilFormat);
108
}
109
110
STDMETHODIMP D3D8Wrapper::IDirect3D8::GetDeviceCaps(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,D3D8Base::D3DCAPS8* pCaps)
111
{
112
LOG("IDirect3D8::GetDeviceCaps( " << Adapter << " , " << DeviceType << " , " << pCaps << " ) [ " << this << " ]\n");
113
return m_pD3D->GetDeviceCaps(Adapter,DeviceType,pCaps);
114
}
115
116
STDMETHODIMP_(HMONITOR) D3D8Wrapper::IDirect3D8::GetAdapterMonitor(UINT Adapter)
117
{
118
LOG("IDirect3D8::GetAdapterMonitor( " << Adapter << " ) [ " << this << " ]\n");
119
return m_pD3D->GetAdapterMonitor(Adapter);
120
}
121
122
STDMETHODIMP D3D8Wrapper::IDirect3D8::CreateDevice(UINT Adapter,D3D8Base::D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3D8Base::D3DPRESENT_PARAMETERS* pPresentationParameters,D3D8Wrapper::IDirect3DDevice8** ppReturnedDeviceInterface)
123
{
124
//sometimes, Intel drivers will clear the dll path. So let's save and restore it (do their job for them)
125
//it doesn't seem like this happens any time besides creating the D3D8 object and a device.
126
//If it does, then this solution isn't scalable at all.
127
//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 created
128
char oldDllDirectory[MAX_PATH];
129
GetDllDirectory(MAX_PATH, oldDllDirectory);
130
131
LOG("IDirect3D8::CreateDevice( " << Adapter << " , " << DeviceType << " , " << hFocusWindow << " , " << BehaviorFlags << " , " << pPresentationParameters << " , " << ppReturnedDeviceInterface << " ) [ " << this << " ]\n");
132
D3D8Base::IDirect3DDevice8* realDevice = NULL;
133
134
HRESULT hr = m_pD3D->CreateDevice(Adapter,DeviceType,hFocusWindow,BehaviorFlags,pPresentationParameters,&realDevice);
135
136
//restore old DLL directory
137
SetDllDirectory(oldDllDirectory);
138
139
if(FAILED(hr))
140
{
141
return hr;
142
}
143
144
// Wrap the real object
145
D3D8Wrapper::IDirect3DDevice8* wrappedDevice = D3D8Wrapper::IDirect3DDevice8::GetDirect3DDevice(realDevice);
146
147
// Store this wrapped pointer for grabbing the screen later
148
last_device = wrappedDevice;
149
150
// Create a new render target
151
D3D8Base::IDirect3DSurface8 *realSurface = NULL;
152
HRESULT hr2 = realDevice->CreateRenderTarget(pPresentationParameters->BackBufferWidth,pPresentationParameters->BackBufferHeight,D3D8Base::D3DFMT_X8R8G8B8,pPresentationParameters->MultiSampleType,FALSE,&realSurface);
153
154
// Store a wrapped pointer to it for grabbing the screen
155
render_surface = D3D8Wrapper::IDirect3DSurface8::GetSurface(realSurface);
156
157
// Return our wrapped object
158
*ppReturnedDeviceInterface = wrappedDevice;
159
160
return hr;
161
}
162
163
}
164
}
165