VirtualBox

忽略:
時間撮記:
2012-10-29 上午11:51:43 (12 年 以前)
作者:
vboxsync
訊息:

crOpenGL: fix state switch for multiple VBO usage

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c

    r40301 r43764  
    16231623}
    16241624
     1625#define CR_BUFFER_HWID(_p) ((_p) ? (_p)->hwid : 0)
    16251626
    16261627void
     
    18501851    GLint curClientTextureUnit = from->curClientTextureUnit;
    18511852    int i;
     1853    GLint idHwArrayBuffer = CR_BUFFER_HWID(toCtx->bufferobject.arrayBuffer);
     1854    const GLint idHwInitialBuffer = idHwArrayBuffer;
     1855
     1856#ifdef DEBUG_misha
     1857    {
     1858        GLint tstHwBuffer = -1;
     1859        diff_api.GetIntegerv(GL_ARRAY_BUFFER_BINDING, &tstHwBuffer);
     1860        CRASSERT(idHwInitialBuffer == tstHwBuffer);
     1861    }
     1862#endif
    18521863
    18531864    if (CHECKDIRTY(cb->clientPointer, bitID)) {
     
    18581869                    from->array.v.stride != to->array.v.stride ||
    18591870                    from->array.v.buffer != to->array.v.buffer) {
     1871                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.v.buffer);
     1872                if (idHwArrayBufferUsed != idHwArrayBuffer)
     1873                {
     1874                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     1875                    idHwArrayBuffer = idHwArrayBufferUsed;
     1876                }
    18601877                diff_api.VertexPointer(to->array.v.size, to->array.v.type,
    18611878                                                             to->array.v.stride, to->array.v.p);
     
    18711888                    from->array.n.stride != to->array.n.stride ||
    18721889                    from->array.n.buffer != to->array.n.buffer) {
     1890                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.n.buffer);
     1891                if (idHwArrayBufferUsed != idHwArrayBuffer)
     1892                {
     1893                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     1894                    idHwArrayBuffer = idHwArrayBufferUsed;
     1895                }
    18731896                diff_api.NormalPointer(to->array.n.type,
    18741897                                                             to->array.n.stride, to->array.n.p);
     
    18851908                    from->array.c.stride != to->array.c.stride ||
    18861909                    from->array.c.buffer != to->array.c.buffer) {
     1910                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.c.buffer);
     1911                if (idHwArrayBufferUsed != idHwArrayBuffer)
     1912                {
     1913                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     1914                    idHwArrayBuffer = idHwArrayBufferUsed;
     1915                }
    18871916                diff_api.ColorPointer(to->array.c.size, to->array.c.type,
    18881917                                                            to->array.c.stride, to->array.c.p);
     
    18981927                    from->array.i.stride != to->array.i.stride ||
    18991928                    from->array.i.buffer != to->array.i.buffer) {
     1929                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.i.buffer);
     1930                if (idHwArrayBufferUsed != idHwArrayBuffer)
     1931                {
     1932                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     1933                    idHwArrayBuffer = idHwArrayBufferUsed;
     1934                }
    19001935                diff_api.IndexPointer(to->array.i.type,
    19011936                                                            to->array.i.stride, to->array.i.p);
     
    19131948                        from->array.t[i].stride != to->array.t[i].stride ||
    19141949                        from->array.t[i].buffer != to->array.t[i].buffer) {
     1950                    GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.t[i].buffer);
     1951                    if (idHwArrayBufferUsed != idHwArrayBuffer)
     1952                    {
     1953                        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     1954                        idHwArrayBuffer = idHwArrayBufferUsed;
     1955                    }
    19151956                    diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + i);
    19161957                    curClientTextureUnit = i;
     
    19281969            if (from->array.e.stride != to->array.e.stride ||
    19291970                    from->array.e.buffer != to->array.e.buffer) {
     1971                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.e.buffer);
     1972                if (idHwArrayBufferUsed != idHwArrayBuffer)
     1973                {
     1974                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     1975                    idHwArrayBuffer = idHwArrayBufferUsed;
     1976                }
    19301977                diff_api.EdgeFlagPointer(to->array.e.stride, to->array.e.p);
    19311978                FILLDIRTY(cb->e);
     
    19411988                    from->array.s.stride != to->array.s.stride ||
    19421989                    from->array.s.buffer != to->array.s.buffer) {
     1990                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.s.buffer);
     1991                if (idHwArrayBufferUsed != idHwArrayBuffer)
     1992                {
     1993                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     1994                    idHwArrayBuffer = idHwArrayBufferUsed;
     1995                }
    19431996                diff_api.SecondaryColorPointerEXT(to->array.s.size, to->array.s.type,
    19441997                                                                                    to->array.s.stride, to->array.s.p);
     
    19542007                    from->array.f.stride != to->array.f.stride ||
    19552008                    from->array.f.buffer != to->array.f.buffer) {
     2009                GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.f.buffer);
     2010                if (idHwArrayBufferUsed != idHwArrayBuffer)
     2011                {
     2012                    diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     2013                    idHwArrayBuffer = idHwArrayBufferUsed;
     2014                }
    19562015                diff_api.FogCoordPointerEXT(to->array.f.type,
    19572016                                                                        to->array.f.stride, to->array.f.p);
     
    19712030                        from->array.a[i].normalized != to->array.a[i].normalized ||
    19722031                        from->array.a[i].buffer != to->array.a[i].buffer) {
     2032                    GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.a[i].buffer);
     2033                    if (idHwArrayBufferUsed != idHwArrayBuffer)
     2034                    {
     2035                        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
     2036                        idHwArrayBuffer = idHwArrayBufferUsed;
     2037                    }
    19732038                    diff_api.VertexAttribPointerARB(i, to->array.a[i].size,
    19742039                                                                                    to->array.a[i].type,
     
    19862051    }
    19872052
     2053    if (idHwArrayBuffer != idHwInitialBuffer)
     2054    {
     2055        diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwInitialBuffer);
     2056    }
     2057
    19882058    if (CHECKDIRTY(cb->enableClientState, bitID)) {
    19892059        /* update vertex array enable/disable flags */
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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