Changeset 34438 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Display
- Timestamp:
- Nov 28, 2010 9:56:32 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 68211
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Display
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk
r33241 r34438 47 47 vrdptext.c \ 48 48 vbox.c \ 49 $(PATH_ROOT)/src/VBox/Additions/common/VBoxVideo/HGSMIBase.cpp \ 49 50 VBoxDisp.def \ 50 51 VBoxDisp.rc -
trunk/src/VBox/Additions/WINNT/Graphics/Display/dd.c
r34129 r34438 1176 1176 if(!!(lpSurfaceLocal->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) 1177 1177 && pDesc->UpdatedMemRegion.bValid 1178 && vboxHwBufferBeginUpdate (pDev))1178 && VBoxVBVABufferBeginUpdate(&pDev->vbvaCtx, &pDev->guestCtx)) 1179 1179 { 1180 1180 vbvaReportDirtyRect (pDev, &pDesc->UpdatedMemRegion.Rect); 1181 1181 1182 if ( pDev-> pVBVA->hostFlags.u32HostEvents1182 if ( pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents 1183 1183 & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) 1184 1184 { 1185 1185 vrdpReset (pDev); 1186 1186 1187 pDev-> pVBVA->hostFlags.u32HostEvents &=1187 pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents &= 1188 1188 ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; 1189 1189 } 1190 1190 1191 if (pDev-> pVBVA->hostFlags.u32HostEvents1191 if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents 1192 1192 & VBVA_F_MODE_VRDP) 1193 1193 { … … 1195 1195 } 1196 1196 1197 vboxHwBufferEndUpdate (pDev);1197 VBoxVBVABufferEndUpdate(&pDev->vbvaCtx); 1198 1198 1199 1199 lpUnlock->ddRVal = DD_OK; … … 1245 1245 DISPDBG((0, "%d,%d %dx%d\n", pDev->ddLock.rArea.left, pDev->ddLock.rArea.top, pDev->ddLock.rArea.right - pDev->ddLock.rArea.left, pDev->ddLock.rArea.bottom - pDev->ddLock.rArea.top)); 1246 1246 1247 if (pDev->bHGSMISupported && vboxHwBufferBeginUpdate (pDev)) 1247 if ( pDev->bHGSMISupported 1248 && VBoxVBVABufferBeginUpdate(&pDev->vbvaCtx, &pDev->guestCtx)) 1248 1249 { 1249 1250 vbvaReportDirtyRect (pDev, &pDev->ddLock.rArea); 1250 1251 1251 if ( pDev-> pVBVA->hostFlags.u32HostEvents1252 if ( pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents 1252 1253 & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) 1253 1254 { 1254 1255 vrdpReset (pDev); 1255 1256 1256 pDev-> pVBVA->hostFlags.u32HostEvents &=1257 pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents &= 1257 1258 ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; 1258 1259 } 1259 1260 1260 if (pDev-> pVBVA->hostFlags.u32HostEvents1261 if (pDev->vbvaCtx.pVBVA->hostFlags.u32HostEvents 1261 1262 & VBVA_F_MODE_VRDP) 1262 1263 { … … 1264 1265 } 1265 1266 1266 vboxHwBufferEndUpdate (pDev);1267 VBoxVBVABufferEndUpdate(&pDev->vbvaCtx); 1267 1268 } 1268 1269 -
trunk/src/VBox/Additions/WINNT/Graphics/Display/driver.h
r33540 r34438 36 36 #include "../Miniport/vboxioctl.h" 37 37 38 #include <VBox/VBoxVideoGuest.h> 38 39 #include <VBox/VBoxVideo.h> 39 40 #ifdef VBOX_WITH_VIDEOHWACCEL … … 168 169 FLONG flHooks; 169 170 170 BOOL fHwBufferOverflow;171 VBVARECORD *pRecord;172 171 VRDPBC cache; 173 172 … … 192 191 193 192 BOOLEAN bHGSMISupported; 194 HGSMI HEAP hgsmiDisplayHeap;195 VBVABUFFER *pVBVA; /* Pointer to the pjScreen + layout->offVBVABuffer. NULL if VBVA is not enabled. */193 HGSMIGUESTCOMMANDCONTEXT guestCtx; 194 VBVABUFFERCONTEXT vbvaCtx; 196 195 197 196 HVBOXVIDEOHGSMI hMpHGSMI; /* context handler passed to miniport HGSMI callbacks */ 198 197 PFNVBOXVIDEOHGSMICOMPLETION pfnHGSMICommandComplete; /* called to complete the command we receive from the miniport */ 199 198 PFNVBOXVIDEOHGSMICOMMANDS pfnHGSMIRequestCommands; /* called to requests the commands posted to us from the host */ 200 201 RTIOPORT IOPortGuestCommand;202 199 203 200 PVOID pVideoPortContext; … … 261 258 } VRDPCLIPRECTS; 262 259 263 264 BOOL vboxVbvaEnable (PPDEV ppdev);265 void vboxVbvaDisable (PPDEV ppdev);266 267 BOOL vboxHwBufferBeginUpdate (PPDEV ppdev);268 void vboxHwBufferEndUpdate (PPDEV ppdev);269 270 BOOL vboxWrite (PPDEV ppdev, const void *pv, uint32_t cb);271 272 BOOL vboxOrderSupported (PPDEV ppdev, unsigned code);273 260 274 261 void VBoxProcessDisplayInfo(PPDEV ppdev); -
trunk/src/VBox/Additions/WINNT/Graphics/Display/drv.c
r33540 r34438 106 106 PPDEV ppdev = (PPDEV)__psoDest->dhpdev; \ 107 107 \ 108 if (ppdev->bHGSMISupported && vboxHwBufferBeginUpdate (ppdev)) \ 108 if ( ppdev->bHGSMISupported \ 109 && VBoxVBVABufferBeginUpdate(&ppdev->vbvaCtx, &ppdev->guestCtx)) \ 109 110 { \ 110 111 vbva##__fn __a; \ 111 112 \ 112 if ( ppdev-> pVBVA->hostFlags.u32HostEvents \113 if ( ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents \ 113 114 & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) \ 114 115 { \ 115 116 vrdpReset (ppdev); \ 116 117 \ 117 ppdev-> pVBVA->hostFlags.u32HostEvents &= \118 ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents &= \ 118 119 ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; \ 119 120 } \ 120 121 \ 121 if (ppdev-> pVBVA->hostFlags.u32HostEvents \122 if (ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents \ 122 123 & VBVA_F_MODE_VRDP) \ 123 124 { \ … … 125 126 } \ 126 127 \ 127 vboxHwBufferEndUpdate (ppdev); \128 VBoxVBVABufferEndUpdate(&ppdev->vbvaCtx); \ 128 129 } \ 129 130 } \ … … 322 323 DISPDBG((1, "offscreen->screen\n")); 323 324 324 if ( ppdev-> pVBVA325 && (ppdev-> pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED))325 if ( ppdev->vbvaCtx.pVBVA 326 && (ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED)) 326 327 { 327 328 if ( (psoSrc->fjBitmap & BMF_DONTCACHE) != 0 … … 729 730 PPDEV ppdev = (PPDEV)psoTarget->dhpdev; 730 731 731 if ( ppdev-> pVBVA732 && (ppdev-> pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED))732 if ( ppdev->vbvaCtx.pVBVA 733 && (ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED)) 733 734 { 734 if (ppdev-> pVBVA->hostFlags.u32HostEvents735 if (ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents 735 736 & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) 736 737 { 737 738 vrdpReset (ppdev); 738 739 739 ppdev-> pVBVA->hostFlags.u32HostEvents &=740 ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents &= 740 741 ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; 741 742 } 742 743 743 if (ppdev-> pVBVA->hostFlags.u32HostEvents744 if (ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents 744 745 & VBVA_F_MODE_VRDP) 745 746 { -
trunk/src/VBox/Additions/WINNT/Graphics/Display/enable.c
r33540 r34438 126 126 ULONG ret = 0; 127 127 128 if (ppdev && ppdev-> pVBVA)129 { 130 if (ppdev-> pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_VRDP)128 if (ppdev && ppdev->vbvaCtx.pVBVA) 129 { 130 if (ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_VRDP) 131 131 { 132 132 ret = 1; 133 133 } 134 DISPDBG((0, "VBOXESC_ISVRDPACTIVE -> %d (%x)\n", ret, ppdev-> pVBVA->hostFlags.u32HostEvents));134 DISPDBG((0, "VBOXESC_ISVRDPACTIVE -> %d (%x)\n", ret, ppdev->vbvaCtx.pVBVA->hostFlags.u32HostEvents)); 135 135 } 136 136 else … … 909 909 910 910 /* Free the driver's VBVA resources. */ 911 vboxVbvaDisable ((PPDEV) dhpdev); 911 if (ppdev->bHGSMISupported) 912 { 913 PPDEV ppdev = (PPDEV) dhpdev; 914 VBoxVBVADisable(&ppdev->vbvaCtx, &ppdev->guestCtx); 915 } 912 916 913 917 // -
trunk/src/VBox/Additions/WINNT/Graphics/Display/screen.c
r33540 r34438 221 221 * HGSMI event flags in the beginning. 222 222 */ 223 int rc = HGSMIHeapSetup (&ppdev-> hgsmiDisplayHeap,223 int rc = HGSMIHeapSetup (&ppdev->guestCtx.heapCtx, 224 224 (uint8_t *)ppdev->pjScreen + ppdev->layout.offDisplayInformation + sizeof (HGSMIHOSTFLAGS), 225 225 ppdev->layout.cbDisplayInformation - sizeof (HGSMIHOSTFLAGS), … … 239 239 else 240 240 { 241 ppdev->IOPortGuestCommand = info.IOPortGuestCommand; 242 } 243 } 241 ppdev->guestCtx.port = info.IOPortGuestCommand; 242 } 243 } 244 /* Update buffer layout in VBVA context information. Shouldn't this get 245 * zeroed if initialising the HGSMI heap fails? */ 246 ppdev->vbvaCtx.offVRAMBuffer = ppdev->layout.offVBVABuffer; 247 ppdev->vbvaCtx.cbBuffer = ppdev->layout.cbVBVABuffer; 244 248 245 249 DISPDBG((0, "vboxInitVBoxVideo:\n" … … 405 409 { 406 410 /* Enable VBVA for this video mode. */ 407 ppdev->bHGSMISupported = vboxVbvaEnable (ppdev); 411 VBVABUFFER *pVBVA = (VBVABUFFER *)((uint8_t *)ppdev->pjScreen + ppdev->layout.offVBVABuffer); 412 ppdev->bHGSMISupported = VBoxVBVAEnable(&ppdev->vbvaCtx, 413 &ppdev->guestCtx, 414 pVBVA); 408 415 LogRel(("VBoxDisp[%d]: VBVA %senabled\n", ppdev->iDevice, ppdev->bHGSMISupported? "": "not ")); 409 416 } … … 414 421 /* Inform the host about this screen layout. */ 415 422 DISPDBG((1, "bInitSURF: %d,%d\n", ppdev->ptlDevOrg.x, ppdev->ptlDevOrg.y)); 416 VBoxProcessDisplayInfo (ppdev); 423 if (ppdev->bHGSMISupported) 424 { 425 VBoxProcessDisplayInfo (ppdev); 426 } 417 427 418 428 #ifdef VBOX_WITH_VIDEOHWACCEL -
trunk/src/VBox/Additions/WINNT/Graphics/Display/vbox.c
r33890 r34438 21 21 #include <VBox/VBoxGuest.h> 22 22 #include <VBox/err.h> 23 #include <VBox/log.h> 23 24 #include <iprt/asm.h> 24 25 #include <iprt/asm-amd64-x86.h> 26 #include <iprt/assert.h> 25 27 26 28 /* 27 29 * There is a hardware ring buffer in the VBox VMMDev PCI memory space. 28 * All graphics commands go there serialized by vboxHwBufferBeginUpdate.30 * All graphics commands go there serialized by VBoxVBVABufferBeginUpdate. 29 31 * and vboxHwBufferEndUpdate. 30 32 * … … 37 39 38 40 /* Forward declarations of internal functions. */ 39 static void vboxHwBufferFlush (PPDEV ppdev); 40 static void vboxHwBufferPlaceDataAt (PPDEV ppdev, void *p, uint32_t cb, uint32_t offset); 41 static BOOL vboxHwBufferWrite (PPDEV ppdev, const void *p, uint32_t cb); 42 43 44 static void vboxHGSMIBufferSubmit (PPDEV ppdev, void *p) 45 { 46 HGSMIOFFSET offBuffer = HGSMIHeapBufferOffset (&ppdev->hgsmiDisplayHeap, p); 47 48 DISPDBG((0, "VBoxDISP::vboxHGSMIBufferSubmit: offset 0x%x\n", offBuffer)); 49 50 ASMOutU32(ppdev->IOPortGuestCommand, offBuffer); 51 } 52 53 static BOOL vboxVBVAInformHost (PPDEV ppdev, BOOL bEnable) 54 { 55 BOOL bRc = FALSE; 56 41 static void vboxHwBufferFlush(PHGSMIGUESTCOMMANDCONTEXT pCtx); 42 static void vboxHwBufferPlaceDataAt(PVBVABUFFERCONTEXT pCtx, const void *p, 43 uint32_t cb, uint32_t offset); 44 static bool vboxHwBufferWrite(PVBVABUFFERCONTEXT pCtx, 45 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, 46 const void *p, uint32_t cb); 47 48 49 static bool vboxVBVAInformHost(PVBVABUFFERCONTEXT pCtx, 50 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, 51 bool bEnable) 52 { 53 bool bRc = false; 54 55 #if 0 /* All callers check this */ 57 56 if (ppdev->bHGSMISupported) 58 { 59 void *p = HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap, 60 sizeof (VBVAENABLE), 61 HGSMI_CH_VBVA, 62 VBVA_ENABLE); 57 #endif 58 { 59 void *p = VBoxHGSMIBufferAlloc(pHGSMICtx, 60 sizeof (VBVAENABLE), 61 HGSMI_CH_VBVA, 62 VBVA_ENABLE); 63 63 if (!p) 64 64 { 65 DISPDBG((0, "VBoxDISP::vboxVBVAInformHost:HGSMIHeapAlloc failed\n"));65 LogFunc(("HGSMIHeapAlloc failed\n")); 66 66 } 67 67 else … … 70 70 71 71 pEnable->u32Flags = bEnable? VBVA_F_ENABLE: VBVA_F_DISABLE; 72 pEnable->u32Offset = p pdev->layout.offVBVABuffer;72 pEnable->u32Offset = pCtx->offVRAMBuffer; 73 73 pEnable->i32Result = VERR_NOT_SUPPORTED; 74 74 75 vboxHGSMIBufferSubmit (ppdev, p);75 VBoxHGSMIBufferSubmit(pHGSMICtx, p); 76 76 77 77 if (bEnable) … … 81 81 else 82 82 { 83 bRc = TRUE;83 bRc = true; 84 84 } 85 85 86 HGSMIHeapFree (&ppdev->hgsmiDisplayHeap, p);86 VBoxHGSMIBufferFree(pHGSMICtx, p); 87 87 } 88 88 } … … 94 94 * Public hardware buffer methods. 95 95 */ 96 BOOL vboxVbvaEnable (PPDEV ppdev) 97 { 98 BOOL bRc = FALSE; 99 100 DISPDBG((1, "VBoxDisp::vboxVbvaEnable called ppdev %p, hgsmi %d, vbva %p\n", ppdev, ppdev->bHGSMISupported, ppdev->pVBVA)); 101 96 RTDECL(bool) VBoxVBVAEnable(PVBVABUFFERCONTEXT pCtx, 97 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, 98 VBVABUFFER *pVBVA) 99 { 100 bool bRc = false; 101 102 LogFlowFunc(("pVBVA %p\n", pVBVA)); 103 104 #if 0 /* All callers check this */ 102 105 if (ppdev->bHGSMISupported) 103 { 104 VBVABUFFER *pVBVA = (VBVABUFFER *)((uint8_t *)ppdev->pjScreen + ppdev->layout.offVBVABuffer); 105 106 DISPDBG((1, "VBoxDisp::vboxVbvaEnable screen %p vbva off 0x%x\n", ppdev->pjScreen, ppdev->layout.offVBVABuffer)); 106 #endif 107 { 108 LogFunc(("pVBVA %p vbva off 0x%x\n", pVBVA, pCtx->offVRAMBuffer)); 107 109 108 110 pVBVA->hostFlags.u32HostEvents = 0; … … 110 112 pVBVA->off32Data = 0; 111 113 pVBVA->off32Free = 0; 112 RtlZeroMemory (pVBVA->aRecords, sizeof (pVBVA->aRecords));114 memset(pVBVA->aRecords, 0, sizeof (pVBVA->aRecords)); 113 115 pVBVA->indexRecordFirst = 0; 114 116 pVBVA->indexRecordFree = 0; 115 117 pVBVA->cbPartialWriteThreshold = 256; 116 pVBVA->cbData = p pdev->layout.cbVBVABuffer - sizeof (VBVABUFFER) + sizeof (pVBVA->au8Data);117 118 p pdev->fHwBufferOverflow = FALSE;119 p pdev->pRecord= NULL;120 p pdev->pVBVA= pVBVA;121 122 bRc = vboxVBVAInformHost (ppdev, TRUE);118 pVBVA->cbData = pCtx->cbBuffer - sizeof (VBVABUFFER) + sizeof (pVBVA->au8Data); 119 120 pCtx->fHwBufferOverflow = false; 121 pCtx->pRecord = NULL; 122 pCtx->pVBVA = pVBVA; 123 124 bRc = vboxVBVAInformHost(pCtx, pHGSMICtx, true); 123 125 } 124 126 125 127 if (!bRc) 126 128 { 127 vboxVbvaDisable (ppdev);129 VBoxVBVADisable(pCtx, pHGSMICtx); 128 130 } 129 131 … … 131 133 } 132 134 133 void vboxVbvaDisable (PPDEV ppdev) 134 { 135 DISPDBG((1, "VBoxDisp::vbvaDisable called.\n")); 136 137 ppdev->fHwBufferOverflow = FALSE; 138 ppdev->pRecord = NULL; 139 ppdev->pVBVA = NULL; 140 141 vboxVBVAInformHost (ppdev, FALSE); 135 RTDECL(void) VBoxVBVADisable(PVBVABUFFERCONTEXT pCtx, 136 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx) 137 { 138 LogFlowFunc(("\n")); 139 140 pCtx->fHwBufferOverflow = false; 141 pCtx->pRecord = NULL; 142 pCtx->pVBVA = NULL; 143 144 vboxVBVAInformHost(pCtx, pHGSMICtx, false); 142 145 143 146 return; 144 147 } 145 148 146 BOOL vboxHwBufferBeginUpdate (PPDEV ppdev) 147 { 148 BOOL bRc = FALSE; 149 150 // DISPDBG((1, "VBoxDisp::vboxHwBufferBeginUpdate called flags = 0x%08X\n", 151 // ppdev->pVBVA? ppdev->pVBVA->u32HostEvents: -1));152 153 if ( p pdev->pVBVA154 && (p pdev->pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED))149 RTDECL(bool) VBoxVBVABufferBeginUpdate(PVBVABUFFERCONTEXT pCtx, 150 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx) 151 { 152 bool bRc = false; 153 154 // LogFunc(("flags = 0x%08X\n", pCtx->pVBVA? pCtx->pVBVA->u32HostEvents: -1)); 155 156 if ( pCtx->pVBVA 157 && (pCtx->pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED)) 155 158 { 156 159 uint32_t indexRecordNext; 157 160 158 VBVA_ASSERT (!ppdev->fHwBufferOverflow);159 VBVA_ASSERT (ppdev->pRecord == NULL);160 161 indexRecordNext = (p pdev->pVBVA->indexRecordFree + 1) % VBVA_MAX_RECORDS;162 163 if (indexRecordNext == p pdev->pVBVA->indexRecordFirst)161 Assert(!pCtx->fHwBufferOverflow); 162 Assert(pCtx->pRecord == NULL); 163 164 indexRecordNext = (pCtx->pVBVA->indexRecordFree + 1) % VBVA_MAX_RECORDS; 165 166 if (indexRecordNext == pCtx->pVBVA->indexRecordFirst) 164 167 { 165 168 /* All slots in the records queue are used. */ 166 vboxHwBufferFlush (p pdev);167 } 168 169 if (indexRecordNext == p pdev->pVBVA->indexRecordFirst)169 vboxHwBufferFlush (pHGSMICtx); 170 } 171 172 if (indexRecordNext == pCtx->pVBVA->indexRecordFirst) 170 173 { 171 174 /* Even after flush there is no place. Fail the request. */ 172 DISPDBG((1, "VBoxDisp::vboxHwBufferBeginUpdateno space in the queue of records!!! first %d, last %d\n",173 p pdev->pVBVA->indexRecordFirst, ppdev->pVBVA->indexRecordFree));175 LogFunc(("no space in the queue of records!!! first %d, last %d\n", 176 pCtx->pVBVA->indexRecordFirst, pCtx->pVBVA->indexRecordFree)); 174 177 } 175 178 else 176 179 { 177 180 /* Initialize the record. */ 178 VBVARECORD *pRecord = &p pdev->pVBVA->aRecords[ppdev->pVBVA->indexRecordFree];181 VBVARECORD *pRecord = &pCtx->pVBVA->aRecords[pCtx->pVBVA->indexRecordFree]; 179 182 180 183 pRecord->cbRecord = VBVA_F_RECORD_PARTIAL; 181 184 182 p pdev->pVBVA->indexRecordFree = indexRecordNext;183 184 // DISPDBG((1, "VBoxDisp::vboxHwBufferBeginUpdateindexRecordNext = %d\n", indexRecordNext));185 pCtx->pVBVA->indexRecordFree = indexRecordNext; 186 187 // LogFunc(("indexRecordNext = %d\n", indexRecordNext)); 185 188 186 189 /* Remember which record we are using. */ 187 p pdev->pRecord = pRecord;188 189 bRc = TRUE;190 pCtx->pRecord = pRecord; 191 192 bRc = true; 190 193 } 191 194 } … … 194 197 } 195 198 196 void vboxHwBufferEndUpdate (PPDEV ppdev)199 RTDECL(void) VBoxVBVABufferEndUpdate(PVBVABUFFERCONTEXT pCtx) 197 200 { 198 201 VBVARECORD *pRecord; 199 202 200 // DISPDBG((1, "VBoxDisp::vboxHwBufferEndUpdate called\n"));201 202 VBVA_ASSERT(ppdev->pVBVA);203 204 pRecord = p pdev->pRecord;205 VBVA_ASSERT(pRecord && (pRecord->cbRecord & VBVA_F_RECORD_PARTIAL));203 // LogFunc(("\n")); 204 205 Assert(pCtx->pVBVA); 206 207 pRecord = pCtx->pRecord; 208 Assert(pRecord && (pRecord->cbRecord & VBVA_F_RECORD_PARTIAL)); 206 209 207 210 /* Mark the record completed. */ 208 211 pRecord->cbRecord &= ~VBVA_F_RECORD_PARTIAL; 209 212 210 p pdev->fHwBufferOverflow = FALSE;211 p pdev->pRecord = NULL;213 pCtx->fHwBufferOverflow = false; 214 pCtx->pRecord = NULL; 212 215 213 216 return; … … 224 227 } 225 228 226 static void vboxHwBufferFlush (PPDEV ppdev)229 static void vboxHwBufferFlush(PHGSMIGUESTCOMMANDCONTEXT pCtx) 227 230 { 228 231 /* Issue the flush command. */ 229 void *p = HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap,230 sizeof (VBVAFLUSH),231 HGSMI_CH_VBVA,232 VBVA_FLUSH);232 void *p = VBoxHGSMIBufferAlloc(pCtx, 233 sizeof (VBVAFLUSH), 234 HGSMI_CH_VBVA, 235 VBVA_FLUSH); 233 236 if (!p) 234 237 { 235 DISPDBG((0, "VBoxDISP::vboxHwBufferFlush:HGSMIHeapAlloc failed\n"));238 LogFunc(("HGSMIHeapAlloc failed\n")); 236 239 } 237 240 else … … 241 244 pFlush->u32Reserved = 0; 242 245 243 vboxHGSMIBufferSubmit (ppdev, p);244 245 HGSMIHeapFree (&ppdev->hgsmiDisplayHeap, p);246 VBoxHGSMIBufferSubmit(pCtx, p); 247 248 VBoxHGSMIBufferSubmit(pCtx, p); 246 249 } 247 250 … … 249 252 } 250 253 251 static void vboxHwBufferPlaceDataAt (PPDEV ppdev, const void *p, uint32_t cb, uint32_t offset) 252 { 253 VBVABUFFER *pVBVA = ppdev->pVBVA; 254 static void vboxHwBufferPlaceDataAt(PVBVABUFFERCONTEXT pCtx, const void *p, 255 uint32_t cb, uint32_t offset) 256 { 257 VBVABUFFER *pVBVA = pCtx->pVBVA; 254 258 uint32_t u32BytesTillBoundary = pVBVA->cbData - offset; 255 259 uint8_t *dst = &pVBVA->au8Data[offset]; … … 271 275 } 272 276 273 static BOOL vboxHwBufferWrite (PPDEV ppdev, const void *p, uint32_t cb) 277 static bool vboxHwBufferWrite(PVBVABUFFERCONTEXT pCtx, 278 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, 279 const void *p, uint32_t cb) 274 280 { 275 281 VBVARECORD *pRecord; … … 278 284 uint32_t cbWritten = 0; 279 285 280 VBVABUFFER *pVBVA = p pdev->pVBVA;281 VBVA_ASSERT(pVBVA);282 283 if (!pVBVA || p pdev->fHwBufferOverflow)284 { 285 return FALSE;286 } 287 288 VBVA_ASSERT(pVBVA->indexRecordFirst != pVBVA->indexRecordFree);289 290 pRecord = p pdev->pRecord;291 VBVA_ASSERT(pRecord && (pRecord->cbRecord & VBVA_F_RECORD_PARTIAL));292 293 DISPDBG((1, "VW%d\n", cb));286 VBVABUFFER *pVBVA = pCtx->pVBVA; 287 Assert(pVBVA); 288 289 if (!pVBVA || pCtx->fHwBufferOverflow) 290 { 291 return false; 292 } 293 294 Assert(pVBVA->indexRecordFirst != pVBVA->indexRecordFree); 295 296 pRecord = pCtx->pRecord; 297 Assert(pRecord && (pRecord->cbRecord & VBVA_F_RECORD_PARTIAL)); 298 299 LogFunc(("%d\n", cb)); 294 300 295 301 cbHwBufferAvail = vboxHwBufferAvail (pVBVA); … … 299 305 uint32_t cbChunk = cb; 300 306 301 // DISPDBG((1, "VBoxDisp::vboxHwBufferWritepVBVA->off32Free %d, pRecord->cbRecord 0x%08X, cbHwBufferAvail %d, cb %d, cbWritten %d\n",307 // LogFunc(("pVBVA->off32Free %d, pRecord->cbRecord 0x%08X, cbHwBufferAvail %d, cb %d, cbWritten %d\n", 302 308 // pVBVA->off32Free, pRecord->cbRecord, cbHwBufferAvail, cb, cbWritten)); 303 309 304 310 if (cbChunk >= cbHwBufferAvail) 305 311 { 306 DISPDBG((1, "VBoxDisp::vboxHwBufferWrite1) avail %d, chunk %d\n", cbHwBufferAvail, cbChunk));307 308 vboxHwBufferFlush (p pdev);312 LogFunc(("1) avail %d, chunk %d\n", cbHwBufferAvail, cbChunk)); 313 314 vboxHwBufferFlush (pHGSMICtx); 309 315 310 316 cbHwBufferAvail = vboxHwBufferAvail (pVBVA); … … 312 318 if (cbChunk >= cbHwBufferAvail) 313 319 { 314 DISPDBG((1, "VBoxDisp::vboxHwBufferWrite:no place for %d bytes. Only %d bytes available after flush. Going to partial writes.\n",320 LogFunc(("no place for %d bytes. Only %d bytes available after flush. Going to partial writes.\n", 315 321 cb, cbHwBufferAvail)); 316 322 317 323 if (cbHwBufferAvail <= pVBVA->cbPartialWriteThreshold) 318 324 { 319 DISPDBG((1, "VBoxDisp::vboxHwBufferWrite:Buffer overflow!!!\n"));320 p pdev->fHwBufferOverflow = TRUE;321 VBVA_ASSERT(FALSE);322 return FALSE;325 LogFunc(("Buffer overflow!!!\n")); 326 pCtx->fHwBufferOverflow = true; 327 Assert(false); 328 return false; 323 329 } 324 330 … … 327 333 } 328 334 329 VBVA_ASSERT(cbChunk <= cb);330 VBVA_ASSERT(cbChunk <= vboxHwBufferAvail (pVBVA));331 332 vboxHwBufferPlaceDataAt (p pdev, (uint8_t *)p + cbWritten, cbChunk, pVBVA->off32Free);335 Assert(cbChunk <= cb); 336 Assert(cbChunk <= vboxHwBufferAvail (pVBVA)); 337 338 vboxHwBufferPlaceDataAt (pCtx, (uint8_t *)p + cbWritten, cbChunk, pVBVA->off32Free); 333 339 334 340 pVBVA->off32Free = (pVBVA->off32Free + cbChunk) % pVBVA->cbData; … … 340 346 } 341 347 342 return TRUE;348 return true; 343 349 } 344 350 … … 346 352 * Public writer to the hardware buffer. 347 353 */ 348 BOOL vboxWrite (PPDEV ppdev, const void *pv, uint32_t cb) 349 { 350 return vboxHwBufferWrite (ppdev, pv, cb); 351 } 352 353 BOOL vboxOrderSupported (PPDEV ppdev, unsigned code) 354 { 355 VBVABUFFER *pVBVA = ppdev->pVBVA; 354 RTDECL(bool) VBoxVBVAWrite(PVBVABUFFERCONTEXT pCtx, 355 PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, 356 const void *pv, uint32_t cb) 357 { 358 return vboxHwBufferWrite (pCtx, pHGSMICtx, pv, cb); 359 } 360 361 RTDECL(bool) VBoxVBVAOrderSupported(PVBVABUFFERCONTEXT pCtx, unsigned code) 362 { 363 VBVABUFFER *pVBVA = pCtx->pVBVA; 356 364 357 365 if (!pVBVA) … … 362 370 if (pVBVA->hostFlags.u32SupportedOrders & (1 << code)) 363 371 { 364 return TRUE;372 return true; 365 373 } 366 374 … … 368 376 } 369 377 378 RTDECL(void) VBoxHGSMIProcessDisplayInfo(PHGSMIGUESTCOMMANDCONTEXT pCtx, 379 uint32_t cDisplay, 380 int32_t cOriginX, 381 int32_t cOriginY, 382 uint32_t offStart, 383 uint32_t cbPitch, 384 uint32_t cWidth, 385 uint32_t cHeight, 386 uint16_t cBPP) 387 { 388 /* Issue the screen info command. */ 389 void *p = VBoxHGSMIBufferAlloc(pCtx, 390 sizeof (VBVAINFOSCREEN), 391 HGSMI_CH_VBVA, 392 VBVA_INFO_SCREEN); 393 if (!p) 394 { 395 LogFunc(("HGSMIHeapAlloc failed\n")); 396 } 397 else 398 { 399 VBVAINFOSCREEN *pScreen = (VBVAINFOSCREEN *)p; 400 401 pScreen->u32ViewIndex = cDisplay; 402 pScreen->i32OriginX = cOriginX; 403 pScreen->i32OriginY = cOriginY; 404 pScreen->u32StartOffset = offStart; 405 pScreen->u32LineSize = cbPitch; 406 pScreen->u32Width = cWidth; 407 pScreen->u32Height = cHeight; 408 pScreen->u16BitsPerPixel = cBPP; 409 pScreen->u16Flags = VBVA_SCREEN_F_ACTIVE; 410 411 VBoxHGSMIBufferSubmit(pCtx, p); 412 413 VBoxHGSMIBufferFree(pCtx, p); 414 } 415 } 416 370 417 void VBoxProcessDisplayInfo (PPDEV ppdev) 371 418 { 372 419 if (ppdev->bHGSMISupported) 373 420 { 374 /* Issue the screen info command. */ 375 void *p = HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap, 376 sizeof (VBVAINFOSCREEN), 377 HGSMI_CH_VBVA, 378 VBVA_INFO_SCREEN); 379 if (!p) 380 { 381 DISPDBG((0, "VBoxDISP::VBoxProcessDisplayInfo: HGSMIHeapAlloc failed\n")); 382 } 383 else 384 { 385 VBVAINFOSCREEN *pScreen = (VBVAINFOSCREEN *)p; 386 387 pScreen->u32ViewIndex = ppdev->iDevice; 388 pScreen->i32OriginX = ppdev->ptlDevOrg.x; 389 pScreen->i32OriginY = ppdev->ptlDevOrg.y; 390 pScreen->u32StartOffset = 0; 391 pScreen->u32LineSize = ppdev->lDeltaScreen > 0?ppdev->lDeltaScreen: -ppdev->lDeltaScreen; 392 pScreen->u32Width = ppdev->cxScreen; 393 pScreen->u32Height = ppdev->cyScreen; 394 pScreen->u16BitsPerPixel = (uint16_t)ppdev->ulBitCount; 395 pScreen->u16Flags = VBVA_SCREEN_F_ACTIVE; 396 397 vboxHGSMIBufferSubmit (ppdev, p); 398 399 HGSMIHeapFree (&ppdev->hgsmiDisplayHeap, p); 400 } 421 VBoxHGSMIProcessDisplayInfo(&ppdev->guestCtx, ppdev->iDevice, 422 ppdev->ptlDevOrg.x, ppdev->ptlDevOrg.y, 0, 423 ppdev->lDeltaScreen > 0 424 ? ppdev->lDeltaScreen 425 : -ppdev->lDeltaScreen, ppdev->cxScreen, 426 ppdev->cyScreen, 427 (uint16_t)ppdev->ulBitCount); 401 428 } 402 429 … … 408 435 VBOXVHWACMD* vboxVHWACommandCreate (PPDEV ppdev, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd) 409 436 { 410 VBOXVHWACMD* pHdr = (VBOXVHWACMD*) HGSMIHeapAlloc (&ppdev->hgsmiDisplayHeap,437 VBOXVHWACMD* pHdr = (VBOXVHWACMD*)VBoxHGSMIBufferAlloc(&ppdev->guestCtx, 411 438 cbCmd + VBOXVHWACMD_HEADSIZE(), 412 439 HGSMI_CH_VBVA, … … 414 441 if (!pHdr) 415 442 { 416 DISPDBG((0, "VBoxDISP::vboxVHWACommandCreate:HGSMIHeapAlloc failed\n"));443 LogFunc(("HGSMIHeapAlloc failed\n")); 417 444 } 418 445 else … … 433 460 void vboxVHWACommandFree (PPDEV ppdev, VBOXVHWACMD* pCmd) 434 461 { 435 HGSMIHeapFree (&ppdev->hgsmiDisplayHeap, pCmd);462 VBoxHGSMIBufferFree(&ppdev->guestCtx, pCmd); 436 463 } 437 464 … … 446 473 { 447 474 VBVAHOSTCMDVHWACMDCOMPLETE * pComplete = VBVAHOSTCMD_BODY(pHostCmd, VBVAHOSTCMDVHWACMDCOMPLETE); 448 VBOXVHWACMD* pComplCmd = (VBOXVHWACMD*)HGSMIOffsetToPointer (&ppdev-> hgsmiDisplayHeap.area, pComplete->offCmd);475 VBOXVHWACMD* pComplCmd = (VBOXVHWACMD*)HGSMIOffsetToPointer (&ppdev->guestCtx.heapCtx.area, pComplete->offCmd); 449 476 PFNVBOXVHWACMDCOMPLETION pfnCompletion = (PFNVBOXVHWACMDCOMPLETION)pComplCmd->GuestVBVAReserved1; 450 477 void * pContext = (void *)pComplCmd->GuestVBVAReserved2; … … 502 529 /* complete it asynchronously by setting event */ 503 530 pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_EVENT; 504 vboxHGSMIBufferSubmit (ppdev, pCmd);531 VBoxHGSMIBufferSubmit(&ppdev->guestCtx, pCmd); 505 532 506 533 if(!(ASMAtomicReadU32((volatile uint32_t *)&pCmd->Flags) & VBOXVHWACMD_FLAG_HG_ASYNCH)) … … 543 570 vbvaVHWACommandRetain(ppdev, pCmd); 544 571 545 vboxHGSMIBufferSubmit (ppdev, pCmd);572 VBoxHGSMIBufferSubmit(&ppdev->guestCtx, pCmd); 546 573 547 574 if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH)) … … 568 595 pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION; 569 596 570 vboxHGSMIBufferSubmit (ppdev, pCmd);597 VBoxHGSMIBufferSubmit(&ppdev->guestCtx, pCmd); 571 598 572 599 if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH) -
trunk/src/VBox/Additions/WINNT/Graphics/Display/vbva.c
r33002 r34438 351 351 hdr.h = (uint16_t)(rect.bottom - rect.top); 352 352 353 vboxWrite (ppdev, &hdr, sizeof(hdr));353 VBoxVBVAWrite(&ppdev->vbvaCtx, &ppdev->guestCtx, &hdr, sizeof(hdr)); 354 354 } 355 355 -
trunk/src/VBox/Additions/WINNT/Graphics/Display/vrdp.c
r33595 r34438 365 365 __inline BOOL vrdpWriteHdr (PPDEV ppdev, uint32_t u32Op) 366 366 { 367 return vboxWrite (ppdev, &u32Op, sizeof (u32Op));367 return VBoxVBVAWrite(&ppdev->vbvaCtx, &ppdev->guestCtx, &u32Op, sizeof (u32Op)); 368 368 } 369 369 … … 381 381 bits.cbPixel = (uint8_t)bytesPerPixel; 382 382 383 bRc = vboxWrite (ppdev, &bits, sizeof (bits));383 bRc = VBoxVBVAWrite(&ppdev->vbvaCtx, &ppdev->guestCtx, &bits, sizeof (bits)); 384 384 385 385 if (bRc) … … 387 387 while (cHeight--) 388 388 { 389 bRc = vboxWrite (ppdev, pu8Bits, cWidth * bytesPerPixel);389 bRc = VBoxVBVAWrite(&ppdev->vbvaCtx, &ppdev->guestCtx, pu8Bits, cWidth * bytesPerPixel); 390 390 391 391 if (!bRc) … … 503 503 if (bRc) 504 504 { 505 vboxWrite (ppdev, pOrder, cbOrder);505 VBoxVBVAWrite(&ppdev->vbvaCtx, &ppdev->guestCtx, pOrder, cbOrder); 506 506 } 507 507 … … 1434 1434 else if (ppo->fl & PO_ELLIPSE) 1435 1435 { 1436 if ( vboxOrderSupported (ppdev, VRDE_ORDER_ELLIPSE))1436 if (VBoxVBVAOrderSupported (&ppdev->vbvaCtx, VRDE_ORDER_ELLIPSE)) 1437 1437 { 1438 1438 VRDEORDERELLIPSE order;
Note:
See TracChangeset
for help on using the changeset viewer.