Changeset 29742 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Miniport
- Timestamp:
- May 21, 2010 3:58:56 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 61925
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Miniport
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
r29710 r29742 288 288 VBOXSHGSMILIST CtlList; 289 289 VBOXSHGSMILIST DmaCmdList; 290 #ifdef VBOX_WITH_VIDEOHWACCEL 291 VBOXSHGSMILIST VhwaCmdList; 292 #endif 290 293 BOOL bSetNotifyDxDpc; 291 294 BOOL bNotifyDxDpc; -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideoHGSMI.cpp
r28800 r29742 380 380 AssertFailed (); 381 381 return VERR_INTERNAL_ERROR; 382 } 383 #else 384 int vbvaInitInfoCaps (PDEVICE_EXTENSION PrimaryExtension, void *pvContext, void *pvData) 385 { 386 VBVACAPS *pCaps = (VBVACAPS*)pvData; 387 pCaps->rc = VERR_NOT_IMPLEMENTED; 388 pCaps->fCaps = VBVACAPS_COMPLETEGCMD_BY_IOREAD | VBVACAPS_IRQ; 389 return VINF_SUCCESS; 390 } 391 392 393 int vbvaFinalizeInfoCaps (PDEVICE_EXTENSION PrimaryExtension, void *pvContext, void *pvData) 394 { 395 VBVACAPS *pCaps = (VBVACAPS*)pvData; 396 AssertRC(pCaps->rc); 397 return pCaps->rc; 382 398 } 383 399 #endif … … 436 452 * i.e. it is assigned by Video Memory Manager, 437 453 * The FB information should be passed to guest from our DxgkDdiSetVidPnSourceAddress callback */ 454 455 /* Inform about caps */ 456 rc = vboxCallVBVA (PrimaryExtension, 457 VBVA_INFO_CAPS, 458 sizeof (VBVACAPS), 459 vbvaInitInfoCaps, 460 vbvaFinalizeInfoCaps, 461 NULL); 462 AssertRC(rc); 463 if (RT_SUCCESS (rc)) 438 464 #endif 439 465 { -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoShgsmi.cpp
r28800 r29742 188 188 #define VBOXSHGSMI_LISTENTRY2CMD(_pEntry) ( (PVBOXSHGSMIHEADER)((uint8_t *)(_pEntry) - RT_OFFSETOF(VBOXSHGSMIHEADER, pvNext)) ) 189 189 190 int VBoxSHGSMICommandProcessCompletion (struct _HGSMIHEAP * pHeap, HGSMIOFFSET offCmd, bool bIrq, PVBOXSHGSMILIST pPostProcessList)190 int VBoxSHGSMICommandProcessCompletion (struct _HGSMIHEAP * pHeap, VBOXSHGSMIHEADER* pCur, bool bIrq, PVBOXSHGSMILIST pPostProcessList) 191 191 { 192 192 int rc = VINF_SUCCESS; 193 193 194 PVBOXSHGSMIHEADER pCur = (PVBOXSHGSMIHEADER)HGSMIBufferDataFromOffset (&pHeap->area, offCmd); 195 Assert(pCur); 196 if (pCur) 197 { 198 do 194 do 195 { 196 if (pCur->fFlags & VBOXSHGSMI_FLAG_GH_ASYNCH_CALLBACK_IRQ) 199 197 { 200 if (pCur->fFlags & VBOXSHGSMI_FLAG_GH_ASYNCH_CALLBACK_IRQ) 198 Assert(bIrq); 199 200 PFNVBOXSHGSMICMDCOMPLETION pfnCompletion = NULL; 201 void *pvCompletion; 202 PFNVBOXSHGSMICMDCOMPLETION_IRQ pfnCallback = (PFNVBOXSHGSMICMDCOMPLETION_IRQ)pCur->u64Info1; 203 void *pvCallback = (void*)pCur->u64Info2; 204 205 pfnCallback(pHeap, VBoxSHGSMIBufferData(pCur), pvCallback, &pfnCompletion, &pvCompletion); 206 if (pfnCompletion) 201 207 { 202 Assert(bIrq); 203 204 PFNVBOXSHGSMICMDCOMPLETION pfnCompletion = NULL; 205 void *pvCompletion; 206 PFNVBOXSHGSMICMDCOMPLETION_IRQ pfnCallback = (PFNVBOXSHGSMICMDCOMPLETION_IRQ)pCur->u64Info1; 207 void *pvCallback = (void*)pCur->u64Info2; 208 209 pfnCallback(pHeap, VBoxSHGSMIBufferData(pCur), pvCallback, &pfnCompletion, &pvCompletion); 210 if (pfnCompletion) 211 { 212 pCur->u64Info1 = (uint64_t)pfnCompletion; 213 pCur->u64Info2 = (uint64_t)pvCompletion; 214 pCur->fFlags &= ~VBOXSHGSMI_FLAG_GH_ASYNCH_CALLBACK_IRQ; 215 } 216 else 217 { 218 /* nothing to do with this command */ 219 break; 220 } 221 } 222 223 if (!bIrq) 224 { 225 PFNVBOXSHGSMICMDCOMPLETION pfnCallback = (PFNVBOXSHGSMICMDCOMPLETION)pCur->u64Info1; 226 void *pvCallback = (void*)pCur->u64Info2; 227 pfnCallback(pHeap, VBoxSHGSMIBufferData(pCur), pvCallback); 208 pCur->u64Info1 = (uint64_t)pfnCompletion; 209 pCur->u64Info2 = (uint64_t)pvCompletion; 210 pCur->fFlags &= ~VBOXSHGSMI_FLAG_GH_ASYNCH_CALLBACK_IRQ; 228 211 } 229 212 else 230 vboxSHGSMIListPut(pPostProcessList, VBOXSHGSMI_CMD2LISTENTRY(pCur), VBOXSHGSMI_CMD2LISTENTRY(pCur)); 231 } while (0); 232 } 233 else 234 { 235 rc = VERR_INVALID_PARAMETER; 236 } 213 { 214 /* nothing to do with this command */ 215 break; 216 } 217 } 218 219 if (!bIrq) 220 { 221 PFNVBOXSHGSMICMDCOMPLETION pfnCallback = (PFNVBOXSHGSMICMDCOMPLETION)pCur->u64Info1; 222 void *pvCallback = (void*)pCur->u64Info2; 223 pfnCallback(pHeap, VBoxSHGSMIBufferData(pCur), pvCallback); 224 } 225 else 226 vboxSHGSMIListPut(pPostProcessList, VBOXSHGSMI_CMD2LISTENTRY(pCur), VBOXSHGSMI_CMD2LISTENTRY(pCur)); 227 } while (0); 228 237 229 238 230 return rc; -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoShgsmi.h
r28800 r29742 102 102 void* VBoxSHGSMICommandAlloc(struct _HGSMIHEAP * pHeap, HGSMISIZE cbData, uint8_t u8Channel, uint16_t u16ChannelInfo); 103 103 void VBoxSHGSMICommandFree(struct _HGSMIHEAP * pHeap, void *pvBuffer); 104 int VBoxSHGSMICommandProcessCompletion(struct _HGSMIHEAP * pHeap, HGSMIOFFSET offCmd, bool bIrq, PVBOXSHGSMILIST pPostProcessList);104 int VBoxSHGSMICommandProcessCompletion(struct _HGSMIHEAP * pHeap, VBOXSHGSMIHEADER* pCmd, bool bIrq, PVBOXSHGSMILIST pPostProcessList); 105 105 int VBoxSHGSMICommandPostprocessCompletion(struct _HGSMIHEAP * pHeap, PVBOXSHGSMILIST pPostProcessList); 106 106 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp
r29710 r29742 173 173 vboxVhwaCommandFree(pDevExt, pCmd); 174 174 } 175 176 void vboxVhwaCompletionListProcess(PDEVICE_EXTENSION pDevExt, VBOXSHGSMILIST *pList) 177 { 178 PVBOXSHGSMILIST_ENTRY pNext, pCur; 179 for (pCur = pList->pFirst; pCur; pCur = pNext) 180 { 181 /* need to save next since the command may be released in a pfnCallback and thus its data might be invalid */ 182 pNext = pCur->pNext; 183 VBOXVHWACMD *pCmd = VBOXVHWA_LISTENTRY2CMD(pCur); 184 PFNVBOXVHWACMDCOMPLETION pfnCallback = (PFNVBOXVHWACMDCOMPLETION)pCmd->GuestVBVAReserved1; 185 void *pvCallback = (void*)pCmd->GuestVBVAReserved2; 186 pfnCallback(pDevExt, pCmd, pvCallback); 187 } 188 } 189 175 190 #endif 176 191 … … 216 231 pInfo1->u.in.guestVersion.reserved = VBOXVHWA_VERSION_RSV; 217 232 218 if(vboxVhwaCommandSubmit(pDevExt, pCmd)) 233 int rc = vboxVhwaCommandSubmit(pDevExt, pCmd); 234 AssertRC(rc); 235 if(RT_SUCCESS(rc)) 219 236 { 220 237 if(RT_SUCCESS(pCmd->rc)) … … 242 259 pInfo2->numFourCC = numFourCC; 243 260 244 if(vboxVhwaCommandSubmit(pDevExt, pCmd)) 245 { 261 int rc = vboxVhwaCommandSubmit(pDevExt, pCmd); 262 AssertRC(rc); 263 if(RT_SUCCESS(rc)) 264 { 265 AssertRC(pCmd->rc); 246 266 if(RT_SUCCESS(pCmd->rc)) 247 267 { … … 270 290 } 271 291 272 if(vboxVhwaCommandSubmit(pDevExt, pCmd)) 273 { 292 rc = vboxVhwaCommandSubmit(pDevExt, pCmd); 293 AssertRC(rc); 294 if(RT_SUCCESS(rc)) 295 { 296 AssertRC(pCmd->rc); 274 297 if(RT_SUCCESS(pCmd->rc)) 275 {276 298 rc = VINF_SUCCESS; 277 } 299 else 300 rc = pCmd->rc; 278 301 } 279 302 … … 295 318 } 296 319 297 if(vboxVhwaCommandSubmit(pDevExt, pCmd)) 298 { 320 rc = vboxVhwaCommandSubmit(pDevExt, pCmd); 321 AssertRC(rc); 322 if(RT_SUCCESS(rc)) 323 { 324 AssertRC(pCmd->rc); 299 325 if(RT_SUCCESS(pCmd->rc)) 300 {301 326 rc = VINF_SUCCESS; 302 } 327 else 328 rc = pCmd->rc; 303 329 } 304 330 … … 345 371 346 372 pSettings->aFormats[pSettings->cFormats] = D3DDDIFMT_X8R8G8B8; 347 ++pSettings->cFormats;348 pSettings->aFormats[pSettings->cFormats] = D3DDDIFMT_A8R8G8B8;349 373 ++pSettings->cFormats; 350 374 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.h
r29710 r29742 14 14 15 15 #include <iprt/cdefs.h> 16 17 #include "VBoxVideoShgsmi.h" 16 18 17 19 VBOXVHWACMD* vboxVhwaCommandCreate(PDEVICE_EXTENSION pDevExt, … … 31 33 void vboxVhwaCommandSubmitAsynch(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext); 32 34 void vboxVhwaCommandSubmitAsynchByEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, RTSEMEVENT hEvent); 35 36 #define VBOXVHWA_CMD2LISTENTRY(_pCmd) ((PVBOXSHGSMILIST_ENTRY)&(_pCmd)->u.pNext) 37 #define VBOXVHWA_LISTENTRY2CMD(_pEntry) ( (VBOXVHWACMD*)((uint8_t *)(_pEntry) - RT_OFFSETOF(VBOXVHWACMD, u.pNext)) ) 38 39 DECLINLINE(void) vboxVhwaPutList(VBOXSHGSMILIST *pList, VBOXVHWACMD* pCmd) 40 { 41 vboxSHGSMIListPut(pList, VBOXVHWA_CMD2LISTENTRY(pCmd), VBOXVHWA_CMD2LISTENTRY(pCmd)); 42 } 43 44 void vboxVhwaCompletionListProcess(PDEVICE_EXTENSION pDevExt, VBOXSHGSMILIST *pList); 33 45 #endif 34 46 … … 41 53 void vboxVHWAInit(PDEVICE_EXTENSION pDevExt); 42 54 43 44 55 #endif /* #ifndef ___VBoxVideoVhwa_h___ */ -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
r29710 r29742 848 848 vboxSHGSMIListInit(&DmaCmdList); 849 849 850 #ifdef VBOX_WITH_VIDEOHWACCEL 851 VBOXSHGSMILIST VhwaCmdList; 852 vboxSHGSMIListInit(&VhwaCmdList); 853 #endif 854 850 855 uint32_t flags = pDevExt->u.primary.pHostFlags->u32HostFlags; 851 856 bOur = (flags & HGSMIHOSTFLAGS_IRQ); … … 878 883 if (pHeap) 879 884 { 880 int rc = VBoxSHGSMICommandProcessCompletion (pHeap, offCmd, TRUE /*bool bIrq*/ , pList); 881 AssertRC(rc); 885 uint16_t chInfo; 886 uint8_t *pvCmd = HGSMIBufferDataAndChInfoFromOffset (&pHeap->area, offCmd, &chInfo); 887 Assert(pvCmd); 888 if (pvCmd) 889 { 890 switch (chInfo) 891 { 892 case VBVA_VDMA_CMD: 893 case VBVA_VDMA_CTL: 894 { 895 int rc = VBoxSHGSMICommandProcessCompletion (pHeap, (VBOXSHGSMIHEADER*)pvCmd, TRUE /*bool bIrq*/ , pList); 896 AssertRC(rc); 897 break; 898 } 899 #ifdef VBOX_WITH_VIDEOHWACCEL 900 case VBVA_VHWA_CMD: 901 { 902 vboxVhwaPutList(&VhwaCmdList, (VBOXVHWACMD*)pvCmd); 903 break; 904 } 905 #endif /* # ifdef VBOX_WITH_VIDEOHWACCEL */ 906 default: 907 AssertBreakpoint(); 908 } 909 } 882 910 } 883 911 } … … 904 932 vboxSHGSMIListCat(&pDevExt->DmaCmdList, &DmaCmdList); 905 933 bNeedDpc = TRUE; 934 } 935 936 if (!vboxSHGSMIListIsEmpty(&VhwaCmdList)) 937 { 938 vboxSHGSMIListCat(&pDevExt->VhwaCmdList, &VhwaCmdList); 906 939 } 907 940 … … 939 972 VBOXSHGSMILIST CtlList; 940 973 VBOXSHGSMILIST DmaCmdList; 974 #ifdef VBOX_WITH_VIDEOHWACCEL 975 VBOXSHGSMILIST VhwaCmdList; 976 #endif 941 977 BOOL bNotifyDpc; 942 978 } VBOXWDDM_DPCDATA, *PVBOXWDDM_DPCDATA; … … 954 990 vboxSHGSMICmdListDetach2List(&pdc->pDevExt->CtlList, &pdc->data.CtlList); 955 991 vboxSHGSMICmdListDetach2List(&pdc->pDevExt->DmaCmdList, &pdc->data.DmaCmdList); 992 #ifdef VBOX_WITH_VIDEOHWACCEL 993 vboxSHGSMICmdListDetach2List(&pdc->pDevExt->VhwaCmdList, &pdc->data.VhwaCmdList); 994 #endif 956 995 pdc->data.bNotifyDpc = pdc->pDevExt->bNotifyDxDpc; 957 996 pdc->pDevExt->bNotifyDxDpc = FALSE; … … 994 1033 AssertRC(rc); 995 1034 } 1035 1036 #ifdef VBOX_WITH_VIDEOHWACCEL 1037 if (!vboxSHGSMIListIsEmpty(&context.data.VhwaCmdList)) 1038 { 1039 vboxVhwaCompletionListProcess(pDevExt, &context.data.VhwaCmdList); 1040 } 1041 #endif 996 1042 997 1043 if (context.data.bNotifyDpc)
Note:
See TracChangeset
for help on using the changeset viewer.