VirtualBox

Ignore:
Timestamp:
Apr 21, 2014 6:22:49 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
93407
Message:

wddm/crOpenGL/DevVGA: impl missing CrCmd commands, some adjustments

File:
1 edited

Legend:

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

    r51081 r51111  
    35123512    LOGF(("ENTER, context(0x%x)", hAdapter));
    35133513
     3514    if (pBuildPagingBuffer->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR))
     3515    {
     3516        WARN(("private data too small"));
     3517        return STATUS_INVALID_PARAMETER;
     3518    }
     3519
     3520    VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBufferPrivateData;
     3521
    35143522    switch (pBuildPagingBuffer->Operation)
    35153523    {
     
    35473555            if (pAlloc->AllocData.hostID)
    35483556            {
    3549                 VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBufferPrivateData;
    3550 
    35513557                cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    35523558                cbPrivateData = sizeof (*pHdr);
     
    35563562                pHdr->u.u8PrimaryID = 0;
    35573563                pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    3558                 pHdr->u2.complexCmdEl.u16CbCmdHost = cbPrivateData;
    3559                 pHdr->u2.complexCmdEl.u16CbCmdGuest = cbBuffer;
    35603564                break;
    35613565            }
     
    36323636            pSysMemCmd->Hdr.u.u8PrimaryID = (cbBuffer >> 8) & 0xff;
    36333637            pSysMemCmd->Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    3634             pSysMemCmd->Hdr.u2.complexCmdEl.u16CbCmdHost = cbPrivateData;
    3635             pSysMemCmd->Hdr.u2.complexCmdEl.u16CbCmdGuest = cbBuffer;
    36363638            pSysMemCmd->phCmd = 0;
    36373639
     
    36483650            }
    36493651
    3650             if (pBuildPagingBuffer->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR))
     3652            if (pAlloc->AllocData.hostID || pBuildPagingBuffer->Fill.Destination.SegmentId != 1)
     3653            {
     3654                if (!pAlloc->AllocData.hostID)
     3655                {
     3656                    WARN(("unexpected segment id"));
     3657                }
     3658
     3659                cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     3660                cbPrivateData = sizeof (*pHdr);
     3661
     3662                pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD;
     3663                pHdr->u8Flags = 0;
     3664                pHdr->u.u8PrimaryID = 0;
     3665                pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
     3666                break;
     3667            }
     3668
     3669            if (pBuildPagingBuffer->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_PAGING_FILL))
    36513670            {
    36523671                WARN(("private data too small"));
     
    36543673            }
    36553674
     3675            VBOXCMDVBVA_PAGING_FILL *pFill = (VBOXCMDVBVA_PAGING_FILL*)pBuildPagingBuffer->pDmaBufferPrivateData;
     3676            pFill->Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_PAGING_FILL;
     3677            pFill->Hdr.u8Flags = 0;
     3678            pFill->Hdr.u.u8PrimaryID = 0;
     3679            pFill->Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED;
     3680            pFill->u32CbFill = (uint32_t)pBuildPagingBuffer->Fill.FillSize;
     3681            pFill->u32Pattern = pBuildPagingBuffer->Fill.FillPattern;
     3682            Assert(!pBuildPagingBuffer->Fill.Destination.SegmentAddress.HighPart);
     3683            pFill->offVRAM = pBuildPagingBuffer->Fill.Destination.SegmentAddress.LowPart;
     3684
    36563685            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
    3657 
    3658             VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBufferPrivateData;
    3659 
    3660             cbPrivateData = sizeof (*pHdr);
    3661 
    3662             pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD;
    3663             pHdr->u8Flags = 0;
    3664             pHdr->u.u8PrimaryID = 0;
    3665             pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
    3666             pHdr->u2.complexCmdEl.u16CbCmdHost = cbPrivateData;
    3667             pHdr->u2.complexCmdEl.u16CbCmdGuest = cbBuffer;
    3668 
    3669             /** @todo: add necessary bits */
    3670 //            WARN(("Impl!"));
     3686            cbPrivateData = sizeof (*pFill);
     3687
    36713688            break;
    36723689        }
     
    36943711    Assert(cbBuffer == 0 || cbBuffer >= sizeof (VBOXCMDVBVA_PAGING_TRANSFER) || cbBuffer == VBOXWDDM_DUMMY_DMABUFFER_SIZE);
    36953712    AssertCompile(VBOXWDDM_DUMMY_DMABUFFER_SIZE < 8);
     3713
     3714    pHdr->u2.complexCmdEl.u16CbCmdHost = cbPrivateData;
     3715    pHdr->u2.complexCmdEl.u16CbCmdGuest = cbBuffer;
     3716
    36963717    pBuildPagingBuffer->pDmaBuffer = ((uint8_t*)pBuildPagingBuffer->pDmaBuffer) + cbBuffer;
    36973718    pBuildPagingBuffer->pDmaBufferPrivateData = ((uint8_t*)pBuildPagingBuffer->pDmaBufferPrivateData) + cbPrivateData;
     
    62486269    pDesc->Info.u.id = pAlloc->AllocData.hostID;
    62496270    /* we do not care about wdth and height, zero them up though */
    6250     pDesc->width = 0;
    6251     pDesc->height = 0;
     6271    pDesc->u16Width = 0;
     6272    pDesc->u16Height = 0;
    62526273}
    62536274
     
    62616282{
    62626283    VBoxCVDdiFillAllocInfoOffVRAM(&pDesc->Info, pList);
    6263     pDesc->width = (uint16_t)pAlloc->AllocData.SurfDesc.width;
    6264     pDesc->height = (uint16_t)pAlloc->AllocData.SurfDesc.height;
     6284    pDesc->u16Width = (uint16_t)pAlloc->AllocData.SurfDesc.width;
     6285    pDesc->u16Height = (uint16_t)pAlloc->AllocData.SurfDesc.height;
    62656286}
    62666287
     
    65696590    else if (pPresent->Flags.ColorFill)
    65706591    {
     6592#ifdef DEBUG_misha
    65716593        WARN(("test color fill!"));
    6572 #if 0
    6573         if (pPresent->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_CLRFILL))
    6574         {
    6575             WARN(("Present->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_CLRFILL (%d)", pPresent->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_CLRFILL)));
    6576             /* @todo: can this actually happen? what status to return? */
    6577             return STATUS_INVALID_PARAMETER;
    6578         }
     6594#endif
    65796595
    65806596        fPatchDst = TRUE;
     
    65916607        }
    65926608
    6593         pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_CLRFILL;
    6594         pHdr->u8Flags = 0;
    6595         VBOXCMDVBVA_CLRFILL *pCFill = (VBOXCMDVBVA_CLRFILL*)pHdr;
    6596 
    6597         if (VBoxCVDdiFillAllocInfo(pHdr, &pCFill->dst, pDstAlloc, pDst, true))
    6598             u32DstPatch = RT_OFFSETOF(VBOXCMDVBVA_CLRFILL, dst.u.offVRAM);
    6599 
    6600         paRects = pCFill->aRects;
    6601         cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_CLRFILL, aRects);
    6602 #endif
    6603         cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     6609        if (pDstAlloc->AllocData.hostID)
     6610        {
     6611            WARN(("color fill present for texid not supported"));
     6612            pHdr->u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD;
     6613            pHdr->u8Flags = 0;
     6614            pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED;
     6615            cbPrivateData = sizeof (VBOXCMDVBVA_HDR);
     6616            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     6617        }
     6618        else
     6619        {
     6620            BOOLEAN fDstPrimary = (!pDstAlloc->AllocData.hostID
     6621                    && pDstAlloc->enmType == VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE
     6622                    && pDstAlloc->bAssigned);
     6623
     6624            if (pPresent->DmaBufferPrivateDataSize < VBOXCMDVBVA_SIZEOF_CLRFILLSTRUCT_MAX)
     6625            {
     6626                WARN(("Present->DmaBufferPrivateDataSize(%d) < VBOXCMDVBVA_SIZEOF_CLRFILLSTRUCT_MAX (%d)", pPresent->DmaBufferPrivateDataSize , VBOXCMDVBVA_SIZEOF_CLRFILLSTRUCT_MAX));
     6627                /* @todo: can this actually happen? what status to return? */
     6628                return STATUS_INVALID_PARAMETER;
     6629            }
     6630
     6631            VBOXCMDVBVA_CLRFILL_HDR *pClrFillHdr = (VBOXCMDVBVA_CLRFILL_HDR*)pHdr;
     6632
     6633            pClrFillHdr->Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_CLRFILL;
     6634            pClrFillHdr->u32Color = pPresent->Color;
     6635
     6636            if (fDstPrimary)
     6637            {
     6638                pHdr->u8Flags = VBOXCMDVBVA_OPF_CLRFILL_TYPE_PRIMARY;
     6639                pHdr->u.u8PrimaryID = pDstAlloc->AllocData.SurfDesc.VidPnSourceId;
     6640
     6641                VBOXCMDVBVA_CLRFILL_PRIMARY *pCFill = (VBOXCMDVBVA_CLRFILL_PRIMARY*)pHdr;
     6642                paRects = pCFill->aRects;
     6643                cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_CLRFILL_PRIMARY, aRects);
     6644            }
     6645            else
     6646            {
     6647                pHdr->u8Flags = VBOXCMDVBVA_OPF_CLRFILL_TYPE_GENERIC_A8R8G8B8;
     6648                pHdr->u.u8PrimaryID = 0;
     6649
     6650                VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8 *pCFill = (VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8*)pHdr;
     6651                VBoxCVDdiFillAllocInfoOffVRAM(&pCFill->dst.Info, pDst);
     6652                pCFill->dst.u16Width = (uint16_t)pDstAlloc->AllocData.SurfDesc.width;
     6653                pCFill->dst.u16Height = (uint16_t)pDstAlloc->AllocData.SurfDesc.height;
     6654                u32DstPatch = RT_OFFSETOF(VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8, dst.Info.u.offVRAM);
     6655                paRects = pCFill->aRects;
     6656                cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_CLRFILL_GENERIC_A8R8G8B8, aRects);
     6657            }
     6658
     6659            cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE;
     6660        }
    66046661    }
    66056662    else
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