stub.h revision a08ba954dfbb6b906afd3079f7830ff920006bff
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/* Copyright (c) 2001, Stanford University
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * All rights reserved
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * See the file LICENSE.txt for information on redistributing this software.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/*
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * How this all works...
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * This directory implements three different interfaces to Chromium:
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
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 *
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 *
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 *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifndef CR_STUB_H
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define CR_STUB_H
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "chromium.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "cr_version.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "cr_hash.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "cr_process.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "cr_spu.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "cr_threads.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include "spu_dispatch_table.h"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifdef GLX
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include <X11/extensions/XShm.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include <sys/shm.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include <X11/extensions/Xdamage.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include <X11/extensions/Xcomposite.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include <X11/extensions/Xfixes.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#if defined(WINDOWS) || defined(Linux) || defined(SunOS)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync# define CR_NEWWINTRACK
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#if !defined(CHROMIUM_THREADSAFE) && defined(CR_NEWWINTRACK)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync# error CHROMIUM_THREADSAFE have to be defined
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifdef CHROMIUM_THREADSAFE
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync# include <cr_threads.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/*#define VBOX_TEST_MEGOO*/
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync#if 0 && defined(CR_NEWWINTRACK) && !defined(WINDOWS)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define XLOCK(dpy) XLockDisplay(dpy)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define XUNLOCK(dpy) XUnlockDisplay(dpy)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#else
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define XLOCK(dpy)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define XUNLOCK(dpy)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
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.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef enum
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync UNDECIDED,
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync CHROMIUM,
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync NATIVE
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync} ContextType;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync#define MAX_DPY_NAME 1000
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef struct context_info_t ContextInfo;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsynctypedef struct window_info_t WindowInfo;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifdef GLX
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsynctypedef struct glxpixmap_info_t GLX_Pixmap_t;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsyncstruct glxpixmap_info_t
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int x, y;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync unsigned int w, h, border, depth;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLenum format;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Window root;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLenum target;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GC gc;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync Pixmap hShmPixmap; /* Shared memory pixmap object, if it's supported*/
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync Damage hDamage; /* damage xserver handle*/
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync Bool bPixmapImageDirty;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync Region pDamageRegion;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync};
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync#endif
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsyncstruct context_info_t
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync char dpyName[MAX_DPY_NAME];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLint spuContext; /* returned by head SPU's CreateContext() */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ContextType type; /* CHROMIUM, NATIVE or UNDECIDED */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync unsigned long id; /* the client-visible handle */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLint visBits;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync WindowInfo *currentDrawable;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLint spuConnection;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync struct VBOXUHGSMI *pHgsmi;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifdef CHROMIUM_THREADSAFE
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync VBOXTLSREFDATA
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifdef WINDOWS
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync HGLRC hglrc;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#elif defined(DARWIN)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ContextInfo *share;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync CGLContextObj cglc;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* CGLContextEnable (CGLEnable, CGLDisable, and CGLIsEnabled) */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync unsigned int options;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* CGLContextParameter (CGLSetParameter and CGLGetParameter) */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLint parambits;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync long swap_rect[4], swap_interval;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync unsigned long client_storage;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync long surf_order, surf_opacy;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync long disp_mask;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#elif defined(GLX)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Display *dpy;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ContextInfo *share;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync XVisualInfo *visual;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Bool direct;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLXContext glxContext;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync CRHashTable *pGLXPixmapsHash;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Bool damageInitFailed;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Display *damageDpy; /* second display connection to read xdamage extension data */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int damageEventsBase;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync};
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifdef DARWIN
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncenum {
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync VISBIT_SWAP_RECT,
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync VISBIT_SWAP_INTERVAL,
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync VISBIT_CLIENT_STORAGE
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync};
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncstruct window_info_t
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char dpyName[MAX_DPY_NAME];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int x, y;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync unsigned int width, height;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ContextType type;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLint spuWindow; /* returned by head SPU's WindowCreate() */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync ContextInfo *pOwner; /* ctx which created this window */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLboolean mapped;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync#ifdef WINDOWS
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync HDC drawable;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync HRGN hVisibleRegion;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync DWORD dmPelsWidth;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync DWORD dmPelsHeight;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync HWND hWnd;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#elif defined(DARWIN)
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync CGSConnectionID connection;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync CGSWindowID drawable;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync CGSSurfaceID surface;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#elif defined(GLX)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Display *dpy;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync# ifdef CR_NEWWINTRACK
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync Display *syncDpy;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync# endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLXDrawable drawable;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync XRectangle *pVisibleRegions;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLint cVisibleRegions;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifdef CR_NEWWINTRACK
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t u32ClientID;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync#endif
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync};
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync/* "Global" variables for the stub library */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsynctypedef struct {
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync /* the first SPU in the SPU chain on this app node */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync SPU *spu;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* OpenGL/SPU dispatch tables */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync crOpenGLInterface wsInterface;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync SPUDispatchTable spuDispatch;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync SPUDispatchTable nativeDispatch;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLboolean haveNativeOpenGL;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* config options */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync int appDrawCursor;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync GLuint minChromiumWindowWidth;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync GLuint minChromiumWindowHeight;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync GLuint maxChromiumWindowWidth;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLuint maxChromiumWindowHeight;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLuint matchChromiumWindowCount;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLuint matchChromiumWindowCounter;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLuint *matchChromiumWindowID;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync GLuint numIgnoreWindowID;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char *matchWindowTitle;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int ignoreFreeglutMenus;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int trackWindowSize;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int trackWindowPos;
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync int trackWindowVisibility;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int trackWindowVisibleRgn;
char *spu_dir;
int force_pbuffers;
int viewportHack;
/* thread safety stuff */
GLboolean threadSafe;
#ifdef CHROMIUM_THREADSAFE
CRtsd dispatchTSD;
CRmutex mutex;
#endif
CRpid mothershipPID;
/* contexts */
int freeContextNumber;
CRHashTable *contextTable;
#ifndef CHROMIUM_THREADSAFE
ContextInfo *currentContext; /* may be NULL */
#endif
/* windows */
CRHashTable *windowTable;
#ifdef GLX
/* Shared memory, used to transfer XServer pixmaps data into client memory */
XShmSegmentInfo xshmSI;
GLboolean bShmInitFailed;
CRHashTable *pGLXPixmapsHash;
GLboolean bXExtensionsChecked;
GLboolean bHaveXComposite;
GLboolean bHaveXFixes;
#endif
#ifdef WINDOWS
# ifndef CR_NEWWINTRACK
HHOOK hMessageHook;
# endif
# ifdef VBOX_WITH_WDDM
bool bRunningUnderWDDM;
# endif
#endif
#ifdef CR_NEWWINTRACK
RTTHREAD hSyncThread;
bool volatile bShutdownSyncThread;
#endif
} 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
* THREAD_DETACH cleanup on windows.
* Note that we can not do
* STUB_INIT_LOCK();
* if (stub_initialized) stubSetCurrentContext(NULL);
* STUB_INIT_UNLOCK();
* 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.
* Note that GetModuleFileName acquires the loader lock.
* */
extern CRtsd g_stubCurrentContextTSD;
DECLINLINE(ContextInfo*) stubGetCurrentContext()
{
ContextInfo* ctx;
VBoxTlsRefGetCurrentFunctional(ctx, ContextInfo, &g_stubCurrentContextTSD);
return ctx;
}
# define stubSetCurrentContext(_ctx) VBoxTlsRefSetCurrent(ContextInfo, &g_stubCurrentContextTSD, _ctx)
#else
# define stubGetCurrentContext() (stub.currentContext)
# define stubSetCurrentContext(_ctx) do { stub.currentContext = (_ctx); } while (0)
#endif
extern Stub stub;
extern DECLEXPORT(SPUDispatchTable) glim;
extern SPUDispatchTable stubThreadsafeDispatch;
extern DECLEXPORT(SPUDispatchTable) stubNULLDispatch;
#if defined(GLX) || defined (WINDOWS)
extern GLboolean stubUpdateWindowVisibileRegions(WindowInfo *pWindow);
#endif
#ifdef WINDOWS
/* WGL versions */
extern WindowInfo *stubGetWindowInfo( HDC drawable );
extern void stubInstallWindowMessageHook();
extern void stubUninstallWindowMessageHook();
#elif defined(DARWIN)
extern CGSConnectionID _CGSDefaultConnection(void);
extern OSStatus CGSGetWindowLevel( CGSConnectionID cid, CGSWindowID wid, CGWindowLevel *level );
extern OSStatus CGSSetWindowAlpha( const CGSConnectionID cid, CGSWindowID wid, float alpha );
/* These don't seem to be included in the OSX glext.h ... */
extern void glPointParameteri( GLenum pname, GLint param );
extern void glPointParameteriv( GLenum pname, const GLint * param );
extern WindowInfo *stubGetWindowInfo( CGSWindowID drawable );
#elif defined(GLX)
/* GLX versions */
extern WindowInfo *stubGetWindowInfo( Display *dpy, GLXDrawable drawable );
extern void stubUseXFont( Display *dpy, Font font, int first, int count, int listbase );
extern Display* stubGetWindowDisplay(WindowInfo *pWindow);
extern void stubCheckXExtensions(WindowInfo *pWindow);
#endif
extern ContextInfo *stubNewContext( const char *dpyName, GLint visBits, ContextType type, unsigned long shareCtx
#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
, struct VBOXUHGSMI *pHgsmi
#endif
);
extern void stubDestroyContext( unsigned long contextId );
extern GLboolean stubMakeCurrent( WindowInfo *window, ContextInfo *context );
extern GLint stubNewWindow( const char *dpyName, GLint visBits );
extern void stubDestroyWindow( GLint con, GLint window );
extern void stubSwapBuffers(WindowInfo *window, GLint flags);
extern void stubGetWindowGeometry(WindowInfo *win, int *x, int *y, unsigned int *w, unsigned int *h);
extern GLboolean stubUpdateWindowGeometry(WindowInfo *pWindow, GLboolean bForceUpdate);
extern GLboolean stubIsWindowVisible(WindowInfo *win);
extern bool stubInit(void);
extern void stubForcedFlush(GLint con);
extern void stubConFlush(GLint con);
extern void APIENTRY stub_GetChromiumParametervCR( GLenum target, GLuint index, GLenum type, GLsizei count, GLvoid *values );
extern void APIENTRY glBoundsInfoCR(const CRrecti *, const GLbyte *, GLint, GLint);
#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
# define CR_CTX_CON(_pCtx) ((_pCtx)->spuConnection)
#else
# define CR_CTX_CON(_pCtx) (0)
#endif
#endif /* CR_STUB_H */