Changeset 41109 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Video
- Timestamp:
- May 2, 2012 8:37:46 AM (13 years ago)
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Video
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/VBoxDispD3D.cpp
r41058 r41109 2469 2469 return hr; 2470 2470 } 2471 2472 static HRESULT vboxWddmShRcRefAlloc(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_ALLOCATION pAlloc, BOOL fAddRef, DWORD *pcRefs)2473 {2474 D3DDDICB_ESCAPE DdiEscape = {0};2475 VBOXDISPIFESCAPE_SHRC_REF Data = {0};2476 DdiEscape.hContext = pDevice->DefaultContext.ContextInfo.hContext;2477 DdiEscape.hDevice = pDevice->hDevice;2478 DdiEscape.Flags.HardwareAccess = 1;2479 DdiEscape.pPrivateDriverData = &Data;2480 DdiEscape.PrivateDriverDataSize = sizeof (Data);2481 Data.EscapeHdr.escapeCode = fAddRef ? VBOXESC_SHRC_ADDREF : VBOXESC_SHRC_RELEASE;2482 Data.hAlloc = (uint64_t)pAlloc->hAllocation;2483 HRESULT hr = pDevice->RtCallbacks.pfnEscapeCb(pDevice->pAdapter->hAdapter, &DdiEscape);2484 if (FAILED(hr))2485 {2486 WARN(("pfnEscapeCb, hr (0x%x)", hr));2487 return TRUE;2488 }2489 2490 LOG(("shrc(0x%p) refs(%d)", (void*)pAlloc->hSharedHandle, Data.EscapeHdr.u32CmdSpecific));2491 if (pcRefs)2492 *pcRefs = Data.EscapeHdr.u32CmdSpecific;2493 2494 return hr;2495 }2496 2497 static HRESULT vboxWddmShRcRefRc(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_RESOURCE pRc, BOOL fAddRef, DWORD *pcRefs)2498 {2499 Assert(pRc->RcDesc.fFlags.SharedResource);2500 DWORD cTotalRefs = 0;2501 HRESULT hr = S_OK;2502 for (DWORD i = 0; i < pRc->cAllocations; ++i)2503 {2504 DWORD cRefs = 0;2505 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i];2506 if(!pAlloc->hSharedHandle)2507 continue;2508 2509 hr = vboxWddmShRcRefAlloc(pDevice, pAlloc, fAddRef, &cRefs);2510 2511 if (FAILED(hr))2512 {2513 WARN(("vboxWddmShRcRefAlloc failed, hr()0x%x", hr));2514 for (DWORD j = 0; j < i; ++j)2515 {2516 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i];2517 if(!pAlloc->hSharedHandle)2518 continue;2519 HRESULT tmpHr = vboxWddmShRcRefAlloc(pDevice, pAlloc, !fAddRef, NULL);2520 Assert(SUCCEEDED(tmpHr));2521 }2522 return hr;2523 }2524 2525 /* success! */2526 cTotalRefs += cRefs;2527 }2528 2529 Assert(cTotalRefs || !fAddRef);2530 2531 /* success! */2532 if (pcRefs)2533 *pcRefs = cTotalRefs;2534 2535 return S_OK;2536 }2537 2538 2471 2539 2472 static HRESULT vboxWddmSwapchainChkCreateIf(PVBOXWDDMDISP_DEVICE pDevice, PVBOXWDDMDISP_SWAPCHAIN pSwapchain) … … 5681 5614 if (pResource->Flags.SharedResource) 5682 5615 { 5683 if (pAllocation->hSharedHandle)5684 {5685 vboxWddmShRcRefAlloc(pDevice, pAllocation, TRUE, NULL);5686 }5687 5616 #ifdef DEBUG_misha 5688 5617 Assert(VBOXWDDMDISP_IS_TEXTURE(pResource->Flags)); … … 5747 5676 for (UINT i = 0; i < pRc->cAllocations; ++i) 5748 5677 { 5749 BOOL fSetDelete = FALSE;5750 5678 PVBOXWDDMDISP_ALLOCATION pAlloc = &pRc->aAllocations[i]; 5751 5679 if (pAlloc->hSharedHandle) 5752 5680 { 5753 /* using one and the same shared resource by different clients could lead to the situation where one client can still refer to the resource5754 * while another one has deleted it5755 * this could lead to gl state corruption on both host and guest side.5756 * This is why we take extra care to avoid it.5757 * Until we do a vboxWddmShRcRefAlloc call below the resource is guarantied to be present, however it can be removed any time after the call5758 * if cShRcRefs is non-zero, i.e. the current cliet is not the one deleting it.5759 * We first explicitely say to wine that resource must NOT be accessed any more and that all references to it should be cleaned */5760 pAdapter->D3D.pfnVBoxWineExD3DRc9SetShRcState((IDirect3DResource9*)pAlloc->pD3DIf, VBOXWINEEX_SHRC_STATE_GL_DISABLE);5761 5762 DWORD cShRcRefs;5763 HRESULT tmpHr = vboxWddmShRcRefAlloc(pDevice, pAlloc, FALSE, &cShRcRefs);5764 if (!cShRcRefs)5765 {5766 /* the current client IS the one deleting this resource */5767 fSetDelete = TRUE;5768 }5769 5681 #ifdef DEBUG_misha 5770 5682 vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared DESTROYED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), " … … 5775 5687 )); 5776 5688 #endif 5777 }5778 5779 if (fSetDelete)5780 {5781 Assert(pAlloc->pD3DIf);5782 pAdapter->D3D.pfnVBoxWineExD3DRc9SetShRcState((IDirect3DResource9*)pAlloc->pD3DIf, VBOXWINEEX_SHRC_STATE_GL_DELETE);5783 5689 } 5784 5690 … … 7091 6997 Assert(pAllocation->hSharedHandle); 7092 6998 #endif 7093 7094 vboxWddmShRcRefAlloc(pDevice, pAllocation, TRUE, NULL);7095 7096 6999 vboxVDbgPrint(("\n\n********\n(0x%x:0n%d)Shared OPENNED pAlloc(0x%p), hRc(0x%p), hAl(0x%p), " 7097 7000 "Handle(0x%x), (0n%d) \n***********\n\n", -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/Makefile.kmk
r40897 r41109 87 87 endif 88 88 VBoxVideoWddm_DEFS += LOG_TO_BACKDOOR 89 VBoxVideoWddm_INCS += ../../../include .. . ../../../../common/VBoxGuestLib $(VBOX_PATH_CROGL_INCLUDE) 89 VBoxVideoWddm_INCS += ../../../include .. . ../../../../common/VBoxGuestLib $(VBOX_PATH_CROGL_INCLUDE) $(VBOX_PATH_CROGL_GENFILES) 90 90 VBoxVideoWddm_LDFLAGS.x86 += /Entry:DriverEntry@8 91 91 VBoxVideoWddm_LDFLAGS.amd64 += /Entry:DriverEntry -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.cpp
r40897 r41109 20 20 #include "VBoxMPCr.h" 21 21 22 #include <VBox/HostServices/VBoxCrOpenGLSvc.h> 23 22 24 #include <cr_protocol.h> 23 25 24 #include <VBox/HostServices/VBoxCrOpenGLSvc.h> 26 #if 0 27 #include <cr_pack.h> 28 29 typedef struct PVBOXMP_SHGSMIPACKER 30 { 31 PVBOXMP_DEVEXT pDevExt; 32 CRPackContext CrPacker; 33 CRPackBuffer CrBuffer; 34 } PVBOXMP_SHGSMIPACKER, *PPVBOXMP_SHGSMIPACKER; 35 36 static void* vboxMpCrShgsmiBufferAlloc(PVBOXMP_DEVEXT pDevExt, HGSMISIZE cbData) 37 { 38 return VBoxSHGSMIHeapBufferAlloc(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx, cbData); 39 } 40 41 static void vboxMpCrShgsmiBufferFree(PVBOXMP_DEVEXT pDevExt, void *pvBuffer) 42 { 43 VBoxSHGSMIHeapBufferFree(&VBoxCommonFromDeviceExt(pDevExt)->guestCtx.heapCtx, pvBuffer); 44 } 45 46 static void vboxMpCrShgsmiPackerCbFlush(void *pvFlush) 47 { 48 PPVBOXMP_SHGSMIPACKER pPacker = (PPVBOXMP_SHGSMIPACKER)pvFlush; 49 50 crPackReleaseBuffer(&pPacker->CrPacker); 51 52 if (pPacker->CrBuffer.opcode_current != pPacker->CrBuffer.opcode_start) 53 { 54 CRMessageOpcodes *pHdr; 55 unsigned int len; 56 pHdr = vboxMpCrPackerPrependHeader(&pPacker->CrBuffer, &len, 0); 57 58 /*Send*/ 59 } 60 61 62 crPackSetBuffer(&pPacker->CrPacker, &pPacker->CrBuffer); 63 crPackResetPointers(&pPacker->CrPacker); 64 } 65 66 static int vboxMpCrShgsmiPackerInit(PPVBOXMP_SHGSMIPACKER pPacker, PVBOXMP_DEVEXT pDevExt) 67 { 68 memset(pPacker, 0, sizeof (*pPacker)); 69 70 static const cbBuffer = 1000; 71 void *pvBuffer = vboxMpCrShgsmiBufferAlloc(pDevExt, cbBuffer); 72 if (!pvBuffer) 73 { 74 WARN(("vboxMpCrShgsmiBufferAlloc failed")); 75 return VERR_NO_MEMORY; 76 } 77 crPackInitBuffer(&pPacker->CrBuffer, pvBuffer, cbBuffer, cbBuffer); 78 crPackSetBuffer(&pPacker->CrPacker, &pPacker->CrBuffer); 79 crPackFlushFunc(&pPacker->CrPacker, vboxMpCrShgsmiPackerCbFlush); 80 crPackFlushArg(&pPacker->CrPacker, pPacker); 81 // crPackSendHugeFunc( thread->packer, packspuHuge ); 82 return VINF_SUCCESS; 83 } 84 #endif 25 85 26 86 static int vboxMpCrCtlAddRef(PVBOXMP_CRCTLCON pCrCtlCon) -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPShgsmi.cpp
r40387 r41109 161 161 KeAcquireSpinLock(&pHeap->HeapLock, &OldIrql); 162 162 HGSMIHeapFree(&pHeap->Heap, pvBuffer); 163 KeReleaseSpinLock(&pHeap->HeapLock, OldIrql); 164 } 165 166 void* VBoxSHGSMIHeapBufferAlloc(PVBOXSHGSMI pHeap, HGSMISIZE cbData) 167 { 168 KIRQL OldIrql; 169 void* pvData; 170 Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL); 171 KeAcquireSpinLock(&pHeap->HeapLock, &OldIrql); 172 pvData = HGSMIHeapBufferAlloc(&pHeap->Heap, cbData); 173 KeReleaseSpinLock(&pHeap->HeapLock, OldIrql); 174 if (!pvData) 175 WARN(("HGSMIHeapAlloc failed!")); 176 return pvData; 177 } 178 179 void VBoxSHGSMIHeapBufferFree(PVBOXSHGSMI pHeap, void *pvBuffer) 180 { 181 KIRQL OldIrql; 182 Assert(KeGetCurrentIrql() <= DISPATCH_LEVEL); 183 KeAcquireSpinLock(&pHeap->HeapLock, &OldIrql); 184 HGSMIHeapBufferFree(&pHeap->Heap, pvBuffer); 163 185 KeReleaseSpinLock(&pHeap->HeapLock, OldIrql); 164 186 } -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPShgsmi.h
r40387 r41109 58 58 void* VBoxSHGSMIHeapAlloc(PVBOXSHGSMI pHeap, HGSMISIZE cbData, uint8_t u8Channel, uint16_t u16ChannelInfo); 59 59 void VBoxSHGSMIHeapFree(PVBOXSHGSMI pHeap, void *pvBuffer); 60 void* VBoxSHGSMIHeapBufferAlloc(PVBOXSHGSMI pHeap, HGSMISIZE cbData); 61 void VBoxSHGSMIHeapBufferFree(PVBOXSHGSMI pHeap, void *pvBuffer); 60 62 void* VBoxSHGSMICommandAlloc(PVBOXSHGSMI pHeap, HGSMISIZE cbData, uint8_t u8Channel, uint16_t u16ChannelInfo); 61 63 void VBoxSHGSMICommandFree(PVBOXSHGSMI pHeap, void *pvBuffer);
Note:
See TracChangeset
for help on using the changeset viewer.