VirtualBox

Changeset 34309 in vbox for trunk


Ignore:
Timestamp:
Nov 24, 2010 11:52:39 AM (14 years ago)
Author:
vboxsync
Message:

crOpenGL: more fixes for glx functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/crOpenGL/glx.c

    r34138 r34309  
    633633}
    634634
     635typedef struct _stubFindPixmapParms_t {
     636    ContextInfo *pCtx;
     637    GLX_Pixmap_t *pGlxPixmap;
     638    GLXDrawable draw;
     639} stubFindPixmapParms_t;
     640
     641static void stubFindPixmapCB(unsigned long key, void *data1, void *data2)
     642{
     643    ContextInfo *pCtx = (ContextInfo *) data1;
     644    stubFindPixmapParms_t *pParms = (stubFindPixmapParms_t *) data2;
     645    GLX_Pixmap_t *pGlxPixmap = (GLX_Pixmap_t *) crHashtableSearch(pCtx->pGLXPixmapsHash, (unsigned int) pParms->draw);
     646
     647    if (pGlxPixmap)
     648    {
     649        pParms->pCtx = pCtx;
     650        pParms->pGlxPixmap = pGlxPixmap;
     651    }
     652}
    635653
    636654DECLEXPORT(Bool) VBOXGLXTAG(glXMakeCurrent)( Display *dpy, GLXDrawable drawable, GLXContext ctx )
     
    641659
    642660    /*crDebug("glXMakeCurrent(%p, 0x%x, 0x%x)", (void *) dpy, (int) drawable, (int) ctx);*/
     661
     662    /*check if passed drawable is GLXPixmap and not X Window*/
     663    if (drawable)
     664    {
     665        GLX_Pixmap_t *pGlxPixmap = (GLX_Pixmap_t *) crHashtableSearch(stub.pGLXPixmapsHash, (unsigned int) drawable);
     666
     667        if (!pGlxPixmap)
     668        {
     669            stubFindPixmapParms_t parms;
     670            parms.pGlxPixmap = NULL;
     671            parms.draw = drawable;
     672            crHashtableWalk(stub.contextTable, stubFindPixmapCB, &parms);
     673            pGlxPixmap = parms.pGlxPixmap;
     674        }
     675
     676        if (pGlxPixmap)
     677        {
     678            /*@todo*/
     679            crWarning("Unimplemented glxMakeCurrent call with GLXPixmap passed, unexpected things might happen.");
     680        }
     681    }
    643682
    644683    if (ctx && drawable) {
     
    16471686    GLXFBConfig *realcfg;
    16481687    int nconfigs;
    1649     //XVisualInfo *vis;
    1650     (void) dpy;
    16511688    (void) config;
    1652     (void) win;
    1653     (void) attrib_list;
    1654     //crWarning("glXCreateWindow not implemented by Chromium");
    1655     //vis = VBOXGLXTAG(glXGetVisualFromFBConfig)(config);
     1689
    16561690    if (stub.wsInterface.glXGetFBConfigs)
    16571691    {
     
    16691703    else
    16701704    {
    1671         crWarning("glXCreateWindow stub.wsInterface.glXChooseFBConfig==NULL");
    1672         return 0;
     1705        if (attrib_list && *attrib_list!=None)
     1706        {
     1707            crWarning("Non empty attrib list in glXCreateWindow");
     1708            return 0;
     1709        }
     1710        return (GLXWindow)win;
    16731711    }
    16741712}
     
    16831721DECLEXPORT(void) VBOXGLXTAG(glXDestroyPixmap)(Display *dpy, GLXPixmap pixmap)
    16841722{
    1685     GLX_Pixmap_t *pGlxPixmap;
    1686 
    1687     if (!stub.currentContext)
    1688     {
    1689         crWarning("glXDestroyPixmap failed, no current context");
     1723    stubFindPixmapParms_t parms;
     1724
     1725    if (crHashtableSearch(stub.pGLXPixmapsHash, (unsigned int) pixmap))
     1726    {
     1727        /*it's valid but never used glxpixmap, so simple free stored ptr*/
     1728        crHashtableDelete(stub.pGLXPixmapsHash, (unsigned int) pixmap, crFree);
    16901729        return;
    16911730    }
    1692 
    1693     pGlxPixmap = (GLX_Pixmap_t *) crHashtableSearch(stub.currentContext->pGLXPixmapsHash, (unsigned int) pixmap);
    1694 
    1695     if (pGlxPixmap)
    1696     {
    1697         XLOCK(dpy);
    1698         if (pGlxPixmap->gc)
    1699         {
    1700             XFreeGC(dpy, pGlxPixmap->gc);
    1701         }
    1702 
    1703         if (pGlxPixmap->hShmPixmap>0)
    1704         {
    1705             XFreePixmap(dpy, pGlxPixmap->hShmPixmap);
    1706         }
    1707         XUNLOCK(dpy);
    1708 
    1709         if (pGlxPixmap->hDamage>0)
    1710         {
    1711             //crDebug("Destroy: Damage for drawable 0x%x, handle 0x%x", (unsigned int) pixmap, (unsigned int) pGlxPixmap->damage);
    1712             XDamageDestroy(stub.currentContext->damageDpy, pGlxPixmap->hDamage);
    1713         }
    1714 
    1715         if (pGlxPixmap->pDamageRegion)
    1716         {
    1717             XDestroyRegion(pGlxPixmap->pDamageRegion);
    1718         }
    1719 
    1720         crHashtableDelete(stub.currentContext->pGLXPixmapsHash, (unsigned int) pixmap, crFree);
    1721     }
    1722     /*else
     1731    else
     1732    {
     1733        /*it's either invalid glxpixmap or one which was already initialized, so it's stored in appropriate ctx hash*/
     1734        parms.pCtx = NULL;
     1735        parms.pGlxPixmap = NULL;
     1736        parms.draw = pixmap;
     1737        crHashtableWalk(stub.contextTable, stubFindPixmapCB, &parms);
     1738    }
     1739
     1740    if (!parms.pGlxPixmap)
    17231741    {
    17241742        crWarning("glXDestroyPixmap called for unknown glxpixmap 0x%x", (unsigned int) pixmap);
    1725     }*/
     1743        return;
     1744    }
     1745
     1746    XLOCK(dpy);
     1747    if (parms.pGlxPixmap->gc)
     1748    {
     1749        XFreeGC(dpy, parms.pGlxPixmap->gc);
     1750    }
     1751
     1752    if (parms.pGlxPixmap->hShmPixmap>0)
     1753    {
     1754        XFreePixmap(dpy, parms.pGlxPixmap->hShmPixmap);
     1755    }
     1756    XUNLOCK(dpy);
     1757
     1758    if (parms.pGlxPixmap->hDamage>0)
     1759    {
     1760        //crDebug("Destroy: Damage for drawable 0x%x, handle 0x%x", (unsigned int) pixmap, (unsigned int) parms.pGlxPixmap->damage);
     1761        XDamageDestroy(parms.pCtx->damageDpy, parms.pGlxPixmap->hDamage);
     1762    }
     1763
     1764    if (parms.pGlxPixmap->pDamageRegion)
     1765    {
     1766        XDestroyRegion(parms.pGlxPixmap->pDamageRegion);
     1767    }
     1768
     1769    crHashtableDelete(parms.pCtx->pGLXPixmapsHash, (unsigned int) pixmap, crFree);
    17261770}
    17271771
     
    17301774    (void) dpy;
    17311775    (void) win;
    1732     crWarning("glXDestroyWindow not implemented by Chromium");
     1776    /*crWarning("glXDestroyWindow not implemented by Chromium");*/
    17331777}
    17341778
    17351779DECLEXPORT(GLXDrawable) VBOXGLXTAG(glXGetCurrentReadDrawable)(void)
    17361780{
    1737     //crWarning("glXGetCurrentReadDrawable not implemented by Chromium");
    17381781    return currentReadDrawable;
    17391782}
     
    19932036DECLEXPORT(Bool) VBOXGLXTAG(glXMakeContextCurrent)(Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx)
    19942037{
    1995     (void) display;
    1996     (void) draw;
    1997     (void) read;
    1998     (void) ctx;
    1999     //crWarning("glXMakeContextCurrent not implemented by Chromium");
    20002038    currentReadDrawable = read;
    20012039    return VBOXGLXTAG(glXMakeCurrent)(display, draw, ctx);
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