1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2 // 3 // 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 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // 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. 14 15 #include "Direct3D9.hpp" 16 #include "Direct3D9Ex.hpp" 17 18 #include "Debug.hpp" 19 20 #include "resource.h" 21 22 #include <stdio.h> 23 #include <assert.h> 24 25 namespace D3D9 26 { 27 class Direct3DShaderValidator9 28 { 29 public: 30 Direct3DShaderValidator9(); 31 32 virtual ~Direct3DShaderValidator9(); 33 34 virtual int __stdcall ValidateShader(long *shader, long *shader1, long *shader2, long *shader3); 35 virtual int __stdcall ValidateShader2(long *shader); 36 virtual int __stdcall ValidateShader3(long *shader, long *shader1, long *shader2, long *shader3); 37 virtual int __stdcall ValidateShader4(long *shader, long *shader1, long *shader2, long *shader3); 38 virtual int __stdcall ValidateShader5(long *shader, long *shader1, long *shader2); 39 virtual int __stdcall ValidateShader6(long *shader, long *shader1, long *shader2, long *shader3); 40 }; 41 42 Direct3DShaderValidator9::Direct3DShaderValidator9() 43 { 44 } 45 46 Direct3DShaderValidator9::~Direct3DShaderValidator9() 47 { 48 } 49 50 int __stdcall Direct3DShaderValidator9::ValidateShader(long *shader, long *shader1, long *shader2, long *shader3) // FIXME 51 { 52 TRACE(""); 53 54 UNIMPLEMENTED(); 55 56 return true; // FIXME 57 } 58 59 int __stdcall Direct3DShaderValidator9::ValidateShader2(long *shader) // FIXME 60 { 61 TRACE(""); 62 63 UNIMPLEMENTED(); 64 65 return true; // FIXME 66 } 67 68 int __stdcall Direct3DShaderValidator9::ValidateShader3(long *shader, long *shader1, long *shader2, long *shader3) 69 { 70 TRACE(""); 71 72 UNIMPLEMENTED(); 73 74 return true; // FIXME 75 } 76 77 int __stdcall Direct3DShaderValidator9::ValidateShader4(long *shader, long *shader1, long *shader2, long *shader3) 78 { 79 TRACE(""); 80 81 UNIMPLEMENTED(); 82 83 return true; // FIXME 84 } 85 86 int __stdcall Direct3DShaderValidator9::ValidateShader5(long *shader, long *shader1, long *shader2) // FIXME 87 { 88 TRACE(""); 89 90 UNIMPLEMENTED(); 91 92 return true; // FIXME 93 } 94 95 int __stdcall Direct3DShaderValidator9::ValidateShader6(long *shader, long *shader1, long *shader2, long *shader3) // FIXME 96 { 97 TRACE(""); 98 99 UNIMPLEMENTED(); 100 101 return true; // FIXME 102 } 103 } 104 105 static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 106 { 107 RECT rect; 108 109 switch(uMsg) 110 { 111 case WM_INITDIALOG: 112 GetWindowRect(GetDesktopWindow(), &rect); 113 SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE); 114 SetTimer(hwnd, 1, 100, NULL); 115 return TRUE; 116 case WM_COMMAND: 117 if(LOWORD(wParam) == IDCANCEL) 118 { 119 EndDialog(hwnd, 0); 120 } 121 break; 122 case WM_TIMER: 123 if(IsDebuggerPresent()) 124 { 125 EndDialog(hwnd, 0); 126 } 127 } 128 129 return FALSE; 130 } 131 132 static void WaitForDebugger(HINSTANCE instance) 133 { 134 if(!IsDebuggerPresent()) 135 { 136 HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG); 137 DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE*)LoadResource(instance, dialog); 138 DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc); 139 } 140 } 141 142 using namespace D3D9; 143 144 extern "C" 145 { 146 HINSTANCE dllInstance = 0; 147 148 int __stdcall DllMain(HINSTANCE instance, unsigned long reason, void *reserved) 149 { 150 #ifndef NDEBUG 151 if(dllInstance == 0) 152 { 153 FILE *file = fopen("debug.txt", "w"); // Clear debug log 154 if(file) fclose(file); 155 } 156 #endif 157 158 GTRACE("HINSTANCE instance = 0x%0.8p, unsigned long reason = %d, void *reserved = 0x%0.8p", instance, reason, reserved); 159 160 dllInstance = instance; 161 162 switch(reason) 163 { 164 case DLL_PROCESS_DETACH: 165 break; 166 case DLL_PROCESS_ATTACH: 167 #ifndef NDEBUG 168 WaitForDebugger(instance); 169 #endif 170 DisableThreadLibraryCalls(instance); 171 break; 172 case DLL_THREAD_ATTACH: 173 break; 174 case DLL_THREAD_DETACH: 175 break; 176 default: 177 SetLastError(ERROR_INVALID_PARAMETER); 178 return FALSE; 179 } 180 181 return TRUE; 182 } 183 184 IDirect3D9 *__stdcall Direct3DCreate9(unsigned int version) 185 { 186 GTRACE(""); 187 188 // D3D_SDK_VERSION check 189 if(version != (31 | 0x80000000) && // 9.0a/b DEBUG_INFO 190 version != 31 && // 9.0a/b 191 version != (32 | 0x80000000) && // 9.0c DEBUG_INFO 192 version != 32) // 9.0c 193 { 194 return 0; 195 } 196 197 IDirect3D9 *device = new D3D9::Direct3D9(version, dllInstance); 198 199 if(device) 200 { 201 device->AddRef(); 202 } 203 204 return device; 205 } 206 207 HRESULT __stdcall Direct3DCreate9Ex(unsigned int version, IDirect3D9Ex **device) 208 { 209 // D3D_SDK_VERSION check 210 if(version != (31 | 0x80000000) && // 9.0a/b DEBUG_INFO 211 version != 31 && // 9.0a/b 212 version != (32 | 0x80000000) && // 9.0c DEBUG_INFO 213 version != 32) // 9.0c 214 { 215 return NOTAVAILABLE(); 216 } 217 218 *device = new D3D9::Direct3D9Ex(version, dllInstance); 219 220 if(device) 221 { 222 (*device)->AddRef(); 223 } 224 else 225 { 226 return OUTOFMEMORY(); 227 } 228 229 return D3D_OK; 230 } 231 232 int __stdcall CheckFullscreen() 233 { 234 GTRACE(""); 235 236 UNIMPLEMENTED(); 237 238 return FALSE; 239 } 240 241 int __stdcall D3DPERF_BeginEvent(D3DCOLOR color, const wchar_t *name) 242 { 243 GTRACE(""); 244 245 // UNIMPLEMENTED(); // PIX unsupported 246 247 return -1; 248 } 249 250 int __stdcall D3DPERF_EndEvent() 251 { 252 GTRACE(""); 253 254 // UNIMPLEMENTED(); // PIX unsupported 255 256 return -1; 257 } 258 259 unsigned long __stdcall D3DPERF_GetStatus() 260 { 261 GTRACE(""); 262 263 // UNIMPLEMENTED(); // PIX unsupported 264 265 return 0; 266 } 267 268 int __stdcall D3DPERF_QueryRepeatFrame() 269 { 270 GTRACE(""); 271 272 // UNIMPLEMENTED(); // PIX unsupported 273 274 return FALSE; 275 } 276 277 void __stdcall D3DPERF_SetMarker(D3DCOLOR color, const wchar_t *name) 278 { 279 GTRACE(""); 280 281 // UNIMPLEMENTED(); // PIX unsupported 282 } 283 284 void __stdcall D3DPERF_SetOptions(unsigned long options) 285 { 286 GTRACE(""); 287 288 // UNIMPLEMENTED(); // PIX unsupported 289 } 290 291 void __stdcall D3DPERF_SetRegion(D3DCOLOR color, const wchar_t *name) 292 { 293 GTRACE(""); 294 295 // UNIMPLEMENTED(); // PIX unsupported 296 } 297 298 void __cdecl DebugSetLevel(long level) 299 { 300 GTRACE("long level = %d", level); 301 302 // UNIMPLEMENTED(); // Debug output unsupported 303 } 304 305 void __cdecl DebugSetMute(long mute) 306 { 307 GTRACE("long mute = %d", mute); 308 309 // UNIMPLEMENTED(); // Debug output unsupported 310 } 311 312 void *__stdcall Direct3DShaderValidatorCreate9() 313 { 314 GTRACE(""); 315 316 // UNIMPLEMENTED(); 317 318 return 0; 319 320 // return new D3D9::Direct3DShaderValidator9(); 321 } 322 323 void __stdcall PSGPError() 324 { 325 GTRACE(""); 326 327 UNIMPLEMENTED(); 328 } 329 330 void __stdcall PSGPSampleTexture() 331 { 332 GTRACE(""); 333 334 UNIMPLEMENTED(); 335 } 336 } 337