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