- Timestamp:
- Mar 27, 2014 5:56:50 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 93041
- Location:
- trunk/src/VBox
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPCr.cpp
r50859 r50913 519 519 Assert(KeGetCurrentIrql() == DISPATCH_LEVEL); 520 520 521 PVBOXMP_CRSHGSMITRANSPORT pCon ;521 PVBOXMP_CRSHGSMITRANSPORT pCon = (PVBOXMP_CRSHGSMITRANSPORT)pvContext; 522 522 PVBOXMP_DEVEXT pDevExt = pCon->pDevExt; 523 523 VBOXCMDVBVA_CRCMD_CMD *pCmd; … … 1031 1031 } 1032 1032 1033 #if 1 /*def DEBUG_misha*/1033 #ifndef DEBUG_misha 1034 1034 g_VBoxMpCrHostCaps &= ~CR_VBOX_CAP_CMDVBVA; 1035 1035 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPVbva.cpp
r50859 r50913 174 174 static int vboxCmdVbvaCtlSubmitAsync(PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, VBOXCMDVBVA_CTL * pCtl, FNVBOXSHGSMICMDCOMPLETION pfnCompletion, void *pvCompletion) 175 175 { 176 const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepAsynch(&pHGSMICtx->heapCtx, pCtl, pfnCompletion, pvCompletion, 0);176 const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepAsynch(&pHGSMICtx->heapCtx, pCtl, pfnCompletion, pvCompletion, VBOXSHGSMI_FLAG_GH_ASYNCH_IRQ); 177 177 HGSMIOFFSET offCmd = VBoxSHGSMICommandOffset(&pHGSMICtx->heapCtx, pHdr); 178 178 if (offCmd == HGSMIOFFSET_VOID) … … 293 293 // LogFunc(("flags = 0x%08X\n", pCtx->pVBVA? pCtx->pVBVA->u32HostEvents: -1)); 294 294 295 if ( pCtx->pVBVA 296 && (pCtx->pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED)) 295 Assert(pCtx->pVBVA); 296 /* we do not use u32HostEvents & VBVA_F_MODE_ENABLED, 297 * VBVA stays enabled once ENABLE call succeeds, until it is disabled with DISABLED call */ 298 // if ( pCtx->pVBVA 299 // && (pCtx->pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED)) 297 300 { 298 301 uint32_t indexRecordNext; … … 366 369 } 367 370 371 DECLINLINE(bool) vboxVBVAExIsEntryInRangeOrEmpty(uint32_t u32First, uint32_t u32Entry, uint32_t u32Free) 372 { 373 return vboxVBVAExIsEntryInRange(u32First, u32Entry, u32Free) 374 || ( u32First == u32Entry 375 && u32Entry == u32Free); 376 } 368 377 #ifdef DEBUG 369 378 … … 371 380 { 372 381 VBVABUFFER *pVBVA = pCtx->pVBVA; 373 if (!vboxVBVAExIsEntryInRange (pCtx->indexRecordFirstUncompleted, pVBVA->indexRecordFirst, pVBVA->indexRecordFree))382 if (!vboxVBVAExIsEntryInRangeOrEmpty(pCtx->indexRecordFirstUncompleted, pVBVA->indexRecordFirst, pVBVA->indexRecordFree)) 374 383 { 375 384 WARN(("invalid record set")); 376 385 } 377 386 378 if (!vboxVBVAExIsEntryInRange (pCtx->off32DataUncompleted, pVBVA->off32Data, pVBVA->off32Free))387 if (!vboxVBVAExIsEntryInRangeOrEmpty(pCtx->off32DataUncompleted, pVBVA->off32Data, pVBVA->off32Free)) 379 388 { 380 389 WARN(("invalid data set")); … … 904 913 int rc = VINF_SUCCESS; 905 914 915 Assert(pCmd->u32FenceID); 916 906 917 pCmd->u8State = VBOXCMDVBVA_STATE_SUBMITTED; 907 918 pVbva->u32FenceSubmitted = pCmd->u32FenceID; 908 919 909 if (VBoxVBVAExGetSize(&pVbva->Vbva) >cbCmd)920 if (VBoxVBVAExGetSize(&pVbva->Vbva) < cbCmd) 910 921 { 911 922 WARN(("buffer does not fit the vbva buffer, we do not support splitting buffers")); … … 1073 1084 } 1074 1085 1075 1086 #if 0 1076 1087 static uint32_t vboxCVDdiSysMemElBuild(VBOXCMDVBVA_SYSMEMEL *pEl, PMDL pMdl, uint32_t iPfn, uint32_t cPages) 1077 1088 { … … 1103 1114 VBOXCMDVBVA_SYSMEMEL *pEl = pCmd->aSysMem; 1104 1115 1105 if (cbBuffer < sizeof (VBOXCMDVBVA_PAGING_TRANSFER)) 1106 { 1107 WARN(("cbBuffer < sizeof (VBOXCMDVBVA_PAGING_TRANSFER)")); 1108 goto done; 1109 } 1116 Assert(cbBuffer >= sizeof (VBOXCMDVBVA_PAGING_TRANSFER)); 1110 1117 1111 1118 cbBuffer -= RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aSysMem); … … 1116 1123 } 1117 1124 1118 done:1119 1125 *pcPagesWritten = cInitPages - cPages; 1120 1126 return cbInitBuffer - cbBuffer; 1121 1127 } 1128 #endif 1129 1130 uint32_t VBoxCVDdiPTransferVRamSysBuildEls(VBOXCMDVBVA_PAGING_TRANSFER *pCmd, PMDL pMdl, uint32_t iPfn, uint32_t cPages, uint32_t cbBuffer, uint32_t *pcPagesWritten) 1131 { 1132 uint32_t cbInitBuffer = cbBuffer; 1133 uint32_t i = 0; 1134 VBOXCMDVBVAPAGEIDX *pPageNumbers = pCmd->aPageNumbers; 1135 1136 cbBuffer -= RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers); 1137 1138 for (; i < cPages && cbBuffer >= sizeof (*pPageNumbers); ++i, cbBuffer -= sizeof (*pPageNumbers)) 1139 { 1140 pPageNumbers[i] = (VBOXCMDVBVAPAGEIDX)(MmGetMdlPfnArray(pMdl)[iPfn + i]); 1141 } 1142 1143 *pcPagesWritten = i; 1144 Assert(cbInitBuffer - cbBuffer == RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers[i])); 1145 return cbInitBuffer - cbBuffer; 1146 } 1147 1122 1148 1123 1149 int vboxCmdVbvaConConnect(PHGSMIGUESTCOMMANDCONTEXT pHGSMICtx, … … 1144 1170 rc = pConnect->Hdr.i32Result; 1145 1171 if (RT_SUCCESS(rc)) 1172 { 1173 Assert(pConnect->Connect.Hdr.u32CmdClientId); 1146 1174 *pu32ClientID = pConnect->Connect.Hdr.u32CmdClientId; 1175 } 1147 1176 else 1148 1177 WARN(("VBOXCMDVBVA3DCTL_TYPE_CONNECT Disable failed %d", rc)); -
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/wddm/VBoxMPWddm.cpp
r50898 r50913 1979 1979 memset(pCaps, 0, sizeof (*pCaps)); 1980 1980 #endif 1981 1982 pCaps->HighestAcceptableAddress.QuadPart = ~((uintptr_t)0); 1981 pCaps->HighestAcceptableAddress.LowPart = ~0UL; 1982 #ifdef RT_ARCH_AMD64 1983 /* driver talks to host in terms of page numbers when reffering to RAM 1984 * we use uint32_t field to pass page index to host, so max would be (~0UL) << PAGE_OFFSET, 1985 * which seems quite enough */ 1986 pCaps->HighestAcceptableAddress.HighPart = PAGE_OFFSET_MASK; 1987 #endif 1983 1988 pCaps->MaxPointerWidth = VBOXWDDM_C_POINTER_MAX_WIDTH; 1984 1989 pCaps->MaxPointerHeight = VBOXWDDM_C_POINTER_MAX_HEIGHT; … … 3095 3100 { 3096 3101 cbCmd = pSubmitCommand->DmaBufferSubmissionEndOffset - pSubmitCommand->DmaBufferSubmissionStartOffset; 3097 if (cbCmd < sizeof (VBOXCMDVBVA_HDR)) 3098 { 3099 WARN(("DmaBufferPrivateDataSubmissionEndOffset (%d) - DmaBufferPrivateDataSubmissionStartOffset (%d) < sizeof (VBOXCMDVBVA_HDR) (%d)", 3100 pSubmitCommand->DmaBufferPrivateDataSubmissionEndOffset, 3101 pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset, 3102 sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR))); 3103 return STATUS_INVALID_PARAMETER; 3104 } 3105 3106 if (cbCmd > 0xffff) 3107 { 3108 WARN(("cbCmd too big")); 3109 return STATUS_INVALID_PARAMETER; 3110 } 3111 3112 if (VBOXWDDM_DUMMY_DMABUFFER_SIZE == cbCmd) 3102 if (!cbCmd || VBOXWDDM_DUMMY_DMABUFFER_SIZE == cbCmd) 3113 3103 { 3114 3104 SysMem.Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_NOPCMD; … … 3119 3109 else 3120 3110 { 3111 if (cbCmd < sizeof (VBOXCMDVBVA_HDR)) 3112 { 3113 WARN(("DmaBufferPrivateDataSubmissionEndOffset (%d) - DmaBufferPrivateDataSubmissionStartOffset (%d) < sizeof (VBOXCMDVBVA_HDR) (%d)", 3114 pSubmitCommand->DmaBufferPrivateDataSubmissionEndOffset, 3115 pSubmitCommand->DmaBufferPrivateDataSubmissionStartOffset, 3116 sizeof (VBOXWDDM_DMA_PRIVATEDATA_BASEHDR))); 3117 return STATUS_INVALID_PARAMETER; 3118 } 3119 3120 if (cbCmd > 0xffff) 3121 { 3122 WARN(("cbCmd too big")); 3123 return STATUS_INVALID_PARAMETER; 3124 } 3125 3121 3126 SysMem.Hdr.u8OpCode = VBOXCMDVBVA_OPTYPE_SYSMEMCMD; 3122 3127 SysMem.Hdr.u8Flags = cbCmd & 0xff; 3123 3128 SysMem.Hdr.u.u8PrimaryID = (cbCmd >> 8) & 0xff; 3124 3129 SysMem.Hdr.u8State = VBOXCMDVBVA_STATE_SUBMITTED; 3125 SysMem.phSysMem = pSubmitCommand->DmaBufferPhysicalAddress.QuadPart + pSubmitCommand->DmaBufferSubmissionStartOffset; 3126 if (SysMem.phSysMem & PAGE_OFFSET_MASK) 3130 if (pSubmitCommand->DmaBufferPhysicalAddress.QuadPart & PAGE_OFFSET_MASK) 3127 3131 { 3128 3132 WARN(("command should be page aligned for now")); 3129 3133 return STATUS_INVALID_PARAMETER; 3130 3134 } 3135 SysMem.iPage = (VBOXCMDVBVAPAGEIDX)(pSubmitCommand->DmaBufferPhysicalAddress.QuadPart >> PAGE_SHIFT); 3136 3137 cbCmd = sizeof (SysMem); 3131 3138 } 3132 3139 3133 3140 pHdr = &SysMem.Hdr; 3134 cbCmd = sizeof (SysMem);3135 3141 } 3136 3142 else … … 3403 3409 LOGF(("ENTER, context(0x%x)", hAdapter)); 3404 3410 3405 /* paging buffer transfer is nop for hostID allocations */3406 if (pBuildPagingBuffer->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR))3407 {3408 WARN(("pBuildPagingBuffer->DmaBufferPrivateDataSize(%d) < sizeof VBOXCMDVBVA_HDR (%d)", pBuildPagingBuffer->DmaBufferPrivateDataSize , sizeof (VBOXCMDVBVA_HDR)));3409 /* @todo: can this actually happen? what status to return? */3410 return STATUS_INVALID_PARAMETER;3411 }3412 3413 3411 switch (pBuildPagingBuffer->Operation) 3414 3412 { … … 3471 3469 } 3472 3470 3473 uint32_t cPages = (uint32_t)((pBuildPagingBuffer->Transfer.TransferSize + 0xfff) >> PAGE_SHIFT); 3474 uint32_t cTotalPages = cPages; 3471 Assert(!(pBuildPagingBuffer->Transfer.TransferSize & PAGE_OFFSET_MASK)); 3472 Assert(!(offVRAM & PAGE_OFFSET_MASK)); 3473 uint32_t cPages = (uint32_t)(pBuildPagingBuffer->Transfer.TransferSize >> PAGE_SHIFT); 3474 Assert(cPages > pBuildPagingBuffer->MultipassOffset); 3475 3475 cPages -= pBuildPagingBuffer->MultipassOffset; 3476 uint32_t iFirstPage = pBuildPagingBuffer-> Transfer.MdlOffset + pBuildPagingBuffer->MultipassOffset;3476 uint32_t iFirstPage = pBuildPagingBuffer->MultipassOffset; 3477 3477 uint32_t cPagesWritten; 3478 offVRAM += pBuildPagingBuffer->Transfer.TransferOffset + pBuildPagingBuffer->MultipassOffset;3478 offVRAM += pBuildPagingBuffer->Transfer.TransferOffset + (pBuildPagingBuffer->MultipassOffset << PAGE_SHIFT); 3479 3479 3480 3480 pPaging->Alloc.u.offVRAM = offVRAM; 3481 3481 if (fIn) 3482 3482 pPaging->Hdr.u8Flags |= VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN; 3483 cbBuffer = VBoxCVDdiPTransferVRamSysBuildEls(pPaging, pMdl, iFirstPage, cPages, pBuildPagingBuffer->Dma BufferPrivateDataSize, &cPagesWritten);3483 cbBuffer = VBoxCVDdiPTransferVRamSysBuildEls(pPaging, pMdl, iFirstPage, cPages, pBuildPagingBuffer->DmaSize, &cPagesWritten); 3484 3484 if (cPagesWritten != cPages) 3485 3485 pBuildPagingBuffer->MultipassOffset += cPagesWritten; … … 3500 3500 /** @todo: add necessary bits */ 3501 3501 WARN(("Impl!")); 3502 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 3502 3503 break; 3503 3504 } … … 3510 3511 return STATUS_INVALID_PARAMETER; 3511 3512 } 3513 WARN(("Do we need to do anything here?")); 3512 3514 break; 3513 3515 } … … 3521 3523 Assert(!cbPrivateData); 3522 3524 3525 Assert(pBuildPagingBuffer->Operation == DXGK_OPERATION_DISCARD_CONTENT || cbBuffer); 3523 3526 pBuildPagingBuffer->pDmaBuffer = ((uint8_t*)pBuildPagingBuffer->pDmaBuffer) + cbBuffer; 3524 3527 pBuildPagingBuffer->pDmaBufferPrivateData = ((uint8_t*)pBuildPagingBuffer->pDmaBufferPrivateData) + cbPrivateData; … … 6088 6091 // LOGF(("ENTER, hContext(0x%x)", hContext)); 6089 6092 6090 vboxVDbgBreakF v();6093 vboxVDbgBreakF(); 6091 6094 6092 6095 PVBOXWDDM_CONTEXT pContext = (PVBOXWDDM_CONTEXT)hContext; 6093 6096 PVBOXWDDM_DEVICE pDevice = pContext->pDevice; 6094 6097 PVBOXMP_DEVEXT pDevExt = pDevice->pAdapter; 6098 uint32_t cbBuffer = 0; 6099 uint32_t cbPrivateData = 0; 6095 6100 6096 6101 if (pPresent->DmaBufferPrivateDataSize < sizeof (VBOXCMDVBVA_HDR)) … … 6191 6196 6192 6197 paRects = pBlt->aRects; 6193 cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects); 6198 cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_BLT_PRIMARY, aRects); 6199 cbMaxRects = pPresent->DmaBufferPrivateDataSize - cbPrivateData; 6194 6200 } 6195 6201 else … … 6214 6220 6215 6221 paRects = pBlt->aRects; 6216 cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, aRects); 6217 } 6222 cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_BLT_OFFPRIMSZFMT_OR_ID, aRects); 6223 cbMaxRects = pPresent->DmaBufferPrivateDataSize - cbPrivateData; 6224 } 6225 6226 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 6218 6227 } 6219 6228 else if (pPresent->Flags.Flip) … … 6247 6256 if (VBoxCVDdiFillAllocInfo(pHdr, &pFlip->src, pSrcAlloc, pSrc, false)) 6248 6257 u32SrcPatch = RT_OFFSETOF(VBOXCMDVBVA_FLIP, src.u.offVRAM); 6258 6259 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 6260 cbPrivateData = sizeof (*pFlip); 6249 6261 } 6250 6262 else if (pPresent->Flags.ColorFill) … … 6278 6290 6279 6291 paRects = pCFill->aRects; 6280 cbMaxRects = pPresent->DmaBufferPrivateDataSize - RT_OFFSETOF(VBOXCMDVBVA_CLRFILL, aRects); 6292 cbPrivateData = RT_OFFSETOF(VBOXCMDVBVA_CLRFILL, aRects); 6293 cbMaxRects = pPresent->DmaBufferPrivateDataSize - cbPrivateData; 6294 6295 cbBuffer = VBOXWDDM_DUMMY_DMABUFFER_SIZE; 6281 6296 } 6282 6297 else … … 6300 6315 pPresent->MultipassOffset = 0; 6301 6316 6317 Assert(cRects); 6302 6318 const RECT *paDstSubRects = &pPresent->pDstSubRects[iStartRect]; 6303 6319 VBoxCVDdiPackRects(paRects, paDstSubRects, cRects); 6320 cbPrivateData += (cRects * sizeof (VBOXCMDVBVA_RECT)); 6304 6321 } 6305 6322 … … 6324 6341 pHdr->u32FenceID = 0; 6325 6342 6326 pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + VBOXWDDM_DUMMY_DMABUFFER_SIZE; 6343 Assert(cbBuffer); 6344 Assert(cbPrivateData); 6345 pPresent->pDmaBuffer = ((uint8_t*)pPresent->pDmaBuffer) + cbBuffer; 6346 pPresent->pDmaBufferPrivateData = ((uint8_t*)pPresent->pDmaBufferPrivateData) + cbPrivateData; 6327 6347 6328 6348 if (pPresent->MultipassOffset) -
trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
r50889 r50913 97 97 VBVAEXHOSTCTL_TYPE_HH_ENABLE, 98 98 VBVAEXHOSTCTL_TYPE_HH_TERM, 99 VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_TERM, 99 100 VBVAEXHOSTCTL_TYPE_HH_RESET, 100 101 VBVAEXHOSTCTL_TYPE_HH_SAVESTATE, … … 213 214 else if (!fHostOnlyMode) 214 215 { 215 if (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) >VBVAEXHOSTCONTEXT_ESTATE_PAUSED)216 if (ASMAtomicUoReadS32(&pCmdVbva->i32EnableState) != VBVAEXHOSTCONTEXT_ESTATE_PAUSED) 216 217 { 217 218 pCtl = RTListGetFirst(&pCmdVbva->GuestCtlList, VBVAEXHOSTCTL, Node); … … 965 966 } 966 967 968 static DECLCALLBACK(void) vboxVDMACrHgcmNotifyTerminatingDoneCb(HVBOXCRCMDCTL_NOTIFY_TERMINATING hClient) 969 { 970 struct VBOXVDMAHOST *pVdma = hClient; 971 Assert(pVdma->CmdVbva.i32State == VBVAEXHOSTCONTEXT_STATE_PROCESSING); 972 int rc = VBoxVDMAThreadEventNotify(&pVdma->Thread); 973 AssertRC(rc); 974 } 975 976 static DECLCALLBACK(int) vboxVDMACrHgcmNotifyTerminatingCb(HVBOXCRCMDCTL_NOTIFY_TERMINATING hClient, VBOXCRCMDCTL_HGCMENABLE_DATA *pHgcmEnableData) 977 { 978 struct VBOXVDMAHOST *pVdma = hClient; 979 VBVAEXHOSTCTL Ctl; 980 Ctl.enmType = VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_TERM; 981 int rc = vdmaVBVACtlSubmitSync(pVdma, &Ctl, VBVAEXHOSTCTL_SOURCE_HOST_ANY); 982 if (!RT_SUCCESS(rc)) 983 { 984 WARN(("vdmaVBVACtlSubmitSync failed %d\n", rc)); 985 return rc; 986 } 987 988 Assert(pVdma->CmdVbva.i32State == VBVAEXHOSTCONTEXT_STATE_PROCESSING); 989 990 pHgcmEnableData->hRHCmd = pVdma; 991 pHgcmEnableData->pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand; 992 993 return VINF_SUCCESS; 994 } 995 967 996 static int vboxVDMACrHgcmHandleEnable(struct VBOXVDMAHOST *pVdma) 968 997 { 969 998 VBOXCRCMDCTL_ENABLE Enable; 970 999 Enable.Hdr.enmType = VBOXCRCMDCTL_TYPE_ENABLE; 971 Enable. hRHCmd = pVdma;972 Enable. pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand;1000 Enable.Data.hRHCmd = pVdma; 1001 Enable.Data.pfnRHCmd = vboxVDMACrHgcmHandleEnableRemainingHostCommand; 973 1002 974 1003 int rc = vboxVDMACrHgcmSubmitSync(pVdma, &Enable.Hdr, sizeof (Enable)); … … 1012 1041 if (RT_SUCCESS(rc)) 1013 1042 { 1014 VBOXCRCMDCTL Ctl; 1015 Ctl.enmType = VBOXCRCMDCTL_TYPE_DISABLE; 1016 rc = vboxVDMACrHgcmSubmitSync(pVdma, &Ctl, sizeof (Ctl)); 1043 VBOXCRCMDCTL_DISABLE Disable; 1044 Disable.Hdr.enmType = VBOXCRCMDCTL_TYPE_DISABLE; 1045 Disable.Data.hNotifyTerm = pVdma; 1046 Disable.Data.pfnNotifyTerm = vboxVDMACrHgcmNotifyTerminatingCb; 1047 Disable.Data.pfnNotifyTermDone = vboxVDMACrHgcmNotifyTerminatingDoneCb; 1048 rc = vboxVDMACrHgcmSubmitSync(pVdma, &Disable.Hdr, sizeof (Disable)); 1017 1049 if (RT_SUCCESS(rc)) 1018 1050 { … … 1042 1074 } 1043 1075 1044 static int vdmaVBVADisableProcess(struct VBOXVDMAHOST *pVdma )1076 static int vdmaVBVADisableProcess(struct VBOXVDMAHOST *pVdma, bool fDoHgcmEnable) 1045 1077 { 1046 1078 if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva)) … … 1053 1085 if (RT_SUCCESS(rc)) 1054 1086 { 1055 /* disable is a bit tricky 1056 * we need to ensure the host ctl commands do not come out of order 1057 * and do not come over HGCM channel until after it is enabled */ 1058 rc = vboxVDMACrHgcmHandleEnable(pVdma); 1059 if (RT_SUCCESS(rc)) 1060 return rc; 1061 1062 PVGASTATE pVGAState = pVdma->pVGAState; 1063 VBOXCRCMD_SVRENABLE_INFO Info; 1064 Info.hCltScr = pVGAState->pDrv; 1065 Info.pfnCltScrUpdateBegin = pVGAState->pDrv->pfnVBVAUpdateBegin; 1066 Info.pfnCltScrUpdateProcess = pVGAState->pDrv->pfnVBVAUpdateProcess; 1067 Info.pfnCltScrUpdateEnd = pVGAState->pDrv->pfnVBVAUpdateEnd; 1068 pVdma->CrSrvInfo.pfnEnable(pVdma->CrSrvInfo.hSvr, &Info); 1087 if (fDoHgcmEnable) 1088 { 1089 /* disable is a bit tricky 1090 * we need to ensure the host ctl commands do not come out of order 1091 * and do not come over HGCM channel until after it is enabled */ 1092 rc = vboxVDMACrHgcmHandleEnable(pVdma); 1093 if (RT_SUCCESS(rc)) 1094 return rc; 1095 1096 PVGASTATE pVGAState = pVdma->pVGAState; 1097 VBOXCRCMD_SVRENABLE_INFO Info; 1098 Info.hCltScr = pVGAState->pDrv; 1099 Info.pfnCltScrUpdateBegin = pVGAState->pDrv->pfnVBVAUpdateBegin; 1100 Info.pfnCltScrUpdateProcess = pVGAState->pDrv->pfnVBVAUpdateProcess; 1101 Info.pfnCltScrUpdateEnd = pVGAState->pDrv->pfnVBVAUpdateEnd; 1102 pVdma->CrSrvInfo.pfnEnable(pVdma->CrSrvInfo.hSvr, &Info); 1103 } 1069 1104 } 1070 1105 else … … 1074 1109 } 1075 1110 1076 static int vboxVDMACrHostCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd) 1077 { 1111 static int vboxVDMACrHostCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd, bool *pfContinue) 1112 { 1113 *pfContinue = true; 1114 1078 1115 switch (pCmd->enmType) 1079 1116 { … … 1101 1138 case VBVAEXHOSTCTL_TYPE_HH_TERM: 1102 1139 { 1103 int rc = vdmaVBVADisableProcess(pVdma );1140 int rc = vdmaVBVADisableProcess(pVdma, true); 1104 1141 if (!RT_SUCCESS(rc)) 1105 1142 { … … 1111 1148 return VINF_SUCCESS; 1112 1149 } 1150 case VBVAEXHOSTCTL_TYPE_HH_ON_HGCM_TERM: 1151 { 1152 int rc = vdmaVBVADisableProcess(pVdma, false); 1153 if (!RT_SUCCESS(rc)) 1154 { 1155 WARN(("vdmaVBVADisableProcess failed %d\n", rc)); 1156 return rc; 1157 } 1158 1159 *pfContinue = false; 1160 1161 return VINF_SUCCESS; 1162 } 1113 1163 case VBVAEXHOSTCTL_TYPE_HH_RESET: 1114 1164 { 1115 int rc = vdmaVBVADisableProcess(pVdma );1165 int rc = vdmaVBVADisableProcess(pVdma, true); 1116 1166 if (!RT_SUCCESS(rc)) 1117 1167 { … … 1148 1198 } 1149 1199 1150 return vdmaVBVADisableProcess(pVdma );1200 return vdmaVBVADisableProcess(pVdma, true); 1151 1201 } 1152 1202 default: … … 1160 1210 * the direction is VRA#M - related, so fIn == true - transfer to VRAM); false - transfer from VRAM 1161 1211 */ 1162 static int vboxVDMACrCmdVbvaProcessPagingEl(PPDMDEVINS pDevIns, const VBOXCMDVBVA_SYSMEMEL *pMemEl, uint8_t *pu8Vram, uint8_t *pu8VramMax, uint8_t **ppu8VramNext, bool fIn) 1163 { 1164 uint32_t u32Cpages = pMemEl->cPagesAfterFirst + 1; 1165 RTGCPHYS phPage = (pMemEl->iPage1 | (pMemEl->iPage2 << 20)); 1212 static int vboxVDMACrCmdVbvaProcessPagingEl(PPDMDEVINS pDevIns, VBOXCMDVBVAPAGEIDX iPage, uint8_t *pu8Vram, bool fIn) 1213 { 1214 RTGCPHYS phPage = (RTGCPHYS)(iPage >> PAGE_SHIFT); 1166 1215 PGMPAGEMAPLOCK Lock; 1167 uint32_t cbCopy = u32Cpages * PAGE_SIZE;1168 uint8_t* pu8VramNext = pu8Vram + cbCopy;1169 1170 if (pu8VramNext <= pu8Vram && pu8VramNext > pu8VramMax)1171 {1172 WARN(("invalid copy size"));1173 return VERR_INVALID_PARAMETER;1174 }1175 1176 1216 int rc; 1217 1177 1218 if (fIn) 1178 1219 { 1179 for (uint32_t i = 0; i < u32Cpages; ++i) 1180 { 1181 const void * pvPage; 1182 rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvPage, &Lock); 1183 if (!RT_SUCCESS(rc)) 1184 { 1185 WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d", rc)); 1186 return rc; 1187 } 1188 1189 memcpy(pu8Vram, pvPage, PAGE_SIZE); 1190 1191 PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock); 1192 1193 pu8Vram += PAGE_SIZE; 1194 } 1220 const void * pvPage; 1221 rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvPage, &Lock); 1222 if (!RT_SUCCESS(rc)) 1223 { 1224 WARN(("PDMDevHlpPhysGCPhys2CCPtrReadOnly failed %d", rc)); 1225 return rc; 1226 } 1227 1228 memcpy(pu8Vram, pvPage, PAGE_SIZE); 1229 1230 PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock); 1195 1231 } 1196 1232 else 1197 1233 { 1198 for (uint32_t i = 0; i < u32Cpages; ++i) 1199 { 1200 void * pvPage; 1201 rc = PDMDevHlpPhysGCPhys2CCPtr(pDevIns, phPage, 0, &pvPage, &Lock); 1202 if (!RT_SUCCESS(rc)) 1203 { 1204 WARN(("PDMDevHlpPhysGCPhys2CCPtr failed %d", rc)); 1205 return rc; 1206 } 1207 1208 memcpy(pvPage, pu8Vram, PAGE_SIZE); 1209 1210 PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock); 1211 1212 pu8Vram += PAGE_SIZE; 1213 } 1214 } 1215 1216 if (ppu8VramNext) 1217 *ppu8VramNext = pu8VramNext; 1234 void * pvPage; 1235 rc = PDMDevHlpPhysGCPhys2CCPtr(pDevIns, phPage, 0, &pvPage, &Lock); 1236 if (!RT_SUCCESS(rc)) 1237 { 1238 WARN(("PDMDevHlpPhysGCPhys2CCPtr failed %d", rc)); 1239 return rc; 1240 } 1241 1242 memcpy(pvPage, pu8Vram, PAGE_SIZE); 1243 1244 PDMDevHlpPhysReleasePageMappingLock(pDevIns, &Lock); 1245 } 1218 1246 1219 1247 return VINF_SUCCESS; 1220 1248 } 1221 1249 1222 static int vboxVDMACrCmdVbvaProcessPagingEls(PPDMDEVINS pDevIns, const VBOXCMDVBVA_SYSMEMEL *pMemEl, uint32_t cMemEls, uint8_t *pu8Vram, uint8_t *pu8VramMax, uint8_t **ppu8VramNext, bool fIn) 1223 { 1224 uint8_t *pu8VramNext = pu8Vram; 1225 for (uint32_t i = 0; i < cMemEls; ++i, ++pMemEl) 1226 { 1227 int rc = vboxVDMACrCmdVbvaProcessPagingEl(pDevIns, pMemEl, pu8Vram, pu8VramMax, &pu8VramNext, fIn); 1250 static int vboxVDMACrCmdVbvaProcessPagingEls(PPDMDEVINS pDevIns, const VBOXCMDVBVAPAGEIDX *piPages, uint32_t cPages, uint8_t *pu8Vram, bool fIn) 1251 { 1252 for (uint32_t i = 0; i < cPages; ++i) 1253 { 1254 int rc = vboxVDMACrCmdVbvaProcessPagingEl(pDevIns, piPages[i], pu8Vram, fIn); 1228 1255 if (!RT_SUCCESS(rc)) 1229 1256 { … … 1233 1260 } 1234 1261 1235 if (ppu8VramNext)1236 *ppu8VramNext = pu8VramNext;1237 1238 1262 return VINF_SUCCESS; 1239 1263 } 1240 1264 1241 1265 static int8_t vboxVDMACrCmdVbvaPagingDataInit(PVGASTATE pVGAState, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd, 1242 const VBOXCMDVBVA _SYSMEMEL **ppSysMem, uint32_t *pcSysMem,1243 uint8_t **ppu8Vram, uint8_t **ppu8VramMax,bool *pfIn)1266 const VBOXCMDVBVAPAGEIDX **ppPages, VBOXCMDVBVAPAGEIDX *pcPages, 1267 uint8_t **ppu8Vram, bool *pfIn) 1244 1268 { 1245 1269 if (cbCmd < sizeof (VBOXCMDVBVA_PAGING_TRANSFER)) … … 1249 1273 } 1250 1274 1251 uint32_t cSysMem = cbCmd - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aSysMem);1252 if (c SysMem % sizeof (VBOXCMDVBVA_SYSMEMEL))1275 VBOXCMDVBVAPAGEIDX cPages = cbCmd - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers); 1276 if (cPages % sizeof (VBOXCMDVBVAPAGEIDX)) 1253 1277 { 1254 1278 WARN(("invalid cmd size")); 1255 1279 return -1; 1256 1280 } 1257 c SysMem /= sizeof (VBOXCMDVBVA_SYSMEMEL);1281 cPages /= sizeof (VBOXCMDVBVAPAGEIDX); 1258 1282 1259 1283 VBOXCMDVBVA_PAGING_TRANSFER *pTransfer = (VBOXCMDVBVA_PAGING_TRANSFER*)pCmd; … … 1264 1288 return -1; 1265 1289 } 1266 const VBOXCMDVBVA _SYSMEMEL *pSysMem = pTransfer->aSysMem;1290 const VBOXCMDVBVAPAGEIDX *pPages = pTransfer->aPageNumbers; 1267 1291 1268 1292 uint8_t * pu8VramBase = pVGAState->vram_ptrR3; 1269 1293 uint8_t *pu8VramMax = pu8VramBase + pVGAState->vram_size; 1270 if ( pTransfer->Alloc.u.offVRAM >= pVGAState->vram_size)1294 if (offVRAM >= pVGAState->vram_size) 1271 1295 { 1272 1296 WARN(("invalid vram offset")); … … 1274 1298 } 1275 1299 1276 uint8_t *pu8Vram = pu8VramBase + pTransfer->Alloc.u.offVRAM; 1300 if (offVRAM + (cPages << PAGE_SHIFT) >= pVGAState->vram_size) 1301 { 1302 WARN(("invalid cPages")); 1303 return -1; 1304 } 1305 1306 uint8_t *pu8Vram = pu8VramBase + offVRAM; 1277 1307 bool fIn = !!(pTransfer->Hdr.u8Flags & VBOXCMDVBVA_OPF_PAGING_TRANSFER_IN); 1278 1308 1279 *pp SysMem = pSysMem;1280 *pc SysMem = cSysMem;1309 *ppPages = pPages; 1310 *pcPages = cPages; 1281 1311 *ppu8Vram = pu8Vram; 1282 *ppu8VramMax = pu8VramMax;1283 1312 *pfIn = fIn; 1284 1313 return 0; … … 1294 1323 { 1295 1324 PVGASTATE pVGAState = pVdma->pVGAState; 1296 const VBOXCMDVBVA _SYSMEMEL *pSysMem;1297 uint32_t c SysMem;1325 const VBOXCMDVBVAPAGEIDX *pPages; 1326 uint32_t cPages; 1298 1327 uint8_t *pu8Vram; 1299 uint8_t *pu8VramMax;1300 1328 bool fIn; 1301 1329 int8_t i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pCmd, cbCmd, 1302 &p SysMem, &cSysMem,1303 &pu8Vram, & pu8VramMax, &fIn);1330 &pPages, &cPages, 1331 &pu8Vram, &fIn); 1304 1332 if (i8Result < 0) 1305 1333 { … … 1309 1337 1310 1338 PPDMDEVINS pDevIns = pVGAState->pDevInsR3; 1311 int rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, p SysMem, cSysMem, pu8Vram, pu8VramMax, &pu8Vram, fIn);1339 int rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, pPages, cPages, pu8Vram, fIn); 1312 1340 if (!RT_SUCCESS(rc)) 1313 1341 { … … 1340 1368 AssertCompile(sizeof (VBOXCMDVBVA_HDR) == 8); 1341 1369 AssertCompile(sizeof (VBOXCMDVBVA_ALLOCINFO) == 4); 1342 AssertCompile(sizeof (VBOXCMDVBVA_SYSMEMEL) == 8); 1343 AssertCompile(!(PAGE_SIZE % sizeof (VBOXCMDVBVA_SYSMEMEL))); 1344 AssertCompile(!(sizeof (VBOXCMDVBVA_PAGING_TRANSFER) % 8)); 1370 AssertCompile(sizeof (VBOXCMDVBVAPAGEIDX) == 4); 1371 AssertCompile(!(PAGE_SIZE % sizeof (VBOXCMDVBVAPAGEIDX))); 1345 1372 1346 1373 #define VBOXCMDVBVA_NUM_SYSMEMEL_PER_PAGE (PAGE_SIZE / sizeof (VBOXCMDVBVA_SYSMEMEL)) … … 1362 1389 } 1363 1390 1364 RTGCPHYS phPage = pSysmemCmd->phSysMem; 1365 if (phPage & PAGE_OFFSET_MASK) 1366 { 1367 WARN(("cmd address is not on page boundary\n")); 1368 return -1; 1369 } 1391 VBOXCMDVBVAPAGEIDX iPage = pSysmemCmd->iPage; 1392 RTGCPHYS phPage = (RTGCPHYS)(iPage << PAGE_SHIFT); 1370 1393 1371 1394 PGMPAGEMAPLOCK Lock; … … 1395 1418 case VBOXCMDVBVA_OPTYPE_PAGING_TRANSFER: 1396 1419 { 1397 const VBOXCMDVBVA_SYSMEMEL *pSysMem;1398 uint32_t c SysMem;1420 const uint32_t *pPages; 1421 uint32_t cPages; 1399 1422 uint8_t *pu8Vram; 1400 uint8_t *pu8VramMax;1401 1423 bool fIn; 1402 1424 i8Result = vboxVDMACrCmdVbvaPagingDataInit(pVGAState, pCmd, cbCmd, 1403 &p SysMem, &cSysMem,1404 &pu8Vram, & pu8VramMax, &fIn);1425 &pPages, &cPages, 1426 &pu8Vram, &fIn); 1405 1427 if (i8Result < 0) 1406 1428 { … … 1409 1431 } 1410 1432 1411 uint32_t cCur SysMem = PAGE_SIZE - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aSysMem);1412 cCur SysMem /= sizeof (VBOXCMDVBVA_SYSMEMEL);1413 Assert(cCur SysMem < cSysMem);1433 uint32_t cCurPages = PAGE_SIZE - RT_OFFSETOF(VBOXCMDVBVA_PAGING_TRANSFER, aPageNumbers); 1434 cCurPages /= sizeof (VBOXCMDVBVAPAGEIDX); 1435 Assert(cCurPages < cPages); 1414 1436 1415 1437 do 1416 1438 { 1417 rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, p SysMem, cCurSysMem, pu8Vram, pu8VramMax, &pu8Vram, fIn);1439 rc = vboxVDMACrCmdVbvaProcessPagingEls(pDevIns, pPages, cCurPages, pu8Vram, fIn); 1418 1440 if (!RT_SUCCESS(rc)) 1419 1441 { … … 1423 1445 } 1424 1446 1425 Assert(c SysMem >= cCurSysMem);1426 c SysMem -= cCurSysMem;1427 1428 if (!c SysMem)1447 Assert(cPages >= cCurPages); 1448 cPages -= cCurPages; 1449 1450 if (!cPages) 1429 1451 break; 1430 1452 … … 1432 1454 1433 1455 phPage += PAGE_SIZE; 1456 pu8Vram += (cCurPages << PAGE_SHIFT); 1434 1457 1435 1458 rc = PDMDevHlpPhysGCPhys2CCPtrReadOnly(pDevIns, phPage, 0, &pvCmd, &Lock); … … 1440 1463 } 1441 1464 1442 if (cSysMem > VBOXCMDVBVA_NUM_SYSMEMEL_PER_PAGE) 1443 cCurSysMem = VBOXCMDVBVA_NUM_SYSMEMEL_PER_PAGE; 1444 else 1445 cCurSysMem = cSysMem; 1465 cCurPages = PAGE_SIZE / sizeof (VBOXCMDVBVAPAGEIDX); 1466 if (cCurPages > cPages) 1467 cCurPages = cPages; 1446 1468 } while (1); 1447 1469 break; … … 2034 2056 VBVARaiseIrqNoWait(pVGAState, 0); 2035 2057 break; 2036 case VBVAEXHOST_DATA_TYPE_HOSTCTL:2037 rc = vboxVDMACrHostCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd);2038 VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc);2039 break;2040 2058 case VBVAEXHOST_DATA_TYPE_GUESTCTL: 2041 2059 rc = vboxVDMACrGuestCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd); 2042 2060 VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc); 2043 2061 break; 2062 case VBVAEXHOST_DATA_TYPE_HOSTCTL: 2063 { 2064 bool fContinue = true; 2065 rc = vboxVDMACrHostCtlProcess(pVdma, (VBVAEXHOSTCTL*)pCmd, &fContinue); 2066 VBoxVBVAExHPDataCompleteCtl(pCmdVbva, (VBVAEXHOSTCTL*)pCmd, rc); 2067 if (fContinue) 2068 break; 2069 } 2044 2070 case VBVAEXHOST_DATA_TYPE_NO_DATA: 2045 2071 rc = VBoxVDMAThreadEventWait(&pVdma->Thread, RT_INDEFINITE_WAIT); -
trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h
r50817 r50913 413 413 414 414 CR_SERVER_RPW RpwWorker; 415 416 VBOXCRCMDCTL_HGCMDISABLE_DATA DisableData; 415 417 416 418 /** configuration options */ … … 573 575 #endif 574 576 575 extern DECLEXPORT(int32_t) crVBoxServerHgcmEnable( HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd, PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd);576 extern DECLEXPORT(int32_t) crVBoxServerHgcmDisable( );577 extern DECLEXPORT(int32_t) crVBoxServerHgcmEnable(VBOXCRCMDCTL_HGCMENABLE_DATA *pData); 578 extern DECLEXPORT(int32_t) crVBoxServerHgcmDisable(VBOXCRCMDCTL_HGCMDISABLE_DATA *pData); 577 579 578 580 extern int crVBoxServerHostCtl(VBOXCRCMDCTL *pCtl, uint32_t cbCtl); -
trunk/src/VBox/HostServices/SharedOpenGL/crserver/crservice.cpp
r50827 r50913 1524 1524 case VBOXCRCMDCTL_TYPE_DISABLE: 1525 1525 { 1526 if (paParms->u.pointer.size != sizeof (VBOXCRCMDCTL ))1526 if (paParms->u.pointer.size != sizeof (VBOXCRCMDCTL_DISABLE)) 1527 1527 WARN(("invalid param size")); 1528 int rc = crVBoxServerHgcmDisable(); 1528 VBOXCRCMDCTL_DISABLE *pDisable = (VBOXCRCMDCTL_DISABLE*)pCtl; 1529 int rc = crVBoxServerHgcmDisable(&pDisable->Data); 1529 1530 if (RT_SUCCESS(rc)) 1530 1531 g_u32fCrHgcmDisabled = 1; … … 1538 1539 WARN(("invalid param size")); 1539 1540 VBOXCRCMDCTL_ENABLE *pEnable = (VBOXCRCMDCTL_ENABLE*)pCtl; 1540 int rc = crVBoxServerHgcmEnable( pEnable->hRHCmd, pEnable->pfnRHCmd);1541 int rc = crVBoxServerHgcmEnable(&pEnable->Data); 1541 1542 if (RT_SUCCESS(rc)) 1542 1543 g_u32fCrHgcmDisabled = 0; -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
r50831 r50913 51 51 52 52 #define VBOXCRHGSMI_CMD_CHECK_COMPLETE(_pData, _rc) do { \ 53 if (CRVBOXHGSMI_CMDDATA_IS_ SET(_pData)) { \53 if (CRVBOXHGSMI_CMDDATA_IS_HGSMICMD(_pData)) { \ 54 54 VBOXCRHGSMI_CMD_COMPLETE(_pData, _rc); \ 55 55 } \ -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_main.c
r50831 r50913 84 84 { 85 85 CRClient *pClient = NULL; 86 int32_t i;87 86 88 87 pClient = crVBoxServerClientById(u32ClientID); … … 158 157 159 158 tearingdown = 1; 159 160 if (cr_server.DisableData.hNotifyTerm) 161 { 162 VBOXCRCMDCTL_HGCMENABLE_DATA EnableData; 163 int rc = cr_server.DisableData.pfnNotifyTerm(cr_server.DisableData.hNotifyTerm, &EnableData); 164 if (!RT_SUCCESS(rc)) 165 { 166 WARN(("pfnNotifyTerm failed %d", rc)); 167 return; 168 } 169 170 rc = crVBoxServerHgcmEnable(&EnableData); 171 if (!RT_SUCCESS(rc)) 172 { 173 WARN(("crVBoxServerHgcmEnable failed %d", rc)); 174 return; 175 } 176 177 cr_server.DisableData.pfnNotifyTermDone(cr_server.DisableData.hNotifyTerm); 178 } 160 179 161 180 crStateSetCurrent( NULL ); … … 2975 2994 { 2976 2995 spuCtx = cr_server.MainContextInfo.SpuContext; 2977 spuWindow = pMural-> CreateInfo.realVisualBits;2996 spuWindow = pMural->spuWindow; 2978 2997 } 2979 2998 } … … 3014 3033 cParams = cBuffers-1; 3015 3034 3016 if (cbCmd !=RT_OFFSETOF(VBOXCMDVBVA_CRCMD_CMD, aBuffers[cBuffers]))3035 if (cbCmd < RT_OFFSETOF(VBOXCMDVBVA_CRCMD_CMD, aBuffers[cBuffers])) 3017 3036 { 3018 3037 WARN(("invalid buffer size")); … … 3363 3382 rc = CrHTablePutToSlot(&cr_server.clientTable, u32ClientId, pClient); 3364 3383 if (RT_SUCCESS(rc)) 3384 { 3385 pConnect->Hdr.u32CmdClientId = u32ClientId; 3365 3386 return VINF_SUCCESS; 3387 } 3366 3388 else 3367 3389 WARN(("CrHTablePutToSlot failed %d", rc)); … … 3454 3476 static DECLCALLBACK(int8_t) crVBoxCrCmdCmd(HVBOXCRCMDSVR hSvr, const VBOXCMDVBVA_HDR *pCmd, uint32_t cbCmd) 3455 3477 { 3456 AssertFailed();3457 3478 switch (pCmd->u8OpCode) 3458 3479 { … … 3884 3905 } 3885 3906 3886 int32_t crVBoxServerHgcmEnable( HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd, PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd)3907 int32_t crVBoxServerHgcmEnable(VBOXCRCMDCTL_HGCMENABLE_DATA *pData) 3887 3908 { 3888 3909 int rc = VINF_SUCCESS; 3889 3910 uint8_t* pCtl; 3890 3911 uint32_t cbCtl; 3912 HVBOXCRCMDCTL_REMAINING_HOST_COMMAND hRHCmd = pData->hRHCmd; 3913 PFNVBOXCRCMDCTL_REMAINING_HOST_COMMAND pfnRHCmd = pData->pfnRHCmd; 3891 3914 3892 3915 Assert(!cr_server.fCrCmdEnabled); … … 3908 3931 } 3909 3932 3910 int32_t crVBoxServerHgcmDisable( )3933 int32_t crVBoxServerHgcmDisable(VBOXCRCMDCTL_HGCMDISABLE_DATA *pData) 3911 3934 { 3912 3935 Assert(!cr_server.fCrCmdEnabled); … … 3920 3943 cr_server.head_spu->dispatch_table.MakeCurrent(0, 0, 0); 3921 3944 3945 cr_server.DisableData = *pData; 3946 3922 3947 return VINF_SUCCESS; 3923 3948 } -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
r50831 r50913 372 372 pCopyRect->yBottom - pCopyRect->yTop, 373 373 pu8Src, 374 fSrcInvert ? - pSrc->pitch: pSrc->pitch,374 fSrcInvert ? -((GLint)pSrc->pitch) : pSrc->pitch, 375 375 UnscaledSrcWidth, 376 376 UnscaledSrcHeight
Note:
See TracChangeset
for help on using the changeset viewer.