| // 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(); |
| } |
| } |