VirtualBox

Changeset 54785 in vbox for trunk


Ignore:
Timestamp:
Mar 16, 2015 1:59:11 PM (10 years ago)
Author:
vboxsync
Message:

VMSVGA3d: Changed the context arrays into pointer arrays to reduce the copying requried when growing (entry size > 8K, I think). This also means the context pointers remain valid across growths.

Location:
trunk/src/VBox/Devices/Graphics
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp

    r54783 r54785  
    845845
    846846    uint32_t                cContexts;
    847     PVMSVGA3DCONTEXT        paContext;
     847    PVMSVGA3DCONTEXT       *papContexts;
    848848    uint32_t                cSurfaces;
    849849    PVMSVGA3DSURFACE        paSurface;
     
    898898
    899899    SSMFIELD_ENTRY(                 VMSVGA3DSTATE, cContexts),
    900     SSMFIELD_ENTRY_IGN_HCPTR(       VMSVGA3DSTATE, paContext),
     900    SSMFIELD_ENTRY_IGN_HCPTR(       VMSVGA3DSTATE, papContexts),
    901901    SSMFIELD_ENTRY(                 VMSVGA3DSTATE, cSurfaces),
    902902    SSMFIELD_ENTRY_IGN_HCPTR(       VMSVGA3DSTATE, paSurface),
     
    13201320#ifdef VBOX_VMSVGA3D_DUAL_OPENGL_PROFILE
    13211321    PVMSVGA3DSTATE pState = RT_FROM_MEMBER(pThis, VMSVGA3DSTATE, ShaderIf);
    1322     VMSVGA3D_SET_CURRENT_CONTEXT(pState, &pState->paContext[fOtherProfile ? 2 : 1]);
     1322    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pState->papContexts[fOtherProfile ? 2 : 1]);
    13231323#else
    13241324    NOREF(pThis);
     
    14441444    AssertRCReturn(rc, rc);
    14451445
    1446     pContext = &pState->paContext[1];
     1446    pContext = pState->papContexts[1];
    14471447    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    14481448
     
    14681468    rc = vmsvga3dContextDefineOgl(pThis, 2, VMSVGA3D_DEF_CTX_F_INIT | VMSVGA3D_DEF_CTX_F_OTHER_PROFILE);
    14691469    AssertLogRelRCReturn(rc, rc);
    1470     pContext = &pState->paContext[1]; /* Array may have been reallocated. */
    1471 
    1472     pOtherCtx = &pState->paContext[2];
     1470    pContext = pState->papContexts[1]; /* Array may have been reallocated. */
     1471
     1472    pOtherCtx = pState->papContexts[2];
    14731473    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pOtherCtx);
    14741474
     
    18321832    for (uint32_t i = 0; i < pState->cContexts; i++)
    18331833    {
    1834         if (pState->paContext[i].id != SVGA3D_INVALID_ID)
    1835             vmsvga3dContextDestroy(pThis, pState->paContext[i].id);
     1834        if (pState->papContexts[i]->id != SVGA3D_INVALID_ID)
     1835            vmsvga3dContextDestroy(pThis, pState->papContexts[i]->id);
    18361836    }
    18371837    return VINF_SUCCESS;
     
    28152815        for (uint32_t cid = 0; cid < pState->cContexts; cid++)
    28162816        {
    2817             pContext = &pState->paContext[cid];
     2817            pContext = pState->papContexts[cid];
    28182818            if (pContext->id == cid)
    28192819            {
     
    28342834        uint32_t cid = pSurface->idAssociatedContext;
    28352835        if (    cid <= pState->cContexts
    2836             &&  pState->paContext[cid].id == cid)
    2837         {
    2838             pContext = &pState->paContext[cid];
     2836            &&  pState->papContexts[cid]->id == cid)
     2837        {
     2838            pContext = pState->papContexts[cid];
    28392839            VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    28402840        }
     
    28452845            for (cid = 0; cid < pState->cContexts; cid++)
    28462846            {
    2847                 if (pState->paContext[cid].id == cid)
     2847                if (pState->papContexts[cid]->id == cid)
    28482848                {
    2849                     pContext = &pState->paContext[cid];
     2849                    pContext = pState->papContexts[cid];
    28502850                    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    28512851                    break;
     
    31503150
    31513151#ifdef VMSVGA3D_OGL_WITH_SHARED_CTX
    3152     if (idPrevCtx < pState->cContexts && pState->paContext[idPrevCtx].id == idPrevCtx)
    3153         VMSVGA3D_SET_CURRENT_CONTEXT(pState, &pState->paContext[idPrevCtx]);
     3152    if (idPrevCtx < pState->cContexts && pState->papContexts[idPrevCtx]->id == idPrevCtx)
     3153        VMSVGA3D_SET_CURRENT_CONTEXT(pState, pState->papContexts[idPrevCtx]);
    31543154#endif
    31553155    return VINF_SUCCESS;
     
    31973197
    31983198    if (    cid >= pState->cContexts
    3199         ||  pState->paContext[cid].id != cid)
     3199        ||  pState->papContexts[cid]->id != cid)
    32003200    {
    32013201        Log(("vmsvga3dSurfaceStretchBlt invalid context id!\n"));
    32023202        AssertFailedReturn(VERR_INVALID_PARAMETER);
    32033203    }
    3204     pContext = &pState->paContext[cid];
     3204    pContext = pState->papContexts[cid];
    32053205    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    32063206#endif
     
    34773477        uint32_t cid = pSurface->idAssociatedContext;
    34783478        if (    cid >= pState->cContexts
    3479             ||  pState->paContext[cid].id != cid)
    3480         {
    3481             Log(("vmsvga3dSurfaceDMA invalid context id (%x - %x)!\n", cid, (cid >= pState->cContexts) ? -1 : pState->paContext[cid].id));
     3479            ||  pState->papContexts[cid]->id != cid)
     3480        {
     3481            Log(("vmsvga3dSurfaceDMA invalid context id (%x - %x)!\n", cid, (cid >= pState->cContexts) ? -1 : pState->papContexts[cid]->id));
    34823482            AssertFailedReturn(VERR_INVALID_PARAMETER);
    34833483        }
    3484         PVMSVGA3DCONTEXT pContext = &pState->paContext[cid];
     3484        PVMSVGA3DCONTEXT pContext = pState->papContexts[cid];
    34853485#endif
    34863486        VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
     
    38303830
    38313831    if (    cid >= pState->cContexts
    3832         ||  pState->paContext[cid].id != cid)
     3832        ||  pState->papContexts[cid]->id != cid)
    38333833    {
    38343834        Log(("vmsvga3dGenerateMipmaps invalid context id!\n"));
    38353835        return VERR_INVALID_PARAMETER;
    38363836    }
    3837     pContext = &pState->paContext[cid];
     3837    pContext = pState->papContexts[cid];
    38383838    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    38393839#endif
     
    39133913
    39143914    if (    cid >= pState->cContexts
    3915         ||  pState->paContext[cid].id != cid)
     3915        ||  pState->papContexts[cid]->id != cid)
    39163916    {
    39173917        Log(("vmsvga3dCommandPresent invalid context id!\n"));
    39183918        return VERR_INVALID_PARAMETER;
    39193919    }
    3920     pContext = &pState->paContext[cid];
     3920    pContext = pState->papContexts[cid];
    39213921    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    39223922#endif
     
    42394239        if (cid >= pState->cContexts)
    42404240        {
    4241             void *pvNew = RTMemRealloc(pState->paContext, sizeof(VMSVGA3DCONTEXT) * (cid + 1));
     4241            /* Grow the array. */
     4242            uint32_t cNew = RT_ALIGN(cid + 15, 16);
     4243            void *pvNew = RTMemRealloc(pState->papContexts, sizeof(pState->papContexts[0]) * cNew);
    42424244            AssertReturn(pvNew, VERR_NO_MEMORY);
    4243             pState->paContext = (PVMSVGA3DCONTEXT)pvNew;
    4244             memset(&pState->paContext[pState->cContexts], 0, sizeof(VMSVGA3DCONTEXT) * (cid + 1 - pState->cContexts));
    4245             for (uint32_t i = pState->cContexts; i < cid + 1; i++)
    4246                 pState->paContext[i].id = SVGA3D_INVALID_ID;
    4247 
    4248             pState->cContexts = cid + 1;
     4245            pState->papContexts = (PVMSVGA3DCONTEXT *)pvNew;
     4246            while (pState->cContexts < cNew)
     4247            {
     4248                pContext = (PVMSVGA3DCONTEXT)RTMemAllocZ(sizeof(*pContext));
     4249                AssertReturn(pContext, VERR_NO_MEMORY);
     4250                pContext->id = SVGA3D_INVALID_ID;
     4251                pState->papContexts[pState->cContexts++] = pContext;
     4252            }
    42494253        }
    42504254        /* If one already exists with this id, then destroy it now. */
    4251         if (pState->paContext[cid].id != SVGA3D_INVALID_ID)
     4255        if (pState->papContexts[cid]->id != SVGA3D_INVALID_ID)
    42524256            vmsvga3dContextDestroy(pThis, cid);
    42534257
    4254         pContext = &pState->paContext[cid];
     4258        pContext = pState->papContexts[cid];
    42554259    }
    42564260
     
    42744278    PVMSVGA3DCONTEXT pSharedCtx = NULL;
    42754279    for (uint32_t i = 0; i < pState->cContexts; i++)
    4276         if (   pState->paContext[i].id != SVGA3D_INVALID_ID
     4280        if (   pState->papContexts[i]->id != SVGA3D_INVALID_ID
    42774281            && i != cid
    42784282# ifdef VBOX_VMSVGA3D_DUAL_OPENGL_PROFILE
    4279             && pState->paContext[i].fOtherProfile == RT_BOOL(fFlags & VMSVGA3D_DEF_CTX_F_OTHER_PROFILE)
     4283            && pState->papContexts[i]->fOtherProfile == RT_BOOL(fFlags & VMSVGA3D_DEF_CTX_F_OTHER_PROFILE)
    42804284# endif
    42814285           )
    42824286        {
    42834287            Log(("Sharing display lists between cid=%d and cid=%d\n", pContext->id, i));
    4284             pSharedCtx = &pState->paContext[i];
     4288            pSharedCtx = pState->papContexts[i];
    42854289            break;
    42864290        }
     
    45084512
    45094513    if (    cid < pState->cContexts
    4510         &&  pState->paContext[cid].id == cid)
    4511     {
    4512         PVMSVGA3DCONTEXT pContext = &pState->paContext[cid];
     4514        &&  pState->papContexts[cid]->id == cid)
     4515    {
     4516        PVMSVGA3DCONTEXT pContext = pState->papContexts[cid];
    45134517
    45144518        Log(("vmsvga3dContextDestroy id %x\n", cid));
     
    46444648    for (uint32_t i = 0; i < pState->cContexts; i++)
    46454649    {
    4646         PVMSVGA3DCONTEXT pContext = &pState->paContext[i];
     4650        PVMSVGA3DCONTEXT pContext = pState->papContexts[i];
    46474651        uint32_t cid = pContext->id;
    46484652
     
    46834687
    46844688    if (    cid >= pState->cContexts
    4685         ||  pState->paContext[cid].id != cid)
     4689        ||  pState->papContexts[cid]->id != cid)
    46864690    {
    46874691        Log(("vmsvga3dSetTransform invalid context id!\n"));
    46884692        return VERR_INVALID_PARAMETER;
    46894693    }
    4690     pContext = &pState->paContext[cid];
     4694    pContext = pState->papContexts[cid];
    46914695    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    46924696
     
    47904794
    47914795    if (    cid >= pState->cContexts
    4792         ||  pState->paContext[cid].id != cid)
     4796        ||  pState->papContexts[cid]->id != cid)
    47934797    {
    47944798        Log(("vmsvga3dSetZRange invalid context id!\n"));
    47954799        return VERR_INVALID_PARAMETER;
    47964800    }
    4797     pContext = &pState->paContext[cid];
     4801    pContext = pState->papContexts[cid];
    47984802    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    47994803
     
    49324936
    49334937    if (    cid >= pState->cContexts
    4934         ||  pState->paContext[cid].id != cid)
     4938        ||  pState->papContexts[cid]->id != cid)
    49354939    {
    49364940        Log(("vmsvga3dSetRenderState invalid context id!\n"));
    49374941        return VERR_INVALID_PARAMETER;
    49384942    }
    4939     pContext = &pState->paContext[cid];
     4943    pContext = pState->papContexts[cid];
    49404944    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    49414945
     
    57675771
    57685772    if (    cid >= pState->cContexts
    5769         ||  pState->paContext[cid].id != cid)
     5773        ||  pState->papContexts[cid]->id != cid)
    57705774    {
    57715775        Log(("vmsvga3dSetRenderTarget invalid context id!\n"));
    57725776        return VERR_INVALID_PARAMETER;
    57735777    }
    5774     pContext = &pState->paContext[cid];
     5778    pContext = pState->papContexts[cid];
    57755779    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    57765780
     
    58395843            VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    58405844
    5841             pContext = &pState->paContext[cid];
     5845            pContext = pState->papContexts[cid];
    58425846            VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    58435847#else
     
    60906094
    60916095    if (    cid >= pState->cContexts
    6092         ||  pState->paContext[cid].id != cid)
     6096        ||  pState->papContexts[cid]->id != cid)
    60936097    {
    60946098        Log(("vmsvga3dSetTextureState invalid context id!\n"));
    60956099        return VERR_INVALID_PARAMETER;
    60966100    }
    6097     pContext = &pState->paContext[cid];
     6101    pContext = pState->papContexts[cid];
    60986102    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    60996103
     
    63366340
    63376341    if (    cid >= pState->cContexts
    6338         ||  pState->paContext[cid].id != cid)
     6342        ||  pState->papContexts[cid]->id != cid)
    63396343    {
    63406344        Log(("vmsvga3dSetMaterial invalid context id!\n"));
    63416345        return VERR_INVALID_PARAMETER;
    63426346    }
    6343     pContext = &pState->paContext[cid];
     6347    pContext = pState->papContexts[cid];
    63446348    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    63456349
     
    63896393
    63906394    if (    cid >= pState->cContexts
    6391         ||  pState->paContext[cid].id != cid)
     6395        ||  pState->papContexts[cid]->id != cid)
    63926396    {
    63936397        Log(("vmsvga3dSetLightData invalid context id!\n"));
    63946398        return VERR_INVALID_PARAMETER;
    63956399    }
    6396     pContext = &pState->paContext[cid];
     6400    pContext = pState->papContexts[cid];
    63976401    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    63986402
     
    65686572
    65696573    if (    cid >= pState->cContexts
    6570         ||  pState->paContext[cid].id != cid)
     6574        ||  pState->papContexts[cid]->id != cid)
    65716575    {
    65726576        Log(("vmsvga3dSetLightEnabled invalid context id!\n"));
    65736577        return VERR_INVALID_PARAMETER;
    65746578    }
    6575     pContext = &pState->paContext[cid];
     6579    pContext = pState->papContexts[cid];
    65766580    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    65776581
     
    66056609
    66066610    if (    cid >= pState->cContexts
    6607         ||  pState->paContext[cid].id != cid)
     6611        ||  pState->papContexts[cid]->id != cid)
    66086612    {
    66096613        Log(("vmsvga3dSetViewPort invalid context id!\n"));
    66106614        return VERR_INVALID_PARAMETER;
    66116615    }
    6612     pContext = &pState->paContext[cid];
     6616    pContext = pState->papContexts[cid];
    66136617    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    66146618
     
    66536657
    66546658    if (    cid >= pState->cContexts
    6655         ||  pState->paContext[cid].id != cid)
     6659        ||  pState->papContexts[cid]->id != cid)
    66566660    {
    66576661        Log(("vmsvga3dSetClipPlane invalid context id!\n"));
    66586662        return VERR_INVALID_PARAMETER;
    66596663    }
    6660     pContext = &pState->paContext[cid];
     6664    pContext = pState->papContexts[cid];
    66616665    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    66626666
     
    66866690
    66876691    if (    cid >= pState->cContexts
    6688         ||  pState->paContext[cid].id != cid)
     6692        ||  pState->papContexts[cid]->id != cid)
    66896693    {
    66906694        Log(("vmsvga3dSetScissorRect invalid context id!\n"));
    66916695        return VERR_INVALID_PARAMETER;
    66926696    }
    6693     pContext = &pState->paContext[cid];
     6697    pContext = pState->papContexts[cid];
    66946698    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    66956699
     
    67256729
    67266730    if (    cid >= pState->cContexts
    6727         ||  pState->paContext[cid].id != cid)
     6731        ||  pState->papContexts[cid]->id != cid)
    67286732    {
    67296733        Log(("vmsvga3dCommandClear invalid context id!\n"));
    67306734        return VERR_INVALID_PARAMETER;
    67316735    }
    6732     pContext = &pState->paContext[cid];
     6736    pContext = pState->papContexts[cid];
    67336737    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    67346738
     
    71757179
    71767180    if (    cid >= pState->cContexts
    7177         ||  pState->paContext[cid].id != cid)
     7181        ||  pState->papContexts[cid]->id != cid)
    71787182    {
    71797183        Log(("vmsvga3dDrawPrimitives invalid context id!\n"));
    71807184        return VERR_INVALID_PARAMETER;
    71817185    }
    7182     pContext = &pState->paContext[cid];
     7186    pContext = pState->papContexts[cid];
    71837187    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    71847188
     
    72807284                VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
    72817285
    7282                 pContext = &pState->paContext[cid];
     7286                pContext = pState->papContexts[cid];
    72837287                VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    72847288#endif
     
    74187422
    74197423    if (    cid >= pState->cContexts
    7420         ||  pState->paContext[cid].id != cid)
     7424        ||  pState->papContexts[cid]->id != cid)
    74217425    {
    74227426        Log(("vmsvga3dShaderDefine invalid context id!\n"));
    74237427        return VERR_INVALID_PARAMETER;
    74247428    }
    7425     pContext = &pState->paContext[cid];
     7429    pContext = pState->papContexts[cid];
    74267430    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    74277431
     
    74317435        if (shid >= pContext->cVertexShaders)
    74327436        {
    7433             void *pvNew = RTMemRealloc(pContext->paVertexShader, sizeof(VMSVGA3DSHADER) * (shid + 1))
     7437            void *pvNew = RTMemRealloc(pContext->paVertexShader, sizeof(VMSVGA3DSHADER) * (shid + 1));
    74347438            AssertReturn(pvNew, VERR_NO_MEMORY);
    74357439            pContext->paVertexShader = (PVMSVGA3DSHADER)pvNew;
     
    75187522
    75197523    if (    cid >= pState->cContexts
    7520         ||  pState->paContext[cid].id != cid)
     7524        ||  pState->papContexts[cid]->id != cid)
    75217525    {
    75227526        Log(("vmsvga3dShaderDestroy invalid context id!\n"));
    75237527        return VERR_INVALID_PARAMETER;
    75247528    }
    7525     pContext = &pState->paContext[cid];
     7529    pContext = pState->papContexts[cid];
    75267530    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    75277531
     
    75717575
    75727576    if (    cid >= pState->cContexts
    7573         ||  pState->paContext[cid].id != cid)
     7577        ||  pState->papContexts[cid]->id != cid)
    75747578    {
    75757579        Log(("vmsvga3dShaderSet invalid context id!\n"));
    75767580        return VERR_INVALID_PARAMETER;
    75777581    }
    7578     pContext = &pState->paContext[cid];
     7582    pContext = pState->papContexts[cid];
    75797583    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    75807584
     
    76447648
    76457649    if (    cid >= pState->cContexts
    7646         ||  pState->paContext[cid].id != cid)
     7650        ||  pState->papContexts[cid]->id != cid)
    76477651    {
    76487652        Log(("vmsvga3dShaderSetConst invalid context id!\n"));
    76497653        return VERR_INVALID_PARAMETER;
    76507654    }
    7651     pContext = &pState->paContext[cid];
     7655    pContext = pState->papContexts[cid];
    76527656    VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    76537657
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h

    r54736 r54785  
    5252            AssertRCReturn(rc, rc);
    5353
    54             pContext = &pState->paContext[i];
     54            pContext = pState->papContexts[i];
    5555            AssertReturn(pContext->id == cid, VERR_INTERNAL_ERROR);
    5656
     
    246246    for (uint32_t i = 0; i < pState->cContexts; i++)
    247247    {
    248         PVMSVGA3DCONTEXT pContext = &pState->paContext[i];
     248        PVMSVGA3DCONTEXT pContext = pState->papContexts[i];
    249249        uint32_t cid = pContext->id;
    250250
     
    357357    for (uint32_t i = 0; i < pState->cContexts; i++)
    358358    {
    359         PVMSVGA3DCONTEXT pContext = &pState->paContext[i];
     359        PVMSVGA3DCONTEXT pContext = pState->papContexts[i];
    360360        uint32_t cid = pContext->id;
    361361
     
    539539                                        uint32_t cid = pSurface->idAssociatedContext;
    540540                                        if (    cid >= pState->cContexts
    541                                             ||  pState->paContext[cid].id != cid)
     541                                            ||  pState->papContexts[cid]->id != cid)
    542542                                        {
    543                                             Log(("vmsvga3dSaveExec invalid context id (%x - %x)!\n", cid, (cid >= pState->cContexts) ? -1 : pState->paContext[cid].id));
     543                                            Log(("vmsvga3dSaveExec invalid context id (%x - %x)!\n", cid, (cid >= pState->cContexts) ? -1 : pState->papContexts[cid]->id));
    544544                                            AssertFailedReturn(VERR_INVALID_PARAMETER);
    545545                                        }
    546                                         PVMSVGA3DCONTEXT pContext = &pState->paContext[cid];
     546                                        PVMSVGA3DCONTEXT pContext = pState->papContexts[cid];
    547547
    548548                                        hr = pSurface->bounce.pTexture->GetSurfaceLevel(i, &pDest);
     
    655655                        uint32_t cid = pSurface->idAssociatedContext;
    656656                        if (    cid >= pState->cContexts
    657                             ||  pState->paContext[cid].id != cid)
    658                         {
    659                             Log(("vmsvga3dSaveExec: invalid context id (%x - %x)!\n", cid, (cid >= pState->cContexts) ? -1 : pState->paContext[cid].id));
     657                            ||  pState->papContexts[cid]->id != cid)
     658                        {
     659                            Log(("vmsvga3dSaveExec: invalid context id (%x - %x)!\n", cid, (cid >= pState->cContexts) ? -1 : pState->papContexts[cid]->id));
    660660                            AssertFailedReturn(VERR_INVALID_PARAMETER);
    661661                        }
    662                         PVMSVGA3DCONTEXT pContext = &pState->paContext[cid];
     662                        PVMSVGA3DCONTEXT pContext = pState->papContexts[cid];
    663663                        VMSVGA3D_SET_CURRENT_CONTEXT(pState, pContext);
    664664# endif
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp

    r54783 r54785  
    343343    RTSEMEVENT              WndRequestSem;
    344344
     345    /** The size of papContexts  */
    345346    uint32_t                cContexts;
    346347    uint32_t                cSurfaces;
    347     PVMSVGA3DCONTEXT        paContext;
     348    /** Contexts indexed by ID.  Grown as needed. */
     349    PVMSVGA3DCONTEXT       *papContexts;
    348350    PVMSVGA3DSURFACE        paSurface;
    349351
     
    366368    SSMFIELD_ENTRY(                 VMSVGA3DSTATE, cContexts),
    367369    SSMFIELD_ENTRY(                 VMSVGA3DSTATE, cSurfaces),
    368     SSMFIELD_ENTRY_IGN_HCPTR(       VMSVGA3DSTATE, paContext),
     370    SSMFIELD_ENTRY_IGN_HCPTR(       VMSVGA3DSTATE, papContexts),
    369371    SSMFIELD_ENTRY_IGN_HCPTR(       VMSVGA3DSTATE, paSurface),
    370372    SSMFIELD_ENTRY_IGNORE(          VMSVGA3DSTATE, fSupportedSurfaceINTZ),
     
    600602    for (uint32_t i = 0; i < pState->cContexts; i++)
    601603    {
    602         if (pState->paContext[i].id != SVGA3D_INVALID_ID)
    603             vmsvga3dContextDestroy(pThis, pState->paContext[i].id);
     604        if (pState->papContexts[i]->id != SVGA3D_INVALID_ID)
     605            vmsvga3dContextDestroy(pThis, pState->papContexts[i]->id);
    604606    }
    605607    return VINF_SUCCESS;
     
    16181620        for (uint32_t cid = 0; cid < pState->cContexts; cid++)
    16191621        {
    1620             PVMSVGA3DCONTEXT pContext = &pState->paContext[cid];
     1622            PVMSVGA3DCONTEXT pContext = pState->papContexts[cid];
    16211623            if (pContext->id == cid)
    16221624            {
     
    18431845        cid = pSurfaceSrc->idAssociatedContext;
    18441846        if (    cid >= pState->cContexts
    1845             ||  pState->paContext[cid].id != cid)
     1847            ||  pState->papContexts[cid]->id != cid)
    18461848        {
    18471849            Log(("vmsvga3dSurfaceCopy invalid context id!\n"));
    18481850            return VERR_INVALID_PARAMETER;
    18491851        }
    1850         pContext = &pState->paContext[cid];
     1852        pContext = pState->papContexts[cid];
    18511853
    18521854        Log(("vmsvga3dSurfaceCopy: create texture surface id=%x type=%d format=%d -> create texture\n", sidDest, pSurfaceDest->flags, pSurfaceDest->format));
     
    18651867        cid = pSurfaceDest->idAssociatedContext;
    18661868        if (    cid >= pState->cContexts
    1867             ||  pState->paContext[cid].id != cid)
     1869            ||  pState->papContexts[cid]->id != cid)
    18681870        {
    18691871            Log(("vmsvga3dSurfaceCopy invalid context id!\n"));
    18701872            return VERR_INVALID_PARAMETER;
    18711873        }
    1872         pContext = &pState->paContext[cid];
     1874        pContext = pState->papContexts[cid];
    18731875
    18741876        /* Must flush the other context's 3d pipeline to make sure all drawing is complete for the surface we're about to use. */
     
    22112213
    22122214    if (    cid >= pState->cContexts
    2213         ||  pState->paContext[cid].id != cid)
     2215        ||  pState->papContexts[cid]->id != cid)
    22142216    {
    22152217        Log(("vmsvga3dSurfaceStretchBlt invalid context id!\n"));
    22162218        AssertFailedReturn(VERR_INVALID_PARAMETER);
    22172219    }
    2218     pContext = &pState->paContext[cid];
     2220    pContext = pState->papContexts[cid];
    22192221
    22202222    if (!pSurfaceSrc->u.pSurface)
     
    24582460                            uint32_t cid = pSurface->idAssociatedContext;
    24592461                            if (    cid >= pState->cContexts
    2460                                 ||  pState->paContext[cid].id != cid)
     2462                                ||  pState->papContexts[cid]->id != cid)
    24612463                            {
    2462                                 Log(("vmsvga3dSurfaceDMA invalid context id (%x - %x)!\n", cid, (cid >= pState->cContexts) ? -1 : pState->paContext[cid].id));
     2464                                Log(("vmsvga3dSurfaceDMA invalid context id (%x - %x)!\n", cid, (cid >= pState->cContexts) ? -1 : pState->papContexts[cid]->id));
    24632465                                AssertFailedReturn(VERR_INVALID_PARAMETER);
    24642466                            }
    2465                             PVMSVGA3DCONTEXT pContext = &pState->paContext[cid];
     2467                            PVMSVGA3DCONTEXT pContext = pState->papContexts[cid];
    24662468
    24672469                            /* @todo only sync when something was actually rendered (since the last sync) */
     
    25272529                            uint32_t cid = pSurface->idAssociatedContext;
    25282530                            if (    cid >= pState->cContexts
    2529                                 ||  pState->paContext[cid].id != cid)
     2531                                ||  pState->papContexts[cid]->id != cid)
    25302532                            {
    25312533                                Log(("vmsvga3dSurfaceDMA invalid context id!\n"));
    25322534                                AssertFailedReturn(VERR_INVALID_PARAMETER);
    25332535                            }
    2534                             PVMSVGA3DCONTEXT pContext = &pState->paContext[cid];
     2536                            PVMSVGA3DCONTEXT pContext = pState->papContexts[cid];
    25352537
    25362538                            Log(("vmsvga3dSurfaceDMA: sync texture from bounce buffer\n"));
     
    26942696
    26952697            if (    cid >= pState->cContexts
    2696                 ||  pState->paContext[cid].id != cid)
     2698                ||  pState->papContexts[cid]->id != cid)
    26972699            {
    26982700                Log(("vmsvga3dGenerateMipmaps invalid context id!\n"));
    26992701                return VERR_INVALID_PARAMETER;
    27002702            }
    2701             pContext = &pState->paContext[cid];
     2703            pContext = pState->papContexts[cid];
    27022704
    27032705            if (pSurface->id == 0x5e)
     
    27482750
    27492751        if (    cid >= pState->cContexts
    2750             ||  pState->paContext[cid].id != cid)
     2752            ||  pState->papContexts[cid]->id != cid)
    27512753        {
    27522754            Log(("vmsvga3dGenerateMipmaps invalid context id!\n"));
    27532755            return VERR_INVALID_PARAMETER;
    27542756        }
    2755         pContext = &pState->paContext[cid];
     2757        pContext = pState->papContexts[cid];
    27562758
    27572759        /* Unknown surface type; turn it into a texture. */
     
    28062808
    28072809    if (    cid >= pState->cContexts
    2808         ||  pState->paContext[cid].id != cid)
     2810        ||  pState->papContexts[cid]->id != cid)
    28092811    {
    28102812        Log(("vmsvga3dCommandPresent invalid context id!\n"));
    28112813        return VERR_INVALID_PARAMETER;
    28122814    }
    2813     pContext = &pState->paContext[cid];
     2815    pContext = pState->papContexts[cid];
    28142816
    28152817    hr = pContext->pDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
     
    29242926    if (cid >= pState->cContexts)
    29252927    {
    2926         void *pvNew = RTMemRealloc(pState->paContext, sizeof(VMSVGA3DCONTEXT) * (cid + 1));
     2928        /* Grow the array. */
     2929        uint32_t cNew = RT_ALIGN(cid + 15, 16);
     2930        void *pvNew = RTMemRealloc(pState->papContexts, sizeof(pState->papContexts[0]) * cNew);
    29272931        AssertReturn(pvNew, VERR_NO_MEMORY);
    2928         pState->paContext = (PVMSVGA3DCONTEXT)pvNew;
    2929         memset(&pState->paContext[pState->cContexts], 0, sizeof(VMSVGA3DCONTEXT) * (cid + 1 - pState->cContexts));
    2930         for (uint32_t i = pState->cContexts; i < cid + 1; i++)
    2931             pState->paContext[i].id = SVGA3D_INVALID_ID;
    2932 
    2933         pState->cContexts = cid + 1;
     2932        pState->papContexts = (PVMSVGA3DCONTEXT *)pvNew;
     2933        while (pState->cContexts < cNew)
     2934        {
     2935            pContext = (PVMSVGA3DCONTEXT)RTMemAllocZ(sizeof(*pContext));
     2936            AssertReturn(pContext, VERR_NO_MEMORY);
     2937            pContext->id = SVGA3D_INVALID_ID;
     2938            pState->papContexts[pState->cContexts++] = pContext;
     2939        }
    29342940    }
    29352941    /* If one already exists with this id, then destroy it now. */
    2936     if (pState->paContext[cid].id != SVGA3D_INVALID_ID)
     2942    if (pState->papContexts[cid]->id != SVGA3D_INVALID_ID)
    29372943        vmsvga3dContextDestroy(pThis, cid);
    29382944
    2939     pContext = &pState->paContext[cid];
     2945    pContext = pState->papContexts[cid];
    29402946    memset(pContext, 0, sizeof(*pContext));
    29412947    pContext->id               = cid;
     
    30343040
    30353041    if (    cid < pState->cContexts
    3036         &&  pState->paContext[cid].id == cid)
    3037     {
    3038         PVMSVGA3DCONTEXT pContext = &pState->paContext[cid];
     3042        &&  pState->papContexts[cid]->id == cid)
     3043    {
     3044        PVMSVGA3DCONTEXT pContext = pState->papContexts[cid];
    30393045
    30403046        Log(("vmsvga3dContextDestroy id %x\n", cid));
     
    31763182    for (uint32_t i = 0; i < pState->cContexts; i++)
    31773183    {
    3178         PVMSVGA3DCONTEXT pContext = &pState->paContext[i];
     3184        PVMSVGA3DCONTEXT pContext = pState->papContexts[i];
    31793185        uint32_t cid = pContext->id;
    31803186
     
    34283434
    34293435    if (    cid >= pState->cContexts
    3430         ||  pState->paContext[cid].id != cid)
     3436        ||  pState->papContexts[cid]->id != cid)
    34313437    {
    34323438        Log(("vmsvga3dSetTransform invalid context id!\n"));
    34333439        return VERR_INVALID_PARAMETER;
    34343440    }
    3435     pContext = &pState->paContext[cid];
     3441    pContext = pState->papContexts[cid];
    34363442
    34373443    switch (type)
     
    35103516
    35113517    if (    cid >= pState->cContexts
    3512         ||  pState->paContext[cid].id != cid)
     3518        ||  pState->papContexts[cid]->id != cid)
    35133519    {
    35143520        Log(("vmsvga3dSetZRange invalid context id!\n"));
    35153521        return VERR_INVALID_PARAMETER;
    35163522    }
    3517     pContext = &pState->paContext[cid];
     3523    pContext = pState->papContexts[cid];
    35183524    pContext->state.zRange = zRange;
    35193525    pContext->state.u32UpdateFlags |= VMSVGA3D_UPDATE_ZRANGE;
     
    35863592
    35873593    if (    cid >= pState->cContexts
    3588         ||  pState->paContext[cid].id != cid)
     3594        ||  pState->papContexts[cid]->id != cid)
    35893595    {
    35903596        Log(("vmsvga3dSetRenderState invalid context id!\n"));
    35913597        return VERR_INVALID_PARAMETER;
    35923598    }
    3593     pContext = &pState->paContext[cid];
     3599    pContext = pState->papContexts[cid];
    35943600
    35953601    for (unsigned i = 0; i < cRenderStates; i++)
     
    42624268
    42634269    if (    cid >= pState->cContexts
    4264         ||  pState->paContext[cid].id != cid)
     4270        ||  pState->papContexts[cid]->id != cid)
    42654271    {
    42664272        Log(("vmsvga3dSetRenderTarget invalid context id!\n"));
    42674273        return VERR_INVALID_PARAMETER;
    42684274    }
    4269     pContext = &pState->paContext[cid];
     4275    pContext = pState->papContexts[cid];
    42704276
    42714277    /* Save for vm state save/restore. */
     
    46884694
    46894695    if (    cid >= pState->cContexts
    4690         ||  pState->paContext[cid].id != cid)
     4696        ||  pState->papContexts[cid]->id != cid)
    46914697    {
    46924698        Log(("vmsvga3dSetTextureState invalid context id!\n"));
    46934699        return VERR_INVALID_PARAMETER;
    46944700    }
    4695     pContext = &pState->paContext[cid];
     4701    pContext = pState->papContexts[cid];
    46964702
    46974703    for (unsigned i = 0; i < cTextureStates; i++)
     
    49504956
    49514957    if (    cid >= pState->cContexts
    4952         ||  pState->paContext[cid].id != cid)
     4958        ||  pState->papContexts[cid]->id != cid)
    49534959    {
    49544960        Log(("vmsvga3dSetMaterial invalid context id!\n"));
    49554961        return VERR_INVALID_PARAMETER;
    49564962    }
    4957     pContext = &pState->paContext[cid];
     4963    pContext = pState->papContexts[cid];
    49584964
    49594965    AssertReturn(face < SVGA3D_FACE_MAX, VERR_INVALID_PARAMETER);
     
    50055011
    50065012    if (    cid >= pState->cContexts
    5007         ||  pState->paContext[cid].id != cid)
     5013        ||  pState->papContexts[cid]->id != cid)
    50085014    {
    50095015        Log(("vmsvga3dSetLightData invalid context id!\n"));
    50105016        return VERR_INVALID_PARAMETER;
    50115017    }
    5012     pContext = &pState->paContext[cid];
     5018    pContext = pState->papContexts[cid];
    50135019
    50145020    switch (pData->type)
     
    50835089
    50845090    if (    cid >= pState->cContexts
    5085         ||  pState->paContext[cid].id != cid)
     5091        ||  pState->papContexts[cid]->id != cid)
    50865092    {
    50875093        Log(("vmsvga3dSetLightEnabled invalid context id!\n"));
    50885094        return VERR_INVALID_PARAMETER;
    50895095    }
    5090     pContext = &pState->paContext[cid];
     5096    pContext = pState->papContexts[cid];
    50915097
    50925098    /* Store for vm state save/restore */
     
    51135119
    51145120    if (    cid >= pState->cContexts
    5115         ||  pState->paContext[cid].id != cid)
     5121        ||  pState->papContexts[cid]->id != cid)
    51165122    {
    51175123        Log(("vmsvga3dSetViewPort invalid context id!\n"));
     
    51195125    }
    51205126    /* Save for vm state save/restore. */
    5121     pContext = &pState->paContext[cid];
     5127    pContext = pState->papContexts[cid];
    51225128    pContext->state.RectViewPort = *pRect;
    51235129    pContext->state.u32UpdateFlags |= VMSVGA3D_UPDATE_VIEWPORT;
     
    51495155
    51505156    if (    cid >= pState->cContexts
    5151         ||  pState->paContext[cid].id != cid)
     5157        ||  pState->papContexts[cid]->id != cid)
    51525158    {
    51535159        Log(("vmsvga3dSetClipPlane invalid context id!\n"));
    51545160        return VERR_INVALID_PARAMETER;
    51555161    }
    5156     pContext = &pState->paContext[cid];
     5162    pContext = pState->papContexts[cid];
    51575163
    51585164    /* Store for vm state save/restore. */
     
    51775183
    51785184    if (    cid >= pState->cContexts
    5179         ||  pState->paContext[cid].id != cid)
     5185        ||  pState->papContexts[cid]->id != cid)
    51805186    {
    51815187        Log(("vmsvga3dCommandClear invalid context id!\n"));
    51825188        return VERR_INVALID_PARAMETER;
    51835189    }
    5184     pContext = &pState->paContext[cid];
     5190    pContext = pState->papContexts[cid];
    51855191
    51865192    if (clearFlag & SVGA3D_CLEAR_COLOR)
     
    53895395
    53905396    if (    cid >= pState->cContexts
    5391         ||  pState->paContext[cid].id != cid)
     5397        ||  pState->papContexts[cid]->id != cid)
    53925398    {
    53935399        Log(("vmsvga3dDrawPrimitives invalid context id!\n"));
     
    53955401    }
    53965402
    5397     pContext = &pState->paContext[cid];
     5403    pContext = pState->papContexts[cid];
    53985404
    53995405    /* Begin a scene before rendering anything. */
     
    56775683
    56785684    if (    cid >= pState->cContexts
    5679         ||  pState->paContext[cid].id != cid)
     5685        ||  pState->papContexts[cid]->id != cid)
    56805686    {
    56815687        Log(("vmsvga3dSetScissorRect invalid context id!\n"));
    56825688        return VERR_INVALID_PARAMETER;
    56835689    }
    5684     pContext = &pState->paContext[cid];
     5690    pContext = pState->papContexts[cid];
    56855691
    56865692    /* Store for vm state save/restore. */
     
    57125718
    57135719    if (    cid >= pState->cContexts
    5714         ||  pState->paContext[cid].id != cid)
     5720        ||  pState->papContexts[cid]->id != cid)
    57155721    {
    57165722        Log(("vmsvga3dShaderDefine invalid context id!\n"));
    57175723        return VERR_INVALID_PARAMETER;
    57185724    }
    5719     pContext = &pState->paContext[cid];
     5725    pContext = pState->papContexts[cid];
    57205726
    57215727    AssertReturn(shid < SVGA3D_MAX_SHADER_IDS, VERR_INVALID_PARAMETER);
     
    58115817
    58125818    if (    cid >= pState->cContexts
    5813         ||  pState->paContext[cid].id != cid)
     5819        ||  pState->papContexts[cid]->id != cid)
    58145820    {
    58155821        Log(("vmsvga3dShaderDestroy invalid context id!\n"));
    58165822        return VERR_INVALID_PARAMETER;
    58175823    }
    5818     pContext = &pState->paContext[cid];
     5824    pContext = pState->papContexts[cid];
    58195825
    58205826    if (type == SVGA3D_SHADERTYPE_VS)
     
    58625868
    58635869    if (    cid >= pState->cContexts
    5864         ||  pState->paContext[cid].id != cid)
     5870        ||  pState->papContexts[cid]->id != cid)
    58655871    {
    58665872        Log(("vmsvga3dShaderSet invalid context id!\n"));
    58675873        return VERR_INVALID_PARAMETER;
    58685874    }
    5869     pContext = &pState->paContext[cid];
     5875    pContext = pState->papContexts[cid];
    58705876
    58715877    if (type == SVGA3D_SHADERTYPE_VS)
     
    59345940
    59355941    if (    cid >= pState->cContexts
    5936         ||  pState->paContext[cid].id != cid)
     5942        ||  pState->papContexts[cid]->id != cid)
    59375943    {
    59385944        Log(("vmsvga3dShaderSetConst invalid context id!\n"));
    59395945        return VERR_INVALID_PARAMETER;
    59405946    }
    5941     pContext = &pState->paContext[cid];
     5947    pContext = pState->papContexts[cid];
    59425948
    59435949    for (uint32_t i = 0; i < cRegisters; i++)
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