VirtualBox

Changeset 50928 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 31, 2014 2:14:11 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
93073
Message:

wddm/DevVga/crOpenGL: new command submission working for 3D

Location:
trunk/src/VBox
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispKmt.cpp

    r49591 r50928  
    166166{
    167167    FreeLibrary(pCallbacks->hGdi32);
     168#ifdef DEBUG_misha
     169    memset(pCallbacks, 0, sizeof (*pCallbacks));
     170#endif
    168171    return S_OK;
    169172}
     
    319322    {
    320323        DeleteDC(pAdapter->hDc);
     324#ifdef DEBUG_misha
     325        memset(pAdapter, 0, sizeof (*pAdapter));
     326#endif
    321327        return S_OK;
    322328    }
     
    358364    if (!Status)
    359365    {
     366#ifdef DEBUG_misha
     367        memset(pDevice, 0, sizeof (*pDevice));
     368#endif
    360369        return S_OK;
    361370    }
     
    406415    Assert(!Status);
    407416    if (!Status)
    408         return S_OK;
    409     return E_FAIL;
    410 }
     417    {
     418#ifdef DEBUG_misha
     419        memset(pContext, 0, sizeof (*pContext));
     420#endif
     421        return S_OK;
     422    }
     423    return E_FAIL;
     424}
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiDisp.cpp

    r50921 r50928  
    3636    if (hr == S_OK)
    3737    {
     38#ifdef DEBUG_misha
     39        memset(pBuffer, 0, sizeof (*pBuffer));
     40#endif
    3841        RTMemFree(pBuffer);
    3942        return VINF_SUCCESS;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxUhgsmiKmt.cpp

    r50921 r50928  
    4242    if (NT_SUCCESS(Status))
    4343    {
     44#ifdef DEBUG_misha
     45        memset(pBuffer, 0, sizeof(*pBuffer));
     46#endif
    4447        RTMemFree(pBuffer);
    4548        return VINF_SUCCESS;
     
    371374                Assert(hr == S_OK);
    372375                if (hr == S_OK)
     376                {
     377#ifdef DEBUG_misha
     378                    memset(pHgsmi, 0, sizeof (*pHgsmi));
     379#endif
    373380                    return S_OK;
     381                }
    374382            }
    375383        }
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPUtils.cpp

    r46876 r50928  
    2929#ifdef DEBUG_misha
    3030/* specifies whether the vboxVDbgBreakF should break in the debugger
    31  * windbg seems to have some issues when there is a lot ( >~50) of sw breakpoints defined
     31 * windbg seems to have some issues when there is a lot ( >32) of sw breakpoints defined
    3232 * to simplify things we just insert breaks for the case of intensive debugging WDDM driver*/
    3333#ifndef VBOX_WDDM_WIN8
    34 int g_bVBoxVDbgBreakF = false;
    35 int g_bVBoxVDbgBreakFv = false;
     34int g_bVBoxVDbgBreakF = 1;
     35int g_bVBoxVDbgBreakFv = 0;
    3636#else
    37 int g_bVBoxVDbgBreakF = false;
    38 int g_bVBoxVDbgBreakFv = false;
     37int g_bVBoxVDbgBreakF = 1;
     38int g_bVBoxVDbgBreakFv = 0;
    3939#endif
    4040#endif
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp

    r50921 r50928  
    11331133    uint32_t cbInitBuffer = cbBuffer;
    11341134    uint32_t i = 0;
    1135     VBOXCMDVBVAPAGEIDX *pPageNumbers = pCmd->aPageNumbers;
    1136 
    1137     cbBuffer -= RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers);
     1135    VBOXCMDVBVAPAGEIDX *pPageNumbers = pCmd->Data.aPageNumbers;
     1136
     1137    cbBuffer -= RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, Data.aPageNumbers);
    11381138
    11391139    for (; i < cPages && cbBuffer >= sizeof (*pPageNumbers); ++i, cbBuffer -= sizeof (*pPageNumbers))
     
    11431143
    11441144    *pcPagesWritten = i;
    1145     Assert(cbInitBuffer - cbBuffer == RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers[i]));
     1145    Assert(cbInitBuffer - cbBuffer == RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, Data.aPageNumbers[i]));
    11461146    return cbInitBuffer - cbBuffer;
    11471147}
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp

    r50921 r50928  
    31093109        else
    31103110        {
     3111            Assert(!pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset);
     3112            Assert(!pSubmitCommand->DmaBufferSubmissionStartOffset);
     3113
    31113114            if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
    31123115            {
     
    31333136                return STATUS_INVALID_PARAMETER;
    31343137            }
    3135             SysMem.iPage = (VBOXCMDVBVAPAGEIDX)(pSubmitCommand->DmaBufferPhysicalAddress.QuadPart >> PAGE_SHIFT);
     3138            SysMem.phCmd = (VBOXCMDVBVAPHADDR)(pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferSubmissionStartOffset);
    31363139
    31373140            cbCmd = sizeof (SysMem);
     
    31423145    else
    31433146    {
     3147        Assert(!pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset);
     3148        Assert(!pSubmitCommand->DmaBufferSubmissionStartOffset);
     3149
    31443150        if (cbCmd < sizeof (VBOXCMDVBVA_HDR))
    31453151        {
     
    31533159        pHdr = (VBOXCMDVBVA_HDR*)((uint8_t*)pSubmitCommand->pDmaBufferPrivateData + pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset);
    31543160    }
     3161
    31553162    pHdr->u32FenceID = pSubmitCommand->SubmissionFenceId;
    31563163    int rc = VBoxCmdVbvaSubmit(pDevExt, &pDevExt->CmdVbva, pHdr, cbCmd);
     
    34133420        case DXGK_OPERATION_TRANSFER:
    34143421        {
     3422            if (!pBuildPagingBuffer->Transfer.Flags.AllocationIsIdle)
     3423            {
     3424                WARN(("allocation is not idle"));
     3425                return STATUS_GRAPHICS_ALLOCATION_BUSY;
     3426            }
     3427
     3428            Assert(!pBuildPagingBuffer->Transfer.MdlOffset);
     3429
    34153430            if ((!pBuildPagingBuffer->Transfer.Source.SegmentId) == (!pBuildPagingBuffer->Transfer.Destination.SegmentId))
    34163431            {
     
    34783493            offVRAM += pBuildPagingBuffer->Transfer.TransferOffset + (pBuildPagingBuffer->MultipassOffset << PAGE_SHIFT);
    34793494
    3480             pPaging->Alloc.u.offVRAM = offVRAM;
     3495            pPaging->Data.Alloc.u.offVRAM = offVRAM;
    34813496            if (fIn)
    34823497                pPaging->Hdr.u8Flags |= VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN;
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r50921 r50928  
    12631263}
    12641264
    1265 static int8_t vboxVDMACrCmdVbvaPagingDataInit(PVGASTATE pVGAState, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd,
     1265static int8_t vboxVDMACrCmdVbvaPagingDataInit(PVGASTATE pVGAState, const VBOXCMDVBVA_HDR *pHdr, const VBOXCMDVBVA_PAGING_TRANSFER_DATA *pData, uint32_t cbCmd,
    12661266                            const VBOXCMDVBVAPAGEIDX **ppPages, VBOXCMDVBVAPAGEIDX *pcPages,
    12671267                            uint8_t **ppu8Vram, bool *pfIn)
     
    12731273    }
    12741274
    1275     VBOXCMDVBVAPAGEIDX cPages = cbCmd - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers);
     1275    VBOXCMDVBVAPAGEIDX cPages = cbCmd - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, Data.aPageNumbers);
    12761276    if (cPages % sizeof (VBOXCMDVBVAPAGEIDX))
    12771277    {
     
    12811281    cPages /= sizeof (VBOXCMDVBVAPAGEIDX);
    12821282
    1283     VBOXCMDVBVA_PAGING_TRANSFER *pTransfer = (VBOXCMDVBVA_PAGING_TRANSFER*)pCmd;
    1284     VBOXCMDVBVAOFFSET offVRAM = pTransfer->Alloc.u.offVRAM;
     1283    VBOXCMDVBVAOFFSET offVRAM = pData->Alloc.u.offVRAM;
    12851284    if (offVRAM & PAGE_OFFSET_MASK)
    12861285    {
     
    12881287        return -1;
    12891288    }
    1290     const VBOXCMDVBVAPAGEIDX *pPages = pTransfer->aPageNumbers;
     1289    const VBOXCMDVBVAPAGEIDX *pPages = pData->aPageNumbers;
    12911290
    12921291    uint8_t * pu8VramBase = pVGAState->vram_ptrR3;
     
    13051304
    13061305    uint8_t *pu8Vram = pu8VramBase + offVRAM;
    1307     bool fIn = !!(pTransfer->Hdr.u8Flags & VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN);
     1306    bool fIn = !!(pHdr->u8Flags & VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN);
    13081307
    13091308    *ppPages = pPages;
     
    13271326            uint8_t *pu8Vram;
    13281327            bool fIn;
    1329             int8_t i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pCmd, cbCmd,
     1328            int8_t i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pCmd, &((VBOXCMDVBVA_PAGING_TRANSFER*)pCmd)->Data, cbCmd,
    13301329                                                                &pPages, &cPages,
    13311330                                                                &pu8Vram, &fIn);
     
    13801379        {
    13811380            VBOXCMDVBVA_SYSMEMCMD *pSysmemCmd = (VBOXCMDVBVA_SYSMEMCMD*)pCmd;
    1382             const VBOXCMDVBVA_HDR *pRealCmd;
     1381            const VBOXCMDVBVA_HDR *pRealCmdHdr;
    13831382            uint32_t cbRealCmd = pCmd->u8Flags;
    13841383            cbRealCmd |= (pCmd->u.u8PrimaryID << 8);
     
    13891388            }
    13901389
    1391             VBOXCMDVBVAPAGEIDX iPage = pSysmemCmd->iPage;
    1392             RTGCPHYS phPage = (RTGCPHYS)(iPage << PAGE_SHIFT);
     1390            RTGCPHYS phCmd = (RTGCPHYS)pSysmemCmd->phCmd;
    13931391
    13941392            PGMPAGEMAPLOCK Lock;
     
    13961394            PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
    13971395            const void * pvCmd;
    1398             int rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvCmd, &Lock);
     1396            int rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phCmd, 0, &pvCmd, &Lock);
    13991397            if (!RT_SUCCESS(rc))
    14001398            {
     
    14031401            }
    14041402
    1405             pRealCmd = (const VBOXCMDVBVA_HDR *)pvCmd;
    1406 
    1407             if (cbRealCmd <= PAGE_SIZE)
    1408             {
    1409                 uint8_t i8Result = vboxVDMACrCmdVbvaProcessCmdData(pVdma, pRealCmd, cbRealCmd);
     1403            Assert((phCmd & PAGE_OFFSET_MASK) == (((uintptr_t)pvCmd) & PAGE_OFFSET_MASK));
     1404
     1405            uint32_t cbCmdPart = PAGE_SIZE - (((uintptr_t)pvCmd) & PAGE_OFFSET_MASK);
     1406
     1407            if (cbRealCmd <= cbCmdPart)
     1408            {
     1409                pRealCmdHdr = (const VBOXCMDVBVA_HDR *)pvCmd;
     1410                uint8_t i8Result = vboxVDMACrCmdVbvaProcessCmdData(pVdma, pRealCmdHdr, cbRealCmd);
    14101411                PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
    14111412                return i8Result;
    14121413            }
    14131414
     1415            VBOXCMDVBVA_HDR Hdr;
     1416            const void *pvCurCmdTail;
     1417            uint32_t cbCurCmdTail;
     1418            if (cbCmdPart >= sizeof (*pRealCmdHdr))
     1419            {
     1420                pRealCmdHdr = (const VBOXCMDVBVA_HDR *)pvCmd;
     1421                pvCurCmdTail = (const void*)(pRealCmdHdr + 1);
     1422                cbCurCmdTail = cbCmdPart - sizeof (*pRealCmdHdr);
     1423            }
     1424            else
     1425            {
     1426                memcpy(&Hdr, pvCmd, cbCmdPart);
     1427                PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
     1428                phCmd += cbCmdPart;
     1429                Assert(!(phCmd & PAGE_OFFSET_MASK));
     1430                rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phCmd, 0, &pvCmd, &Lock);
     1431                if (!RT_SUCCESS(rc))
     1432                {
     1433                    WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d\n", rc));
     1434                    return -1;
     1435                }
     1436
     1437                cbCmdPart = sizeof (*pRealCmdHdr) - cbCmdPart;
     1438                memcpy(((uint8_t*)(&Hdr)) + cbCmdPart, pvCmd, cbCmdPart);
     1439                pvCurCmdTail = (const void*)(((uint8_t*)pvCmd) + cbCmdPart);
     1440                cbCurCmdTail = PAGE_SIZE - cbCmdPart;
     1441            }
     1442
     1443            if (cbCurCmdTail > cbRealCmd - sizeof (*pRealCmdHdr))
     1444                cbCurCmdTail = cbRealCmd - sizeof (*pRealCmdHdr);
     1445
    14141446            int8_t i8Result = 0;
    14151447
    1416             switch (pRealCmd->u8OpCode)
     1448            switch (pRealCmdHdr->u8OpCode)
    14171449            {
    14181450                case VBOXCMDVBVA_OPTYPE_PAGING_TRANSFER:
     
    14221454                    uint8_t *pu8Vram;
    14231455                    bool fIn;
    1424                     i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pCmd, cbCmd,
     1456                    i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pRealCmdHdr, (const VBOXCMDVBVA_PAGING_TRANSFER_DATA*)pvCurCmdTail, cbRealCmd,
    14251457                                                                        &pPages, &cPages,
    14261458                                                                        &pu8Vram, &fIn);
     
    14281460                    {
    14291461                        WARN(("vboxVDMACrCmdVbvaPagingDataInit failed %d", i8Result));
    1430                         return i8Result;
     1462                        /* we need to break, not return, to ensure currently locked page is released */
     1463                        break;
    14311464                    }
    14321465
    1433                     uint32_t cCurPages = PAGE_SIZE - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers);
    1434                     cCurPages /= sizeof (VBOXCMDVBVAPAGEIDX);
     1466                    if (cbCurCmdTail & 3)
     1467                    {
     1468                        WARN(("command is not alligned properly %d", cbCurCmdTail));
     1469                        i8Result = -1;
     1470                        /* we need to break, not return, to ensure currently locked page is released */
     1471                        break;
     1472                    }
     1473
     1474                    uint32_t cCurPages = cbCurCmdTail / sizeof (VBOXCMDVBVAPAGEIDX);
    14351475                    Assert(cCurPages < cPages);
    14361476
     
    14421482                            WARN(("vboxVDMACrCmdVbvaProcessPagingEls failed %d", rc));
    14431483                            i8Result = -1;
     1484                            /* we need to break, not return, to ensure currently locked page is released */
    14441485                            break;
    14451486                        }
     
    14531494                        PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock);
    14541495
    1455                         phPage += PAGE_SIZE;
     1496                        Assert(!(phCmd & PAGE_OFFSET_MASK));
     1497
     1498                        phCmd += PAGE_SIZE;
    14561499                        pu8Vram += (cCurPages << PAGE_SHIFT);
    14571500
    1458                         rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvCmd, &Lock);
     1501                        rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phCmd, 0, &pvCmd, &Lock);
    14591502                        if (!RT_SUCCESS(rc))
    14601503                        {
    14611504                            WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d\n", rc));
     1505                            /* the page is not locked, return */
    14621506                            return -1;
    14631507                        }
  • trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c

    r49591 r50928  
    16381638        PVBOXUHGSMI_BUFFER pBuf = _crVBoxHGSMIBufFromHdr(hgcm_buffer);
    16391639        PCRVBOXHGSMI_CLIENT pClient = (PCRVBOXHGSMI_CLIENT)pBuf->pvUserData;
    1640         pBuf->pfnUnlock(pBuf);
    16411640        _crVBoxHGSMIBufFree(pClient, pBuf);
    16421641    }
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