VirtualBox

Changeset 30440 in vbox


Ignore:
Timestamp:
Jun 24, 2010 6:51:20 PM (14 years ago)
Author:
vboxsync
Message:

crOpenGL: wddm friendly windows info tracking + more consistent updates (disabled except windows yet)

Location:
trunk
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/HostServices/VBoxCrOpenGLSvc.h

    r28800 r30440  
    4343#define SHCRGL_GUEST_FN_WRITE_READ  (4)
    4444#define SHCRGL_GUEST_FN_SET_VERSION (6)
     45#define SHCRGL_GUEST_FN_INJECT      (9)
    4546
    4647/* Parameters count */
     
    5354#define SHCRGL_CPARMS_SET_VERSION (2)
    5455#define SHCRGL_CPARMS_SCREEN_CHANGED (1)
     56#define SHCRGL_CPARMS_INJECT (2)
    5557
    5658/**
     
    125127} CRVBOXHGCMSETVERSION;
    126128
     129/** GUEST_FN_INJECT Parameters structure. */
     130typedef struct
     131{
     132    VBoxGuestHGCMCallInfo   hdr;
     133
     134    /** 32bit, in
     135     *  ClientID to inject commands buffer for
     136     */
     137    HGCMFunctionParameter   u32ClientID;
     138    /** pointer, in
     139     *  Data buffer
     140     */
     141    HGCMFunctionParameter   pBuffer;
     142} CRVBOXHGCMINJECT;
     143
    127144#endif
  • trunk/src/VBox/Additions/common/crOpenGL/Makefile.kmk

    r29790 r30440  
    130130   VBoxOGL_SOURCES.solaris += \
    131131        $(VBOX_PATH_CROGL_GENFILES)/solaris_glxapi_exports.asm \
    132         $(VBOX_PATH_CROGL_GENFILES)/solaris_exports_dri.asm \
     132        $(VBOX_PATH_CROGL_GENFILES)/solaris_exports_dri.asm
    133133   VBoxOGL_SOURCES.linux += \
    134134        $(VBOX_PATH_CROGL_GENFILES)/linux_glxapi_exports.asm \
     
    136136   VBoxOGL_SOURCES.freebsd += \
    137137        $(VBOX_PATH_CROGL_GENFILES)/freebsd_glxapi_exports.asm \
    138         $(VBOX_PATH_CROGL_GENFILES)/freebsd_exports_dri.asm \
    139 
     138        $(VBOX_PATH_CROGL_GENFILES)/freebsd_exports_dri.asm
    140139  else
    141140   VBoxOGL_SOURCES.solaris += \
  • trunk/src/VBox/Additions/common/crOpenGL/context.c

    r29454 r30440  
    140140    winInfo->cVisibleRegions = 0;
    141141#endif
     142#ifdef CR_NEWWINTRACK
     143    winInfo->u32ClientID = stub.spu->dispatch_table.VBoxPackGetInjectID();
     144#endif
    142145    winInfo->spuWindow = spuWin;
    143146
     
    158161    if (win->dpy) {
    159162    XWindowAttributes attr;
     163    XLOCK(win->dpy);
    160164    XGetWindowAttributes(win->dpy, win->drawable, &attr);
     165    XUNLOCK(win->dpy);
    161166    return (attr.map_state != IsUnmapped);
    162167    }
     
    216221    winInfo->mapped = -1; /* don't know */
    217222    winInfo->pOwner = NULL;
     223#ifdef CR_NEWWINTRACK
     224    winInfo->u32ClientID = -1;
     225#endif
    218226#ifndef WINDOWS
    219227    crHashtableAdd(stub.windowTable, (unsigned int) drawable, winInfo);
     
    570578    //       Disabling those tripples glxgears fps, thus using xevens instead of per frame polling is much more preffered.
    571579    //@todo: Check similiar on windows guests, though doubtfull as there're no XSync like calls on windows.
     580    if (window && window->dpy)
     581    {
     582        XLOCK(window->dpy);
     583    }
     584
    572585    if (!window
    573586        || !window->dpy
     
    581594        *x = *y = 0;
    582595        *w = *h = 0;
     596    }
     597
     598    if (window && window->dpy)
     599    {
     600        XUNLOCK(window->dpy);
    583601    }
    584602}
     
    638656    unsigned int mask;
    639657    int x, y;
     658
     659    XLOCK(window->dpy);
     660
    640661    Bool q = XQueryPointer(window->dpy, window->drawable, &root, &child,
    641662                                                 &rootX, &rootY, &pos[0], &pos[1], &mask);
     
    649670        pos[0] = pos[1] = 0;
    650671    }
     672
     673    XUNLOCK(window->dpy);
    651674}
    652675
     
    854877                /*crDebug("(1)stubMakeCurrent ctx=%p(%i) window=%p(%i)", context, context->spuContext, window, window->spuWindow);*/
    855878                window->spuWindow = stub.spu->dispatch_table.WindowCreate( window->dpyName, context->visBits );
     879#ifdef CR_NEWWINTRACK
     880                window->u32ClientID = stub.spu->dispatch_table.VBoxPackGetInjectID();
     881#endif
     882
    856883            }
    857884        }
     
    922949                        unsigned int border, depth, w, h;
    923950
     951                        XLOCK(context->currentDrawable->dpy);
    924952                        if (!XGetGeometry(context->currentDrawable->dpy, context->currentDrawable->drawable, &root, &x, &y, &w, &h, &border, &depth))
    925953                        {
    926954                            crWindowDestroy((GLint)context->currentDrawable->drawable);
    927955                        }
     956                        XUNLOCK(context->currentDrawable->dpy);
    928957#endif
    929958                   
     
    9801009        if (stub.trackWindowSize)
    9811010            stub.spuDispatch.WindowSize( window->spuWindow, winW, winH );
     1011        if (stub.trackWindowPos)
     1012            stub.spuDispatch.WindowPosition(window->spuWindow, x, y);
    9821013        if (winW > 0 && winH > 0)
    9831014            stub.spu->dispatch_table.Viewport( 0, 0, winW, winH );
  • trunk/src/VBox/Additions/common/crOpenGL/fakedri_drv.c

    r28800 r30440  
    334334void __attribute__ ((constructor)) vbox_install_into_mesa(void)
    335335{
    336     if (!stubInit())
    337     {
    338         crDebug("vboxdriInitScreen: stubInit failed");
    339         return;
    340     }
    341 
    342336    {
    343337        void (*pxf86Msg)(MessageType type, const char *format, ...) _printf_attribute(2,3);
     
    354348            return;
    355349        }
     350    }
     351
     352    if (!stubInit())
     353    {
     354        crDebug("vboxdriInitScreen: stubInit failed");
     355        return;
    356356    }
    357357
  • trunk/src/VBox/Additions/common/crOpenGL/glx.c

    r28190 r30440  
    457457        return NULL;
    458458
     459    XLOCK(dpy);
    459460    searchvis.visualid = XVisualIDFromVisual(DefaultVisual(dpy, screen));
    460461    pret = XGetVisualInfo(dpy, VisualIDMask, &searchvis, &nvisuals);
     462    XUNLOCK(dpy);
    461463     
    462464    if (nvisuals!=1) crWarning("glXChooseVisual: XGetVisualInfo returned %i visuals for %x", nvisuals, (unsigned int) searchvis.visualid);
     
    644646
    645647        if (context && context->type == UNDECIDED) {
     648            XLOCK(dpy);
    646649            XSync(dpy, 0); /* sync to force window creation on the server */
     650            XUNLOCK(dpy);
    647651        }
    648652    }
     
    14521456    if (pGlxPixmap)
    14531457    {
     1458        XLOCK(dpy);
    14541459        if (pGlxPixmap->gc)
    14551460        {
     
    14611466            XFreePixmap(dpy, pGlxPixmap->hShmPixmap);
    14621467        }
     1468        XUNLOCK(dpy);
    14631469
    14641470        if (pGlxPixmap->hDamage>0)
     
    16371643    /*@todo doesn't really list all the common visuals, have to use some static list*/
    16381644    searchvis.screen = screen;
     1645    XLOCK(dpy);
    16391646    pVisuals = XGetVisualInfo(dpy, VisualScreenMask, &searchvis, nelements);
     1647    XUNLOCK(dpy);
    16401648
    16411649    if (*nelements)
     
    16641672
    16651673    *nelements = 1;
     1674    XLOCK(dpy);
    16661675    *pGLXFBConfigs = (GLXFBConfig) XVisualIDFromVisual(DefaultVisual(dpy, screen));
     1676    XUNLOCK(dpy);
    16671677
    16681678    crDebug("glXGetFBConfigs returned %i configs", *nelements);
     
    17121722
    17131723        temp.visualid = (VisualID)config;
     1724        XLOCK(dpy);
    17141725        pret = XGetVisualInfo(dpy, VisualIDMask, &temp, &nret);
     1726        XUNLOCK(dpy);
    17151727       
    17161728        if (nret!=1) crWarning("XGetVisualInfo returned %i visuals for %p", nret, config);
     
    17811793
    17821794    /* Check for extension and pixmaps format */
    1783 
     1795    XLOCK(dpy);
    17841796    if (!XShmQueryExtension(dpy))
    17851797    {
    17861798        crWarning("No XSHM extension");
     1799        XUNLOCK(dpy);
    17871800        return;
    17881801    }
     
    17911804    {
    17921805        crWarning("XSHM extension doesn't support pixmaps");
     1806        XUNLOCK(dpy);
    17931807        return;
    17941808    }
     
    17971811    {
    17981812        crWarning("XSHM extension doesn't support ZPixmap format");
     1813        XUNLOCK(dpy);
    17991814        return;
    18001815    }
     1816    XUNLOCK(dpy);
    18011817
    18021818    /* Alloc shared memory, so far using hardcoded value...could fail for bigger displays one day */
     
    18171833    }
    18181834
    1819 
     1835    XLOCK(dpy);
    18201836    if (!XShmAttach(dpy, &stub.xshmSI))
    18211837    {
     
    18231839        shmctl(stub.xshmSI.shmid, IPC_RMID, 0);
    18241840        shmdt(stub.xshmSI.shmaddr);
     1841        XUNLOCK(dpy);
    18251842        return;
    18261843    }
     1844    XUNLOCK(dpy);
    18271845
    18281846    stub.bShmInitFailed = GL_FALSE;
     
    19151933    CRASSERT(pContext && pCreateInfoPixmap);
    19161934
     1935    XLOCK(dpy);
    19171936    if (!XGetGeometry(dpy, (Pixmap)draw, &root, &x, &y, &w, &h, &border, &depth))
    19181937    {
     
    19211940        {
    19221941            crWarning("stubInitGlxPixmap failed in call to XGetGeometry for 0x%x", (int) draw);
     1942            XUNLOCK(dpy);
    19231943            return NULL;
    19241944        }
     
    19291949    {
    19301950        crWarning("stubInitGlxPixmap failed to allocate memory");
     1951        XUNLOCK(dpy);
    19311952        return NULL;
    19321953    }
     
    19651986        pGlxPixmap->hShmPixmap = 0;
    19661987    }
     1988    XUNLOCK(dpy);
    19671989
    19681990    stubInitXDamageExtension(pContext);
     
    20362058    else
    20372059    {
     2060        XLOCK(dpy);
    20382061        XCopyArea(dpy, (Pixmap)draw, pGlxPixmap->hShmPixmap, pGlxPixmap->gc,
    20392062                  pGlxPixmap->x, pGlxPixmap->y, pGlxPixmap->w, pGlxPixmap->h, 0, 0);
    20402063        /* Have to make sure XCopyArea is processed */
    20412064        XSync(dpy, False);
     2065        XUNLOCK(dpy);
    20422066        stub.spu->dispatch_table.TexImage2D(pGlxPixmap->target, 0, pGlxPixmap->format, pGlxPixmap->w, pGlxPixmap->h, 0,
    20432067                                            GL_BGRA, GL_UNSIGNED_BYTE, stub.xshmSI.shmaddr);
     
    20782102        GLint origUnpackRowLength;
    20792103
     2104        XLOCK(dpy);
    20802105        XCopyArea(dpy, (Pixmap)draw, pGlxPixmap->hShmPixmap, pGlxPixmap->gc,
    20812106                  pRect->x, pRect->y, pRect->width, pRect->height, 0, 0);
    20822107        /* Have to make sure XCopyArea is processed */
    20832108        XSync(dpy, False);
     2109        XUNLOCK(dpy);
    20842110
    20852111        /* Save original value, doesn't cause sync as it's reported by state tracker*/
     
    21592185        /* Sync connections, note that order of syncs is important here.
    21602186         * First make sure client commands are finished, then make sure we get all the damage events back*/
     2187        XLOCK(dpy);
    21612188        XSync(dpy, False);
     2189        XUNLOCK(dpy);
    21622190        XSync(stub.currentContext->damageDpy, False);
    21632191
     
    21792207        XImage *pxim;
    21802208
     2209        XLOCK(dpy);
    21812210        pxim = XGetImage(dpy, (Pixmap)draw, pGlxPixmap->x, pGlxPixmap->y, pGlxPixmap->w, pGlxPixmap->h, AllPlanes, ZPixmap);
     2211        XUNLOCK(dpy);
    21822212        /*if (pxim)
    21832213        {
  • trunk/src/VBox/Additions/common/crOpenGL/load.c

    r26909 r30440  
    1919#include <string.h>
    2020#include <signal.h>
     21#include <iprt/initterm.h>
     22#include <iprt/thread.h>
     23#include <iprt/err.h>
     24#include <iprt/asm.h>
    2125#ifndef WINDOWS
    22 #include <sys/types.h>
    23 #include <unistd.h>
     26# include <sys/types.h>
     27# include <unistd.h>
    2428#endif
    2529#ifdef CHROMIUM_THREADSAFE
     
    8084static ScissorFunc_t origScissor;
    8185
    82 static void stubCheckWindowState(WindowInfo *window)
     86static void stubCheckWindowState(WindowInfo *window, GLboolean bFlushOnChange)
    8387{
    8488    bool bForceUpdate = false;
     89    bool bChanged = false;
    8590
    8691#ifdef WINDOWS
     
    102107#endif
    103108
    104     stubUpdateWindowGeometry(window, bForceUpdate);
     109    bChanged = stubUpdateWindowGeometry(window, bForceUpdate) || bForceUpdate;
    105110
    106111#if defined(GLX) || defined (WINDOWS)
    107112    if (stub.trackWindowVisibleRgn)
    108113    {
    109         stubUpdateWindowVisibileRegions(window);
     114        bChanged = stubUpdateWindowVisibileRegions(window) || bChanged;
    110115    }
    111116#endif
     
    117122            stub.spu->dispatch_table.WindowShow(window->spuWindow, mapped);
    118123            window->mapped = mapped;
    119         }
     124            bChanged = true;
     125        }
     126    }
     127
     128    if (bFlushOnChange && bChanged)
     129    {
     130        stub.spu->dispatch_table.Flush();
    120131    }
    121132}
     
    133144    unsigned int border, depth, w, h;
    134145
     146    XLOCK(pWindow->dpy);
    135147    if (!XGetGeometry(pWindow->dpy, pWindow->drawable, &root, &x, &y, &w, &h, &border, &depth))
    136148    {
     149        XUNLOCK(pWindow->dpy);
    137150        return false;
    138151    }
     152    XUNLOCK(pWindow->dpy);
    139153#endif
    140154
     
    164178    }
    165179
    166     stubCheckWindowState(pWindow);
     180    stubCheckWindowState(pWindow, GL_FALSE);
    167181}
    168182
     
    174188        return;
    175189
    176     stubCheckWindowState(stub.currentContext->currentDrawable);
    177 
     190#if defined(CR_NEWWINTRACK) && !defined(WINDOWS)
     191    crLockMutex(&stub.mutex);
     192#endif
     193
     194    stubCheckWindowState(stub.currentContext->currentDrawable, GL_TRUE);
    178195    crHashtableWalk(stub.windowTable, stubCheckWindowsCB, stub.currentContext);
     196
     197#if defined(CR_NEWWINTRACK) && !defined(WINDOWS)
     198    crUnlockMutex(&stub.mutex);
     199#endif
    179200}
    180201
     
    253274        origDrawBuffer = stub.spuDispatch.DrawBuffer;
    254275        origScissor = stub.spuDispatch.Scissor;
     276#ifndef CR_NEWWINTRACK
    255277        stub.spuDispatch.Clear = trapClear;
    256278        stub.spuDispatch.Viewport = trapViewport;
     279#endif
    257280        if (stub.viewportHack)
    258281            stub.spuDispatch.Scissor = trapScissor;
     
    282305
    283306#ifdef WINDOWS
     307# ifndef CR_NEWWINTRACK
    284308    stubUninstallWindowMessageHook();
     309# endif
     310#endif
     311
     312#ifdef CR_NEWWINTRACK
     313    ASMAtomicWriteBool(&stub.bShutdownSyncThread, true);
    285314#endif
    286315 
     
    330359#endif
    331360    crDebug("stubSPUSafeTearDown");
     361
     362#ifdef WINDOWS
     363# ifndef CR_NEWWINTRACK
     364    stubUninstallWindowMessageHook();
     365# endif
     366#endif
     367
     368#if defined(WINDOWS) && defined(CR_NEWWINTRACK)
     369    crUnlockMutex(mutex);
     370    if (RTThreadGetState(stub.hSyncThread)!=RTTHREADSTATE_TERMINATED)
     371    {
     372        ASMAtomicWriteBool(&stub.bShutdownSyncThread, true);
     373        if (PostThreadMessage(RTThreadGetNative(stub.hSyncThread), WM_QUIT, 0, 0))
     374        {
     375            RTThreadWait(stub.hSyncThread, 1000, NULL);
     376        }
     377        else
     378        {
     379            crDebug("Sync thread killed before DLL_PROCESS_DETACH");
     380        }
     381    }
     382    crLockMutex(mutex);
     383#endif
     384
    332385    crNetTearDown();
    333 #ifdef WINDOWS
    334     stubUninstallWindowMessageHook();
    335 #endif
    336386    crMemset(&stub, 0, sizeof(stub));
    337387#ifdef CHROMIUM_THREADSAFE
     
    393443
    394444    stub.windowTable = crAllocHashtable();
     445
     446#ifdef CR_NEWWINTRACK
     447    stub.bShutdownSyncThread = false;
     448    stub.hSyncThread = NIL_RTTHREAD;
     449#endif
    395450
    396451    defaultWin = (WindowInfo *) crCalloc(sizeof(WindowInfo));
     
    595650}
    596651
     652#ifdef CR_NEWWINTRACK
     653static void stubSyncTrCheckWindowsCB(unsigned long key, void *data1, void *data2)
     654{
     655    WindowInfo *pWindow = (WindowInfo *) data1;
     656    ContextInfo *pCtx = (ContextInfo *) data2;
     657
     658    if (pWindow->type!=CHROMIUM || pWindow->spuWindow==0)
     659    {
     660        return;
     661    }
     662
     663    stub.spu->dispatch_table.VBoxPackSetInjectID(pWindow->u32ClientID);
     664
     665    if (!stubSystemWindowExist(pWindow))
     666    {
     667#ifdef WINDOWS
     668        crWindowDestroy((GLint)pWindow->hWnd);
     669#else
     670        crWindowDestroy((GLint)pWindow->drawable);
     671#endif
     672        /*No need to flush here as crWindowDestroy does it*/
     673        return;
     674    }
     675
     676    stubCheckWindowState(pWindow, GL_TRUE);
     677}
     678
     679static DECLCALLBACK(int) stubSyncThreadProc(RTTHREAD ThreadSelf, void *pvUser)
     680{
     681#ifdef WINDOWS
     682    MSG msg;
     683#endif
     684
     685    (void) pvUser;
     686
     687    crDebug("Sync thread started");
     688#ifdef WINDOWS
     689    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
     690#endif
     691
     692    crLockMutex(&stub.mutex);
     693    stub.spu->dispatch_table.VBoxPackSetInjectThread();
     694    crUnlockMutex(&stub.mutex);
     695
     696    RTThreadUserSignal(ThreadSelf);
     697
     698    while(!stub.bShutdownSyncThread)
     699    {
     700#ifdef WINDOWS
     701        if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
     702        {
     703            crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL);
     704            RTThreadSleep(50);
     705        }
     706        else
     707        {
     708            if (WM_QUIT==msg.message)
     709            {
     710                crDebug("Sync thread got WM_QUIT");
     711                break;
     712            }
     713            else
     714            {
     715                TranslateMessage(&msg);
     716                DispatchMessage(&msg);
     717            }
     718        }
     719#else
     720        crLockMutex(&stub.mutex);
     721        crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL);
     722        crUnlockMutex(&stub.mutex);
     723        RTThreadSleep(50);
     724#endif
     725    }
     726
     727    crDebug("Sync thread stopped");
     728    return 0;
     729}
     730#endif
     731
    597732/**
    598733 * Do one-time initializations for the faker.
     
    623758    stubInitVars();
    624759
     760    crGetProcName(response, 1024);
     761    crDebug("Stub launched for %s", response);
     762
    625763    /* @todo check if it'd be of any use on other than guests, no use for windows */
    626764    app_id = crGetenv( "CR_APPLICATION_ID_NUMBER" );
     
    644782            crNetFreeConnection(ns.conn);
    645783        }
     784#ifdef CR_NEWWINTRACK
     785        {
     786            Status st = XInitThreads();
     787            if (st==0)
     788            {
     789                crWarning("XInitThreads returned %i", (int)st);
     790            }
     791        }
     792#endif
    646793    }
    647794#endif
     
    692839
    693840#ifdef WINDOWS
     841# ifndef CR_NEWWINTRACK
    694842    stubInstallWindowMessageHook();
     843# endif
     844#endif
     845
     846#ifdef CR_NEWWINTRACK
     847    {
     848        int rc;
     849
     850        RTR3Init();
     851
     852        crDebug("Starting sync thread");
     853
     854        rc = RTThreadCreate(&stub.hSyncThread, stubSyncThreadProc, NULL, 0, RTTHREADTYPE_DEFAULT, RTTHREADFLAGS_WAITABLE, "Sync");
     855        if (RT_FAILURE(rc))
     856        {
     857            crError("Failed to start sync thread! (%x)", rc);
     858        }
     859        RTThreadUserWait(stub.hSyncThread, 60 * 1000);
     860        RTThreadUserReset(stub.hSyncThread);
     861
     862        crDebug("Going on");
     863    }
    695864#endif
    696865
     
    704873    return true;
    705874}
    706 
    707 
    708875
    709876/* Sigh -- we can't do initialization at load time, since Windows forbids
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu.h

    r20879 r30440  
    3535    CRPackContext *packer;
    3636    int writeback;
     37    GLboolean bInjectThread;
    3738};
    3839
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c

    r21308 r30440  
    3636    thread->id = id;
    3737    thread->currentContext = NULL;
     38    thread->bInjectThread = GL_FALSE;
    3839
    3940    /* connect to the server */
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_misc.c

    r27091 r30440  
    108108    int writeback = 1;
    109109
    110     crPackFlush();
    111 
    112     if (packspuSyncOnFlushes())
    113     {
    114         crPackWriteback(&writeback);
     110    if (!thread->bInjectThread)
     111    {
     112        crPackFlush();
     113        if (packspuSyncOnFlushes())
     114        {
     115            crPackWriteback(&writeback);
     116            packspuFlush( (void *) thread );
     117            while (writeback)
     118                crNetRecv();
     119        }
     120    }
     121    else
     122    {
    115123        packspuFlush( (void *) thread );
    116         while (writeback)
    117             crNetRecv();
    118124    }
    119125}
     
    336342    }
    337343}
     344
     345#ifdef CHROMIUM_THREADSAFE
     346void PACKSPU_APIENTRY packspu_VBoxPackSetInjectThread(void)
     347{
     348    crLockMutex(&_PackMutex);
     349    {
     350        GET_THREAD(thread);
     351        CRASSERT(!thread);
     352        CRASSERT((pack_spu.numThreads>0) && (pack_spu.numThreads<MAX_THREADS));
     353
     354        thread = &(pack_spu.thread[pack_spu.numThreads]);
     355        thread->id = crThreadID();
     356        thread->currentContext = NULL;
     357        thread->bInjectThread = GL_TRUE;
     358
     359        thread->netServer.name = crStrdup(pack_spu.name);
     360        thread->netServer.buffer_size = 64 * 1024;
     361
     362        crNetNewClient(pack_spu.thread[0].netServer.conn, &(thread->netServer));
     363        CRASSERT(thread->netServer.conn);
     364
     365        CRASSERT(thread->packer == NULL);
     366        thread->packer = crPackNewContext( pack_spu.swap );
     367        CRASSERT(thread->packer);
     368        crPackInitBuffer(&(thread->buffer), crNetAlloc(thread->netServer.conn),
     369                         thread->netServer.conn->buffer_size, thread->netServer.conn->mtu);
     370        thread->buffer.canBarf = thread->netServer.conn->Barf ? GL_TRUE : GL_FALSE;
     371
     372        crPackSetBuffer( thread->packer, &thread->buffer );
     373        crPackFlushFunc( thread->packer, packspuFlush );
     374        crPackFlushArg( thread->packer, (void *) thread );
     375        crPackSendHugeFunc( thread->packer, packspuHuge );
     376        crPackSetContext( thread->packer );
     377
     378        crSetTSD(&_PackTSD, thread);
     379
     380        pack_spu.numThreads++;
     381    }
     382    crUnlockMutex(&_PackMutex);
     383}
     384
     385GLuint PACKSPU_APIENTRY packspu_VBoxPackGetInjectID(void)
     386{
     387    GLuint ret;
     388
     389    crLockMutex(&_PackMutex);
     390    {
     391        GET_THREAD(thread);
     392        CRASSERT(thread && thread->netServer.conn && thread->netServer.conn->type==CR_VBOXHGCM);
     393        ret = thread->netServer.conn->u32ClientID;
     394    }
     395    crUnlockMutex(&_PackMutex);
     396
     397    return ret;
     398}
     399
     400void PACKSPU_APIENTRY packspu_VBoxPackSetInjectID(GLuint id)
     401{
     402    crLockMutex(&_PackMutex);
     403    {
     404        GET_THREAD(thread);
     405        CRASSERT(thread && thread->netServer.conn && thread->netServer.conn->type==CR_VBOXHGCM);
     406        thread->netServer.conn->u32InjectClientID = id;
     407    }
     408    crUnlockMutex(&_PackMutex);
     409}
     410#else  /*ifdef CHROMIUM_THREADSAFE*/
     411void PACKSPU_APIENTRY packspu_VBoxPackSetInjectThread(void)
     412{
     413}
     414
     415GLuint PACKSPU_APIENTRY packspu_VBoxPackGetInjectID(void)
     416{
     417    return 0;
     418}
     419
     420void PACKSPU_APIENTRY packspu_VBoxPackSetInjectID(GLuint id)
     421{
     422    (void) id;
     423}
     424#endif /*CHROMIUM_THREADSAFE*/
  • trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_special

    r28552 r30440  
    102102GetCompressedTexImageARB
    103103BindRenderbufferEXT
     104VBoxPackSetInjectThread
     105VBoxPackGetInjectID
     106VBoxPackSetInjectID
  • trunk/src/VBox/Additions/common/crOpenGL/stub.c

    r29017 r30440  
    1717static void crForcedFlush()
    1818{
     19#if 0
    1920    GLint buffer;
    2021    stub.spu->dispatch_table.GetIntegerv(GL_DRAW_BUFFER, &buffer);
     
    2223    stub.spu->dispatch_table.Flush();
    2324    stub.spu->dispatch_table.DrawBuffer(buffer);
     25#else
     26    stub.spu->dispatch_table.Flush();
     27#endif
    2428}
    2529
     
    291295}
    292296
     297# ifndef CR_NEWWINTRACK
    293298static void stubCBCheckWindowsInfo(unsigned long key, void *data1, void *data2)
    294299{
     
    393398        UnhookWindowsHookEx(stub.hMessageHook);
    394399}
     400# endif /*# ifndef CR_NEWWINTRACK*/
     401
    395402#elif defined(GLX) //#ifdef WINDOWS
    396403static GLboolean stubCheckXExtensions(WindowInfo *pWindow)
     
    398405    int evb, erb, vmi=0, vma=0;
    399406
     407    XLOCK(pWindow->dpy);
    400408    if (XCompositeQueryExtension(pWindow->dpy, &evb, &erb)
    401409        && XCompositeQueryVersion(pWindow->dpy, &vma, &vmi)
     
    410418        {
    411419            crDebug("XFixes %i.%i", vma, vmi);
     420            XUNLOCK(pWindow->dpy);
    412421            return GL_TRUE;
    413422        }
     
    421430        crWarning("XComposite not found or old version (%i.%i), no VisibilityTracking", vma, vmi);
    422431    }
     432    XUNLOCK(pWindow->dpy);
    423433    return GL_FALSE;
    424434}
     
    450460    * it seems there's no way to get even based updates for this. Or I've failed to find the appropriate extension.
    451461    */
     462    XLOCK(pWindow->dpy);
    452463    xreg = XCompositeCreateRegionFromBorderClip(pWindow->dpy, pWindow->drawable);
    453464    pXRects = XFixesFetchRegion(pWindow->dpy, xreg, &cRects);
    454465    XFixesDestroyRegion(pWindow->dpy, xreg);
     466    XUNLOCK(pWindow->dpy);
    455467
    456468    /* @todo For some odd reason *first* run of compiz on freshly booted VM gives us 0 cRects all the time.
  • trunk/src/VBox/Additions/common/crOpenGL/stub.h

    r26909 r30440  
    4646#endif
    4747
     48#ifdef WINDOWS
     49#define CR_NEWWINTRACK
     50#endif
     51
     52#if !defined(CHROMIUM_THREADSAFE) && defined(CR_NEWWINTRACK)
     53# error CHROMIUM_THREADSAFE have to be defined
     54#endif
     55
     56#if defined(CR_NEWWINTRACK) && !defined(WINDOWS)
     57#define XLOCK(dpy) XLockDisplay(dpy)
     58#define XUNLOCK(dpy) XUnlockDisplay(dpy)
     59#else
     60#define XLOCK(dpy)
     61#define XUNLOCK(dpy)
     62#endif
    4863
    4964/* When we first create a rendering context we can't be sure whether
     
    140155    GLboolean mapped;
    141156#ifdef WINDOWS
    142     HDC drawable;
    143     HRGN hVisibleRegion;
    144     DWORD dmPelsWidth;
    145     DWORD dmPelsHeight;
    146     HWND  hWnd;
     157    HDC      drawable;
     158    HRGN     hVisibleRegion;
     159    DWORD    dmPelsWidth;
     160    DWORD    dmPelsHeight;
     161    HWND     hWnd;
    147162#elif defined(DARWIN)
    148163    CGSConnectionID connection;
     
    154169    XRectangle *pVisibleRegions;
    155170    GLint cVisibleRegions;
     171#endif
     172#ifdef CR_NEWWINTRACK
     173    uint32_t u32ClientID;
    156174#endif
    157175};
     
    214232
    215233#ifdef WINDOWS
    216     HHOOK       hMessageHook;
    217 #endif
     234# ifndef CR_NEWWINTRACK
     235    HHOOK           hMessageHook;
     236# endif
     237#endif
     238
     239#ifdef CR_NEWWINTRACK
     240    RTTHREAD        hSyncThread;
     241    bool volatile   bShutdownSyncThread;
     242#endif
     243
    218244} Stub;
    219245
  • trunk/src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt

    r27244 r30440  
    85008500chromium    extpack
    85018501
     8502name        VBoxPackSetInjectThread
     8503return      void
     8504category    VBox
     8505chromium    nopack
     8506
     8507name        VBoxPackGetInjectID
     8508return      GLuint
     8509category    VBox
     8510chromium    nopack
     8511
     8512name        VBoxPackSetInjectID
     8513return      void
     8514param       id          GLuint
     8515category    VBox
     8516chromium    nopack
    85028517
    85038518# OpenGL 1.5
  • trunk/src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.py

    r27267 r30440  
    353353                cat == "1.2" or
    354354                cat == "Chromium" or
    355                 cat == "GL_chromium"):
     355                cat == "GL_chromium" or
     356                cat == "VBox"):
    356357                return ''
    357358        elif (cat == '1.3' or
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_net.h

    r21523 r30440  
    220220    uint32_t cbHostBufferAllocated;
    221221    uint32_t cbHostBuffer;
     222#ifdef IN_GUEST
     223    uint32_t u32InjectClientID;
     224#endif
    222225    /* Used on host side to indicate that we are not allowed to store above pointers for later use
    223226     * in crVBoxHGCMReceiveMessage. As those messages are going to be processed after the correspoding
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c

    r29930 r30440  
    232232         * Ensures context bits are reset */
    233233        crStateFreeContext(defaultContext);
     234#ifdef CHROMIUM_THREADSAFE
     235        crSetTSD(&__contextTSD, NULL);
     236#else
     237        __currentContext = NULL;
     238#endif
    234239    }
    235240
  • trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c

    r28800 r30440  
    331331static void crVBoxHGCMWriteExact(CRConnection *conn, const void *buf, unsigned int len)
    332332{
    333     CRVBOXHGCMWRITE parms;
    334333    int rc;
    335 
    336     parms.hdr.result      = VERR_WRONG_ORDER;
    337     parms.hdr.u32ClientID = conn->u32ClientID;
    338     parms.hdr.u32Function = SHCRGL_GUEST_FN_WRITE;
    339     parms.hdr.cParms      = SHCRGL_CPARMS_WRITE;
    340 
    341     parms.pBuffer.type                   = VMMDevHGCMParmType_LinAddr_In;
    342     parms.pBuffer.u.Pointer.size         = len;
    343     parms.pBuffer.u.Pointer.u.linearAddr = (uintptr_t) buf;
    344 
    345     rc = crVBoxHGCMCall(&parms, sizeof(parms));
    346 
    347     if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.result))
    348     {
    349         crWarning("SHCRGL_GUEST_FN_WRITE failed with %x %x\n", rc, parms.hdr.result);
     334    int32_t callRes;
     335
     336#ifdef IN_GUEST
     337    if (conn->u32InjectClientID)
     338    {
     339        CRVBOXHGCMINJECT parms;
     340
     341        parms.hdr.result      = VERR_WRONG_ORDER;
     342        parms.hdr.u32ClientID = conn->u32ClientID;
     343        parms.hdr.u32Function = SHCRGL_GUEST_FN_INJECT;
     344        parms.hdr.cParms      = SHCRGL_CPARMS_INJECT;
     345
     346        parms.u32ClientID.type       = VMMDevHGCMParmType_32bit;
     347        parms.u32ClientID.u.value32  = conn->u32InjectClientID;
     348
     349        parms.pBuffer.type                   = VMMDevHGCMParmType_LinAddr_In;
     350        parms.pBuffer.u.Pointer.size         = len;
     351        parms.pBuffer.u.Pointer.u.linearAddr = (uintptr_t) buf;
     352
     353        rc = crVBoxHGCMCall(&parms, sizeof(parms));
     354        callRes = parms.hdr.result;
     355    }
     356    else
     357#endif
     358    {
     359        CRVBOXHGCMWRITE parms;
     360
     361        parms.hdr.result      = VERR_WRONG_ORDER;
     362        parms.hdr.u32ClientID = conn->u32ClientID;
     363        parms.hdr.u32Function = SHCRGL_GUEST_FN_WRITE;
     364        parms.hdr.cParms      = SHCRGL_CPARMS_WRITE;
     365
     366        parms.pBuffer.type                   = VMMDevHGCMParmType_LinAddr_In;
     367        parms.pBuffer.u.Pointer.size         = len;
     368        parms.pBuffer.u.Pointer.u.linearAddr = (uintptr_t) buf;
     369
     370        rc = crVBoxHGCMCall(&parms, sizeof(parms));
     371        callRes = parms.hdr.result;
     372    }
     373
     374    if (RT_FAILURE(rc) || RT_FAILURE(callRes))
     375    {
     376        crWarning("SHCRGL_GUEST_FN_WRITE failed with %x %x\n", rc, callRes);
    350377    }
    351378}
     
    476503            _crVBoxHGCMWriteBytes(conn, start, len);
    477504#else
     505            CRASSERT(!conn->u32InjectClientID);
    478506            crDebug("SHCRGL: sending userbuf with %d bytes\n", len);
    479507            crVBoxHGCMWriteReadExact(conn, start, len, CR_VBOXHGCM_USERALLOCATED);
     
    493521     * No need to prepend it to the buffer
    494522     */
     523#ifdef IN_GUEST
     524    if (conn->u32InjectClientID)
     525    {
     526        crVBoxHGCMWriteExact(conn, start, len);
     527    }
     528    else
     529#endif
    495530    crVBoxHGCMWriteReadExact(conn, start, len, hgcm_buffer->kind);
    496531
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r29019 r30440  
    277277        }
    278278
     279        case SHCRGL_GUEST_FN_INJECT:
     280        {
     281            Log(("svcCall: SHCRGL_GUEST_FN_INJECT\n"));
     282
     283            /* Verify parameter count and types. */
     284            if (cParms != SHCRGL_CPARMS_INJECT)
     285            {
     286                rc = VERR_INVALID_PARAMETER;
     287            }
     288            else
     289            if (    paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* u32ClientID */
     290                 || paParms[1].type != VBOX_HGCM_SVC_PARM_PTR   /* pBuffer */
     291               )
     292            {
     293                rc = VERR_INVALID_PARAMETER;
     294            }
     295            else
     296            {
     297                /* Fetch parameters. */
     298                uint32_t u32InjectClientID = paParms[0].u.uint32;
     299                uint8_t *pBuffer  = (uint8_t *)paParms[1].u.pointer.addr;
     300                uint32_t cbBuffer = paParms[1].u.pointer.size;
     301
     302                /* Execute the function. */
     303                rc = crVBoxServerClientWrite(u32InjectClientID, pBuffer, cbBuffer);
     304                if (!RT_SUCCESS(rc))
     305                {
     306                    Assert(VERR_NOT_SUPPORTED==rc);
     307                    svcClientVersionUnsupported(0, 0);
     308                }
     309
     310            }
     311            break;
     312        }
     313
    279314        case SHCRGL_GUEST_FN_READ:
    280315        {
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r29930 r30440  
    381381    int32_t i;
    382382
    383     //crDebug("crServer: [%x] ClientWrite u32ClientID=%d", crThreadID(), u32ClientID);
     383    /*crDebug("=>crServer: ClientWrite u32ClientID=%d", u32ClientID);*/
    384384
    385385    for (i = 0; i < cr_server.numClients; i++)
     
    451451
    452452    CRASSERT(!pClient->conn->allow_redir_ptr || crNetNumMessages(pClient->conn)==0);
     453
     454    /*crDebug("<=crServer: ClientWrite u32ClientID=%d", u32ClientID);*/
    453455
    454456    return VINF_SUCCESS;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette