VirtualBox

Changeset 45616 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Apr 18, 2013 5:44:22 PM (12 years ago)
Author:
vboxsync
Message:

crOpenGL: 1.work around 4.2.12 saved state issues, 2. saved state fixes

Location:
trunk/src/VBox
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_version.h

    r45149 r45616  
    1616/* version with invalid glGetError state */
    1717#define SHCROGL_SSM_VERSION_WITH_INVALID_ERROR_STATE                30
     18/* VBox 4.2.12 had a bug that incorrectly CRMuralInfo data
     19 * in a different format without changing the state version,
     20 * i.e. 30 version can have both "correct" and "incorrect" CRMuralInfo data */
     21#define SHCROGL_SSM_VERSION_WITH_BUGGY_MURAL_INFO                   30
    1822/* the saved state has incorrect front and back buffer image data */
    1923#define SHCROGL_SSM_VERSION_WITH_BUGGY_FB_IMAGE_DATA                31
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_context.c

    r45248 r45616  
    307307    crStateSwitchPrepare(cr_server.bUseMultipleContexts ? NULL : ctx, oldCtx, idDrawFBO, idReadFBO);
    308308
    309     /*
    310     crDebug("**** %s client %d  curCtx=%d curWin=%d", __func__,
    311                     cr_server.curClient->number, ctxPos, window);
    312     */
    313     cr_server.curClient->currentContextNumber = context;
    314     cr_server.curClient->currentCtxInfo = ctxInfo;
    315     cr_server.curClient->currentMural = mural;
    316     cr_server.curClient->currentWindow = window;
    317 
    318     CRASSERT(cr_server.curClient->currentCtxInfo);
    319     CRASSERT(cr_server.curClient->currentCtxInfo->pContext);
     309    if (cr_server.curClient)
     310    {
     311        /*
     312        crDebug("**** %s client %d  curCtx=%d curWin=%d", __func__,
     313                        cr_server.curClient->number, ctxPos, window);
     314        */
     315        cr_server.curClient->currentContextNumber = context;
     316        cr_server.curClient->currentCtxInfo = ctxInfo;
     317        cr_server.curClient->currentMural = mural;
     318        cr_server.curClient->currentWindow = window;
     319
     320        CRASSERT(cr_server.curClient->currentCtxInfo);
     321        CRASSERT(cr_server.curClient->currentCtxInfo->pContext);
     322    }
    320323
    321324    /* This is a hack to force updating the 'current' attribs */
     
    401404
    402405    if (!ctx->framebufferobject.drawFB
    403             && (ctx->buffer.drawBuffer == GL_FRONT || ctx->buffer.drawBuffer == GL_FRONT_LEFT))
     406            && (ctx->buffer.drawBuffer == GL_FRONT || ctx->buffer.drawBuffer == GL_FRONT_LEFT)
     407            && cr_server.curClient)
    404408        cr_server.curClient->currentMural->bFbDraw = GL_TRUE;
    405409
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r45527 r45616  
    10901090        return VINF_SUCCESS;
    10911091
    1092     pData->idFBO = (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidColorTexs[fWrite ? pMural->iCurDrawBuffer : pMural->iCurReadBuffer] : 0;
     1092    pData->idFBO = pMural && (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidColorTexs[fWrite ? pMural->iCurDrawBuffer : pMural->iCurReadBuffer] : 0;
    10931093    pData->cElements = 0;
    10941094
    10951095    pEl = &pData->aElements[pData->cElements];
    1096     pEl->idFBO = (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_FB_IDX(pMural)] : 0;
     1096    pEl->idFBO = pMural && (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_FB_IDX(pMural)] : 0;
    10971097    pEl->enmBuffer = pData->aElements[1].idFBO ? GL_COLOR_ATTACHMENT0 : GL_FRONT;
    10981098    pEl->posX = 0;
     
    11211121    {
    11221122        pEl = &pData->aElements[pData->cElements];
    1123         pEl->idFBO = (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_BB_IDX(pMural)] : 0;
     1123        pEl->idFBO = pMural && (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_BB_IDX(pMural)] : 0;
    11241124        pEl->enmBuffer = pData->aElements[1].idFBO ? GL_COLOR_ATTACHMENT0 : GL_BACK;
    11251125        pEl->posX = 0;
     
    11511151            AssertCompile(sizeof (GLfloat) == 4);
    11521152            pEl = &pData->aElements[pData->cElements];
    1153             pEl->idFBO = (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_FB_IDX(pMural)] : 0;
     1153            pEl->idFBO = pMural && (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_FB_IDX(pMural)] : 0;
    11541154            pEl->enmBuffer = 0; /* we do not care */
    11551155            pEl->posX = 0;
     
    11821182            AssertCompile(sizeof (GLuint) == 4);
    11831183            pEl = &pData->aElements[pData->cElements];
    1184             pEl->idFBO = (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_FB_IDX(pMural)] : 0;
     1184            pEl->idFBO = pMural && (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_FB_IDX(pMural)] : 0;
    11851185            pEl->enmBuffer = 0; /* we do not care */
    11861186            pEl->posX = 0;
     
    12071207    {
    12081208        pEl = &pData->aElements[pData->cElements];
    1209         pEl->idFBO = (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_FB_IDX(pMural)] : 0;
     1209        pEl->idFBO = pMural && (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO) ? pMural->aidFBOs[CR_SERVER_FBO_FB_IDX(pMural)] : 0;
    12101210        pEl->enmBuffer = 0; /* we do not care */
    12111211        pEl->posX = 0;
     
    16871687}
    16881688
    1689 static int32_t crVBoxServerLoadMurals(PSSMHANDLE pSSM, uint32_t version)
     1689typedef struct CR_SERVER_LOADSTATE_READER
     1690{
     1691    PSSMHANDLE pSSM;
     1692    uint32_t cbBuffer;
     1693    uint32_t cbData;
     1694    uint32_t offData;
     1695    uint8_t *pu8Buffer;
     1696} CR_SERVER_LOADSTATE_READER;
     1697
     1698static void crServerLsrInit(CR_SERVER_LOADSTATE_READER *pReader, PSSMHANDLE pSSM)
     1699{
     1700    memset(pReader, 0, sizeof (*pReader));
     1701    pReader->pSSM = pSSM;
     1702}
     1703
     1704static void crServerLsrTerm(CR_SERVER_LOADSTATE_READER *pReader)
     1705{
     1706    if (pReader->pu8Buffer)
     1707        RTMemFree(pReader->pu8Buffer);
     1708
     1709    /* sanity */
     1710    memset(pReader, 0, sizeof (*pReader));
     1711}
     1712
     1713static int crServerLsrDataGetMem(CR_SERVER_LOADSTATE_READER *pReader, void *pvBuffer, uint32_t cbBuffer)
     1714{
     1715    int rc = VINF_SUCCESS;
     1716    uint32_t cbRemaining = cbBuffer;
     1717    if (pReader->cbData)
     1718    {
     1719        uint8_t cbData = RT_MIN(pReader->cbData, cbBuffer);
     1720        memcpy(pvBuffer, pReader->pu8Buffer + pReader->offData, cbData);
     1721        pReader->cbData -= cbData;
     1722        pReader->offData += cbData;
     1723
     1724        cbRemaining -= cbData;
     1725        pvBuffer = ((uint8_t*)pvBuffer) + cbData;
     1726    }
     1727
     1728    if (cbRemaining)
     1729    {
     1730        rc = SSMR3GetMem(pReader->pSSM, pvBuffer, cbRemaining);
     1731        AssertRC(rc);
     1732    }
     1733
     1734    return rc;
     1735}
     1736
     1737static int crServerLsrDataGetU32(CR_SERVER_LOADSTATE_READER *pReader, uint32_t *pu32)
     1738{
     1739    return crServerLsrDataGetMem(pReader, pu32, sizeof (*pu32));
     1740}
     1741
     1742static int crServerLsrDataPutMem(CR_SERVER_LOADSTATE_READER *pReader, void *pvBuffer, uint32_t cbBuffer)
     1743{
     1744    if (!pReader->cbData && pReader->cbBuffer >= cbBuffer)
     1745    {
     1746        pReader->offData = 0;
     1747        pReader->cbData = cbBuffer;
     1748        memcpy(pReader->pu8Buffer, pvBuffer, cbBuffer);
     1749    }
     1750    else if (pReader->offData >= cbBuffer)
     1751    {
     1752        pReader->offData -= cbBuffer;
     1753        pReader->cbData += cbBuffer;
     1754        memcpy(pReader->pu8Buffer + pReader->offData, pvBuffer, cbBuffer);
     1755    }
     1756    else
     1757    {
     1758        uint8_t *pu8Buffer = pReader->pu8Buffer;
     1759
     1760        pReader->pu8Buffer = (uint8_t*)RTMemAlloc(cbBuffer + pReader->cbData);
     1761        if (!pReader->pu8Buffer)
     1762        {
     1763            crWarning("failed to allocate mem %d", cbBuffer + pReader->cbData);
     1764            return VERR_NO_MEMORY;
     1765        }
     1766
     1767        memcpy(pReader->pu8Buffer, pvBuffer, cbBuffer);
     1768        if (pu8Buffer)
     1769        {
     1770            memcpy(pReader->pu8Buffer + cbBuffer, pu8Buffer + pReader->offData, pReader->cbData);
     1771            RTMemFree(pu8Buffer);
     1772        }
     1773        else
     1774        {
     1775            Assert(!pReader->cbData);
     1776        }
     1777        pReader->offData = 0;
     1778        pReader->cbData += cbBuffer;
     1779    }
     1780
     1781    return VINF_SUCCESS;
     1782}
     1783
     1784/* data to bi skipped by */
     1785
     1786typedef struct CR_SERVER_BUGGY_MURAL_DATA_2
     1787{
     1788    void*ListHead_pNext;
     1789    void*ListHead_pPrev;
     1790    uint32_t cEntries;
     1791} CR_SERVER_BUGGY_MURAL_DATA_2;
     1792typedef struct CR_SERVER_BUGGY_MURAL_DATA_1
     1793{
     1794    /* VBOXVR_COMPOSITOR_ENTRY Ce; */
     1795    void*Ce_Node_pNext;
     1796    void*Ce_Node_pPrev;
     1797    CR_SERVER_BUGGY_MURAL_DATA_2 Vr;
     1798    /* VBOXVR_TEXTURE Tex; */
     1799    uint32_t Tex_width;
     1800    uint32_t Tex_height;
     1801    uint32_t Tex_target;
     1802    uint32_t Tex_hwid;
     1803    /* RTPOINT Pos; */
     1804    uint32_t Pos_x;
     1805    uint32_t Pos_y;
     1806    uint32_t fChanged;
     1807    uint32_t cRects;
     1808    void* paSrcRects;
     1809    void* paDstRects;
     1810} CR_SERVER_BUGGY_MURAL_DATA_1;
     1811
     1812typedef struct CR_SERVER_BUGGY_MURAL_DATA_4
     1813{
     1814    uint32_t                   u32Magic;
     1815    int32_t                    cLockers;
     1816    RTNATIVETHREAD             NativeThreadOwner;
     1817    int32_t                    cNestings;
     1818    uint32_t                            fFlags;
     1819    void*                          EventSem;
     1820    R3R0PTRTYPE(PRTLOCKVALRECEXCL)      pValidatorRec;
     1821    RTHCPTR                             Alignment;
     1822} CR_SERVER_BUGGY_MURAL_DATA_4;
     1823
     1824typedef struct CR_SERVER_BUGGY_MURAL_DATA_3
     1825{
     1826    void*Compositor_List_pNext;
     1827    void*Compositor_List_pPrev;
     1828    void*Compositor_pfnEntryRemoved;
     1829    float StretchX;
     1830    float StretchY;
     1831    uint32_t cRects;
     1832    uint32_t cRectsBuffer;
     1833    void*paSrcRects;
     1834    void*paDstRects;
     1835    CR_SERVER_BUGGY_MURAL_DATA_4 CritSect;
     1836} CR_SERVER_BUGGY_MURAL_DATA_3;
     1837
     1838typedef struct CR_SERVER_BUGGY_MURAL_DATA
     1839{
     1840    uint8_t fRootVrOn;
     1841    CR_SERVER_BUGGY_MURAL_DATA_1 RootVrCEntry;
     1842    CR_SERVER_BUGGY_MURAL_DATA_3 RootVrCompositor;
     1843} CR_SERVER_BUGGY_MURAL_DATA;
     1844
     1845AssertCompile(sizeof (CR_SERVER_BUGGY_MURAL_DATA) < sizeof (CRClient));
     1846
     1847static int32_t crVBoxServerLoadMurals(CR_SERVER_LOADSTATE_READER *pReader, uint32_t version)
    16901848{
    16911849    unsigned long key;
    16921850    uint32_t ui, uiNumElems;
     1851    bool fBuggyMuralData = false;
    16931852    /* Load windows */
    1694     int32_t rc = SSMR3GetU32(pSSM, &uiNumElems);
     1853    int32_t rc = crServerLsrDataGetU32(pReader, &uiNumElems);
    16951854    AssertRCReturn(rc, rc);
    16961855    for (ui=0; ui<uiNumElems; ++ui)
     
    17011860        unsigned long key;
    17021861
    1703         rc = SSMR3GetMem(pSSM, &key, sizeof(key));
     1862        rc = crServerLsrDataGetMem(pReader, &key, sizeof(key));
    17041863        AssertRCReturn(rc, rc);
    1705         rc = SSMR3GetMem(pSSM, &createInfo, sizeof(createInfo));
     1864        rc = crServerLsrDataGetMem(pReader, &createInfo, sizeof(createInfo));
    17061865        AssertRCReturn(rc, rc);
    17071866
     1867        CRASSERT(!pReader->cbData);
     1868
    17081869        if (createInfo.pszDpyName)
    17091870        {
    1710             rc = SSMR3GetStrZEx(pSSM, psz, 200, NULL);
     1871            rc = SSMR3GetStrZEx(pReader->pSSM, psz, 200, NULL);
    17111872            AssertRCReturn(rc, rc);
    17121873            createInfo.pszDpyName = psz;
     
    17181879
    17191880    /* Load cr_server.muralTable */
    1720     rc = SSMR3GetU32(pSSM, &uiNumElems);
     1881    rc = SSMR3GetU32(pReader->pSSM, &uiNumElems);
    17211882    AssertRCReturn(rc, rc);
    17221883    for (ui=0; ui<uiNumElems; ++ui)
     
    17251886        CRMuralInfo *pActualMural = NULL;
    17261887
    1727         rc = SSMR3GetMem(pSSM, &key, sizeof(key));
     1888        rc = crServerLsrDataGetMem(pReader, &key, sizeof(key));
    17281889        AssertRCReturn(rc, rc);
    1729         rc = SSMR3GetMem(pSSM, &muralInfo, RT_OFFSETOF(CRMuralInfo, CreateInfo));
     1890        rc = crServerLsrDataGetMem(pReader, &muralInfo, RT_OFFSETOF(CRMuralInfo, CreateInfo));
    17301891        AssertRCReturn(rc, rc);
    17311892
    17321893        if (version <= SHCROGL_SSM_VERSION_BEFORE_FRONT_DRAW_TRACKING)
    17331894            muralInfo.bFbDraw = GL_TRUE;
     1895
     1896        if (!ui && version == SHCROGL_SSM_VERSION_WITH_BUGGY_MURAL_INFO)
     1897        {
     1898            /* Lookahead buffer used to determine whether the data erroneously storred root visible regions data */
     1899            union
     1900            {
     1901                void * apv[1];
     1902                CR_SERVER_BUGGY_MURAL_DATA Data;
     1903                /* need to chak spuWindow, so taking the offset of filed following it*/
     1904                uint8_t au8[RT_OFFSETOF(CRMuralInfo, screenId)];
     1905                RTRECT aVisRects[sizeof (CR_SERVER_BUGGY_MURAL_DATA) / sizeof (RTRECT)];
     1906            } LaBuf;
     1907
     1908            do {
     1909                /* first value is bool (uint8_t) value followed by pointer-size-based alignment.
     1910                 * the mural memory is zero-initialized initially, so we can be sure the padding is zeroed,
     1911                 * i.e. possible values for visible regions data are 0 or (1 << (sizeof (void*) - 8)) */
     1912                rc = crServerLsrDataGetMem(pReader, &LaBuf, sizeof (LaBuf));
     1913                AssertRCReturn(rc, rc);
     1914                if (LaBuf.apv[0] != NULL && LaBuf.apv[0] != ((void*)(1 << (sizeof (void*) - 8))))
     1915                    break;
     1916
     1917                /* check that the pointers are either valid or NULL */
     1918                if(LaBuf.Data.RootVrCEntry.Ce_Node_pNext && !RT_VALID_PTR(LaBuf.Data.RootVrCEntry.Ce_Node_pNext))
     1919                    break;
     1920                if(LaBuf.Data.RootVrCEntry.Ce_Node_pPrev && !RT_VALID_PTR(LaBuf.Data.RootVrCEntry.Ce_Node_pPrev))
     1921                    break;
     1922                if(LaBuf.Data.RootVrCEntry.Vr.ListHead_pNext && !RT_VALID_PTR(LaBuf.Data.RootVrCEntry.Vr.ListHead_pNext))
     1923                    break;
     1924                if(LaBuf.Data.RootVrCEntry.Vr.ListHead_pPrev && !RT_VALID_PTR(LaBuf.Data.RootVrCEntry.Vr.ListHead_pPrev))
     1925                    break;
     1926
     1927                /* the entry can can be the only one within the (mural) compositor,
     1928                 * so its compositor entry node can either contain NULL pNext and pPrev,
     1929                 * or both of them pointing to compositor's list head */
     1930                if (LaBuf.Data.RootVrCEntry.Ce_Node_pNext != LaBuf.Data.RootVrCEntry.Ce_Node_pPrev)
     1931                    break;
     1932
     1933                /* can either both or none be NULL */
     1934                if (!LaBuf.Data.RootVrCEntry.Ce_Node_pNext != !LaBuf.Data.RootVrCEntry.Ce_Node_pPrev)
     1935                    break;
     1936
     1937                if (!LaBuf.Data.fRootVrOn)
     1938                {
     1939                    if (LaBuf.Data.RootVrCEntry.Ce_Node_pNext || LaBuf.Data.RootVrCEntry.Ce_Node_pPrev)
     1940                        break;
     1941
     1942                    /* either non-initialized (zeroed) or empty list */
     1943                    if (LaBuf.Data.RootVrCEntry.Vr.ListHead_pNext != LaBuf.Data.RootVrCEntry.Vr.ListHead_pPrev)
     1944                        break;
     1945
     1946                    if (LaBuf.Data.RootVrCEntry.Vr.cEntries)
     1947                        break;
     1948                }
     1949                else
     1950                {
     1951                    /* the entry should be initialized */
     1952                    if (!LaBuf.Data.RootVrCEntry.Vr.ListHead_pNext)
     1953                        break;
     1954                    if (!LaBuf.Data.RootVrCEntry.Vr.ListHead_pPrev)
     1955                        break;
     1956
     1957                    if (LaBuf.Data.RootVrCEntry.Vr.cEntries)
     1958                    {
     1959                        /* entry should be in compositor list*/
     1960                        if (LaBuf.Data.RootVrCEntry.Ce_Node_pPrev == NULL)
     1961                            break;
     1962                        CRASSERT(LaBuf.Data.RootVrCEntry.Ce_Node_pNext);
     1963                    }
     1964                    else
     1965                    {
     1966                        /* entry should NOT be in compositor list*/
     1967                        if (LaBuf.Data.RootVrCEntry.Ce_Node_pPrev != NULL)
     1968                            break;
     1969                        CRASSERT(!LaBuf.Data.RootVrCEntry.Ce_Node_pNext);
     1970                    }
     1971                }
     1972
     1973#if 0
     1974                if (muralInfo.pVisibleRects)
     1975                {
     1976                    int j;
     1977                    int cRects = RT_MIN(muralInfo.cVisibleRects, RT_ELEMENTS(LaBuf.aVisRects));
     1978                    CRASSERT(cRects);
     1979                    for (j = 0; j < cRects; ++j)
     1980                    {
     1981                        PRTRECT pRect = &LaBuf.aVisRects[j];
     1982                        if (pRect->xLeft >= pRect->xRight)
     1983                            break;
     1984                        if (pRect->yTop >= pRect->yBottom)
     1985                            break;
     1986                        if (pRect->xLeft < 0 || pRect->xRight < 0
     1987                                || pRect->yTop < 0 || pRect->yBottom < 0)
     1988                            break;
     1989                        if (pRect->xLeft > (GLint)muralInfo.width
     1990                                || pRect->xRight > (GLint)muralInfo.width)
     1991                            break;
     1992                        if (pRect->yTop > (GLint)muralInfo.height
     1993                                || pRect->yBottom > (GLint)muralInfo.height)
     1994                            break;
     1995                    }
     1996
     1997                    if (j < cRects)
     1998                    {
     1999                        fBuggyMuralData = true;
     2000                        break;
     2001                    }
     2002                }
     2003
     2004                if (muralInfo.pVisibleRects)
     2005                {
     2006                    /* @todo: do we actually need any further checks here? */
     2007                    fBuggyMuralData = true;
     2008                    break;
     2009                }
     2010
     2011                /* no visible regions*/
     2012
     2013                if (ui == uiNumElems - 1)
     2014                {
     2015                    /* this is the last mural, next it goes idsPool, whose content can not match the above template again */
     2016                    fBuggyMuralData = true;
     2017                    break;
     2018                }
     2019
     2020                /* next it goes a next mural info */
     2021//                if (!fExpectPtr)
     2022//                {
     2023//                    CRMuralInfo *pNextSpuWindowInfoMural = (CRMuralInfo*)((void*)&LaBuf);
     2024//                    if (!pNextSpuWindowInfoMural->spuWindow)
     2025//                        fBuggyMuralData = true;
     2026//
     2027//                    break;
     2028//                }
     2029#endif
     2030                /* fExpectPtr == true, the valid pointer values should not match possible mural width/height/position */
     2031                fBuggyMuralData = true;
     2032                break;
     2033
     2034            } while (0);
     2035
     2036            rc = crServerLsrDataPutMem(pReader, &LaBuf, sizeof (LaBuf));
     2037            AssertRCReturn(rc, rc);
     2038        }
     2039
     2040        if (fBuggyMuralData)
     2041        {
     2042            CR_SERVER_BUGGY_MURAL_DATA Tmp;
     2043            rc = crServerLsrDataGetMem(pReader, &Tmp, sizeof (Tmp));
     2044            AssertRCReturn(rc, rc);
     2045        }
    17342046
    17352047        if (muralInfo.pVisibleRects)
     
    17412053            }
    17422054
    1743             rc = SSMR3GetMem(pSSM, muralInfo.pVisibleRects, 4*sizeof(GLint)*muralInfo.cVisibleRects);
     2055            rc = crServerLsrDataGetMem(pReader, muralInfo.pVisibleRects, 4*sizeof(GLint)*muralInfo.cVisibleRects);
    17442056            AssertRCReturn(rc, rc);
    17452057        }
    17462058
    1747         pActualMural = (CRMuralInfo *)crHashtableSearch(cr_server.muralTable, key);;
     2059        pActualMural = (CRMuralInfo *)crHashtableSearch(cr_server.muralTable, key);
    17482060        CRASSERT(pActualMural);
    17492061
    17502062        if (version >= SHCROGL_SSM_VERSION_WITH_WINDOW_CTX_USAGE)
    17512063        {
    1752             rc = SSMR3GetMem(pSSM, pActualMural->ctxUsage, sizeof (pActualMural->ctxUsage));
     2064            rc = crServerLsrDataGetMem(pReader, pActualMural->ctxUsage, sizeof (pActualMural->ctxUsage));
    17532065            CRASSERT(rc == VINF_SUCCESS);
    17542066        }
     
    19062218    unsigned long key;
    19072219    GLenum err;
     2220    CR_SERVER_LOADSTATE_READER Reader;
    19082221
    19092222    if (!cr_server.bIsInLoadingState)
     
    19292242        return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
    19302243    }
     2244
     2245    crServerLsrInit(&Reader, pSSM);
    19312246
    19322247#ifdef DEBUG_misha
     
    19732288    if (version > SHCROGL_SSM_VERSION_WITH_BUGGY_FB_IMAGE_DATA)
    19742289    {
     2290        CRASSERT(!Reader.pu8Buffer);
    19752291        /* we have a mural data here */
    1976         rc = crVBoxServerLoadMurals(pSSM, version);
     2292        rc = crVBoxServerLoadMurals(&Reader, version);
    19772293        AssertRCReturn(rc, rc);
     2294        CRASSERT(!Reader.pu8Buffer);
    19782295    }
    19792296
     
    20912408        CRServerFreeIDsPool_t dummyIdsPool;
    20922409
     2410        CRASSERT(!Reader.pu8Buffer);
     2411
    20932412        /* we have a mural data here */
    2094         rc = crVBoxServerLoadMurals(pSSM, version);
     2413        rc = crVBoxServerLoadMurals(&Reader, version);
    20952414        AssertRCReturn(rc, rc);
    20962415
    20972416        /* not used any more, just read it out and ignore */
    2098         rc = SSMR3GetMem(pSSM, &dummyIdsPool, sizeof(dummyIdsPool));
     2417        rc = crServerLsrDataGetMem(&Reader, &dummyIdsPool, sizeof(dummyIdsPool));
    20992418        CRASSERT(rc == VINF_SUCCESS);
    21002419    }
     
    21092428            unsigned long ctxID=-1, winID=-1;
    21102429
    2111             rc = SSMR3GetU32(pSSM, &ui);
     2430            rc = crServerLsrDataGetU32(&Reader, &ui);
    21122431            AssertRCReturn(rc, rc);
    21132432            /* If this assert fires, then we should search correct client in the list first*/
     
    21162435            if (version>=4)
    21172436            {
    2118                 rc = SSMR3GetU32(pSSM, &pClient->conn->vMajor);
     2437                rc = crServerLsrDataGetU32(&Reader, &pClient->conn->vMajor);
    21192438                AssertRCReturn(rc, rc);
    21202439
    2121                 rc = SSMR3GetU32(pSSM, &pClient->conn->vMinor);
     2440                rc = crServerLsrDataGetU32(&Reader, &pClient->conn->vMinor);
    21222441                AssertRCReturn(rc, rc);
    21232442            }
    21242443
    2125             rc = SSMR3GetMem(pSSM, &client, sizeof(client));
     2444            rc = crServerLsrDataGetMem(&Reader, &client, sizeof(client));
    21262445            CRASSERT(rc == VINF_SUCCESS);
    21272446
     
    21422461            if (client.currentCtxInfo && client.currentContextNumber>=0)
    21432462            {
    2144                 rc = SSMR3GetMem(pSSM, &ctxID, sizeof(ctxID));
     2463                rc = crServerLsrDataGetMem(&Reader, &ctxID, sizeof(ctxID));
    21452464                AssertRCReturn(rc, rc);
    21462465                client.currentCtxInfo = (CRContextInfo*) crHashtableSearch(cr_server.contextTable, ctxID);
     
    21532472            if (client.currentMural && client.currentWindow>=0)
    21542473            {
    2155                 rc = SSMR3GetMem(pSSM, &winID, sizeof(winID));
     2474                rc = crServerLsrDataGetMem(&Reader, &winID, sizeof(winID));
    21562475                AssertRCReturn(rc, rc);
    21572476                client.currentMural = (CRMuralInfo*) crHashtableSearch(cr_server.muralTable, winID);
     
    21602479                //pClient->currentWindow = winID;
    21612480            }
     2481
     2482            CRASSERT(!Reader.cbData);
    21622483
    21632484            /* Restore client active context and window */
     
    22432564        cr_server.head_spu->dispatch_table.StringMarkerGREMEDY(sizeof (CR_DBG_STR_STATE_LOAD_STOP), CR_DBG_STR_STATE_LOAD_STOP);
    22442565#endif
     2566
     2567    CRASSERT(!Reader.cbData);
     2568    crServerLsrTerm(&Reader);
    22452569
    22462570    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