blob: e9c4c56a2d43b9567ac27f48db0b96267ef64eeb [file] [log] [blame]
Nicolas Capens0bac2852016-05-07 06:09:58 -04001// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
Nicolas Capensee16f0d2015-07-16 17:40:10 -04002//
Nicolas Capens0bac2852016-05-07 06:09:58 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
Nicolas Capensee16f0d2015-07-16 17:40:10 -04006//
Nicolas Capens0bac2852016-05-07 06:09:58 -04007// http://www.apache.org/licenses/LICENSE-2.0
Nicolas Capensee16f0d2015-07-16 17:40:10 -04008//
Nicolas Capens0bac2852016-05-07 06:09:58 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Nicolas Capensee16f0d2015-07-16 17:40:10 -040014
15#include "Direct3D9Ex.hpp"
16
17#include "Direct3DDevice9Ex.hpp"
Nicolas Capensee16f0d2015-07-16 17:40:10 -040018#include "Debug.hpp"
19
20namespace sw
21{
22 extern bool postBlendSRGB;
23}
24
25namespace D3D9
26{
27 Direct3D9Ex::Direct3D9Ex(int version, const HINSTANCE instance) : Direct3D9(version, instance)
28 {
29 d3d9ex = 0;
30 }
31
32 Direct3D9Ex::~Direct3D9Ex()
33 {
34 }
35
36 long Direct3D9Ex::QueryInterface(const IID &iid, void **object)
37 {
38 TRACE("const IID &iid = 0x%0.8p, void **object = 0x%0.8p", iid, object);
39
40 if(iid == IID_IDirect3D9Ex ||
41 iid == IID_IDirect3D9 ||
42 iid == IID_IUnknown)
43 {
44 AddRef();
45 *object = this;
46
47 return S_OK;
48 }
Nicolas Capensee16f0d2015-07-16 17:40:10 -040049
50 *object = 0;
51
52 return NOINTERFACE(iid);
53 }
54
55 unsigned long Direct3D9Ex::AddRef()
56 {
57 TRACE("void");
58
59 return Direct3D9::AddRef();
60 }
61
62 unsigned long Direct3D9Ex::Release()
63 {
64 TRACE("void");
65
66 return Direct3D9::Release();
67 }
68
69 long Direct3D9Ex::RegisterSoftwareDevice(void *initializeFunction)
70 {
71 TRACE("void *initializeFunction = 0x%0.8p", initializeFunction);
72
73 loadSystemD3D9ex();
74
75 if(d3d9ex)
76 {
77 return d3d9ex->RegisterSoftwareDevice(initializeFunction);
78 }
79 else
80 {
81 return INVALIDCALL();
82 }
83 }
84
85 unsigned int Direct3D9Ex::GetAdapterCount()
86 {
87 TRACE("void");
88
89 return Direct3D9::GetAdapterCount();
90 }
91
92 long Direct3D9Ex::GetAdapterIdentifier(unsigned int adapter, unsigned long flags, D3DADAPTER_IDENTIFIER9 *identifier)
93 {
94 TRACE("unsigned int adapter = %d, unsigned long flags = 0x%0.8X, D3DADAPTER_IDENTIFIER9 *identifier = 0x%0.8p", adapter, flags, identifier);
95
96 return Direct3D9::GetAdapterIdentifier(adapter, flags, identifier);
97 }
98
99 unsigned int Direct3D9Ex::GetAdapterModeCount(unsigned int adapter, D3DFORMAT format)
100 {
101 TRACE("unsigned int adapter = %d, D3DFORMAT format = %d", adapter, format);
102
103 return Direct3D9::GetAdapterModeCount(adapter, format);
104 }
105
106 long Direct3D9Ex::EnumAdapterModes(unsigned int adapter, D3DFORMAT format, unsigned int index, D3DDISPLAYMODE *mode)
107 {
108 TRACE("unsigned int adapter = %d, D3DFORMAT format = %d, unsigned int index = %d, D3DDISPLAYMODE *mode = 0x%0.8p", adapter, format, index, mode);
109
110 return Direct3D9::EnumAdapterModes(adapter, format, index, mode);
111 }
112
113 long Direct3D9Ex::GetAdapterDisplayMode(unsigned int adapter, D3DDISPLAYMODE *mode)
114 {
115 TRACE("unsigned int adapter = %d, D3DDISPLAYMODE *mode = 0x%0.8p", adapter, mode);
116
117 return Direct3D9::GetAdapterDisplayMode(adapter, mode);
118 }
119
120 long Direct3D9Ex::CheckDeviceType(unsigned int adapter, D3DDEVTYPE checkType, D3DFORMAT displayFormat, D3DFORMAT backBufferFormat, int windowed)
121 {
122 TRACE("unsigned int adapter = %d, D3DDEVTYPE checkType = %d, D3DFORMAT displayFormat = %d, D3DFORMAT backBufferFormat = %d, int windowed = %d", adapter, checkType, displayFormat, backBufferFormat, windowed);
123
124 if(checkType != D3DDEVTYPE_HAL)
125 {
126 loadSystemD3D9ex();
127
128 if(d3d9ex)
129 {
130 return d3d9ex->CheckDeviceType(adapter, checkType, displayFormat, backBufferFormat, windowed);
131 }
132 else
133 {
134 return CheckDeviceType(adapter, D3DDEVTYPE_HAL, displayFormat, backBufferFormat, windowed);
135 }
136 }
137
138 return Direct3D9::CheckDeviceType(adapter, checkType, displayFormat, backBufferFormat, windowed);
139 }
140
141 long Direct3D9Ex::CheckDeviceFormat(unsigned int adapter, D3DDEVTYPE deviceType, D3DFORMAT adapterFormat, unsigned long usage, D3DRESOURCETYPE resourceType, D3DFORMAT checkFormat)
142 {
143 TRACE("unsigned int adapter = %d, D3DDEVTYPE deviceType = %d, D3DFORMAT adapterFormat = %d, unsigned long usage = %d, D3DRESOURCETYPE resourceType = %d, D3DFORMAT checkFormat = %d", adapter, deviceType, adapterFormat, usage, resourceType, checkFormat);
144
145 if(deviceType != D3DDEVTYPE_HAL)
146 {
147 loadSystemD3D9ex();
148
149 if(d3d9ex)
150 {
151 return d3d9ex->CheckDeviceFormat(adapter, deviceType, adapterFormat, usage, resourceType, checkFormat);
152 }
153 else
154 {
155 return CheckDeviceFormat(adapter, D3DDEVTYPE_HAL, adapterFormat, usage, resourceType, checkFormat);
156 }
157 }
158
159 return Direct3D9::CheckDeviceFormat(adapter, deviceType, adapterFormat, usage, resourceType, checkFormat);
160 }
161
162 long Direct3D9Ex::CheckDeviceMultiSampleType(unsigned int adapter, D3DDEVTYPE deviceType, D3DFORMAT surfaceFormat, int windowed, D3DMULTISAMPLE_TYPE multiSampleType, unsigned long *qualityLevels)
163 {
164 TRACE("unsigned int adapter = %d, D3DDEVTYPE deviceType = %d, D3DFORMAT surfaceFormat = %d, int windowed = %d, D3DMULTISAMPLE_TYPE multiSampleType = %d, unsigned long *qualityLevels = 0x%0.8p", adapter, deviceType, surfaceFormat, windowed, multiSampleType, qualityLevels);
165
166 if(deviceType != D3DDEVTYPE_HAL)
167 {
168 loadSystemD3D9ex();
169
170 if(d3d9ex)
171 {
172 return d3d9ex->CheckDeviceMultiSampleType(adapter, deviceType, surfaceFormat, windowed, multiSampleType, qualityLevels);
173 }
174 else
175 {
176 return CheckDeviceMultiSampleType(adapter, D3DDEVTYPE_HAL, surfaceFormat, windowed, multiSampleType, qualityLevels);
177 }
178 }
179
180 return Direct3D9::CheckDeviceMultiSampleType(adapter, deviceType, surfaceFormat, windowed, multiSampleType, qualityLevels);
181 }
182
183 long Direct3D9Ex::CheckDepthStencilMatch(unsigned int adapter, D3DDEVTYPE deviceType, D3DFORMAT adapterFormat, D3DFORMAT renderTargetFormat, D3DFORMAT depthStencilFormat)
184 {
185 TRACE("unsigned int adapter = %d, D3DDEVTYPE deviceType = %d, D3DFORMAT adapterFormat = %d, D3DFORMAT renderTargetFormat = %d, D3DFORMAT depthStencilFormat = %d", adapter, deviceType, adapterFormat, renderTargetFormat, depthStencilFormat);
186
187 return Direct3D9::CheckDepthStencilMatch(adapter, deviceType, adapterFormat, renderTargetFormat, depthStencilFormat);
188 }
189
190 long Direct3D9Ex::CheckDeviceFormatConversion(unsigned int adapter, D3DDEVTYPE deviceType, D3DFORMAT sourceFormat, D3DFORMAT targetFormat)
191 {
192 TRACE("unsigned int adapter = %d, D3DDEVTYPE deviceType = %d, D3DFORMAT sourceFormat = %d, D3DFORMAT targetFormat = %d", adapter, deviceType, sourceFormat, targetFormat);
193
194 if(deviceType != D3DDEVTYPE_HAL)
195 {
196 loadSystemD3D9ex();
197
198 if(d3d9ex)
199 {
200 return d3d9ex->CheckDeviceFormatConversion(adapter, deviceType, sourceFormat, targetFormat);
201 }
202 else
203 {
204 return CheckDeviceFormatConversion(adapter, D3DDEVTYPE_HAL, sourceFormat, targetFormat);
205 }
206 }
207
208 return D3D_OK;
209 }
210
211 long Direct3D9Ex::GetDeviceCaps(unsigned int adapter, D3DDEVTYPE deviceType, D3DCAPS9 *capabilities)
212 {
213 TRACE("unsigned int adapter = %d, D3DDEVTYPE deviceType = %d, D3DCAPS9 *capabilities = 0x%0.8p", adapter, deviceType, capabilities);
214
215 if(deviceType != D3DDEVTYPE_HAL)
216 {
217 loadSystemD3D9ex();
218
219 if(d3d9ex)
220 {
221 return d3d9ex->GetDeviceCaps(adapter, deviceType, capabilities);
222 }
223 else
224 {
225 return GetDeviceCaps(adapter, D3DDEVTYPE_HAL, capabilities);
226 }
227 }
228
229 long result = Direct3D9::GetDeviceCaps(adapter, deviceType, capabilities);
230
231 if(sw::postBlendSRGB)
232 {
Nicolas Capens518e41a2016-04-27 23:18:01 -0400233 capabilities->PrimitiveMiscCaps |= D3DPMISCCAPS_POSTBLENDSRGBCONVERT; // Indicates device can perform conversion to sRGB after blending.
Nicolas Capensee16f0d2015-07-16 17:40:10 -0400234 }
235
236 return result;
237 }
238
239 HMONITOR Direct3D9Ex::GetAdapterMonitor(unsigned int adapter)
240 {
241 TRACE("unsigned int adapter = %d", adapter);
242
243 return Direct3D9::GetAdapterMonitor(adapter);
244 }
245
246 long Direct3D9Ex::CreateDevice(unsigned int adapter, D3DDEVTYPE deviceType, HWND focusWindow, unsigned long behaviorFlags, D3DPRESENT_PARAMETERS *presentParameters, IDirect3DDevice9 **returnedDeviceInterface)
247 {
248 TRACE("unsigned int adapter = %d, D3DDEVTYPE deviceType = %d, HWND focusWindow = %d, unsigned long behaviorFlags = 0x%0.8X, D3DPRESENT_PARAMETERS *presentParameters = 0x%0.8p, IDirect3DDevice9 **returnedDeviceInterface = 0x%0.8p", adapter, deviceType, focusWindow, behaviorFlags, presentParameters, returnedDeviceInterface);
249
250 if(!focusWindow || !presentParameters || !returnedDeviceInterface)
251 {
252 *returnedDeviceInterface = 0;
253
254 return INVALIDCALL();
255 }
256
257 D3DDISPLAYMODEEX fullscreenDisplayMode = {0};
258 fullscreenDisplayMode.Size = sizeof(D3DDISPLAYMODEEX);
259 fullscreenDisplayMode.Format = presentParameters->BackBufferFormat;
260 fullscreenDisplayMode.Width = presentParameters->BackBufferWidth;
261 fullscreenDisplayMode.Height = presentParameters->BackBufferHeight;
262 fullscreenDisplayMode.RefreshRate = presentParameters->FullScreen_RefreshRateInHz;
263 fullscreenDisplayMode.ScanLineOrdering = D3DSCANLINEORDERING_PROGRESSIVE;
264
265 return CreateDeviceEx(adapter, deviceType, focusWindow, behaviorFlags, presentParameters, presentParameters->Windowed ? 0 : &fullscreenDisplayMode, (IDirect3DDevice9Ex**)returnedDeviceInterface);
266 }
267
268 unsigned int __stdcall Direct3D9Ex::GetAdapterModeCountEx(unsigned int adapter, const D3DDISPLAYMODEFILTER *filter)
269 {
270 TRACE("unsigned int adapter = %d, const D3DDISPLAYMODEFILTER *filter = 0x%0.8p", adapter, filter);
271
272 return Direct3D9::GetAdapterModeCount(adapter, filter->Format); // FIXME
273 }
Nicolas Capens518e41a2016-04-27 23:18:01 -0400274
Nicolas Capensee16f0d2015-07-16 17:40:10 -0400275 long __stdcall Direct3D9Ex::EnumAdapterModesEx(unsigned int adapter, const D3DDISPLAYMODEFILTER *filter, unsigned int index, D3DDISPLAYMODEEX *modeEx)
276 {
277 TRACE("unsigned int adapter = %d, const D3DDISPLAYMODEFILTER *filter = 0x%0.8p, unsigned int index = %d, D3DDISPLAYMODEEX *modeEx = 0x%0.8p", adapter, filter, index, modeEx);
278
279 D3DDISPLAYMODE mode;
280
281 mode.Format = modeEx->Format;
282 mode.Width = modeEx->Width;
283 mode.Height = modeEx->Height;
284 mode.RefreshRate = modeEx->RefreshRate;
285
286 return Direct3D9::EnumAdapterModes(adapter, filter->Format, index, &mode); // FIXME
287 }
288
289 long __stdcall Direct3D9Ex::GetAdapterDisplayModeEx(unsigned int adapter, D3DDISPLAYMODEEX *modeEx, D3DDISPLAYROTATION *rotation)
290 {
291 TRACE("unsigned int adapter = %d, D3DDISPLAYMODEEX *modeEx = 0x%0.8p, D3DDISPLAYROTATION *rotation = 0x%0.8p", adapter, modeEx, rotation);
292
293 D3DDISPLAYMODE mode;
294
295 mode.Format = modeEx->Format;
296 mode.Width = modeEx->Width;
297 mode.Height = modeEx->Height;
298 mode.RefreshRate = modeEx->RefreshRate;
299
300 return GetAdapterDisplayMode(adapter, &mode); // FIXME
301 }
302
303 long __stdcall Direct3D9Ex::CreateDeviceEx(unsigned int adapter, D3DDEVTYPE deviceType, HWND focusWindow, DWORD behaviorFlags, D3DPRESENT_PARAMETERS *presentParameters, D3DDISPLAYMODEEX *fullscreenDisplayMode, IDirect3DDevice9Ex **returnedDeviceInterface)
304 {
305 TRACE("unsigned int adapter = %d, D3DDEVTYPE deviceType = %d, HWND focusWindow = %d, DWORD behaviorFlags = 0x%0.8X, D3DPRESENT_PARAMETERS *presentParameters = 0x%0.8p, D3DDISPLAYMODEEX *fullscreenDisplayMode = 0x%0.8p, IDirect3DDevice9Ex **returnedDeviceInterface = 0x%0.8p", adapter, deviceType, focusWindow, behaviorFlags, presentParameters, fullscreenDisplayMode, returnedDeviceInterface);
306
307 if(deviceType != D3DDEVTYPE_HAL)
308 {
309 loadSystemD3D9ex();
310
311 if(d3d9ex)
312 {
313 return d3d9ex->CreateDeviceEx(adapter, deviceType, focusWindow, behaviorFlags, presentParameters, fullscreenDisplayMode, returnedDeviceInterface);
314 }
315 else
316 {
317 CreateDeviceEx(adapter, deviceType, focusWindow, behaviorFlags, presentParameters, fullscreenDisplayMode, returnedDeviceInterface);
318 }
319 }
320
321 if(!focusWindow || !presentParameters || !returnedDeviceInterface)
322 {
323 *returnedDeviceInterface = 0;
324
325 return INVALIDCALL();
326 }
327
328 *returnedDeviceInterface = new Direct3DDevice9Ex(instance, this, adapter, deviceType, focusWindow, behaviorFlags, presentParameters);
329
330 if(*returnedDeviceInterface)
331 {
332 (*returnedDeviceInterface)->AddRef();
333 }
334
335 return D3D_OK;
336 }
337
338 long __stdcall Direct3D9Ex::GetAdapterLUID(unsigned int adapter, LUID *luid)
339 {
340 TRACE("unsigned int adapter = %d, LUID *luid = 0x%0.8p", adapter, luid);
341
342 if(adapter != D3DADAPTER_DEFAULT)
343 {
344 UNIMPLEMENTED();
345 }
346
347 // FIXME: Should return a presistent id using AllocateLocallyUniqueId()
348 luid->LowPart = 0x0000001;
349 luid->HighPart = 0x0000000;
350
351 return D3D_OK;
352 }
353
354 void Direct3D9Ex::loadSystemD3D9ex()
355 {
356 if(d3d9ex)
357 {
358 return;
359 }
360
361 char d3d9Path[MAX_PATH + 16];
362 GetSystemDirectory(d3d9Path, MAX_PATH);
363 strcat(d3d9Path, "\\d3d9.dll");
364 d3d9Lib = LoadLibrary(d3d9Path);
365
366 if(d3d9Lib)
367 {
368 typedef IDirect3D9Ex* (__stdcall *DIRECT3DCREATE9EX)(unsigned int, IDirect3D9Ex**);
369 DIRECT3DCREATE9EX direct3DCreate9Ex = (DIRECT3DCREATE9EX)GetProcAddress(d3d9Lib, "Direct3DCreate9Ex");
370 direct3DCreate9Ex(D3D_SDK_VERSION, &d3d9ex);
371 }
372 }
373}