VirtualBox

Changeset 16480 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 3, 2009 10:31:14 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
42370
Message:

crOpenGL: track visible regions on linux guests + some more exports

Location:
trunk/src/VBox
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/Makefile.kmk

    r16381 r16480  
    143143        $(VBOX_LIB_VBGL_R3) \
    144144        $(PATH_LIB)/additions/VBoxOGLspuload$(VBOX_SUFF_LIB) \
    145         $(VBOX_PATH_ADDITIONS)/VBoxOGLcrutil$(VBOX_SUFF_DLL)
     145        $(VBOX_PATH_ADDITIONS)/VBoxOGLcrutil$(VBOX_SUFF_DLL) \
     146        Xcomposite
    146147endif
    147148
  • trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/context.c

    r16456 r16480  
    138138#elif defined(GLX)
    139139    winInfo->drawable = (GLXDrawable) spuWin;
     140    winInfo->pVisibleRegions = NULL;
    140141#endif
    141142    winInfo->spuWindow = spuWin;
     
    203204    winInfo->dpyName[MAX_DPY_NAME-1] = 0;
    204205    winInfo->dpy = dpy;
     206    winInfo->pVisibleRegions = NULL;
    205207#elif defined(Darwin)
    206208    winInfo->connection = _CGSDefaultConnection(); // store our connection as default
  • trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/load.c

    r16456 r16480  
    7575static ViewportFunc_t origViewport;
    7676
    77 
    7877static void stubCheckWindowState(void)
    7978{
     
    112111    stubUpdateWindowGeometry(window, bForceUpdate);
    113112
    114 #ifdef WINDOWS
     113#if defined(GLX) || defined (WINDOWS)
    115114    if (stub.trackWindowVisibleRgn)
    116115    {
     
    288287#ifdef WINDOWS
    289288    defaultWin->hVisibleRegion = INVALID_HANDLE_VALUE;
     289#elif defined(GLX)
     290    defaultWin->pVisibleRegions = NULL;
    290291#endif
    291292    crHashtableAdd(stub.windowTable, 0, defaultWin);
  • trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/stub.c

    r15532 r16480  
    99#include "cr_mem.h"
    1010#include "stub.h"
     11
     12#ifdef GLX
     13#include <X11/extensions/Xcomposite.h>
     14#include <X11/extensions/Xfixes.h>
     15#endif
    1116
    1217/**
     
    8893        {
    8994            DeleteObject(winInfo->hVisibleRegion);
     95        }
     96#elif defined(GLX)
     97        if (winInfo->pVisibleRegions)
     98        {
     99            XFree(winInfo->pVisibleRegions);
    90100        }
    91101#endif
     
    380390        UnhookWindowsHookEx(stub.hMessageHook);
    381391}
    382 #endif
     392#elif defined(GLX) //#ifdef WINDOWS
     393static GLboolean stubCheckXExtensions(WindowInfo *pWindow)
     394{
     395    int evb, erb, vmi=0, vma=0;
     396
     397    if (XCompositeQueryExtension(pWindow->dpy, &evb, &erb)
     398        && XCompositeQueryVersion(pWindow->dpy, &vma, &vmi)
     399        && (vma>0 || vmi>=4))
     400    {
     401        crDebug("XComposite %i.%i", vma, vmi);
     402        vma=0;
     403        vmi=0;
     404        if (XFixesQueryExtension(pWindow->dpy, &evb, &erb)
     405            && XFixesQueryVersion(pWindow->dpy, &vma, &vmi)
     406            && vma>=2)
     407        {
     408            crDebug("XFixes %i.%i", vma, vmi);
     409            return GL_TRUE;
     410        }
     411        else
     412        {
     413            crWarning("XFixes not found or old version (%i.%i), no VisibilityTracking", vma, vmi);
     414        }
     415    }
     416    else
     417    {
     418        crWarning("XComposite not found or old version (%i.%i), no VisibilityTracking", vma, vmi);
     419    }
     420    return GL_FALSE;
     421}
     422
     423/*
     424 *  Updates visible regions for given spu window.
     425 *  Returns GL_TRUE if regions changed since last call, GL_FALSE overwise.
     426 */
     427GLboolean stubUpdateWindowVisibileRegions(WindowInfo *pWindow)
     428{
     429    static GLboolean bExtensionsChecked = GL_FALSE;
     430
     431    XserverRegion xreg;
     432    int cRects, i;
     433    XRectangle *pXRects;
     434    GLint* pGLRects;
     435
     436    if (bExtensionsChecked || stubCheckXExtensions(pWindow))
     437    {
     438        bExtensionsChecked = GL_TRUE;
     439    }
     440    else
     441    {
     442        stub.trackWindowVisibleRgn = 0;
     443        return GL_FALSE;
     444    }
     445
     446    /*@todo see comment regarding size/position updates and XSync, same applies to those functions but
     447    * it seems there's no way to get even based updates for this. Or I've failed to find the appropriate extension.
     448    */
     449    xreg = XCompositeCreateRegionFromBorderClip(pWindow->dpy, pWindow->drawable);
     450    pXRects = XFixesFetchRegion(pWindow->dpy, xreg, &cRects);
     451    XFixesDestroyRegion(pWindow->dpy, xreg);
     452
     453    if (!pWindow->pVisibleRegions
     454        || pWindow->cVisibleRegions!=cRects
     455        || crMemcmp(pWindow->pVisibleRegions, pXRects, cRects * sizeof(XRectangle)))
     456    {
     457        pWindow->pVisibleRegions = pXRects;
     458        pWindow->cVisibleRegions = cRects;
     459
     460        pGLRects = crAlloc(4*cRects*sizeof(GLint));
     461        if (!pGLRects)
     462        {
     463            crWarning("stubUpdateWindowVisibileRegions: failed to allocate %i bytes", 4*cRects*sizeof(GLint));
     464            return GL_FALSE;
     465        }
     466
     467        /*crDebug("Got %i rects.", cRects);*/
     468        for (i=0; i<cRects; ++i)
     469        {
     470            pGLRects[4*i+0] = pXRects[i].x;
     471            pGLRects[4*i+1] = pXRects[i].y;
     472            pGLRects[4*i+2] = pXRects[i].x+pXRects[i].width;
     473            pGLRects[4*i+3] = pXRects[i].y+pXRects[i].height;
     474            /*crDebug("Rect[%i]=(%i,%i,%i,%i)", i, pGLRects[4*i+0], pGLRects[4*i+1], pGLRects[4*i+2], pGLRects[4*i+3]);*/                   
     475        }
     476
     477        crDebug("Dispatched WindowVisibleRegion (%i, cRects=%i)", pWindow->spuWindow, cRects);
     478        stub.spuDispatch.WindowVisibleRegion(pWindow->spuWindow, cRects, pGLRects);
     479        crFree(pGLRects);
     480        return GL_TRUE;
     481    }
     482    else
     483    {
     484        XFree(pXRects);
     485    }
     486
     487    return GL_FALSE;
     488}
     489#endif //#ifdef WINDOWS
  • trunk/src/VBox/Additions/WINNT/Graphics/crOpenGL/stub.h

    r16387 r16480  
    122122    Display *dpy;
    123123    GLXDrawable drawable;
     124    XRectangle *pVisibleRegions;
     125    GLint cVisibleRegions;
    124126#endif
    125127};
     
    183185extern DECLEXPORT(SPUDispatchTable) stubNULLDispatch;
    184186
     187#if defined(GLX) || defined (WINDOWS)
     188extern GLboolean stubUpdateWindowVisibileRegions(WindowInfo *pWindow);
     189#endif
    185190
    186191#ifdef WINDOWS
     
    191196extern void stubInstallWindowMessageHook();
    192197extern void stubUninstallWindowMessageHook();
    193 
    194 extern GLboolean stubUpdateWindowVisibileRegions(WindowInfo *pWindow);
    195198
    196199#elif defined(DARWIN)
  • trunk/src/VBox/GuestHost/OpenGL/packer/pack_visibleregion.c

    r15532 r16480  
    3030{
    3131    GLint i, size, cnt;
    32 #ifdef WINDOWS
    33     RECT *pRECT = (RECT*) pRects;
    34 #else
    35 #endif
    3632
    3733    GET_PACKER_CONTEXT(pc);
     
    4844    for (i=0; i<cRects; ++i)
    4945    {
    50 #ifdef WINDOWS
    51         WRITE_DATA(cnt, GLint, (GLint) pRECT[i].left);
    52         WRITE_DATA(cnt+4, GLint, (GLint) pRECT[i].top);
    53         WRITE_DATA(cnt+8, GLint, (GLint) pRECT[i].right);
    54         WRITE_DATA(cnt+12, GLint, (GLint) pRECT[i].bottom);
     46        WRITE_DATA(cnt, GLint, (GLint) pRects[4*i+0]);
     47        WRITE_DATA(cnt+4, GLint, (GLint) pRects[4*i+1]);
     48        WRITE_DATA(cnt+8, GLint, (GLint) pRects[4*i+2]);
     49        WRITE_DATA(cnt+12, GLint, (GLint) pRects[4*i+3]);
    5550        cnt += 16;
    56 #else
    57 #endif
    5851    }
    5952    WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
Note: See TracChangeset for help on using the changeset viewer.

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