VirtualBox

Changeset 30513 in vbox


Ignore:
Timestamp:
Jun 29, 2010 5:14:15 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
63218
Message:

crOpenGL: window tracking with wddm callbacks

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Config.kmk

    r30428 r30513  
    40884088TEMPLATE_VBOXCROGLR3GUESTDLL_EXTENDS_BY       = prepending
    40894089TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS             = CHROMIUM_THREADSAFE VBOX_WITH_HGCM
    4090 TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS.win         = _WIN32_WINNT=0x0500 WINDOWS=1
     4090TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS.win         = WINDOWS=1
    40914091TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS.linux       = Linux=1 _GNU_SOURCE
    40924092TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS.solaris     = SunOS=1 _GNU_SOURCE #GLEXT_64_TYPES_DEFINED
  • trunk/src/VBox/Additions/common/crOpenGL/Makefile.kmk

    r30440 r30513  
    8484  VBoxOGL_DEFS         += VBOX_OGL_GLX_USE_CSTUBS
    8585 endif
     86endif
     87
     88ifdef VBOXWDDM
     89 VBoxOGL_DEFS.win += VBOX_WITH_WDDM
     90 VBoxOGL_SDKS     += WINDDKWLH
    8691endif
    8792
  • trunk/src/VBox/Additions/common/crOpenGL/load.c

    r30487 r30513  
    3131#endif
    3232
     33#ifdef VBOX_WITH_WDDM
     34#include <d3d9types.h>
     35#include <D3dumddi.h>
     36#include "../../WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h"
     37#include "../../WINNT/Graphics/Display/wddm/vboxdispmp.h"
     38#endif
     39
    3340/**
    3441 * If you change this, see the comments in tilesortspu_context.c
     
    653660
    654661#ifdef CR_NEWWINTRACK
     662# ifdef VBOX_WITH_WDDM
     663static stubDispatchVisibleRegions(WindowInfo *pWindow)
     664{
     665    DWORD dwCount;
     666    LPRGNDATA lpRgnData;
     667
     668    dwCount = GetRegionData(pWindow->hVisibleRegion, 0, NULL);
     669    lpRgnData = crAlloc(dwCount);
     670
     671    if (lpRgnData)
     672    {
     673        GetRegionData(pWindow->hVisibleRegion, dwCount, lpRgnData);
     674        crDebug("Dispatched WindowVisibleRegion (%i, cRects=%i)", pWindow->spuWindow, lpRgnData->rdh.nCount);
     675        stub.spuDispatch.WindowVisibleRegion(pWindow->spuWindow, lpRgnData->rdh.nCount, (GLint*) lpRgnData->Buffer);
     676        crFree(lpRgnData);
     677    }
     678    else crWarning("GetRegionData failed, VisibleRegions update failed");
     679}
     680
     681static HRGN stubMakeRegionFromRects(PVBOXVIDEOCM_CMD_RECTS pRegions, uint32_t start)
     682{
     683    HRGN hRgn, hTmpRgn;
     684    uint32_t i;
     685
     686    if (pRegions->RectsInfo.cRects<=start)
     687    {
     688        return INVALID_HANDLE_VALUE;
     689    }
     690
     691    hRgn = CreateRectRgn(0, 0, 0, 0);
     692    for (i=start; i<pRegions->RectsInfo.cRects; ++i)
     693    {
     694        hTmpRgn = CreateRectRgnIndirect(&pRegions->RectsInfo.aRects[i]);
     695        CombineRgn(hRgn, hRgn, hTmpRgn, RGN_OR);
     696        DeleteObject(hTmpRgn);
     697    }
     698    return hRgn;
     699}
     700
     701static void stubSyncTrUpdateWindowCB(unsigned long key, void *data1, void *data2)
     702{
     703    WindowInfo *pWindow = (WindowInfo *) data1;
     704    VBOXDISPMP_REGIONS *pRegions = (VBOXDISPMP_REGIONS*) data2;
     705    bool bChanged = false;
     706    HRGN hNewRgn = INVALID_HANDLE_VALUE;
     707
     708    if (pRegions->hWnd != pWindow->hWnd)
     709    {
     710        return;
     711    }
     712
     713    if (!pWindow->mapped)
     714    {
     715        pWindow->mapped = GL_TRUE;
     716        bChanged = true;
     717        crDebug("Dispatched: WindowShow(%i, %i)", pWindow->spuWindow, pWindow->mapped);
     718        stub.spu->dispatch_table.WindowShow(pWindow->spuWindow, pWindow->mapped);
     719    }
     720
     721    if (pRegions->pRegions->fFlags.bAddVisibleRects && pRegions->pRegions->fFlags.bPositionRect)
     722    {
     723        int winX, winY;
     724        unsigned int winW, winH;
     725
     726        winX = pRegions->pRegions->RectsInfo.aRects[0].left;
     727        winY = pRegions->pRegions->RectsInfo.aRects[0].top;
     728        winW = pRegions->pRegions->RectsInfo.aRects[0].right - winX;
     729        winH = pRegions->pRegions->RectsInfo.aRects[0].bottom - winY;
     730
     731        if (stub.trackWindowPos && (winX!=pWindow->x || winY!=pWindow->y))
     732        {
     733            crDebug("Dispatched WindowPosition (%i)", pWindow->spuWindow);
     734            stub.spuDispatch.WindowPosition(pWindow->spuWindow, winX, winY);
     735            pWindow->x = winX;
     736            pWindow->y = winY;
     737            bChanged = true;
     738        }
     739
     740        if (stub.trackWindowSize && (winW!=pWindow->width || winH!=pWindow->height))
     741        {
     742            crDebug("Dispatched WindowSize (%i)", pWindow->spuWindow);
     743            stub.spuDispatch.WindowSize(pWindow->spuWindow, winW, winH);
     744            pWindow->width = winW;
     745            pWindow->height = winH;
     746            bChanged = true;
     747        }
     748
     749        hNewRgn = stubMakeRegionFromRects(pRegions->pRegions, 1);
     750    }
     751    else
     752    {
     753        hNewRgn = stubMakeRegionFromRects(pRegions->pRegions, 0);
     754    }
     755
     756    if (hNewRgn!=INVALID_HANDLE_VALUE)
     757    {
     758        POINT pt;
     759        pt.x = 0;
     760        pt.y = 0;
     761        ScreenToClient(pWindow->hWnd, &pt);
     762        OffsetRgn(hNewRgn, pt.x, pt.y);
     763
     764        if (pWindow->hVisibleRegion!=INVALID_HANDLE_VALUE)
     765        {
     766            CombineRgn(hNewRgn, pWindow->hVisibleRegion, hNewRgn,
     767                       pRegions->pRegions->fFlags.bAddHiddenRects ? RGN_DIFF:RGN_OR);
     768
     769            if (!EqualRgn(pWindow->hVisibleRegion, hNewRgn))
     770            {
     771                DeleteObject(pWindow->hVisibleRegion);
     772                pWindow->hVisibleRegion = hNewRgn;
     773                stubDispatchVisibleRegions(pWindow);
     774                bChanged = true;
     775            }
     776            else
     777            {
     778                DeleteObject(hNewRgn);
     779            }
     780        }
     781        else
     782        {
     783            if (pRegions->pRegions->fFlags.bAddVisibleRects)
     784            {
     785                pWindow->hVisibleRegion = hNewRgn;
     786                stubDispatchVisibleRegions(pWindow);
     787                bChanged = true;
     788            }
     789        }
     790    }
     791
     792    if (bChanged)
     793    {
     794        stub.spu->dispatch_table.Flush();
     795    }
     796}
     797# endif
     798
    655799static void stubSyncTrCheckWindowsCB(unsigned long key, void *data1, void *data2)
    656800{
    657801    WindowInfo *pWindow = (WindowInfo *) data1;
    658     ContextInfo *pCtx = (ContextInfo *) data2;
     802    (void) data2;
    659803
    660804    if (pWindow->type!=CHROMIUM || pWindow->spuWindow==0)
     
    683827#ifdef WINDOWS
    684828    MSG msg;
     829# ifdef VBOX_WITH_WDDM
     830    static VBOXDISPMP_CALLBACKS VBoxDispMpTstCallbacks = {NULL, NULL, NULL};
     831    HMODULE hVBoxD3D = NULL;
     832    VBOXDISPMP_REGIONS Regions;
     833    HRESULT hr;
     834# endif
    685835#endif
    686836
     
    690840#ifdef WINDOWS
    691841    PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE);
     842# ifdef VBOX_WITH_WDDM
     843    if (GetModuleHandleEx(0, "VBoxDispD3D", &hVBoxD3D))
     844    {
     845        PFNVBOXDISPMP_GETCALLBACKS pfnVBoxDispMpGetCallbacks;
     846        pfnVBoxDispMpGetCallbacks = (PFNVBOXDISPMP_GETCALLBACKS)GetProcAddress(hVBoxD3D, TEXT("VBoxDispMpGetCallbacks"));
     847        if (pfnVBoxDispMpGetCallbacks)
     848        {
     849            hr = pfnVBoxDispMpGetCallbacks(VBOXDISPMP_VERSION, &VBoxDispMpTstCallbacks);
     850            if (S_OK==hr)
     851            {
     852                CRASSERT(VBoxDispMpTstCallbacks.pfnEnableEvents);
     853                CRASSERT(VBoxDispMpTstCallbacks.pfnDisableEvents);
     854                CRASSERT(VBoxDispMpTstCallbacks.pfnGetRegions);
     855
     856                hr = VBoxDispMpTstCallbacks.pfnEnableEvents();
     857                if (hr != S_OK)
     858                {
     859                    crWarning("VBoxDispMpTstCallbacks.pfnEnableEvents failed");
     860                }
     861                else
     862                {
     863                    crDebug("running with VBoxDispD3D");
     864                }
     865            }
     866            else
     867            {
     868                crWarning("VBoxDispMpGetCallbacks failed");
     869            }
     870        }
     871    }
     872# endif
    692873#endif
    693874
     
    703884        if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    704885        {
    705             crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL);
    706             RTThreadSleep(50);
     886# ifdef VBOX_WITH_WDDM
     887            if (VBoxDispMpTstCallbacks.pfnGetRegions)
     888            {
     889                hr = VBoxDispMpTstCallbacks.pfnGetRegions(&Regions, 50);
     890                if (S_OK==hr)
     891                {
     892                    /*hacky way to make sure window wouldn't be deleted in another thread as we hold hashtable lock here*/
     893                    crHashtableWalk(stub.windowTable, stubSyncTrUpdateWindowCB, &Regions);
     894                }
     895                else
     896                {
     897                    if (WAIT_TIMEOUT!=hr)
     898                    {
     899                        crWarning("VBoxDispMpTstCallbacks.pfnGetRegions failed with 0x%x", hr);
     900                    }
     901                }
     902            }
     903            else
     904# endif
     905            {
     906                crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL);
     907                RTThreadSleep(50);
     908            }
    707909        }
    708910        else
     
    727929    }
    728930
     931#ifdef VBOX_WITH_WDDM
     932    if (VBoxDispMpTstCallbacks.pfnDisableEvents)
     933    {
     934        VBoxDispMpTstCallbacks.pfnDisableEvents();
     935    }
     936    if (hVBoxD3D)
     937    {
     938        FreeLibrary(hVBoxD3D);
     939    }
     940#endif
    729941    crDebug("Sync thread stopped");
    730942    return 0;
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