Changeset 51111 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video/mp
- Timestamp:
- Apr 21, 2014 6:22:49 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 93407
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r51081 r51111 3512 3512 LOGF(("ENTER, context(0x%x)", hAdapter)); 3513 3513 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 3514 3522 switch (pBuildPagingBuffer->Operation) 3515 3523 { … … 3547 3555 if (pAlloc->AllocData.hostID) 3548 3556 { 3549 VBOXCMDVBVA_HDR *pHdr = (VBOXCMDVBVA_HDR*)pBuildPagingBuffer->pDmaBufferPrivateData;3550 3551 3557 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3552 3558 cbPrivateData = sizeof (*pHdr); … … 3556 3562 pHdr->u.u8PrimaryID = 0; 3557 3563 pHdr->u8State = VBOXCMDVBVA_STATE_SUBMITTED; 3558 pHdr->u2.complexCmdEl.u16CbCmdHost = cbPrivateData;3559 pHdr->u2.complexCmdEl.u16CbCmdGuest = cbBuffer;3560 3564 break; 3561 3565 } … … 3632 3636 pSysMemCmd->Hdr.u.u8PrimaryID = (cbBuffer >> 8) & 0xff; 3633 3637 pSysMemCmd->Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED; 3634 pSysMemCmd->Hdr.u2.complexCmdEl.u16CbCmdHost = cbPrivateData;3635 pSysMemCmd->Hdr.u2.complexCmdEl.u16CbCmdGuest = cbBuffer;3636 3638 pSysMemCmd->phCmd = 0; 3637 3639 … … 3648 3650 } 3649 3651 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)) 3651 3670 { 3652 3671 WARN(("private data too small")); … … 3654 3673 } 3655 3674 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 3656 3685 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 3671 3688 break; 3672 3689 } … … 3694 3711 Assert(cbBuffer == 0 || cbBuffer >= sizeof (VBOXCMDVBVA_PAGING_TRANSFER) || cbBuffer == VBOXWDDM_DUMMY_DMABUFFER_SIZE); 3695 3712 AssertCompile(VBOXWDDM_DUMMY_DMABUFFER_SIZE < 8); 3713 3714 pHdr->u2.complexCmdEl.u16CbCmdHost = cbPrivateData; 3715 pHdr->u2.complexCmdEl.u16CbCmdGuest = cbBuffer; 3716 3696 3717 pBuildPagingBuffer->pDmaBuffer = ((uint8_t*)pBuildPagingBuffer->pDmaBuffer) + cbBuffer; 3697 3718 pBuildPagingBuffer->pDmaBufferPrivateData = ((uint8_t*)pBuildPagingBuffer->pDmaBufferPrivateData) + cbPrivateData; … … 6248 6269 pDesc->Info.u.id = pAlloc->AllocData.hostID; 6249 6270 /* 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; 6252 6273 } 6253 6274 … … 6261 6282 { 6262 6283 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; 6265 6286 } 6266 6287 … … 6569 6590 else if (pPresent->Flags.ColorFill) 6570 6591 { 6592 #ifdef DEBUG_misha 6571 6593 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 6579 6595 6580 6596 fPatchDst = TRUE; … … 6591 6607 } 6592 6608 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 } 6604 6661 } 6605 6662 else
Note:
See TracChangeset
for help on using the changeset viewer.