Changeset 50987 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video
- Timestamp:
- Apr 7, 2014 5:08:07 PM (11 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPDevExt.h
r50940 r50987 244 244 } 245 245 246 /* 128 MB */ 247 DECLINLINE(ULONG) vboxWddmVramCpuInvisibleSegmentSize(PVBOXMP_DEVEXT pDevExt) 248 { 249 return 128 * 1024 * 1024; 250 } 251 246 252 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 247 DECLINLINE(ULONG) vboxWddmVramCpuInvisibleSegmentSize(PVBOXMP_DEVEXT pDevExt)248 {249 return vboxWddmVramCpuVisibleSegmentSize(pDevExt);250 }251 253 252 254 DECLINLINE(bool) vboxWddmCmpSurfDescsBase(VBOXWDDM_SURFACE_DESC *pDesc1, VBOXWDDM_SURFACE_DESC *pDesc2) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVdma.cpp
r50940 r50987 652 652 { 653 653 PVBOXWDDM_ALLOCATION pAlloc = pCF->Alloc.pAlloc; 654 Assert(pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID); 655 if (pAlloc->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID) 654 if (pAlloc->AllocData.Addr.SegmentId && pAlloc->AllocData.Addr.SegmentId != 1) 655 { 656 WARN(("request to collor fill invalid allocation")); 657 return STATUS_INVALID_PARAMETER; 658 } 659 660 VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAlloc->AllocData.Addr); 661 if (offVram != VBOXVIDEOOFFSET_VOID) 656 662 { 657 663 RECT UnionRect = {0}; 658 uint8_t *pvMem = pDevExt->pvVisibleVram + pAlloc->AllocData.Addr.offVram;664 uint8_t *pvMem = pDevExt->pvVisibleVram + offVram; 659 665 UINT bpp = pAlloc->AllocData.SurfDesc.bpp; 660 666 Assert(bpp); … … 721 727 } 722 728 } 729 else 730 WARN(("invalid offVram")); 723 731 } 724 732 … … 743 751 enmSrcFormat = pSrcAlloc->SurfDesc.format; 744 752 enmDstFormat = pDstAlloc->SurfDesc.format; 753 754 if (pDstAlloc->Addr.SegmentId && pDstAlloc->Addr.SegmentId != 1) 755 { 756 WARN(("request to collor blit invalid allocation")); 757 return STATUS_INVALID_PARAMETER; 758 } 759 760 if (pSrcAlloc->Addr.SegmentId && pSrcAlloc->Addr.SegmentId != 1) 761 { 762 WARN(("request to collor blit invalid allocation")); 763 return STATUS_INVALID_PARAMETER; 764 } 745 765 746 766 if (enmSrcFormat != enmDstFormat) … … 2035 2055 return STATUS_INVALID_PARAMETER; 2036 2056 2037 Assert(pSource->pPrimaryAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);2038 Assert(pSource->pShadowAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID);2039 if (pSource->pPrimaryAllocation->AllocData.Addr.offVram == VBOXVIDEOOFFSET_VOID)2057 if (vboxWddmAddrFramOffset(&pSource->pPrimaryAllocation->AllocData.Addr) == VBOXVIDEOOFFSET_VOID) 2058 { 2059 WARN(("invalid primary")); 2040 2060 return STATUS_INVALID_PARAMETER; 2041 if (pSource->pShadowAllocation->AllocData.Addr.offVram == VBOXVIDEOOFFSET_VOID) 2061 } 2062 if (vboxWddmAddrFramOffset(&pSource->pShadowAllocation->AllocData.Addr) == VBOXVIDEOOFFSET_VOID) 2063 { 2064 WARN(("invalid secondary")); 2042 2065 return STATUS_INVALID_PARAMETER; 2066 } 2043 2067 2044 2068 NTSTATUS Status = vboxVdmaGgDmaBltPerform(pDevExt, &pSource->pShadowAllocation->AllocData, pRect, &pSource->pPrimaryAllocation->AllocData, pRect); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVhwa.cpp
r44529 r50987 538 538 memset(pInfo, 0, sizeof(VBOXVHWA_SURFACEDESC)); 539 539 540 if (pSurf->AllocData.Addr.SegmentId != 1) 541 { 542 WARN(("invalid segment id!")); 543 return VERR_INVALID_PARAMETER; 544 } 545 540 546 pInfo->height = pSurf->AllocData.SurfDesc.height; 541 547 pInfo->width = pSurf->AllocData.SurfDesc.width; … … 814 820 Assert(pOverlay->pCurentAlloc != pAlloc); 815 821 int rc = VINF_SUCCESS; 822 823 if (pFbSurf->AllocData.Addr.SegmentId != 1) 824 { 825 WARN(("invalid segment id on flip")); 826 return VERR_INVALID_PARAMETER; 827 } 828 816 829 if (pFlipInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAYFLIP_INFO)) 817 830 { … … 889 902 } 890 903 #endif 904 905 if (pAlloc->AllocData.Addr.SegmentId != 1) 906 { 907 WARN(("invalid segment id on color fill")); 908 return VERR_INVALID_PARAMETER; 909 } 910 891 911 Assert(pAlloc->hHostHandle); 892 912 Assert(pAlloc->pResource); … … 971 991 Assert(pFbSurf->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID); 972 992 int rc = VINF_SUCCESS; 993 994 if (pFbSurf->AllocData.Addr.SegmentId != 1) 995 { 996 WARN(("invalid segment id on overlay update")); 997 return VERR_INVALID_PARAMETER; 998 } 999 973 1000 if (pOverlayInfo->PrivateDriverDataSize == sizeof (VBOXWDDM_OVERLAY_INFO)) 974 1001 { -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r50984 r50987 263 263 NTSTATUS vboxWddmGhDisplayPostInfoView(PVBOXMP_DEVEXT pDevExt, const VBOXWDDM_ALLOC_DATA *pAllocData) 264 264 { 265 VBOXVIDEOOFFSET offVram = pAllocData->Addr.offVram;265 VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAllocData->Addr); 266 266 if (offVram == VBOXVIDEOOFFSET_VOID) 267 267 { … … 300 300 return STATUS_SUCCESS; 301 301 302 if (pAllocData->Addr.offVram == VBOXVIDEOOFFSET_VOID) 303 { 304 WARN(("pAllocData->Addr.offVram == VBOXVIDEOOFFSET_VOID")); 302 VBOXVIDEOOFFSET offVram = vboxWddmAddrFramOffset(&pAllocData->Addr);; 303 if (offVram == VBOXVIDEOOFFSET_VOID) 304 { 305 WARN(("offVram == VBOXVIDEOOFFSET_VOID")); 305 306 return STATUS_UNSUCCESSFUL; 306 307 } … … 310 311 USHORT bpp = pAllocData->SurfDesc.bpp; 311 312 ULONG cbLine = VBOXWDDM_ROUNDBOUND(((width * bpp) + 7) / 8, 4); 312 ULONG yOffset = (ULONG) pAllocData->Addr.offVram / cbLine;313 ULONG xOffset = (ULONG) pAllocData->Addr.offVram % cbLine;313 ULONG yOffset = (ULONG)offVram / cbLine; 314 ULONG xOffset = (ULONG)offVram % cbLine; 314 315 315 316 if (bpp == 4) … … 413 414 pFbAlloc = pRealFbAlloc; 414 415 415 if (!pFbAlloc || pFbAlloc->AllocData.Addr.offVram== VBOXVIDEOOFFSET_VOID)416 if (!pFbAlloc || vboxWddmAddrFramOffset(&pFbAlloc->AllocData.Addr) == VBOXVIDEOOFFSET_VOID) 416 417 { 417 418 return false; … … 474 475 } 475 476 476 Assert(pToAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID); 477 Assert(pFromAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID); 478 if (pToAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID 479 && pFromAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID) 477 if (pToAllocation->AllocData.Addr.SegmentId == 1 && pToAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID 478 && pFromAllocation->AllocData.Addr.SegmentId == 1 && pFromAllocation->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID) 480 479 { 481 480 RECT Rect; … … 487 486 &pToAllocation->AllocData, &Rect); 488 487 } 488 else 489 WARN(("invalid allocation data")); 489 490 490 491 /* ensure we issue resize command on next update */ … … 1425 1426 for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 1426 1427 { 1427 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i]; 1428 PVBOXWDDM_ALLOCATION pPrimary = pSource->pPrimaryAllocation; 1429 if (pPrimary && pPrimary->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID) 1428 PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[i]; 1429 if (pTarget->fConnected) 1430 1430 { 1431 1431 memset(¬ify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA)); 1432 1432 notify.InterruptType = DXGK_INTERRUPT_CRTC_VSYNC; 1433 /* @todo: !!!this is not correct in case we want source[i]->target[i!=j] mapping */1434 1433 notify.CrtcVsync.VidPnTargetId = i; 1435 notify.CrtcVsync.PhysicalAddress.QuadPart = pPrimary->AllocData.Addr.offVram;1436 1434 pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, ¬ify); 1437 1438 1435 bNeedDpc = TRUE; 1439 1436 } … … 1596 1593 for (UINT i = 0; i < (UINT)VBoxCommonFromDeviceExt(pDevExt)->cDisplays; ++i) 1597 1594 { 1598 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[i]; 1599 PVBOXWDDM_ALLOCATION pPrimary = pSource->pPrimaryAllocation; 1600 if (pPrimary && pPrimary->AllocData.Addr.offVram != VBOXVIDEOOFFSET_VOID) 1595 PVBOXWDDM_TARGET pTarget = &pDevExt->aTargets[i]; 1596 if (pTarget->fConnected) 1601 1597 { 1602 1598 memset(¬ify, 0, sizeof(DXGKARGCB_NOTIFY_INTERRUPT_DATA)); 1603 1599 notify.InterruptType = DXGK_INTERRUPT_CRTC_VSYNC; 1604 /* @todo: !!!this is not correct in case we want source[i]->target[i!=j] mapping */1605 1600 notify.CrtcVsync.VidPnTargetId = i; 1606 notify.CrtcVsync.PhysicalAddress.QuadPart = pPrimary->AllocData.Addr.offVram;1607 1601 pDevExt->u.primary.DxgkInterface.DxgkCbNotifyInterrupt(pDevExt->u.primary.DxgkInterface.DeviceHandle, ¬ify); 1608 1609 pDevExt->bNotifyDxDpc = TRUE; 1602 bNeedDpc = TRUE; 1610 1603 } 1611 1604 } … … 2064 2057 * DXGK_QUERYSEGMENTIN *pQsIn = (DXGK_QUERYSEGMENTIN*)pQueryAdapterInfo->pInputData; */ 2065 2058 DXGK_QUERYSEGMENTOUT *pQsOut = (DXGK_QUERYSEGMENTOUT*)pQueryAdapterInfo->pOutputData; 2066 #ifdef VBOXWDDM_RENDER_FROM_SHADOW2067 2059 # define VBOXWDDM_SEGMENTS_COUNT 2 2068 #else2069 # define VBOXWDDM_SEGMENTS_COUNT 12070 #endif2071 2060 if (!pQsOut->pSegmentDescriptor) 2072 2061 { … … 2076 2065 else if (pQsOut->NbSegment != VBOXWDDM_SEGMENTS_COUNT) 2077 2066 { 2078 AssertBreakpoint(); 2079 LOGREL(("NbSegment (%d) != 1", pQsOut->NbSegment)); 2067 WARN(("NbSegment (%d) != 1", pQsOut->NbSegment)); 2080 2068 Status = STATUS_INVALID_PARAMETER; 2081 2069 } … … 2094 2082 pDr->Flags.Value = 0; 2095 2083 pDr->Flags.CpuVisible = 1; 2096 #ifdef VBOXWDDM_RENDER_FROM_SHADOW 2084 2097 2085 ++pDr; 2098 2086 /* create cpu-invisible segment of the same size */ … … 2106 2094 pDr->CommitLimit = pDr->Size; 2107 2095 pDr->Flags.Value = 0; 2108 #endif2109 2096 2110 2097 pQsOut->PagingBufferSegmentId = 0; 2111 pQsOut->PagingBufferSize = 1024;2112 pQsOut->PagingBufferPrivateDataSize = 0; /* @todo: do we need a private buffer ? */2098 pQsOut->PagingBufferSize = 0xc00; 2099 pQsOut->PagingBufferPrivateDataSize = 0; 2113 2100 } 2114 2101 } … … 2420 2407 { 2421 2408 case VBOXWDDM_ALLOC_TYPE_STD_SHAREDPRIMARYSURFACE: 2422 #if 0 //defined(VBOXWDDM_RENDER_FROM_SHADOW)2423 pAllocationInfo->SupportedReadSegmentSet = 2;2424 pAllocationInfo->SupportedWriteSegmentSet = 2;2425 #endif2426 #ifndef VBOXWDDM_RENDER_FROM_SHADOW2427 pAllocationInfo->Flags.CpuVisible = 1;2428 #endif2429 2409 break; 2430 2410 case VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC: … … 2455 2435 Assert(pAllocation->AllocData.SurfDesc.pitch); 2456 2436 Assert(pAllocation->AllocData.SurfDesc.cbSize); 2457 if (!pAllocInfo->fFlags.SharedResource) 2458 { 2459 pAllocationInfo->Flags.CpuVisible = 1; 2460 } 2461 else 2437 2438 // if (!pAllocInfo->fFlags.SharedResource && !pAllocInfo->hostID) 2439 // pAllocationInfo->Flags.CpuVisible = 1; 2440 2441 Assert(!pAllocationInfo->Flags.CpuVisible); 2442 2443 if (pAllocInfo->fFlags.SharedResource) 2462 2444 { 2463 2445 pAllocation->hSharedHandle = (HANDLE)pAllocInfo->hSharedHandle; … … 2468 2450 } 2469 2451 #endif 2452 } 2453 2454 // if (pAllocInfo->hostID) 2455 { 2456 pAllocationInfo->SupportedReadSegmentSet = 2; 2457 pAllocationInfo->SupportedWriteSegmentSet = 2; 2470 2458 } 2471 2459 } … … 3493 3481 uint32_t offVRAM; 3494 3482 BOOLEAN fIn; 3483 UINT SegmentId; 3495 3484 3496 3485 if (pBuildPagingBuffer->Transfer.Source.SegmentId) 3497 3486 { 3487 SegmentId = pBuildPagingBuffer->Transfer.Source.SegmentId; 3498 3488 Assert(!pBuildPagingBuffer->Transfer.Destination.SegmentId); 3499 3489 Assert(!pBuildPagingBuffer->Transfer.Source.SegmentAddress.HighPart); … … 3504 3494 else 3505 3495 { 3496 SegmentId = pBuildPagingBuffer->Transfer.Destination.SegmentId; 3506 3497 Assert(pBuildPagingBuffer->Transfer.Destination.SegmentId); 3507 3498 Assert(!pBuildPagingBuffer->Transfer.Source.SegmentId); … … 3510 3501 pMdl = pBuildPagingBuffer->Transfer.Source.pMdl; 3511 3502 fIn = TRUE; 3503 } 3504 3505 if (SegmentId != 1) 3506 { 3507 WARN(("SegmentId")); 3508 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3509 break; 3512 3510 } 3513 3511 … … 7168 7166 PVBOXMP_DEVEXT pDevExt = (PVBOXMP_DEVEXT)hAdapter; 7169 7167 PVBOXWDDM_SOURCE pSource = &pDevExt->aSources[pPresentDisplayOnly->VidPnSourceId]; 7170 Assert(pSource->AllocData.Addr.SegmentId );7168 Assert(pSource->AllocData.Addr.SegmentId == 1); 7171 7169 VBOXWDDM_ALLOC_DATA SrcAllocData; 7172 7170 SrcAllocData.SurfDesc.width = pPresentDisplayOnly->Pitch * pPresentDisplayOnly->BytesPerPixel; -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.h
r50940 r50987 236 236 KeReleaseSpinLock(&pSource->AllocationLock, OldIrql); 237 237 return pPrimary; 238 } 239 240 DECLINLINE(VBOXVIDEOOFFSET) vboxWddmAddrFramOffset(const VBOXWDDM_ADDR *pAddr) 241 { 242 return (pAddr->offVram != VBOXVIDEOOFFSET_VOID && pAddr->SegmentId) ? 243 (pAddr->SegmentId == 1 ? pAddr->offVram : 0) 244 : VBOXVIDEOOFFSET_VOID; 238 245 } 239 246
Note:
See TracChangeset
for help on using the changeset viewer.