load.c revision 90acfc2e27e7c8560e100e36f24a978c932a82ca
df9eb29d4fc657eb85ce9b3762d564738e952412vboxsync/* Copyright (c) 2001, Stanford University
df9eb29d4fc657eb85ce9b3762d564738e952412vboxsync * All rights reserved
df9eb29d4fc657eb85ce9b3762d564738e952412vboxsync * See the file LICENSE.txt for information on redistributing this software.
df9eb29d4fc657eb85ce9b3762d564738e952412vboxsync#include "../../WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h"
df9eb29d4fc657eb85ce9b3762d564738e952412vboxsync#include "../../WINNT/Graphics/Display/wddm/vboxdispmp.h"
df9eb29d4fc657eb85ce9b3762d564738e952412vboxsync * If you change this, see the comments in tilesortspu_context.c
#ifdef WINDOWS
#ifdef WINDOWS
static int stub_initialized = 0;
/* NOTE: 'SPUDispatchTable stubThreadsafeDispatch' is declared in tsfuncs.c */
static void stubInitNativeDispatch( void )
int numFuncs;
bool bForceUpdate = false;
bool bChanged = false;
#ifdef WINDOWS
crDebug("Resolution changed(%d,%d), forcing window Pos/Size update", devMode.dmPelsWidth, devMode.dmPelsHeight);
bForceUpdate = true;
bChanged = true;
#ifdef WINDOWS
#ifdef WINDOWS
static void stubCheckWindowsState(void)
origViewport(x, y, w, h);
/*stub.spuDispatch.SwapBuffers = trapSwapBuffers;
stub.spuDispatch.DrawBuffer = trapDrawBuffer;*/
static void stubSPUTearDown(void)
if (!stub_initialized) return;
stub_initialized = 0;
#ifdef WINDOWS
# ifndef CR_NEWWINTRACK
#ifdef CR_NEWWINTRACK
#ifndef Linux
#ifdef GLX
static void stubSPUSafeTearDown(void)
#ifdef CHROMIUM_THREADSAFE
if (!stub_initialized) return;
stub_initialized = 0;
#ifdef CHROMIUM_THREADSAFE
#ifdef WINDOWS
# ifndef CR_NEWWINTRACK
#if defined(CR_NEWWINTRACK)
# if defined(WINDOWS)
/*RTThreadWait might return too early, which cause our code being unloaded while RT thread wrapper is still running*/
if (!rc)
#ifdef CHROMIUM_THREADSAFE
static void stubExitHandler(void)
static void stubInitVars(void)
#ifdef CHROMIUM_THREADSAFE
#ifdef CR_NEWWINTRACK
#ifdef WINDOWS
#ifndef WINDOWS
(void) stubExitHandler;
(void) stubSignalHandler;
GenerateMothershipPort(void)
unsigned short port;
#ifdef WINDOWS
return port;
int sock, k;
CRASSERT(k == 0);
port++;
return port;
FILE *f;
const char *home;
if (home)
if (conf)
return NULL;
while (!feof(f)) {
char **args;
return args;
fclose(f);
return NULL;
static int Mothership_Awake = 0;
void stubSetDefaultConfigurationOptions(void)
crNetSetRank(0);
#ifdef WINDOWS
for (i=0; gsViewportHackApps[i]; ++i)
#ifdef CR_NEWWINTRACK
# ifdef VBOX_WITH_WDDM
if (lpRgnData)
crDebug("Dispatched WindowVisibleRegion (%i, cRects=%i)", pWindow->spuWindow, lpRgnData->rdh.nCount);
stub.spuDispatch.WindowVisibleRegion(pWindow->spuWindow, lpRgnData->rdh.nCount, (GLint*) lpRgnData->Buffer);
uint32_t i;
return INVALID_HANDLE_VALUE;
return hRgn;
bool bChanged = false;
bChanged = true;
bChanged = true;
bChanged = true;
if (!bRc)
bChanged = true;
bChanged = true;
if (bChanged)
(void) data2;
#ifdef WINDOWS
#ifdef WINDOWS
# ifdef VBOX_WITH_WDDM
(void) pvUser;
#ifdef WINDOWS
# ifdef VBOX_WITH_WDDM
pfnVBoxDispMpGetCallbacks = (PFNVBOXDISPMP_GETCALLBACKS)GetProcAddress(hVBoxD3D, TEXT("VBoxDispMpGetCallbacks"));
#ifdef WINDOWS
# ifdef VBOX_WITH_WDDM
uint32_t i;
crDebug("Rect(%d): left(%d), top(%d), right(%d), bottom(%d)", i, pRect->left, pRect->top, pRect->right, pRect->bottom);
/*hacky way to make sure window wouldn't be deleted in another thread as we hold hashtable lock here*/
#ifdef VBOX_WITH_WDDM
if (hVBoxD3D)
stubInit(void)
char **spuchain;
int num_spus;
int *spu_ids;
char **spu_names;
const char *app_id;
int disable_sync = 0;
if (stub_initialized)
stubInitVars();
/*@todo when vm boots with compiz turned on, new code causes hang in xcb_wait_for_reply in the sync thread*/
#ifndef WINDOWS
#if 0 && defined(CR_NEWWINTRACK)
if (st==0)
for (i = 0 ; i < num_spus ; i++)
for (i = 0; i < num_spus; ++i)
#if !defined(VBOX_NO_NATIVEGL)
#ifdef WINDOWS
# ifndef CR_NEWWINTRACK
#ifdef CR_NEWWINTRACK
int rc;
RTR3Init();
if (!disable_sync)
rc = RTThreadCreate(&stub.hSyncThread, stubSyncThreadProc, NULL, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "Sync");
#ifdef GLX
#ifdef LINUX
#ifdef WINDOWS
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
(void) lpvReserved;
switch (fdwReason)
case DLL_PROCESS_ATTACH:
return FALSE;
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
if (stub_initialized)
case DLL_THREAD_DETACH:
if (stub_initialized)
return TRUE;