VirtualBox

Changeset 50913 in vbox for trunk/src


Ignore:
Timestamp:
Mar 27, 2014 5:56:50 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
93041
Message:

wddm/graphics: new command submission working for 2D, more testing needed

Location:
trunk/src/VBox
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.cpp

    r50859 r50913  
    519519    Assert(KeGetCurrentIrql() == DISPATCH_LEVEL);
    520520
    521     PVBOXMP_CRSHGSMITRANSPORT pCon;
     521    PVBOXMP_CRSHGSMITRANSPORT pCon = (PVBOXMP_CRSHGSMITRANSPORT)pvContext;
    522522    PVBOXMP_DEVEXT pDevExt = pCon->pDevExt;
    523523    VBOXCMDVBVA_CRCMD_CMD *pCmd;
     
    10311031    }
    10321032
    1033 #if 1 /*def DEBUG_misha*/
     1033#ifndef DEBUG_misha
    10341034    g_VBoxMpCrHostCaps &= ~CR_VBOX_CAP_CMDVBVA;
    10351035#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp

    r50859 r50913  
    174174static int vboxCmdVbvaCtlSubmitAsync(PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, VBOXCMDVBVA_CTL * pCtl, FNVBOXSHGSMICMDCOMPLETION pfnCompletion, void *pvCompletion)
    175175{
    176     const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepAsynch(&pHGSMICtx->heapCtx, pCtl, pfnCompletion, pvCompletion, 0);
     176    const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepAsynch(&pHGSMICtx->heapCtx, pCtl, pfnCompletion, pvCompletion, VBOXSHGSMI_FLAG_GH_ASYNCH_IRQ);
    177177    HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pHGSMICtx->heapCtx, pHdr);
    178178    if (offCmd == HGSMIOFFSET_VOID)
     
    293293    // LogFunc(("flags = 0x%08X\n", pCtx->pVBVA? pCtx->pVBVA->u32HostEvents: -1));
    294294
    295     if (   pCtx->pVBVA
    296         && (pCtx->pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED))
     295    Assert(pCtx->pVBVA);
     296    /* we do not use u32HostEvents & VBVA_F_MODE_ENABLED,
     297     * VBVA stays enabled once ENABLE call succeeds, until it is disabled with DISABLED call */
     298//    if (   pCtx->pVBVA
     299//        && (pCtx->pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED))
    297300    {
    298301        uint32_t indexRecordNext;
     
    366369}
    367370
     371DECLINLINE(bool) vboxVBVAExIsEntryInRangeOrEmpty(uint32_t u32First, uint32_t u32Entry, uint32_t u32Free)
     372{
     373    return vboxVBVAExIsEntryInRange(u32First, u32Entry, u32Free)
     374            || (    u32First == u32Entry
     375                 && u32Entry == u32Free);
     376}
    368377#ifdef DEBUG
    369378
     
    371380{
    372381    VBVABUFFER *pVBVA = pCtx->pVBVA;
    373     if (!vboxVBVAExIsEntryInRange(pCtx->indexRecordFirstUncompleted, pVBVA->indexRecordFirst, pVBVA->indexRecordFree))
     382    if (!vboxVBVAExIsEntryInRangeOrEmpty(pCtx->indexRecordFirstUncompleted, pVBVA->indexRecordFirst, pVBVA->indexRecordFree))
    374383    {
    375384        WARN(("invalid record set"));
    376385    }
    377386
    378     if (!vboxVBVAExIsEntryInRange(pCtx->off32DataUncompleted, pVBVA->off32Data, pVBVA->off32Free))
     387    if (!vboxVBVAExIsEntryInRangeOrEmpty(pCtx->off32DataUncompleted, pVBVA->off32Data, pVBVA->off32Free))
    379388    {
    380389        WARN(("invalid data set"));
     
    904913    int rc = VINF_SUCCESS;
    905914
     915    Assert(pCmd->u32FenceID);
     916
    906917    pCmd->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    907918    pVbva->u32FenceSubmitted = pCmd->u32FenceID;
    908919
    909     if (VBoxVBVAExGetSize(&pVbva->Vbva) > cbCmd)
     920    if (VBoxVBVAExGetSize(&pVbva->Vbva) < cbCmd)
    910921    {
    911922        WARN(("buffer does not fit the vbva buffer, we do not support splitting buffers"));
     
    10731084}
    10741085
    1075 
     1086#if 0
    10761087static uint32_t vboxCVDdiSysMemElBuild(VBOXCMDVBVA_SYSMEMEL *pEl, PMDL pMdl, uint32_t iPfn, uint32_t cPages)
    10771088{
     
    11031114    VBOXCMDVBVA_SYSMEMEL *pEl = pCmd->aSysMem;
    11041115
    1105     if (cbBuffer < sizeof (VBOXCMDVBVA_PAGING_TRANSFER))
    1106     {
    1107         WARN(("cbBuffer < sizeof (VBOXCMDVBVA_PAGING_TRANSFER)"));
    1108         goto done;
    1109     }
     1116    Assert(cbBuffer >= sizeof (VBOXCMDVBVA_PAGING_TRANSFER));
    11101117
    11111118    cbBuffer -= RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aSysMem);
     
    11161123    }
    11171124
    1118 done:
    11191125    *pcPagesWritten = cInitPages - cPages;
    11201126    return cbInitBuffer - cbBuffer;
    11211127}
     1128#endif
     1129
     1130uint32_t VBoxCVDdiPTransferVRamSysBuildEls(VBOXCMDVBVA_PAGING_TRANSFER *pCmd, PMDL pMdl, uint32_t iPfn, uint32_t cPages, uint32_t cbBuffer, uint32_t *pcPagesWritten)
     1131{
     1132    uint32_t cbInitBuffer = cbBuffer;
     1133    uint32_t i = 0;
     1134    VBOXCMDVBVAPAGEIDX *pPageNumbers = pCmd->aPageNumbers;
     1135
     1136    cbBuffer -= RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers);
     1137
     1138    for (; i < cPages && cbBuffer >= sizeof (*pPageNumbers); ++i, cbBuffer -= sizeof (*pPageNumbers))
     1139    {
     1140        pPageNumbers[i] = (VBOXCMDVBVAPAGEIDX)(MmGetMdlPfnArray(pMdl)[iPfn + i]);
     1141    }
     1142
     1143    *pcPagesWritten = i;
     1144    Assert(cbInitBuffer - cbBuffer == RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers[i]));
     1145    return cbInitBuffer - cbBuffer;
     1146}
     1147
    11221148
    11231149int vboxCmdVbvaConConnect(PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx,
     
    11441170        rc = pConnect->Hdr.i32Result;
    11451171        if (RT_SUCCESS(rc))
     1172        {
     1173            Assert(pConnect->Connect.Hdr.u32CmdClientId);
    11461174            *pu32ClientID = pConnect->Connect.Hdr.u32CmdClientId;
     1175        }
    11471176        else
    11481177            WARN(("VBOXCMDVBVA3DCTL_TYPE_CONNECT Disable failed %d", rc));
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r50898 r50913  
    19791979            memset(pCaps, 0, sizeof (*pCaps));
    19801980#endif
    1981 
    1982             pCaps->HighestAcceptableAddress.QuadPart = ~((uintptr_t)0);
     1981            pCaps->HighestAcceptableAddress.LowPart = ~0UL;
     1982#ifdef RT_ARCH_AMD64
     1983            /* driver talks to host in terms of page numbers when reffering to RAM
     1984             * we use uint32_t field to pass page index to host, so max would be (~0UL) << PAGE_OFFSET,
     1985             * which seems quite enough */
     1986            pCaps->HighestAcceptableAddress.HighPart = PAGE_OFFSET_MASK;
     1987#endif
    19831988            pCaps->MaxPointerWidth  = VBOXWDDM_C_POINTER_MAX_WIDTH;
    19841989            pCaps->MaxPointerHeight = VBOXWDDM_C_POINTER_MAX_HEIGHT;
     
    30953100    {
    30963101        cbCmd = pSubmitCommand->DmaBufferSubmissionEndOffset - pSubmitCommand->DmaBufferSubmissionStartOffset;
    3097         if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
    3098         {
    3099             WARN(("DmaBufferPrivateDataSubmissionEndOffset (%d) - DmaBufferPrivateDataSubmissionStartOffset (%d) < sizeof (VBOXCMDVBVA_HDR) (%d)",
    3100                     pSubmitCommand->DmaBufferPrivateDataSubmissionEndOffset,
    3101                     pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset,
    3102                     sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR)));
    3103             return STATUS_INVALID_PARAMETER;
    3104         }
    3105 
    3106         if (cbCmd > 0xffff)
    3107         {
    3108             WARN(("cbCmd too big"));
    3109             return STATUS_INVALID_PARAMETER;
    3110         }
    3111 
    3112         if (VBOXWDDM_DUMMY_DMABUFFER_SIZE == cbCmd)
     3102        if (!cbCmd || VBOXWDDM_DUMMY_DMABUFFER_SIZE == cbCmd)
    31133103        {
    31143104            SysMem.Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD;
     
    31193109        else
    31203110        {
     3111            if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
     3112            {
     3113                WARN(("DmaBufferPrivateDataSubmissionEndOffset (%d) - DmaBufferPrivateDataSubmissionStartOffset (%d) < sizeof (VBOXCMDVBVA_HDR) (%d)",
     3114                        pSubmitCommand->DmaBufferPrivateDataSubmissionEndOffset,
     3115                        pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset,
     3116                        sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR)));
     3117                return STATUS_INVALID_PARAMETER;
     3118            }
     3119
     3120            if (cbCmd > 0xffff)
     3121            {
     3122                WARN(("cbCmd too big"));
     3123                return STATUS_INVALID_PARAMETER;
     3124            }
     3125
    31213126            SysMem.Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_SYSMEMCMD;
    31223127            SysMem.Hdr.u8Flags = cbCmd & 0xff;
    31233128            SysMem.Hdr.u.u8PrimaryID = (cbCmd >> 8) & 0xff;
    31243129            SysMem.Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    3125             SysMem.phSysMem = pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferSubmissionStartOffset;
    3126             if (SysMem.phSysMem & PAGE_OFFSET_MASK)
     3130            if (pSubmitCommand->DmaBufferPhysicalAddress.QuadPart & PAGE_OFFSET_MASK)
    31273131            {
    31283132                WARN(("command should be page aligned for now"));
    31293133                return STATUS_INVALID_PARAMETER;
    31303134            }
     3135            SysMem.iPage = (VBOXCMDVBVAPAGEIDX)(pSubmitCommand->DmaBufferPhysicalAddress.QuadPart >> PAGE_SHIFT);
     3136
     3137            cbCmd = sizeof (SysMem);
    31313138        }
    31323139
    31333140        pHdr = &SysMem.Hdr;
    3134         cbCmd = sizeof (SysMem);
    31353141    }
    31363142    else
     
    34033409    LOGF(("ENTER, context(0x%x)", hAdapter));
    34043410
    3405     /* paging buffer transfer is nop for hostID allocations */
    3406     if (pBuildPagingBuffer->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR))
    3407     {
    3408         WARN(("pBuildPagingBuffer->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_HDR (%d)", pBuildPagingBuffer->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_HDR)));
    3409         /* @todo: can this actually happen? what status to return? */
    3410         return STATUS_INVALID_PARAMETER;
    3411     }
    3412 
    34133411    switch (pBuildPagingBuffer->Operation)
    34143412    {
     
    34713469            }
    34723470
    3473             uint32_t cPages = (uint32_t)((pBuildPagingBuffer->Transfer.TransferSize + 0xfff) >> PAGE_SHIFT);
    3474             uint32_t cTotalPages = cPages;
     3471            Assert(!(pBuildPagingBuffer->Transfer.TransferSize & PAGE_OFFSET_MASK));
     3472            Assert(!(offVRAM & PAGE_OFFSET_MASK));
     3473            uint32_t cPages = (uint32_t)(pBuildPagingBuffer->Transfer.TransferSize >> PAGE_SHIFT);
     3474            Assert(cPages > pBuildPagingBuffer->MultipassOffset);
    34753475            cPages -= pBuildPagingBuffer->MultipassOffset;
    3476             uint32_t iFirstPage = pBuildPagingBuffer->Transfer.MdlOffset + pBuildPagingBuffer->MultipassOffset;
     3476            uint32_t iFirstPage = pBuildPagingBuffer->MultipassOffset;
    34773477            uint32_t cPagesWritten;
    3478             offVRAM += pBuildPagingBuffer->Transfer.TransferOffset + pBuildPagingBuffer->MultipassOffset;
     3478            offVRAM += pBuildPagingBuffer->Transfer.TransferOffset + (pBuildPagingBuffer->MultipassOffset << PAGE_SHIFT);
    34793479
    34803480            pPaging->Alloc.u.offVRAM = offVRAM;
    34813481            if (fIn)
    34823482                pPaging->Hdr.u8Flags |= VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN;
    3483             cbBuffer = VBoxCVDdiPTransferVRamSysBuildEls(pPaging, pMdl, iFirstPage, cPages, pBuildPagingBuffer->DmaBufferPrivateDataSize, &cPagesWritten);
     3483            cbBuffer = VBoxCVDdiPTransferVRamSysBuildEls(pPaging, pMdl, iFirstPage, cPages, pBuildPagingBuffer->DmaSize, &cPagesWritten);
    34843484            if (cPagesWritten != cPages)
    34853485                pBuildPagingBuffer->MultipassOffset += cPagesWritten;
     
    35003500            /** @todo: add necessary bits */
    35013501            WARN(("Impl!"));
     3502            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    35023503            break;
    35033504        }
     
    35103511                return STATUS_INVALID_PARAMETER;
    35113512            }
     3513            WARN(("Do we need to do anything here?"));
    35123514            break;
    35133515        }
     
    35213523    Assert(!cbPrivateData);
    35223524
     3525    Assert(pBuildPagingBuffer->Operation == DXGK_OPERATION_DISCARD_CONTENT || cbBuffer);
    35233526    pBuildPagingBuffer->pDmaBuffer = ((uint8_t*)pBuildPagingBuffer->pDmaBuffer) + cbBuffer;
    35243527    pBuildPagingBuffer->pDmaBufferPrivateData = ((uint8_t*)pBuildPagingBuffer->pDmaBufferPrivateData) + cbPrivateData;
     
    60886091//    LOGF(("ENTER, hContext(0x%x)", hContext));
    60896092
    6090     vboxVDbgBreakFv();
     6093    vboxVDbgBreakF();
    60916094
    60926095    PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)hContext;
    60936096    PVBOXWDDM_DEVICE pDevice = pContext->pDevice;
    60946097    PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter;
     6098    uint32_t cbBuffer = 0;
     6099    uint32_t cbPrivateData = 0;
    60956100
    60966101    if (pPresent->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR))
     
    61916196
    61926197            paRects = pBlt->aRects;
    6193             cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects);
     6198            cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects);
     6199            cbMaxRects = pPresent->DmaBufferPrivateDataSize - cbPrivateData;
    61946200        }
    61956201        else
     
    62146220
    62156221            paRects = pBlt->aRects;
    6216             cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, aRects);
    6217         }
     6222            cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, aRects);
     6223            cbMaxRects = pPresent->DmaBufferPrivateDataSize - cbPrivateData;
     6224        }
     6225
     6226        cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    62186227    }
    62196228    else if (pPresent->Flags.Flip)
     
    62476256        if (VBoxCVDdiFillAllocInfo(pHdr, &pFlip->src, pSrcAlloc, pSrc, false))
    62486257            u32SrcPatch = RT_OFFSETOF(VBOXCMDVBVA_FLIP, src.u.offVRAM);
     6258
     6259        cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     6260        cbPrivateData = sizeof (*pFlip);
    62496261    }
    62506262    else if (pPresent->Flags.ColorFill)
     
    62786290
    62796291        paRects = pCFill->aRects;
    6280         cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_CLRFILL, aRects);
     6292        cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_CLRFILL, aRects);
     6293        cbMaxRects = pPresent->DmaBufferPrivateDataSize - cbPrivateData;
     6294
     6295        cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    62816296    }
    62826297    else
     
    63006315            pPresent->MultipassOffset = 0;
    63016316
     6317        Assert(cRects);
    63026318        const RECT *paDstSubRects = &pPresent->pDstSubRects[iStartRect];
    63036319        VBoxCVDdiPackRects(paRects, paDstSubRects, cRects);
     6320        cbPrivateData += (cRects * sizeof (VBOXCMDVBVA_RECT));
    63046321    }
    63056322
     
    63246341    pHdr->u32FenceID = 0;
    63256342
    6326     pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     6343    Assert(cbBuffer);
     6344    Assert(cbPrivateData);
     6345    pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + cbBuffer;
     6346    pPresent->pDmaBufferPrivateData = ((uint8_t*)pPresent->pDmaBufferPrivateData) + cbPrivateData;
    63276347
    63286348    if (pPresent->MultipassOffset)
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r50889 r50913  
    9797    VBVAEXHOSTCTL_TYPE_HH_ENABLE,
    9898    VBVAEXHOSTCTL_TYPE_HH_TERM,
     99    VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_TERM,
    99100    VBVAEXHOSTCTL_TYPE_HH_RESET,
    100101    VBVAEXHOSTCTL_TYPE_HH_SAVESTATE,
     
    213214        else if (!fHostOnlyMode)
    214215        {
    215             if (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) > VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
     216            if (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) != VBVAEXHOSTCONTEXT_ESTATE_PAUSED)
    216217            {
    217218                pCtl = RTListGetFirst(&pCmdVbva->GuestCtlList, VBVAEXHOSTCTL, Node);
     
    965966}
    966967
     968static DECLCALLBACK(void) vboxVDMACrHgcmNotifyTerminatingDoneCb(HVBOXCRCMDCTL_NOTIFY_TERMINATING hClient)
     969{
     970    struct VBOXVDMAHOST *pVdma = hClient;
     971    Assert(pVdma->CmdVbva.i32State == VBVAEXHOSTCONTEXT_STATE_PROCESSING);
     972    int rc = VBoxVDMAThreadEventNotify(&pVdma->Thread);
     973    AssertRC(rc);
     974}
     975
     976static DECLCALLBACK(int) vboxVDMACrHgcmNotifyTerminatingCb(HVBOXCRCMDCTL_NOTIFY_TERMINATING hClient, VBOXCRCMDCTL_HGCMENABLE_DATA *pHgcmEnableData)
     977{
     978    struct VBOXVDMAHOST *pVdma = hClient;
     979    VBVAEXHOSTCTL Ctl;
     980    Ctl.enmType = VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_TERM;
     981    int rc = vdmaVBVACtlSubmitSync(pVdma, &Ctl, VBVAEXHOSTCTL_SOURCE_HOST_ANY);
     982    if (!RT_SUCCESS(rc))
     983    {
     984        WARN(("vdmaVBVACtlSubmitSync failed %d\n", rc));
     985        return rc;
     986    }
     987
     988    Assert(pVdma->CmdVbva.i32State == VBVAEXHOSTCONTEXT_STATE_PROCESSING);
     989
     990    pHgcmEnableData->hRHCmd = pVdma;
     991    pHgcmEnableData->pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand;
     992
     993    return VINF_SUCCESS;
     994}
     995
    967996static int vboxVDMACrHgcmHandleEnable(struct VBOXVDMAHOST *pVdma)
    968997{
    969998    VBOXCRCMDCTL_ENABLE Enable;
    970999    Enable.Hdr.enmType = VBOXCRCMDCTL_TYPE_ENABLE;
    971     Enable.hRHCmd = pVdma;
    972     Enable.pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand;
     1000    Enable.Data.hRHCmd = pVdma;
     1001    Enable.Data.pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand;
    9731002
    9741003    int rc = vboxVDMACrHgcmSubmitSync(pVdma, &Enable.Hdr, sizeof (Enable));
     
    10121041    if (RT_SUCCESS(rc))
    10131042    {
    1014         VBOXCRCMDCTL Ctl;
    1015         Ctl.enmType = VBOXCRCMDCTL_TYPE_DISABLE;
    1016         rc = vboxVDMACrHgcmSubmitSync(pVdma, &Ctl, sizeof (Ctl));
     1043        VBOXCRCMDCTL_DISABLE Disable;
     1044        Disable.Hdr.enmType = VBOXCRCMDCTL_TYPE_DISABLE;
     1045        Disable.Data.hNotifyTerm = pVdma;
     1046        Disable.Data.pfnNotifyTerm = vboxVDMACrHgcmNotifyTerminatingCb;
     1047        Disable.Data.pfnNotifyTermDone = vboxVDMACrHgcmNotifyTerminatingDoneCb;
     1048        rc = vboxVDMACrHgcmSubmitSync(pVdma, &Disable.Hdr, sizeof (Disable));
    10171049        if (RT_SUCCESS(rc))
    10181050        {
     
    10421074}
    10431075
    1044 static int vdmaVBVADisableProcess(struct VBOXVDMAHOST *pVdma)
     1076static int vdmaVBVADisableProcess(struct VBOXVDMAHOST *pVdma, bool fDoHgcmEnable)
    10451077{
    10461078    if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
     
    10531085    if (RT_SUCCESS(rc))
    10541086    {
    1055         /* disable is a bit tricky
    1056          * we need to ensure the host ctl commands do not come out of order
    1057          * and do not come over HGCM channel until after it is enabled */
    1058         rc = vboxVDMACrHgcmHandleEnable(pVdma);
    1059         if (RT_SUCCESS(rc))
    1060             return rc;
    1061 
    1062         PVGASTATE pVGAState = pVdma->pVGAState;
    1063         VBOXCRCMD_SVRENABLE_INFO Info;
    1064         Info.hCltScr = pVGAState->pDrv;
    1065         Info.pfnCltScrUpdateBegin = pVGAState->pDrv->pfnVBVAUpdateBegin;
    1066         Info.pfnCltScrUpdateProcess = pVGAState->pDrv->pfnVBVAUpdateProcess;
    1067         Info.pfnCltScrUpdateEnd = pVGAState->pDrv->pfnVBVAUpdateEnd;
    1068         pVdma->CrSrvInfo.pfnEnable(pVdma->CrSrvInfo.hSvr, &Info);
     1087        if (fDoHgcmEnable)
     1088        {
     1089            /* disable is a bit tricky
     1090             * we need to ensure the host ctl commands do not come out of order
     1091             * and do not come over HGCM channel until after it is enabled */
     1092            rc = vboxVDMACrHgcmHandleEnable(pVdma);
     1093            if (RT_SUCCESS(rc))
     1094                return rc;
     1095
     1096            PVGASTATE pVGAState = pVdma->pVGAState;
     1097            VBOXCRCMD_SVRENABLE_INFO Info;
     1098            Info.hCltScr = pVGAState->pDrv;
     1099            Info.pfnCltScrUpdateBegin = pVGAState->pDrv->pfnVBVAUpdateBegin;
     1100            Info.pfnCltScrUpdateProcess = pVGAState->pDrv->pfnVBVAUpdateProcess;
     1101            Info.pfnCltScrUpdateEnd = pVGAState->pDrv->pfnVBVAUpdateEnd;
     1102            pVdma->CrSrvInfo.pfnEnable(pVdma->CrSrvInfo.hSvr, &Info);
     1103        }
    10691104    }
    10701105    else
     
    10741109}
    10751110
    1076 static int vboxVDMACrHostCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd)
    1077 {
     1111static int vboxVDMACrHostCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd, bool *pfContinue)
     1112{
     1113    *pfContinue = true;
     1114
    10781115    switch (pCmd->enmType)
    10791116    {
     
    11011138        case VBVAEXHOSTCTL_TYPE_HH_TERM:
    11021139        {
    1103             int rc = vdmaVBVADisableProcess(pVdma);
     1140            int rc = vdmaVBVADisableProcess(pVdma, true);
    11041141            if (!RT_SUCCESS(rc))
    11051142            {
     
    11111148            return VINF_SUCCESS;
    11121149        }
     1150        case VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_TERM:
     1151        {
     1152            int rc = vdmaVBVADisableProcess(pVdma, false);
     1153            if (!RT_SUCCESS(rc))
     1154            {
     1155                WARN(("vdmaVBVADisableProcess failed %d\n", rc));
     1156                return rc;
     1157            }
     1158
     1159            *pfContinue = false;
     1160
     1161            return VINF_SUCCESS;
     1162        }
    11131163        case VBVAEXHOSTCTL_TYPE_HH_RESET:
    11141164        {
    1115             int rc = vdmaVBVADisableProcess(pVdma);
     1165            int rc = vdmaVBVADisableProcess(pVdma, true);
    11161166            if (!RT_SUCCESS(rc))
    11171167            {
     
    11481198            }
    11491199
    1150             return vdmaVBVADisableProcess(pVdma);
     1200            return vdmaVBVADisableProcess(pVdma, true);
    11511201        }
    11521202        default:
     
    11601210 * the direction is VRA#M - related, so fIn == true - transfer to VRAM); false - transfer from VRAM
    11611211 */
    1162 static int vboxVDMACrCmdVbvaProcessPagingEl(PPDMDEVINS pDevIns, const VBOXCMDVBVA_SYSMEMEL *pMemEl, uint8_t *pu8Vram, uint8_t *pu8VramMax, uint8_t **ppu8VramNext, bool fIn)
    1163 {
    1164     uint32_t u32Cpages = pMemEl->cPagesAfterFirst + 1;
    1165     RTGCPHYS phPage = (pMemEl->iPage1 | (pMemEl->iPage2 << 20));
     1212static int vboxVDMACrCmdVbvaProcessPagingEl(PPDMDEVINS pDevIns, VBOXCMDVBVAPAGEIDX iPage, uint8_t *pu8Vram, bool fIn)
     1213{
     1214    RTGCPHYS phPage = (RTGCPHYS)(iPage >> PAGE_SHIFT);
    11661215    PGMPAGEMAPLOCK Lock;
    1167     uint32_t cbCopy = u32Cpages * PAGE_SIZE;
    1168     uint8_t* pu8VramNext = pu8Vram + cbCopy;
    1169 
    1170     if (pu8VramNext <= pu8Vram && pu8VramNext > pu8VramMax)
    1171     {
    1172         WARN(("invalid copy size"));
    1173         return VERR_INVALID_PARAMETER;
    1174     }
    1175 
    11761216    int rc;
     1217
    11771218    if (fIn)
    11781219    {
    1179         for (uint32_t i = 0; i < u32Cpages; ++i)
    1180         {
    1181             const void * pvPage;
    1182             rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvPage, &Lock);
    1183             if (!RT_SUCCESS(rc))
    1184             {
    1185                 WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d", rc));
    1186                 return rc;
    1187             }
    1188 
    1189             memcpy(pu8Vram, pvPage, PAGE_SIZE);
    1190 
    1191             PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
    1192 
    1193             pu8Vram += PAGE_SIZE;
    1194         }
     1220        const void * pvPage;
     1221        rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvPage, &Lock);
     1222        if (!RT_SUCCESS(rc))
     1223        {
     1224            WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d", rc));
     1225            return rc;
     1226        }
     1227
     1228        memcpy(pu8Vram, pvPage, PAGE_SIZE);
     1229
     1230        PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
    11951231    }
    11961232    else
    11971233    {
    1198         for (uint32_t i = 0; i < u32Cpages; ++i)
    1199         {
    1200             void * pvPage;
    1201             rc = PDMDevHlpPhysGCPhys2CCPtr(pDevIns, phPage, 0, &pvPage, &Lock);
    1202             if (!RT_SUCCESS(rc))
    1203             {
    1204                 WARN(("PDMDevHlpPhysGCPhys2CCPtr failed %d", rc));
    1205                 return rc;
    1206             }
    1207 
    1208             memcpy(pvPage, pu8Vram, PAGE_SIZE);
    1209 
    1210             PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
    1211 
    1212             pu8Vram += PAGE_SIZE;
    1213         }
    1214     }
    1215 
    1216     if (ppu8VramNext)
    1217         *ppu8VramNext = pu8VramNext;
     1234        void * pvPage;
     1235        rc = PDMDevHlpPhysGCPhys2CCPtr(pDevIns, phPage, 0, &pvPage, &Lock);
     1236        if (!RT_SUCCESS(rc))
     1237        {
     1238            WARN(("PDMDevHlpPhysGCPhys2CCPtr failed %d", rc));
     1239            return rc;
     1240        }
     1241
     1242        memcpy(pvPage, pu8Vram, PAGE_SIZE);
     1243
     1244        PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
     1245    }
    12181246
    12191247    return VINF_SUCCESS;
    12201248}
    12211249
    1222 static int vboxVDMACrCmdVbvaProcessPagingEls(PPDMDEVINS pDevIns, const VBOXCMDVBVA_SYSMEMEL *pMemEl, uint32_t cMemEls, uint8_t *pu8Vram, uint8_t *pu8VramMax, uint8_t **ppu8VramNext, bool fIn)
    1223 {
    1224     uint8_t *pu8VramNext = pu8Vram;
    1225     for (uint32_t i = 0; i < cMemEls; ++i, ++pMemEl)
    1226     {
    1227         int rc = vboxVDMACrCmdVbvaProcessPagingEl(pDevIns, pMemEl, pu8Vram, pu8VramMax, &pu8VramNext, fIn);
     1250static int vboxVDMACrCmdVbvaProcessPagingEls(PPDMDEVINS pDevIns, const VBOXCMDVBVAPAGEIDX *piPages, uint32_t cPages, uint8_t *pu8Vram, bool fIn)
     1251{
     1252    for (uint32_t i = 0; i < cPages; ++i)
     1253    {
     1254        int rc = vboxVDMACrCmdVbvaProcessPagingEl(pDevIns, piPages[i], pu8Vram, fIn);
    12281255        if (!RT_SUCCESS(rc))
    12291256        {
     
    12331260    }
    12341261
    1235     if (ppu8VramNext)
    1236         *ppu8VramNext = pu8VramNext;
    1237 
    12381262    return VINF_SUCCESS;
    12391263}
    12401264
    12411265static int8_t vboxVDMACrCmdVbvaPagingDataInit(PVGASTATE pVGAState, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd,
    1242                             const VBOXCMDVBVA_SYSMEMEL **ppSysMem, uint32_t *pcSysMem,
    1243                             uint8_t **ppu8Vram, uint8_t **ppu8VramMax, bool *pfIn)
     1266                            const VBOXCMDVBVAPAGEIDX **ppPages, VBOXCMDVBVAPAGEIDX *pcPages,
     1267                            uint8_t **ppu8Vram, bool *pfIn)
    12441268{
    12451269    if (cbCmd < sizeof (VBOXCMDVBVA_PAGING_TRANSFER))
     
    12491273    }
    12501274
    1251     uint32_t cSysMem = cbCmd - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aSysMem);
    1252     if (cSysMem % sizeof (VBOXCMDVBVA_SYSMEMEL))
     1275    VBOXCMDVBVAPAGEIDX cPages = cbCmd - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers);
     1276    if (cPages % sizeof (VBOXCMDVBVAPAGEIDX))
    12531277    {
    12541278        WARN(("invalid cmd size"));
    12551279        return -1;
    12561280    }
    1257     cSysMem /= sizeof (VBOXCMDVBVA_SYSMEMEL);
     1281    cPages /= sizeof (VBOXCMDVBVAPAGEIDX);
    12581282
    12591283    VBOXCMDVBVA_PAGING_TRANSFER *pTransfer = (VBOXCMDVBVA_PAGING_TRANSFER*)pCmd;
     
    12641288        return -1;
    12651289    }
    1266     const VBOXCMDVBVA_SYSMEMEL *pSysMem = pTransfer->aSysMem;
     1290    const VBOXCMDVBVAPAGEIDX *pPages = pTransfer->aPageNumbers;
    12671291
    12681292    uint8_t * pu8VramBase = pVGAState->vram_ptrR3;
    12691293    uint8_t *pu8VramMax = pu8VramBase + pVGAState->vram_size;
    1270     if (pTransfer->Alloc.u.offVRAM >= pVGAState->vram_size)
     1294    if (offVRAM >= pVGAState->vram_size)
    12711295    {
    12721296        WARN(("invalid vram offset"));
     
    12741298    }
    12751299
    1276     uint8_t *pu8Vram = pu8VramBase + pTransfer->Alloc.u.offVRAM;
     1300    if (offVRAM + (cPages << PAGE_SHIFT) >= pVGAState->vram_size)
     1301    {
     1302        WARN(("invalid cPages"));
     1303        return -1;
     1304    }
     1305
     1306    uint8_t *pu8Vram = pu8VramBase + offVRAM;
    12771307    bool fIn = !!(pTransfer->Hdr.u8Flags & VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN);
    12781308
    1279     *ppSysMem = pSysMem;
    1280     *pcSysMem = cSysMem;
     1309    *ppPages = pPages;
     1310    *pcPages = cPages;
    12811311    *ppu8Vram = pu8Vram;
    1282     *ppu8VramMax = pu8VramMax;
    12831312    *pfIn = fIn;
    12841313    return 0;
     
    12941323        {
    12951324            PVGASTATE pVGAState = pVdma->pVGAState;
    1296             const VBOXCMDVBVA_SYSMEMEL *pSysMem;
    1297             uint32_t cSysMem;
     1325            const VBOXCMDVBVAPAGEIDX *pPages;
     1326            uint32_t cPages;
    12981327            uint8_t *pu8Vram;
    1299             uint8_t *pu8VramMax;
    13001328            bool fIn;
    13011329            int8_t i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pCmd, cbCmd,
    1302                                                                 &pSysMem, &cSysMem,
    1303                                                                 &pu8Vram, &pu8VramMax, &fIn);
     1330                                                                &pPages, &cPages,
     1331                                                                &pu8Vram, &fIn);
    13041332            if (i8Result < 0)
    13051333            {
     
    13091337
    13101338            PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
    1311             int rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, pSysMem, cSysMem, pu8Vram, pu8VramMax, &pu8Vram, fIn);
     1339            int rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, pPages, cPages, pu8Vram, fIn);
    13121340            if (!RT_SUCCESS(rc))
    13131341            {
     
    13401368AssertCompile(sizeof (VBOXCMDVBVA_HDR) == 8);
    13411369AssertCompile(sizeof (VBOXCMDVBVA_ALLOCINFO) == 4);
    1342 AssertCompile(sizeof (VBOXCMDVBVA_SYSMEMEL) == 8);
    1343 AssertCompile(!(PAGE_SIZE % sizeof (VBOXCMDVBVA_SYSMEMEL)));
    1344 AssertCompile(!(sizeof (VBOXCMDVBVA_PAGING_TRANSFER) % 8));
     1370AssertCompile(sizeof (VBOXCMDVBVAPAGEIDX) == 4);
     1371AssertCompile(!(PAGE_SIZE % sizeof (VBOXCMDVBVAPAGEIDX)));
    13451372
    13461373#define VBOXCMDVBVA_NUM_SYSMEMEL_PER_PAGE (PAGE_SIZE / sizeof (VBOXCMDVBVA_SYSMEMEL))
     
    13621389            }
    13631390
    1364             RTGCPHYS phPage = pSysmemCmd->phSysMem;
    1365             if (phPage & PAGE_OFFSET_MASK)
    1366             {
    1367                 WARN(("cmd address is not on page boundary\n"));
    1368                 return -1;
    1369             }
     1391            VBOXCMDVBVAPAGEIDX iPage = pSysmemCmd->iPage;
     1392            RTGCPHYS phPage = (RTGCPHYS)(iPage << PAGE_SHIFT);
    13701393
    13711394            PGMPAGEMAPLOCK Lock;
     
    13951418                case VBOXCMDVBVA_OPTYPE_PAGING_TRANSFER:
    13961419                {
    1397                     const VBOXCMDVBVA_SYSMEMEL *pSysMem;
    1398                     uint32_t cSysMem;
     1420                    const uint32_t *pPages;
     1421                    uint32_t cPages;
    13991422                    uint8_t *pu8Vram;
    1400                     uint8_t *pu8VramMax;
    14011423                    bool fIn;
    14021424                    i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pCmd, cbCmd,
    1403                                                                         &pSysMem, &cSysMem,
    1404                                                                         &pu8Vram, &pu8VramMax, &fIn);
     1425                                                                        &pPages, &cPages,
     1426                                                                        &pu8Vram, &fIn);
    14051427                    if (i8Result < 0)
    14061428                    {
     
    14091431                    }
    14101432
    1411                     uint32_t cCurSysMem = PAGE_SIZE - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aSysMem);
    1412                     cCurSysMem /= sizeof (VBOXCMDVBVA_SYSMEMEL);
    1413                     Assert(cCurSysMem < cSysMem);
     1433                    uint32_t cCurPages = PAGE_SIZE - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers);
     1434                    cCurPages /= sizeof (VBOXCMDVBVAPAGEIDX);
     1435                    Assert(cCurPages < cPages);
    14141436
    14151437                    do
    14161438                    {
    1417                         rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, pSysMem, cCurSysMem, pu8Vram, pu8VramMax, &pu8Vram, fIn);
     1439                        rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, pPages, cCurPages, pu8Vram, fIn);
    14181440                        if (!RT_SUCCESS(rc))
    14191441                        {
     
    14231445                        }
    14241446
    1425                         Assert(cSysMem >= cCurSysMem);
    1426                         cSysMem -= cCurSysMem;
    1427 
    1428                         if (!cSysMem)
     1447                        Assert(cPages >= cCurPages);
     1448                        cPages -= cCurPages;
     1449
     1450                        if (!cPages)
    14291451                            break;
    14301452
     
    14321454
    14331455                        phPage += PAGE_SIZE;
     1456                        pu8Vram += (cCurPages << PAGE_SHIFT);
    14341457
    14351458                        rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvCmd, &Lock);
     
    14401463                        }
    14411464
    1442                         if (cSysMem > VBOXCMDVBVA_NUM_SYSMEMEL_PER_PAGE)
    1443                             cCurSysMem = VBOXCMDVBVA_NUM_SYSMEMEL_PER_PAGE;
    1444                         else
    1445                             cCurSysMem = cSysMem;
     1465                        cCurPages = PAGE_SIZE / sizeof (VBOXCMDVBVAPAGEIDX);
     1466                        if (cCurPages > cPages)
     1467                            cCurPages = cPages;
    14461468                    } while (1);
    14471469                    break;
     
    20342056                VBVARaiseIrqNoWait(pVGAState, 0);
    20352057                break;
    2036             case VBVAEXHOST_DATA_TYPE_HOSTCTL:
    2037                 rc = vboxVDMACrHostCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd);
    2038                 VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc);
    2039                 break;
    20402058            case VBVAEXHOST_DATA_TYPE_GUESTCTL:
    20412059                rc = vboxVDMACrGuestCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd);
    20422060                VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc);
    20432061                break;
     2062            case VBVAEXHOST_DATA_TYPE_HOSTCTL:
     2063            {
     2064                bool fContinue = true;
     2065                rc = vboxVDMACrHostCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd, &fContinue);
     2066                VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc);
     2067                if (fContinue)
     2068                    break;
     2069            }
    20442070            case VBVAEXHOST_DATA_TYPE_NO_DATA:
    20452071                rc = VBoxVDMAThreadEventWait(&pVdma->Thread, RT_INDEFINITE_WAIT);
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h

    r50817 r50913  
    413413
    414414    CR_SERVER_RPW RpwWorker;
     415
     416    VBOXCRCMDCTL_HGCMDISABLE_DATA DisableData;
    415417
    416418    /** configuration options */
     
    573575#endif
    574576
    575 extern DECLEXPORT(int32_t) crVBoxServerHgcmEnable(HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd, PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd);
    576 extern DECLEXPORT(int32_t) crVBoxServerHgcmDisable();
     577extern DECLEXPORT(int32_t) crVBoxServerHgcmEnable(VBOXCRCMDCTL_HGCMENABLE_DATA *pData);
     578extern DECLEXPORT(int32_t) crVBoxServerHgcmDisable(VBOXCRCMDCTL_HGCMDISABLE_DATA *pData);
    577579
    578580extern int crVBoxServerHostCtl(VBOXCRCMDCTL *pCtl, uint32_t cbCtl);
  • trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp

    r50827 r50913  
    15241524                case VBOXCRCMDCTL_TYPE_DISABLE:
    15251525                {
    1526                     if (paParms->u.pointer.size != sizeof (VBOXCRCMDCTL))
     1526                    if (paParms->u.pointer.size != sizeof (VBOXCRCMDCTL_DISABLE))
    15271527                        WARN(("invalid param size"));
    1528                     int rc = crVBoxServerHgcmDisable();
     1528                    VBOXCRCMDCTL_DISABLE *pDisable = (VBOXCRCMDCTL_DISABLE*)pCtl;
     1529                    int rc = crVBoxServerHgcmDisable(&pDisable->Data);
    15291530                    if (RT_SUCCESS(rc))
    15301531                        g_u32fCrHgcmDisabled = 1;
     
    15381539                        WARN(("invalid param size"));
    15391540                    VBOXCRCMDCTL_ENABLE *pEnable = (VBOXCRCMDCTL_ENABLE*)pCtl;
    1540                     int rc = crVBoxServerHgcmEnable(pEnable->hRHCmd, pEnable->pfnRHCmd);
     1541                    int rc = crVBoxServerHgcmEnable(&pEnable->Data);
    15411542                    if (RT_SUCCESS(rc))
    15421543                        g_u32fCrHgcmDisabled = 0;
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h

    r50831 r50913  
    5151
    5252#define VBOXCRHGSMI_CMD_CHECK_COMPLETE(_pData, _rc) do { \
    53         if (CRVBOXHGSMI_CMDDATA_IS_SET(_pData)) { \
     53        if (CRVBOXHGSMI_CMDDATA_IS_HGSMICMD(_pData)) { \
    5454            VBOXCRHGSMI_CMD_COMPLETE(_pData, _rc); \
    5555        } \
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c

    r50831 r50913  
    8484{
    8585    CRClient *pClient = NULL;
    86     int32_t i;
    8786
    8887    pClient = crVBoxServerClientById(u32ClientID);
     
    158157
    159158    tearingdown = 1;
     159
     160    if (cr_server.DisableData.hNotifyTerm)
     161    {
     162        VBOXCRCMDCTL_HGCMENABLE_DATA EnableData;
     163        int rc = cr_server.DisableData.pfnNotifyTerm(cr_server.DisableData.hNotifyTerm, &EnableData);
     164        if (!RT_SUCCESS(rc))
     165        {
     166            WARN(("pfnNotifyTerm failed %d", rc));
     167            return;
     168        }
     169
     170        rc = crVBoxServerHgcmEnable(&EnableData);
     171        if (!RT_SUCCESS(rc))
     172        {
     173            WARN(("crVBoxServerHgcmEnable failed %d", rc));
     174            return;
     175        }
     176
     177        cr_server.DisableData.pfnNotifyTermDone(cr_server.DisableData.hNotifyTerm);
     178    }
    160179
    161180    crStateSetCurrent( NULL );
     
    29752994        {
    29762995            spuCtx = cr_server.MainContextInfo.SpuContext;
    2977             spuWindow = pMural->CreateInfo.realVisualBits;
     2996            spuWindow = pMural->spuWindow;
    29782997        }
    29792998    }
     
    30143033    cParams = cBuffers-1;
    30153034
    3016     if (cbCmd != RT_OFFSETOF(VBOXCMDVBVA_CRCMD_CMD, aBuffers[cBuffers]))
     3035    if (cbCmd < RT_OFFSETOF(VBOXCMDVBVA_CRCMD_CMD, aBuffers[cBuffers]))
    30173036    {
    30183037        WARN(("invalid buffer size"));
     
    33633382                    rc = CrHTablePutToSlot(&cr_server.clientTable, u32ClientId, pClient);
    33643383                    if (RT_SUCCESS(rc))
     3384                    {
     3385                        pConnect->Hdr.u32CmdClientId = u32ClientId;
    33653386                        return VINF_SUCCESS;
     3387                    }
    33663388                    else
    33673389                        WARN(("CrHTablePutToSlot failed %d", rc));
     
    34543476static DECLCALLBACK(int8_t) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd)
    34553477{
    3456     AssertFailed();
    34573478    switch (pCmd->u8OpCode)
    34583479    {
     
    38843905}
    38853906
    3886 int32_t crVBoxServerHgcmEnable(HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd, PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd)
     3907int32_t crVBoxServerHgcmEnable(VBOXCRCMDCTL_HGCMENABLE_DATA *pData)
    38873908{
    38883909    int rc = VINF_SUCCESS;
    38893910    uint8_t* pCtl;
    38903911    uint32_t cbCtl;
     3912    HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd = pData->hRHCmd;
     3913    PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd = pData->pfnRHCmd;
    38913914
    38923915    Assert(!cr_server.fCrCmdEnabled);
     
    39083931}
    39093932
    3910 int32_t crVBoxServerHgcmDisable()
     3933int32_t crVBoxServerHgcmDisable(VBOXCRCMDCTL_HGCMDISABLE_DATA *pData)
    39113934{
    39123935    Assert(!cr_server.fCrCmdEnabled);
     
    39203943    cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0);
    39213944
     3945    cr_server.DisableData = *pData;
     3946
    39223947    return VINF_SUCCESS;
    39233948}
  • trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp

    r50831 r50913  
    372372                        pCopyRect->yBottom - pCopyRect->yTop,
    373373                        pu8Src,
    374                         fSrcInvert ? -pSrc->pitch : pSrc->pitch,
     374                        fSrcInvert ? -((GLint)pSrc->pitch) : pSrc->pitch,
    375375                        UnscaledSrcWidth,
    376376                        UnscaledSrcHeight
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