Changeset 40842 in vbox for trunk/src/VBox/Additions/WINNT
- Timestamp:
- Apr 10, 2012 8:47:25 AM (13 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video/mp
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp
r38112 r40842 536 536 if (!VBoxLikesVideoMode(iDisplay, xres, yres, bpp)) 537 537 { 538 WARN (("host does not like special mode %dx%d:%d for display %d", xres, yres, bpp, iDisplay));538 WARN_NOBP(("host does not like special mode %dx%d:%d for display %d", xres, yres, bpp, iDisplay)); 539 539 return FALSE; 540 540 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPTypes.h
r40747 r40842 142 142 uint32_t iIndex; 143 143 uint32_t cOpens; 144 KSPIN_LOCK OpenLock; 144 145 LIST_ENTRY OpenList; 145 146 /* helps tracking when to release wine shared resource */ … … 287 288 PVBOXWDDM_DEVICE pDevice; 288 289 uint32_t cShRcRefs; 290 uint32_t cOpens; 289 291 } VBOXWDDM_OPENALLOCATION, *PVBOXWDDM_OPENALLOCATION; 290 292 -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r40785 r40842 49 49 { 50 50 ExFreePool(pvMem); 51 } 52 53 DECLINLINE(void) VBoxWddmOaRelease(PVBOXWDDM_OPENALLOCATION pOa) 54 { 55 PVBOXWDDM_ALLOCATION pAllocation = pOa->pAllocation; 56 KIRQL OldIrql; 57 KeAcquireSpinLock(&pAllocation->OpenLock, &OldIrql); 58 Assert(pAllocation->cOpens); 59 --pAllocation->cOpens; 60 uint32_t cOpens = --pOa->cOpens; 61 Assert(cOpens < UINT32_MAX/2); 62 if (!cOpens) 63 { 64 RemoveEntryList(&pOa->ListEntry); 65 KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql); 66 vboxWddmMemFree(pOa); 67 } 68 else 69 KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql); 70 } 71 72 DECLINLINE(PVBOXWDDM_OPENALLOCATION) VBoxWddmOaSearchLocked(PVBOXWDDM_DEVICE pDevice, PVBOXWDDM_ALLOCATION pAllocation) 73 { 74 for (PLIST_ENTRY pCur = pAllocation->OpenList.Flink; pCur != &pAllocation->OpenList; pCur = pCur->Flink) 75 { 76 PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry); 77 if (pCurOa->pDevice == pDevice) 78 { 79 return pCurOa; 80 } 81 } 82 return NULL; 83 } 84 85 DECLINLINE(PVBOXWDDM_OPENALLOCATION) VBoxWddmOaSearch(PVBOXWDDM_DEVICE pDevice, PVBOXWDDM_ALLOCATION pAllocation) 86 { 87 PVBOXWDDM_OPENALLOCATION pOa; 88 KIRQL OldIrql; 89 KeAcquireSpinLock(&pAllocation->OpenLock, &OldIrql); 90 pOa = VBoxWddmOaSearchLocked(pDevice, pAllocation); 91 KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql); 92 return pOa; 51 93 } 52 94 … … 2020 2062 pAllocation->bVisible = FALSE; 2021 2063 pAllocation->bAssigned = FALSE; 2064 KeInitializeSpinLock(&pAllocation->OpenLock); 2022 2065 InitializeListHead(&pAllocation->OpenList); 2023 2066 … … 3991 4034 } 3992 4035 3993 PVBOXWDDM_OPENALLOCATION pOa = NULL; 3994 for (PLIST_ENTRY pCur = pAlloc->OpenList.Flink; pCur != &pAlloc->OpenList; pCur = pCur->Flink) 3995 { 3996 PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry); 3997 if (pCurOa->pDevice == pDevice) 3998 { 3999 pOa = pCurOa; 4000 break; 4001 } 4002 } 4003 4036 PVBOXWDDM_OPENALLOCATION pOa = VBoxWddmOaSearch(pDevice, pAlloc); 4004 4037 if (!pOa) 4005 4038 { … … 4867 4900 } 4868 4901 4902 4903 4869 4904 /* 4870 4905 * DxgkDdiOpenAllocation … … 4916 4951 } 4917 4952 4918 PVBOXWDDM_OPENALLOCATION pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION));4919 if (!pOa)4920 {4921 WARN(("failed to allocation alloc info"));4922 Status = STATUS_INSUFFICIENT_RESOURCES;4923 break;4924 }4925 4926 4953 #ifdef DEBUG 4927 for (PLIST_ENTRY pCur = pAllocation->OpenList.Flink; pCur != &pAllocation->OpenList; pCur = pCur->Flink)4928 {4929 PVBOXWDDM_OPENALLOCATION pCurOa = CONTAINING_RECORD(pCur, VBOXWDDM_OPENALLOCATION, ListEntry);4930 if (pCurOa->pDevice == pDevice)4931 {4932 /* should not happen */4933 Assert(0);4934 break;4935 }4936 }4937 4954 Assert(!pAllocation->fAssumedDeletion); 4938 4955 #endif 4939 InsertHeadList(&pAllocation->OpenList, &pOa->ListEntry);4940 pOa->hAllocation = pInfo->hAllocation;4941 pOa->pAllocation = pAllocation;4942 pOa->pDevice = pDevice;4943 pInfo->hDeviceSpecificAllocation = pOa;4944 4945 4946 4956 if (pRcInfo) 4947 4957 { 4948 4958 Assert(pAllocation->enmType == VBOXWDDM_ALLOC_TYPE_UMD_RC_GENERIC); 4949 4959 4950 if (pInfo->PrivateDriverDataSize <sizeof (VBOXWDDM_ALLOCINFO)4960 if (pInfo->PrivateDriverDataSize != sizeof (VBOXWDDM_ALLOCINFO) 4951 4961 || !pInfo->pPrivateDriverData) 4952 4962 { 4953 4963 WARN(("invalid data size")); 4954 vboxWddmMemFree(pOa);4955 4964 Status = STATUS_INVALID_PARAMETER; 4956 4965 break; … … 4969 4978 } 4970 4979 4971 ++pAllocation->cOpens; 4980 KIRQL OldIrql; 4981 PVBOXWDDM_OPENALLOCATION pOa; 4982 KeAcquireSpinLock(&pAllocation->OpenLock, &OldIrql); 4983 pOa = VBoxWddmOaSearchLocked(pDevice, pAllocation); 4984 if (pOa) 4985 { 4986 ++pOa->cOpens; 4987 ++pAllocation->cOpens; 4988 KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql); 4989 } 4990 else 4991 { 4992 KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql); 4993 pOa = (PVBOXWDDM_OPENALLOCATION)vboxWddmMemAllocZero(sizeof (VBOXWDDM_OPENALLOCATION)); 4994 if (!pOa) 4995 { 4996 WARN(("failed to allocation alloc info")); 4997 Status = STATUS_INSUFFICIENT_RESOURCES; 4998 break; 4999 } 5000 5001 pOa->hAllocation = pInfo->hAllocation; 5002 pOa->pAllocation = pAllocation; 5003 pOa->pDevice = pDevice; 5004 pOa->cOpens = 1; 5005 5006 PVBOXWDDM_OPENALLOCATION pConcurrentOa; 5007 KeAcquireSpinLock(&pAllocation->OpenLock, &OldIrql); 5008 pConcurrentOa = VBoxWddmOaSearchLocked(pDevice, pAllocation); 5009 if (!pConcurrentOa) 5010 InsertHeadList(&pAllocation->OpenList, &pOa->ListEntry); 5011 else 5012 ++pConcurrentOa->cOpens; 5013 ++pAllocation->cOpens; 5014 KeReleaseSpinLock(&pAllocation->OpenLock, OldIrql); 5015 if (pConcurrentOa) 5016 { 5017 vboxWddmMemFree(pOa); 5018 pOa = pConcurrentOa; 5019 } 5020 } 5021 5022 pInfo->hDeviceSpecificAllocation = pOa; 4972 5023 } 4973 5024 … … 4978 5029 DXGK_OPENALLOCATIONINFO* pInfo2Free = &pOpenAllocation->pOpenAllocation[j]; 4979 5030 PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pInfo2Free->hDeviceSpecificAllocation; 4980 PVBOXWDDM_ALLOCATION pAllocation = pOa2Free->pAllocation; 4981 RemoveEntryList(&pOa2Free->ListEntry); 4982 Assert(pAllocation->cOpens); 4983 --pAllocation->cOpens; 4984 vboxWddmMemFree(pOa2Free); 5031 VBoxWddmOaRelease(pOa2Free); 4985 5032 } 4986 5033 } … … 5011 5058 PVBOXWDDM_OPENALLOCATION pOa2Free = (PVBOXWDDM_OPENALLOCATION)pCloseAllocation->pOpenHandleList[i]; 5012 5059 PVBOXWDDM_ALLOCATION pAllocation = pOa2Free->pAllocation; 5013 RemoveEntryList(&pOa2Free->ListEntry);5014 5060 Assert(pAllocation->cShRcRefs >= pOa2Free->cShRcRefs); 5015 5061 pAllocation->cShRcRefs -= pOa2Free->cShRcRefs; 5016 Assert(pAllocation->cOpens); 5017 --pAllocation->cOpens; 5018 vboxWddmMemFree(pOa2Free); 5062 VBoxWddmOaRelease(pOa2Free); 5019 5063 } 5020 5064
Note:
See TracChangeset
for help on using the changeset viewer.