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