d3d9_main.c revision 0f4c42cc432d01dc2d69b4cbd2a44624e3ce6ce6
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/* $Id$ */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/** @file
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VBox D3D8 dll switcher
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/*
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Copyright (C) 2009 Oracle Corporation
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * available from http://www.virtualbox.org. This file is free software;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * General Public License (GPL) as published by the Free Software
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include "d3d9.h"
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#include "switcher.h"
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef void (WINAPI *DebugSetMuteProc)(void);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef IDirect3D9* (WINAPI *Direct3DCreate9Proc)(UINT SDKVersion);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef HRESULT (WINAPI *Direct3DCreate9ExProc)(UINT SDKVersion, IDirect3D9Ex **direct3d9ex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync/* @todo: this does not return a value according to MSDN */
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef void* (WINAPI *Direct3DShaderValidatorCreate9Proc)(void);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef int (WINAPI *D3DPERF_BeginEventProc)(D3DCOLOR color, LPCWSTR name);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef int (WINAPI *D3DPERF_EndEventProc)(void);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef DWORD (WINAPI *D3DPERF_GetStatusProc)(void);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef void (WINAPI *D3DPERF_SetOptionsProc)(DWORD options);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef BOOL (WINAPI *D3DPERF_QueryRepeatFrameProc)(void);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef void (WINAPI *D3DPERF_SetMarkerProc)(D3DCOLOR color, LPCWSTR name);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef void (WINAPI *D3DPERF_SetRegionProc)(D3DCOLOR color, LPCWSTR name);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic void WINAPI vboxDebugSetMuteStub(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic IDirect3D9* WINAPI vboxDirect3DCreate9Stub(UINT SDKVersion)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic HRESULT WINAPI vboxDirect3DCreate9ExStub(UINT SDKVersion, IDirect3D9Ex **direct3d9ex)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync if (direct3d9ex)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync *direct3d9ex = NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return E_FAIL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic void* WINAPI vboxDirect3DShaderValidatorCreate9Stub(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return NULL;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int WINAPI vboxD3DPERF_BeginEventStub(D3DCOLOR color, LPCWSTR name)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic int WINAPI vboxD3DPERF_EndEventStub(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic DWORD WINAPI vboxD3DPERF_GetStatusStub(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic void WINAPI vboxD3DPERF_SetOptionsStub(DWORD options)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic BOOL WINAPI vboxD3DPERF_QueryRepeatFrameStub(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return 0;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic void WINAPI vboxD3DPERF_SetMarkerStub(D3DCOLOR color, LPCWSTR name)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic void WINAPI vboxD3DPERF_SetRegionStub(D3DCOLOR color, LPCWSTR name)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsynctypedef struct _D3D9ExTag
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync int initialized;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync const char *vboxName;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync const char *msName;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync DebugSetMuteProc pDebugSetMute;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Direct3DCreate9Proc pDirect3DCreate9;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Direct3DCreate9ExProc pDirect3DCreate9Ex;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync Direct3DShaderValidatorCreate9Proc pDirect3DShaderValidatorCreate9;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync D3DPERF_BeginEventProc pD3DPERF_BeginEvent;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync D3DPERF_EndEventProc pD3DPERF_EndEvent;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync D3DPERF_GetStatusProc pD3DPERF_GetStatus;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync D3DPERF_SetOptionsProc pD3DPERF_SetOptions;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync D3DPERF_QueryRepeatFrameProc pD3DPERF_QueryRepeatFrame;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync D3DPERF_SetMarkerProc pD3DPERF_SetMarker;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync D3DPERF_SetRegionProc pD3DPERF_SetRegion;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync} D3D9Export;
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#ifdef VBOX_WDDM_WOW64
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic D3D9Export g_swd3d9 = {0, "VBoxD3D9-x86.dll", "MSD3D9.dll",};
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#else
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncstatic D3D9Export g_swd3d9 = {0, "VBoxD3D9.dll", "MSD3D9.dll",};
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync#endif
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncvoid FillD3DExports(HANDLE hDLL)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, DebugSetMute);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, Direct3DCreate9);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, Direct3DCreate9Ex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, Direct3DShaderValidatorCreate9);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, D3DPERF_BeginEvent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, D3DPERF_EndEvent);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, D3DPERF_GetStatus);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, D3DPERF_SetOptions);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, D3DPERF_QueryRepeatFrame);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, D3DPERF_SetMarker);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_FILLPROC(g_swd3d9, hDLL, D3DPERF_SetRegion);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncvoid WINAPI DebugSetMute(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKCALL(g_swd3d9, DebugSetMute);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync g_swd3d9.pDebugSetMute();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncIDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKRET(g_swd3d9, Direct3DCreate9, NULL);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return g_swd3d9.pDirect3DCreate9(SDKVersion);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncHRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKRET(g_swd3d9, Direct3DCreate9Ex, E_FAIL);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return g_swd3d9.pDirect3DCreate9Ex(SDKVersion, direct3d9ex);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncvoid* WINAPI Direct3DShaderValidatorCreate9(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKRET(g_swd3d9, Direct3DShaderValidatorCreate9, NULL);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return g_swd3d9.pDirect3DShaderValidatorCreate9();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint WINAPI D3DPERF_BeginEvent(D3DCOLOR color, LPCWSTR name)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKRET(g_swd3d9, D3DPERF_BeginEvent, -1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return g_swd3d9.pD3DPERF_BeginEvent(color, name);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncint WINAPI D3DPERF_EndEvent(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKRET(g_swd3d9, D3DPERF_EndEvent, -1);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return g_swd3d9.pD3DPERF_EndEvent();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncDWORD WINAPI D3DPERF_GetStatus(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKRET(g_swd3d9, D3DPERF_EndEvent, 0);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return g_swd3d9.pD3DPERF_GetStatus();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncvoid WINAPI D3DPERF_SetOptions(DWORD options)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKCALL(g_swd3d9, D3DPERF_SetOptions);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync g_swd3d9.pD3DPERF_SetOptions(options);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncBOOL WINAPI D3DPERF_QueryRepeatFrame(void)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKRET(g_swd3d9, D3DPERF_QueryRepeatFrame, FALSE);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync return g_swd3d9.pD3DPERF_QueryRepeatFrame();
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncvoid WINAPI D3DPERF_SetMarker(D3DCOLOR color, LPCWSTR name)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKCALL(g_swd3d9, D3DPERF_SetMarker);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync g_swd3d9.pD3DPERF_SetMarker(color, name);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsyncvoid WINAPI D3DPERF_SetRegion(D3DCOLOR color, LPCWSTR name)
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync{
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync SW_CHECKCALL(g_swd3d9, D3DPERF_SetRegion);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync g_swd3d9.pD3DPERF_SetRegion(color, name);
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync}
3194da424708abdd288b28d96892b3a5f3f7df0bvboxsync