stub.h revision a08ba954dfbb6b906afd3079f7830ff920006bff
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/* Copyright (c) 2001, Stanford University
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * All rights reserved
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * See the file LICENSE.txt for information on redistributing this software.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * How this all works...
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * This directory implements three different interfaces to Chromium:
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 1. the Chromium interface - this is defined by the functions that start
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * with the "cr" prefix and are defined in chromium.h and implemented in
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * stub.c. Typically, this is used by parallel apps (like psubmit).
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 2. GLX emulation interface - the glX*() functions are emulated here.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * When glXCreateContext() is called we may either create a real, native
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * GLX context or a Chromium context (depending on match_window_title and
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * minimum_window_size).
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * 3. WGL emulation interface - the wgl*() functions are emulated here.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * When wglCreateContext() is called we may either create a real, native
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * WGL context or a Chromium context (depending on match_window_title and
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * minimum_window_size).
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#if defined(WINDOWS) || defined(Linux) || defined(SunOS)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#if !defined(CHROMIUM_THREADSAFE) && defined(CR_NEWWINTRACK)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/*#define VBOX_TEST_MEGOO*/
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync#if 0 && defined(CR_NEWWINTRACK) && !defined(WINDOWS)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/* When we first create a rendering context we can't be sure whether
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * it'll be handled by Chromium or as a native GLX/WGL context. So in
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * CreateContext() we'll mark the ContextInfo object as UNDECIDED then
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * switch it to either NATIVE or CHROMIUM the first time MakeCurrent()
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * is called. In MakeCurrent() we can use a criteria like window size
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * or window title to decide between CHROMIUM and NATIVE.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef enum
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync Pixmap hShmPixmap; /* Shared memory pixmap object, if it's supported*/
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLint spuContext; /* returned by head SPU's CreateContext() */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ContextType type; /* CHROMIUM, NATIVE or UNDECIDED */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* CGLContextEnable (CGLEnable, CGLDisable, and CGLIsEnabled) */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync unsigned int options;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* CGLContextParameter (CGLSetParameter and CGLGetParameter) */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync unsigned long client_storage;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Display *damageDpy; /* second display connection to read xdamage extension data */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLint spuWindow; /* returned by head SPU's WindowCreate() */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ContextInfo *pOwner; /* ctx which created this window */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync/* "Global" variables for the stub library */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsynctypedef struct {
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* the first SPU in the SPU chain on this app node */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* OpenGL/SPU dispatch tables */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* config options */
char *spu_dir;
int force_pbuffers;
int viewportHack;
#ifdef CHROMIUM_THREADSAFE
int freeContextNumber;
#ifndef CHROMIUM_THREADSAFE
#ifdef GLX
#ifdef WINDOWS
# ifndef CR_NEWWINTRACK
# ifdef VBOX_WITH_WDDM
bool bRunningUnderWDDM;
#ifdef CR_NEWWINTRACK
bool volatile bShutdownSyncThread;
} Stub;
#ifdef CHROMIUM_THREADSAFE
/* we place the g_stubCurrentContextTLS outside the Stub data because Stub data is inited by the client's call,
* while we need g_stubCurrentContextTLS the g_stubCurrentContextTLS to be valid at any time to be able to handle
* on THREAD_DETACH since it may cause deadlock, i.e. in this situation loader lock is acquired first and then the init lock,
* but since we use GetModuleFileName in crGetProcName called from stubInitLocked, the lock order might be the oposite.
return ctx;
# define stubSetCurrentContext(_ctx) VBoxTlsRefSetCurrent(ContextInfo, &g_stubCurrentContextTSD, _ctx)
#ifdef WINDOWS
extern void stubInstallWindowMessageHook();
extern void stubUninstallWindowMessageHook();
/* These don't seem to be included in the OSX glext.h ... */
extern ContextInfo *stubNewContext( const char *dpyName, GLint visBits, ContextType type, unsigned long shareCtx
extern void stubGetWindowGeometry(WindowInfo *win, int *x, int *y, unsigned int *w, unsigned int *h);
extern bool stubInit(void);