| // Copyright 2016 The SwiftShader Authors. All Rights Reserved. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #include "Direct3D9.hpp" | |
| #include "Direct3D9Ex.hpp" | |
| #include "Debug.hpp" | |
| #include "resource.h" | |
| #include <stdio.h> | |
| #include <assert.h> | |
| namespace D3D9 | |
| { | |
| class Direct3DShaderValidator9 | |
| { | |
| public: | |
| Direct3DShaderValidator9(); | |
| virtual ~Direct3DShaderValidator9(); | |
| virtual int __stdcall ValidateShader(long *shader, long *shader1, long *shader2, long *shader3); | |
| virtual int __stdcall ValidateShader2(long *shader); | |
| virtual int __stdcall ValidateShader3(long *shader, long *shader1, long *shader2, long *shader3); | |
| virtual int __stdcall ValidateShader4(long *shader, long *shader1, long *shader2, long *shader3); | |
| virtual int __stdcall ValidateShader5(long *shader, long *shader1, long *shader2); | |
| virtual int __stdcall ValidateShader6(long *shader, long *shader1, long *shader2, long *shader3); | |
| }; | |
| Direct3DShaderValidator9::Direct3DShaderValidator9() | |
| { | |
| } | |
| Direct3DShaderValidator9::~Direct3DShaderValidator9() | |
| { | |
| } | |
| int __stdcall Direct3DShaderValidator9::ValidateShader(long *shader, long *shader1, long *shader2, long *shader3) // FIXME | |
| { | |
| TRACE(""); | |
| UNIMPLEMENTED(); | |
| return true; // FIXME | |
| } | |
| int __stdcall Direct3DShaderValidator9::ValidateShader2(long *shader) // FIXME | |
| { | |
| TRACE(""); | |
| UNIMPLEMENTED(); | |
| return true; // FIXME | |
| } | |
| int __stdcall Direct3DShaderValidator9::ValidateShader3(long *shader, long *shader1, long *shader2, long *shader3) | |
| { | |
| TRACE(""); | |
| UNIMPLEMENTED(); | |
| return true; // FIXME | |
| } | |
| int __stdcall Direct3DShaderValidator9::ValidateShader4(long *shader, long *shader1, long *shader2, long *shader3) | |
| { | |
| TRACE(""); | |
| UNIMPLEMENTED(); | |
| return true; // FIXME | |
| } | |
| int __stdcall Direct3DShaderValidator9::ValidateShader5(long *shader, long *shader1, long *shader2) // FIXME | |
| { | |
| TRACE(""); | |
| UNIMPLEMENTED(); | |
| return true; // FIXME | |
| } | |
| int __stdcall Direct3DShaderValidator9::ValidateShader6(long *shader, long *shader1, long *shader2, long *shader3) // FIXME | |
| { | |
| TRACE(""); | |
| UNIMPLEMENTED(); | |
| return true; // FIXME | |
| } | |
| } | |
| static INT_PTR CALLBACK DebuggerWaitDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) | |
| { | |
| RECT rect; | |
| switch(uMsg) | |
| { | |
| case WM_INITDIALOG: | |
| GetWindowRect(GetDesktopWindow(), &rect); | |
| SetWindowPos(hwnd, HWND_TOP, rect.right / 2, rect.bottom / 2, 0, 0, SWP_NOSIZE); | |
| SetTimer(hwnd, 1, 100, NULL); | |
| return TRUE; | |
| case WM_COMMAND: | |
| if(LOWORD(wParam) == IDCANCEL) | |
| { | |
| EndDialog(hwnd, 0); | |
| } | |
| break; | |
| case WM_TIMER: | |
| if(IsDebuggerPresent()) | |
| { | |
| EndDialog(hwnd, 0); | |
| } | |
| } | |
| return FALSE; | |
| } | |
| static void WaitForDebugger(HINSTANCE instance) | |
| { | |
| if(!IsDebuggerPresent()) | |
| { | |
| HRSRC dialog = FindResource(instance, MAKEINTRESOURCE(IDD_DIALOG1), RT_DIALOG); | |
| DLGTEMPLATE *dialogTemplate = (DLGTEMPLATE*)LoadResource(instance, dialog); | |
| DialogBoxIndirect(instance, dialogTemplate, NULL, DebuggerWaitDialogProc); | |
| } | |
| } | |
| using namespace D3D9; | |
| extern "C" | |
| { | |
| HINSTANCE dllInstance = 0; | |
| int __stdcall DllMain(HINSTANCE instance, unsigned long reason, void *reserved) | |
| { | |
| #ifndef NDEBUG | |
| if(dllInstance == 0) | |
| { | |
| FILE *file = fopen("debug.txt", "w"); // Clear debug log | |
| if(file) fclose(file); | |
| } | |
| #endif | |
| GTRACE("HINSTANCE instance = 0x%0.8p, unsigned long reason = %d, void *reserved = 0x%0.8p", instance, reason, reserved); | |
| dllInstance = instance; | |
| switch(reason) | |
| { | |
| case DLL_PROCESS_DETACH: | |
| break; | |
| case DLL_PROCESS_ATTACH: | |
| #ifndef NDEBUG | |
| WaitForDebugger(instance); | |
| #endif | |
| DisableThreadLibraryCalls(instance); | |
| break; | |
| case DLL_THREAD_ATTACH: | |
| break; | |
| case DLL_THREAD_DETACH: | |
| break; | |
| default: | |
| SetLastError(ERROR_INVALID_PARAMETER); | |
| return FALSE; | |
| } | |
| return TRUE; | |
| } | |
| IDirect3D9 *__stdcall Direct3DCreate9(unsigned int version) | |
| { | |
| GTRACE(""); | |
| // D3D_SDK_VERSION check | |
| if(version != (31 | 0x80000000) && // 9.0a/b DEBUG_INFO | |
| version != 31 && // 9.0a/b | |
| version != (32 | 0x80000000) && // 9.0c DEBUG_INFO | |
| version != 32) // 9.0c | |
| { | |
| return 0; | |
| } | |
| IDirect3D9 *device = new D3D9::Direct3D9(version, dllInstance); | |
| if(device) | |
| { | |
| device->AddRef(); | |
| } | |
| return device; | |
| } | |
| HRESULT __stdcall Direct3DCreate9Ex(unsigned int version, IDirect3D9Ex **device) | |
| { | |
| // D3D_SDK_VERSION check | |
| if(version != (31 | 0x80000000) && // 9.0a/b DEBUG_INFO | |
| version != 31 && // 9.0a/b | |
| version != (32 | 0x80000000) && // 9.0c DEBUG_INFO | |
| version != 32) // 9.0c | |
| { | |
| return NOTAVAILABLE(); | |
| } | |
| *device = new D3D9::Direct3D9Ex(version, dllInstance); | |
| if(device) | |
| { | |
| (*device)->AddRef(); | |
| } | |
| else | |
| { | |
| return OUTOFMEMORY(); | |
| } | |
| return D3D_OK; | |
| } | |
| int __stdcall CheckFullscreen() | |
| { | |
| GTRACE(""); | |
| UNIMPLEMENTED(); | |
| return FALSE; | |
| } | |
| int __stdcall D3DPERF_BeginEvent(D3DCOLOR color, const wchar_t *name) | |
| { | |
| GTRACE(""); | |
| // UNIMPLEMENTED(); // PIX unsupported | |
| return -1; | |
| } | |
| int __stdcall D3DPERF_EndEvent() | |
| { | |
| GTRACE(""); | |
| // UNIMPLEMENTED(); // PIX unsupported | |
| return -1; | |
| } | |
| unsigned long __stdcall D3DPERF_GetStatus() | |
| { | |
| GTRACE(""); | |
| // UNIMPLEMENTED(); // PIX unsupported | |
| return 0; | |
| } | |
| int __stdcall D3DPERF_QueryRepeatFrame() | |
| { | |
| GTRACE(""); | |
| // UNIMPLEMENTED(); // PIX unsupported | |
| return FALSE; | |
| } | |
| void __stdcall D3DPERF_SetMarker(D3DCOLOR color, const wchar_t *name) | |
| { | |
| GTRACE(""); | |
| // UNIMPLEMENTED(); // PIX unsupported | |
| } | |
| void __stdcall D3DPERF_SetOptions(unsigned long options) | |
| { | |
| GTRACE(""); | |
| // UNIMPLEMENTED(); // PIX unsupported | |
| } | |
| void __stdcall D3DPERF_SetRegion(D3DCOLOR color, const wchar_t *name) | |
| { | |
| GTRACE(""); | |
| // UNIMPLEMENTED(); // PIX unsupported | |
| } | |
| void __cdecl DebugSetLevel(long level) | |
| { | |
| GTRACE("long level = %d", level); | |
| // UNIMPLEMENTED(); // Debug output unsupported | |
| } | |
| void __cdecl DebugSetMute(long mute) | |
| { | |
| GTRACE("long mute = %d", mute); | |
| // UNIMPLEMENTED(); // Debug output unsupported | |
| } | |
| void *__stdcall Direct3DShaderValidatorCreate9() | |
| { | |
| GTRACE(""); | |
| // UNIMPLEMENTED(); | |
| return 0; | |
| // return new D3D9::Direct3DShaderValidator9(); | |
| } | |
| void __stdcall PSGPError() | |
| { | |
| GTRACE(""); | |
| UNIMPLEMENTED(); | |
| } | |
| void __stdcall PSGPSampleTexture() | |
| { | |
| GTRACE(""); | |
| UNIMPLEMENTED(); | |
| } | |
| } |