- Timestamp:
- May 20, 2010 7:57:47 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 61885
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
r29677 r29710 30 30 #include "VBoxDispD3D.h" 31 31 #include "VBoxDispD3DCmn.h" 32 #include "../../Miniport/wddm/VBoxVideoIf.h"33 32 34 33 #ifdef VBOXWDDMDISP_DEBUG … … 297 296 298 297 #define VBOX_FORMATOP_COUNT() (sizeof(gVBoxFormatOps)/sizeof(gVBoxFormatOps[0])) 298 299 #ifdef VBOX_WITH_VIDEOHWACCEL 300 301 static bool vboxVhwaIsEnabled(PVBOXWDDMDISP_ADAPTER pAdapter) 302 { 303 for (uint32_t i = 0; i < pAdapter->cHeads; ++i) 304 { 305 if (pAdapter->aHeads[i].Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED) 306 return true; 307 } 308 return false; 309 } 310 311 static bool vboxVhwaHasCKeying(PVBOXWDDMDISP_ADAPTER pAdapter) 312 { 313 for (uint32_t i = 0; i < pAdapter->cHeads; ++i) 314 { 315 VBOXVHWA_INFO* pSettings = &pAdapter->aHeads[i].Vhwa.Settings; 316 if ((pSettings->fFlags & VBOXVHWA_F_ENABLED) 317 && ((pSettings->fFlags & VBOXVHWA_F_CKEY_DST) 318 || (pSettings->fFlags & VBOXVHWA_F_CKEY_SRC)) 319 ) 320 return true; 321 } 322 return false; 323 } 324 325 #endif 299 326 300 327 /** … … 348 375 memset(pData->pData, 0, sizeof (DDRAW_CAPS)); 349 376 #ifdef VBOX_WITH_VIDEOHWACCEL 350 VBOXWDDM_QI_2D_1 Query; 351 Query.hdr.enmType = VBOXWDDM_QI_TYPE_2D_1; 352 VBOXVHWA_VERSION_INIT(&Query.Info.u.in.guestVersion); 353 D3DDDICB_QUERYADAPTERINFO DdiQuery; 354 DdiQuery.PrivateDriverDataSize = sizeof(Query); 355 DdiQuery.pPrivateDriverData = &Query; 356 hr = pAdapter->RtCallbacks.pfnQueryAdapterInfoCb(pAdapter->hAdapter, &DdiQuery); 357 Assert(hr == S_OK); 358 if (hr == S_OK) 377 if (vboxVhwaHasCKeying(pAdapter)) 359 378 { 360 if (Query.hdr.rc == VINF_SUCCESS) 361 { 362 /* query succeeded, check the results */ 363 if (Query.Info.u.out.cfgFlags == VBOXVHWA_CFG_ENABLED) 364 { 365 /* 2D is enabled*/ 366 DDRAW_CAPS *pCaps = (DDRAW_CAPS*)pData->pData; 367 /* overlay supported */ 368 if (Query.Info.u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY) 369 { 370 if (Query.Info.u.out.caps & VBOXVHWA_CAPS_COLORKEY) 371 { 372 pCaps->Caps = DDRAW_CAPS_COLORKEY; 373 } 374 } 375 376 /* @todo: feel the caps from here */ 377 } 378 } 379 DDRAW_CAPS *pCaps = (DDRAW_CAPS*)pData->pData; 380 pCaps->Caps |= DDRAW_CAPS_COLORKEY; 379 381 } 380 382 #endif … … 395 397 0, sizeof (DDRAW_MODE_SPECIFIC_CAPS) - RT_OFFSETOF(DDRAW_MODE_SPECIFIC_CAPS, Caps)); 396 398 #ifdef VBOX_WITH_VIDEOHWACCEL 397 VBOXWDDM_QI_2D_1 Query; 398 Query.hdr.enmType = VBOXWDDM_QI_TYPE_2D_1; 399 VBOXVHWA_VERSION_INIT(&Query.Info.u.in.guestVersion); 400 D3DDDICB_QUERYADAPTERINFO DdiQuery; 401 DdiQuery.PrivateDriverDataSize = sizeof(Query); 402 DdiQuery.pPrivateDriverData = &Query; 403 hr = pAdapter->RtCallbacks.pfnQueryAdapterInfoCb(pAdapter->hAdapter, &DdiQuery); 404 Assert(hr == S_OK); 405 if (hr == S_OK) 399 VBOXVHWA_INFO *pSettings = &pAdapter->aHeads[pCaps->Head].Vhwa.Settings; 400 if (pSettings->fFlags & VBOXVHWA_F_ENABLED) 406 401 { 407 if (Query.hdr.rc == VINF_SUCCESS) 402 pCaps->Caps |= MODE_CAPS_OVERLAY | MODE_CAPS_OVERLAYSTRETCH; 403 404 if (pSettings->fFlags & VBOXVHWA_F_CKEY_DST) 408 405 { 409 /* query succeeded, check the results */ 410 if (Query.Info.u.out.cfgFlags == VBOXVHWA_CFG_ENABLED) 411 { 412 /* 2D is enabled*/ 413 if (Query.Info.u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY) 414 { 415 /* overlay supported */ 416 pCaps->Caps = MODE_CAPS_OVERLAY | MODE_CAPS_OVERLAYSTRETCH; 417 if (Query.Info.u.out.caps & VBOXVHWA_CAPS_COLORKEY) 418 { 419 if (Query.Info.u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_DESTOVERLAY) 420 { 421 pCaps->CKeyCaps |= MODE_CKEYCAPS_DESTOVERLAY 422 | MODE_CKEYCAPS_DESTOVERLAYYUV /* ?? */; 423 } 424 } 425 426 pCaps->FxCaps = MODE_FXCAPS_OVERLAYSHRINKX 427 | MODE_FXCAPS_OVERLAYSHRINKY 428 | MODE_FXCAPS_OVERLAYSTRETCHX 429 | MODE_FXCAPS_OVERLAYSTRETCHY; 430 431 pCaps->MaxVisibleOverlays = Query.Info.u.out.numOverlays; 432 pCaps->MinOverlayStretch = 1; 433 pCaps->MaxOverlayStretch = 32000; 434 } 435 } 406 pCaps->CKeyCaps |= MODE_CKEYCAPS_DESTOVERLAY 407 | MODE_CKEYCAPS_DESTOVERLAYYUV /* ?? */ 408 ; 436 409 } 410 411 if (pSettings->fFlags & VBOXVHWA_F_CKEY_SRC) 412 { 413 pCaps->CKeyCaps |= MODE_CKEYCAPS_SRCOVERLAY 414 | MODE_CKEYCAPS_SRCOVERLAYCLRSPACE /* ?? */ 415 | MODE_CKEYCAPS_SRCOVERLAYCLRSPACEYUV /* ?? */ 416 | MODE_CKEYCAPS_SRCOVERLAYYUV /* ?? */ 417 ; 418 } 419 420 pCaps->FxCaps = MODE_FXCAPS_OVERLAYSHRINKX 421 | MODE_FXCAPS_OVERLAYSHRINKY 422 | MODE_FXCAPS_OVERLAYSTRETCHX 423 | MODE_FXCAPS_OVERLAYSTRETCHY; 424 425 426 pCaps->MaxVisibleOverlays = pSettings->cOverlaysSupported; 427 pCaps->MinOverlayStretch = 1; 428 pCaps->MaxOverlayStretch = 32000; 437 429 } 438 430 #endif … … 1421 1413 vboxVDbgPrint(("==> "__FUNCTION__"\n")); 1422 1414 1423 // AssertBreakpoint(); 1424 1425 HRESULT hr = S_OK; 1415 VBOXWDDM_QI Query; 1416 D3DDDICB_QUERYADAPTERINFO DdiQuery; 1417 DdiQuery.PrivateDriverDataSize = sizeof(Query); 1418 DdiQuery.pPrivateDriverData = &Query; 1419 HRESULT hr = pOpenData->pAdapterCallbacks->pfnQueryAdapterInfoCb(pOpenData->hAdapter, &DdiQuery); 1420 Assert(hr == S_OK); 1421 if (hr != S_OK) 1422 { 1423 vboxVDbgPrintR((__FUNCTION__": pfnQueryAdapterInfoCb failed, hr (%d)\n", hr)); 1424 return E_FAIL; 1425 } 1426 1427 /* check the miniport version match display version */ 1428 if (Query.u32Version != VBOXVIDEOIF_VERSION) 1429 { 1430 vboxVDbgPrintR((__FUNCTION__": miniport version mismatch, expected (%d), but was (%d)\n", 1431 VBOXVIDEOIF_VERSION, 1432 Query.u32Version)); 1433 return E_FAIL; 1434 } 1435 1436 #ifdef VBOX_WITH_VIDEOHWACCEL 1437 Assert(Query.cInfos >= 1); 1438 PVBOXWDDMDISP_ADAPTER pAdapter = (PVBOXWDDMDISP_ADAPTER)RTMemAllocZ(RT_OFFSETOF(VBOXWDDMDISP_ADAPTER, aHeads[Query.cInfos])); 1439 #else 1426 1440 PVBOXWDDMDISP_ADAPTER pAdapter = (PVBOXWDDMDISP_ADAPTER)RTMemAllocZ(sizeof (VBOXWDDMDISP_ADAPTER)); 1441 #endif 1427 1442 Assert(pAdapter); 1428 1443 if (pAdapter) … … 1432 1447 pAdapter->uRtVersion= pOpenData->Version; 1433 1448 pAdapter->RtCallbacks = *pOpenData->pAdapterCallbacks; 1449 1450 #ifdef VBOX_WITH_VIDEOHWACCEL 1451 pAdapter->cHeads = Query.cInfos; 1452 for (uint32_t i = 0; i < pAdapter->cHeads; ++i) 1453 { 1454 pAdapter->aHeads[i].Vhwa.Settings = Query.aInfos[i]; 1455 } 1456 #endif 1434 1457 1435 1458 pOpenData->hAdapter = pAdapter; -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h
r29434 r29710 17 17 18 18 #include "VBoxDispD3DIf.h" 19 #include "../../Miniport/wddm/VBoxVideoIf.h" 19 20 20 21 #include <iprt/cdefs.h> 22 23 #ifdef VBOX_WITH_VIDEOHWACCEL 24 typedef struct VBOXDISPVHWA_INFO 25 { 26 VBOXVHWA_INFO Settings; 27 }VBOXDISPVHWA_INFO; 28 29 /* represents settings secific to 30 * display device (head) on the multiple-head graphics card 31 * currently used for 2D (overlay) only since in theory its settings 32 * can differ per each frontend's framebuffer. */ 33 typedef struct VBOXWDDMDISP_HEAD 34 { 35 VBOXDISPVHWA_INFO Vhwa; 36 } VBOXWDDMDISP_HEAD; 37 #endif 21 38 22 39 typedef struct VBOXWDDMDISP_ADAPTER … … 28 45 IDirect3D9Ex * pD3D9If; 29 46 D3DDDI_ADAPTERCALLBACKS RtCallbacks; 47 #ifdef VBOX_WITH_VIDEOHWACCEL 48 uint32_t cHeads; 49 VBOXWDDMDISP_HEAD aHeads[1]; 50 #endif 30 51 } VBOXWDDMDISP_ADAPTER, *PVBOXWDDMDISP_ADAPTER; 31 52 -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.h
r29670 r29710 153 153 } VBOXWDDM_POINTER_INFO, *PVBOXWDDM_POINTER_INFO; 154 154 155 #ifdef VBOX_WITH_VIDEOHWACCEL 156 typedef struct VBOXWDDM_VHWA 157 { 158 VBOXVHWA_INFO Settings; 159 } VBOXWDDM_VHWA; 160 #endif 161 155 162 typedef struct VBOXWDDM_SOURCE 156 163 { … … 161 168 VBOXWDDM_SURFACE_DESC SurfInfo; 162 169 VBOXVBVAINFO Vbva; 170 #endif 171 #ifdef VBOX_WITH_VIDEOHWACCEL 172 /* @todo: in our case this seems more like a target property, 173 * but keep it here for now */ 174 VBOXWDDM_VHWA Vhwa; 163 175 #endif 164 176 VBOXWDDM_POINTER_INFO PointerInfo; … … 214 226 # ifdef VBOXVDMA_WITH_VBVA 215 227 VBOXVBVAINFO Vbva; 216 # endif217 # ifdef VBOX_WITH_VIDEOHWACCEL218 VBOXVHWA_INFO Vhwa;219 228 # endif 220 229 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h
r29488 r29710 23 23 24 24 #include <VBox/VBoxVideo.h> 25 26 /* @todo: implement a check to ensure display & miniport versions match 27 * one would increase this whenever defines in this file change */ 28 #define VBOXVIDEOIF_VERSION 1 25 29 26 30 /* create allocation func */ … … 60 64 #define VBOXWDDM_ALLOCINFO_HEAD(_pb) ((VBOXWDDM_ALLOCINFO*)((uint8_t *)(_pb) - VBOXWDDM_ALLOCATION_HEADSIZE())) 61 65 66 67 #define VBOXVHWA_F_ENABLED 0x00000001 68 #define VBOXVHWA_F_CKEY_DST 0x00000002 69 #define VBOXVHWA_F_CKEY_SRC 0x00000004 70 71 #define VBOXVHWA_MAX_FORMATS 8 72 73 typedef struct VBOXVHWA_INFO 74 { 75 uint32_t fFlags; 76 uint32_t cOverlaysSupported; 77 uint32_t cFormats; 78 D3DDDIFORMAT aFormats[VBOXVHWA_MAX_FORMATS]; 79 } VBOXVHWA_INFO; 80 62 81 /* query info func */ 63 typedef enum64 {65 VBOXWDDM_QI_TYPE_UNEFINED = 0,66 #ifdef VBOX_WITH_VIDEOHWACCEL67 /* VBOXVHWACMD_QUERYINFO1 */68 VBOXWDDM_QI_TYPE_2D_1,69 /* VBOXVHWACMD_QUERYINFO2 */70 VBOXWDDM_QI_TYPE_2D_271 #endif72 } VBOXWDDM_QI_TYPE;73 74 82 typedef struct VBOXWDDM_QI 75 83 { 76 VBOXWDDM_QI_TYPE enmType; 77 int rc; 84 uint32_t u32Version; 85 uint32_t cInfos; 86 VBOXVHWA_INFO aInfos[VBOX_VIDEO_MAX_SCREENS]; 78 87 } VBOXWDDM_QI; 79 80 typedef struct VBOXWDDM_QI_2D_181 {82 VBOXWDDM_QI hdr;83 VBOXVHWACMD_QUERYINFO1 Info;84 } VBOXWDDM_QI_2D_1;85 86 typedef struct VBOXWDDM_QI_2D_287 {88 VBOXWDDM_QI hdr;89 VBOXVHWACMD_QUERYINFO2 Info;90 } VBOXWDDM_QI_2D_2;91 88 92 89 /* submit cmd func */ -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.cpp
r29671 r29710 13 13 #include "../Helper.h" 14 14 15 VBOXVHWACMD* vboxVhwaCtlCommandCreate(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd) 16 { 15 #ifndef VBOXVHWA_WITH_SHGSMI 16 # include <iprt/semaphore.h> 17 # include <iprt/asm.h> 18 #endif 19 20 21 22 DECLINLINE(void) vboxVhwaHdrInit(VBOXVHWACMD* pHdr, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd) 23 { 24 memset(pHdr, 0, sizeof(VBOXVHWACMD)); 25 pHdr->iDisplay = srcId; 26 pHdr->rc = VERR_GENERAL_FAILURE; 27 pHdr->enmCmd = enmCmd; 28 #ifndef VBOXVHWA_WITH_SHGSMI 29 pHdr->cRefs = 1; 30 #endif 31 } 32 33 #ifdef VBOXVHWA_WITH_SHGSMI 34 static int vboxVhwaCommandSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, HGSMIOFFSET offDr) 35 { 36 VBoxHGSMIGuestWrite(pDevExt, offDr); 37 return VINF_SUCCESS; 38 } 39 #else 40 DECLINLINE(void) vbvaVhwaCommandRelease(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd) 41 { 42 uint32_t cRefs = ASMAtomicDecU32(&pCmd->cRefs); 43 Assert(cRefs < UINT32_MAX / 2); 44 if(!cRefs) 45 { 46 vboxHGSMIBufferFree(pDevExt, pCmd); 47 } 48 } 49 50 DECLINLINE(void) vbvaVhwaCommandRetain(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd) 51 { 52 ASMAtomicIncU32(&pCmd->cRefs); 53 } 54 55 /* do not wait for completion */ 56 void vboxVhwaCommandSubmitAsynch(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext) 57 { 58 pCmd->GuestVBVAReserved1 = (uintptr_t)pfnCompletion; 59 pCmd->GuestVBVAReserved2 = (uintptr_t)pContext; 60 vbvaVhwaCommandRetain(pDevExt, pCmd); 61 62 vboxHGSMIBufferSubmit(pDevExt, pCmd); 63 64 if(!(pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH) 65 || ((pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION) 66 && (pCmd->Flags & VBOXVHWACMD_FLAG_HG_ASYNCH_RETURNED))) 67 { 68 /* the command is completed */ 69 pfnCompletion(pDevExt, pCmd, pContext); 70 } 71 72 vbvaVhwaCommandRelease(pDevExt, pCmd); 73 } 74 75 static DECLCALLBACK(void) vboxVhwaCompletionSetEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pvContext) 76 { 77 RTSemEventSignal((RTSEMEVENT)pvContext); 78 } 79 80 void vboxVhwaCommandSubmitAsynchByEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, RTSEMEVENT hEvent) 81 { 82 vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionSetEvent, hEvent); 83 } 84 #endif 85 86 VBOXVHWACMD* vboxVhwaCommandCreate(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd, VBOXVHWACMD_LENGTH cbCmd) 87 { 88 #ifdef VBOXVHWA_WITH_SHGSMI 17 89 VBOXVHWACMD* pHdr = (VBOXVHWACMD*)VBoxSHGSMICommandAlloc(&pDevExt->u.primary.hgsmiAdapterHeap, 18 90 cbCmd + VBOXVHWACMD_HEADSIZE(), 19 91 HGSMI_CH_VBVA, 20 92 VBVA_VHWA_CMD); 93 #else 94 VBOXVHWACMD* pHdr = (VBOXVHWACMD*)vboxHGSMIBufferAlloc(pDevExt, 95 cbCmd + VBOXVHWACMD_HEADSIZE(), 96 HGSMI_CH_VBVA, 97 VBVA_VHWA_CMD); 98 #endif 21 99 Assert(pHdr); 22 100 if (!pHdr) … … 26 104 else 27 105 { 28 vboxVhwa InitHdr(pHdr, srcId, enmCmd);106 vboxVhwaHdrInit(pHdr, srcId, enmCmd); 29 107 } 30 108 … … 32 110 } 33 111 34 void vboxVhwaCtlCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd) 35 { 112 void vboxVhwaCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd) 113 { 114 #ifdef VBOXVHWA_WITH_SHGSMI 36 115 VBoxSHGSMICommandFree(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd); 37 } 38 39 static int vboxVhwaCtlCommandSubmitHgsmi(struct _DEVICE_EXTENSION* pDevExt, HGSMIOFFSET offDr) 40 { 41 VBoxHGSMIGuestWrite(pDevExt, offDr); 42 return VINF_SUCCESS; 43 } 44 45 int vboxVhwaCtlCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd) 46 { 116 #else 117 vbvaVhwaCommandRelease(pDevExt, pCmd); 118 #endif 119 } 120 121 int vboxVhwaCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd) 122 { 123 #ifdef VBOXVHWA_WITH_SHGSMI 47 124 const VBOXSHGSMIHEADER* pHdr = VBoxSHGSMICommandPrepSynch(&pDevExt->u.primary.hgsmiAdapterHeap, pCmd); 48 125 Assert(pHdr); … … 56 133 if (offCmd != HGSMIOFFSET_VOID) 57 134 { 58 rc = vboxVhwaC tlCommandSubmitHgsmi(pDevExt, offCmd);135 rc = vboxVhwaCommandSubmitHgsmi(pDevExt, offCmd); 59 136 AssertRC(rc); 60 137 if (RT_SUCCESS(rc)) … … 74 151 rc = VERR_INVALID_PARAMETER; 75 152 return rc; 153 #else 154 RTSEMEVENT hEvent; 155 int rc = RTSemEventCreate(&hEvent); 156 AssertRC(rc); 157 if (RT_SUCCESS(rc)) 158 { 159 pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ; 160 vboxVhwaCommandSubmitAsynchByEvent(pDevExt, pCmd, hEvent); 161 rc = RTSemEventWait(hEvent, RT_INDEFINITE_WAIT); 162 AssertRC(rc); 163 if (RT_SUCCESS(rc)) 164 RTSemEventDestroy(hEvent); 165 } 166 return rc; 167 #endif 168 } 169 170 #ifndef VBOXVHWA_WITH_SHGSMI 171 static DECLCALLBACK(void) vboxVhwaCompletionFreeCmd(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pContext) 172 { 173 vboxVhwaCommandFree(pDevExt, pCmd); 174 } 175 #endif 176 177 void vboxVhwaCommandSubmitAsynchAndComplete(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd) 178 { 179 #ifdef VBOXVHWA_WITH_SHGSMI 180 # error "port me" 181 #else 182 pCmd->Flags |= VBOXVHWACMD_FLAG_GH_ASYNCH_NOCOMPLETION; 183 184 vboxVhwaCommandSubmitAsynch(pDevExt, pCmd, vboxVhwaCompletionFreeCmd, NULL); 185 #endif 76 186 } 77 187 … … 79 189 { 80 190 VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo); 81 vboxVhwaC tlCommandFree(pDevExt, pCmd);191 vboxVhwaCommandFree(pDevExt, pCmd); 82 192 } 83 193 … … 85 195 { 86 196 VBOXVHWACMD* pCmd = VBOXVHWACMD_HEAD(pInfo); 87 vboxVhwaC tlCommandFree(pDevExt, pCmd);197 vboxVhwaCommandFree(pDevExt, pCmd); 88 198 } 89 199 90 200 VBOXVHWACMD_QUERYINFO1* vboxVHWAQueryHostInfo1(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) 91 201 { 92 VBOXVHWACMD* pCmd = vboxVhwaC tlCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1));202 VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO1, sizeof(VBOXVHWACMD_QUERYINFO1)); 93 203 VBOXVHWACMD_QUERYINFO1 *pInfo1; 94 204 … … 106 216 pInfo1->u.in.guestVersion.reserved = VBOXVHWA_VERSION_RSV; 107 217 108 if(vboxVhwaC tlCommandSubmit(pDevExt, pCmd))218 if(vboxVhwaCommandSubmit(pDevExt, pCmd)) 109 219 { 110 220 if(RT_SUCCESS(pCmd->rc)) … … 114 224 } 115 225 116 vboxVhwaC tlCommandFree(pDevExt, pCmd);226 vboxVhwaCommandFree(pDevExt, pCmd); 117 227 return NULL; 118 228 } … … 120 230 VBOXVHWACMD_QUERYINFO2* vboxVHWAQueryHostInfo2(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, uint32_t numFourCC) 121 231 { 122 VBOXVHWACMD* pCmd = vboxVhwaC tlCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC));232 VBOXVHWACMD* pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_QUERY_INFO2, VBOXVHWAINFO2_SIZE(numFourCC)); 123 233 VBOXVHWACMD_QUERYINFO2 *pInfo2; 124 234 Assert(pCmd); … … 132 242 pInfo2->numFourCC = numFourCC; 133 243 134 if(vboxVhwaC tlCommandSubmit(pDevExt, pCmd))244 if(vboxVhwaCommandSubmit(pDevExt, pCmd)) 135 245 { 136 246 if(RT_SUCCESS(pCmd->rc)) … … 143 253 } 144 254 145 vboxVhwaC tlCommandFree(pDevExt, pCmd);255 vboxVhwaCommandFree(pDevExt, pCmd); 146 256 return NULL; 147 257 } … … 152 262 VBOXVHWACMD* pCmd; 153 263 154 pCmd = vboxVhwaC tlCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_ENABLE, 0);264 pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_ENABLE, 0); 155 265 Assert(pCmd); 156 266 if (!pCmd) … … 160 270 } 161 271 162 if(vboxVhwaC tlCommandSubmit(pDevExt, pCmd))272 if(vboxVhwaCommandSubmit(pDevExt, pCmd)) 163 273 { 164 274 if(RT_SUCCESS(pCmd->rc)) … … 168 278 } 169 279 170 vboxVhwaC tlCommandFree(pDevExt, pCmd);280 vboxVhwaCommandFree(pDevExt, pCmd); 171 281 return rc; 172 282 } … … 177 287 VBOXVHWACMD* pCmd; 178 288 179 pCmd = vboxVhwaC tlCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_DISABLE, 0);289 pCmd = vboxVhwaCommandCreate(pDevExt, srcId, VBOXVHWACMD_TYPE_DISABLE, 0); 180 290 Assert(pCmd); 181 291 if (!pCmd) … … 185 295 } 186 296 187 if(vboxVhwaC tlCommandSubmit(pDevExt, pCmd))297 if(vboxVhwaCommandSubmit(pDevExt, pCmd)) 188 298 { 189 299 if(RT_SUCCESS(pCmd->rc)) … … 193 303 } 194 304 195 vboxVhwaC tlCommandFree(pDevExt, pCmd);305 vboxVhwaCommandFree(pDevExt, pCmd); 196 306 return rc; 197 307 } 198 308 199 void vboxVHWAInit(PDEVICE_EXTENSION pDevExt) 200 { 201 VBOXVHWA_INFO *pSettings = &pDevExt->u.primary.Vhwa; 309 static void vboxVHWAInitSrc(PDEVICE_EXTENSION pDevExt, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId) 310 { 311 Assert(srcId < pDevExt->cSources); 312 VBOXVHWA_INFO *pSettings = &pDevExt->aSources[srcId].Vhwa.Settings; 202 313 memset (pSettings, 0, sizeof (VBOXVHWA_INFO)); 203 314 204 VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVHWAQueryHostInfo1(pDevExt, 205 0 /*D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId*/); 315 VBOXVHWACMD_QUERYINFO1* pInfo1 = vboxVHWAQueryHostInfo1(pDevExt, srcId); 206 316 if (pInfo1) 207 317 { 208 318 if (pInfo1->u.out.cfgFlags & VBOXVHWA_CFG_ENABLED) 209 319 { 210 if (pInfo1->u.out.numOverlays) 320 if ((pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAY) 321 && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYSTRETCH) 322 && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_OVERLAY) 323 && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_FLIP) 324 && (pInfo1->u.out.surfaceCaps & VBOXVHWA_SCAPS_LOCALVIDMEM) 325 && pInfo1->u.out.numOverlays) 211 326 { 212 pSettings->bEnabled = true; 327 pSettings->fFlags |= VBOXVHWA_F_ENABLED; 328 329 if (pInfo1->u.out.caps & VBOXVHWA_CAPS_COLORKEY) 330 { 331 if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_SRCOVERLAY) 332 { 333 pSettings->fFlags |= VBOXVHWA_F_CKEY_SRC; 334 /* todo: VBOXVHWA_CKEYCAPS_SRCOVERLAYONEACTIVE ? */ 335 } 336 337 if (pInfo1->u.out.colorKeyCaps & VBOXVHWA_CKEYCAPS_DESTOVERLAY) 338 { 339 pSettings->fFlags |= VBOXVHWA_F_CKEY_DST; 340 /* todo: VBOXVHWA_CKEYCAPS_DESTOVERLAYONEACTIVE ? */ 341 } 342 } 343 213 344 pSettings->cFormats = 0; 214 345 … … 218 349 ++pSettings->cFormats; 219 350 220 if (pInfo1->u.out.numFourCC) 351 if (pInfo1->u.out.numFourCC 352 && (pInfo1->u.out.caps & VBOXVHWA_CAPS_OVERLAYFOURCC)) 221 353 { 222 VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVHWAQueryHostInfo2(pDevExt, 223 0 /*D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId*/, 224 pInfo1->u.out.numFourCC); 354 VBOXVHWACMD_QUERYINFO2* pInfo2 = vboxVHWAQueryHostInfo2(pDevExt, srcId, pInfo1->u.out.numFourCC); 225 355 if (pInfo2) 226 356 { … … 238 368 } 239 369 } 370 371 void vboxVHWAInit(PDEVICE_EXTENSION pDevExt) 372 { 373 for (uint32_t i = 0; i < pDevExt->cSources; ++i) 374 { 375 vboxVHWAInitSrc(pDevExt, i); 376 } 377 } -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoVhwa.h
r29670 r29710 15 15 #include <iprt/cdefs.h> 16 16 17 /* 18 * with wddm 2D commands are split into two categories: 19 * 1. control commands: those that are not (and actually can not be) 20 * handled.trasfered as DMA commands in terms of WDDM model 21 * these are: 22 * VBOXVHWACMD_TYPE_QUERY_INFO1, 23 * VBOXVHWACMD_TYPE_QUERY_INFO2, 24 * VBOXVHWACMD_TYPE_ENABLE, 25 * VBOXVHWACMD_TYPE_DISABLE, 26 * 2. DMA commands: all the rest are handled as DMA commands 27 * (i.e. using vboxVdmaXxx API) 28 * This is opaque to the host 2D frontend 29 * */ 30 #define VBOXVHWA_MAX_FORMATS 64 31 typedef struct VBOXVHWA_INFO 32 { 33 bool bEnabled; 34 uint32_t cOverlaysSupported; 35 uint32_t cFormats; 36 D3DDDIFORMAT aFormats[VBOXVHWA_MAX_FORMATS]; 37 } VBOXVHWA_INFO; 38 DECLINLINE(void) vboxVhwaInitHdr(VBOXVHWACMD* pHdr, D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, VBOXVHWACMD_TYPE enmCmd) 39 { 40 memset(pHdr, 0, sizeof(VBOXVHWACMD)); 41 pHdr->iDisplay = srcId; 42 pHdr->rc = VERR_GENERAL_FAILURE; 43 pHdr->enmCmd = enmCmd; 44 /* no need for the cRefs since we're using SHGSMI that has its own ref counting */ 45 // pHdr->cRefs = 1; 46 } 47 48 VBOXVHWACMD* vboxVhwaCtlCommandCreate(PDEVICE_EXTENSION pDevExt, 17 VBOXVHWACMD* vboxVhwaCommandCreate(PDEVICE_EXTENSION pDevExt, 49 18 D3DDDI_VIDEO_PRESENT_SOURCE_ID srcId, 50 19 VBOXVHWACMD_TYPE enmCmd, 51 20 VBOXVHWACMD_LENGTH cbCmd); 52 21 53 void vboxVhwaCtlCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd); 54 int vboxVhwaCtlCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd); 55 int vboxVhwaCtlCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd); 22 void vboxVhwaCommandFree(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd); 23 int vboxVhwaCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd); 24 int vboxVhwaCommandSubmit(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd); 25 void vboxVhwaCommandSubmitAsynchAndComplete(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd); 26 27 #ifndef VBOXVHWA_WITH_SHGSMI 28 typedef DECLCALLBACK(void) FNVBOXVHWACMDCOMPLETION(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD * pCmd, void * pContext); 29 typedef FNVBOXVHWACMDCOMPLETION *PFNVBOXVHWACMDCOMPLETION; 30 31 void vboxVhwaCommandSubmitAsynch(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, PFNVBOXVHWACMDCOMPLETION pfnCompletion, void * pContext); 32 void vboxVhwaCommandSubmitAsynchByEvent(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD* pCmd, RTSEMEVENT hEvent); 33 #endif 34 56 35 void vboxVHWAFreeHostInfo1(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO1* pInfo); 57 36 void vboxVHWAFreeHostInfo2(PDEVICE_EXTENSION pDevExt, VBOXVHWACMD_QUERYINFO2* pInfo); -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.cpp
r29670 r29710 1183 1183 PAGED_CODE(); 1184 1184 1185 dfprintf(("==> "__FUNCTION__ ", context(0x%x) \n", hAdapter));1185 dfprintf(("==> "__FUNCTION__ ", context(0x%x), Query type (%d)\n", hAdapter, pQueryAdapterInfo->Type)); 1186 1186 NTSTATUS Status = STATUS_SUCCESS; 1187 1187 PDEVICE_EXTENSION pContext = (PDEVICE_EXTENSION)hAdapter; … … 1204 1204 pCaps->InterruptMessageNumber = 0; 1205 1205 pCaps->NumberOfSwizzlingRanges = 0; 1206 /* @todo: need to adjust this for proper 2D Accel support */ 1207 pCaps->MaxOverlays = 0; /* ?? how much should we support? 32 */ 1206 pCaps->MaxOverlays = 0; 1207 #ifdef VBOX_WITH_VIDEOHWACCEL 1208 for (uint32_t i = 0; i < pContext->cSources; ++i) 1209 { 1210 if ( pContext->aSources[i].Vhwa.Settings.fFlags & VBOXVHWA_F_ENABLED) 1211 pCaps->MaxOverlays += pContext->aSources[i].Vhwa.Settings.cOverlaysSupported; 1212 } 1213 #endif 1208 1214 pCaps->GammaRampCaps.Value = 0; 1209 1215 pCaps->PresentationCaps.Value = 0; … … 1283 1289 } 1284 1290 case DXGKQAITYPE_UMDRIVERPRIVATE: 1285 AssertBreakpoint(); 1286 Assert(pQueryAdapterInfo->InputDataSize > sizeof (VBOXWDDM_QI)); 1287 if (pQueryAdapterInfo->InputDataSize > sizeof (VBOXWDDM_QI) 1288 && pQueryAdapterInfo->OutputDataSize > sizeof (VBOXWDDM_QI)) 1289 { 1290 VBOXWDDM_QI * pQi = (VBOXWDDM_QI*)pQueryAdapterInfo->pInputData; 1291 switch (pQi->enmType) 1291 Assert (pQueryAdapterInfo->OutputDataSize >= sizeof (VBOXWDDM_QI)); 1292 if (pQueryAdapterInfo->OutputDataSize >= sizeof (VBOXWDDM_QI)) 1293 { 1294 VBOXWDDM_QI * pQi = (VBOXWDDM_QI*)pQueryAdapterInfo->pOutputData; 1295 memset (pQi, 0, sizeof (VBOXWDDM_QI)); 1296 pQi->u32Version = VBOXVIDEOIF_VERSION; 1297 pQi->cInfos = pContext->cSources; 1298 #ifdef VBOX_WITH_VIDEOHWACCEL 1299 for (uint32_t i = 0; i < pContext->cSources; ++i) 1292 1300 { 1293 #ifdef VBOX_WITH_VIDEOHWACCEL 1294 case VBOXWDDM_QI_TYPE_2D_1: 1295 { 1296 if (pQueryAdapterInfo->InputDataSize >= sizeof (VBOXWDDM_QI_2D_1) 1297 && pQueryAdapterInfo->OutputDataSize >= sizeof (VBOXWDDM_QI_2D_1)) 1298 { 1299 VBOXWDDM_QI_2D_1 * pQueryIn = (VBOXWDDM_QI_2D_1*)pQueryAdapterInfo->pInputData; 1300 VBOXWDDM_QI_2D_1 * pQueryOut = (VBOXWDDM_QI_2D_1*)pQueryAdapterInfo->pOutputData; 1301 /* @todo: submit to the host */ 1302 #if 0 1303 VBOXVHWACMD *pCmd = create-cmd; 1304 VBOXVHWACMD_QUERYINFO1 *pQueryCmd = VBOXVHWACMD_BODY(pCmd, VBOXVHWACMD_QUERYINFO1); 1305 pQueryCmd->u.in.guestVersion = pQueryIn->Info.in.guestVersion; 1306 int rc = submit-cmd; 1307 pQueryOut->hdr.rc = rc; 1308 if (RT_SUCCESS(rc)) 1309 { 1310 memcpy(&pQueryOut->Info, pQueryCmd, sizeof(VBOXVHWACMD_QUERYINFO1)); 1311 } 1312 #else 1313 pQueryOut->hdr.rc = VERR_NOT_SUPPORTED; 1301 pQi->aInfos[i] = pContext->aSources[i].Vhwa.Settings; 1302 } 1314 1303 #endif 1315 }1316 else1317 {1318 drprintf((__FUNCTION__ ": in or out buffer for VBOXWDDM_QI_TYPE_2D_1 too small\n"));1319 Status = STATUS_BUFFER_TOO_SMALL;1320 }1321 break;1322 }1323 case VBOXWDDM_QI_TYPE_2D_2:1324 {1325 /* @todo: submit to the host */1326 break;1327 }1328 #endif1329 default:1330 drprintf((__FUNCTION__ ": unsupported qi (%d)\n", pQi->enmType));1331 AssertBreakpoint();1332 Status = STATUS_INVALID_PARAMETER;1333 }1334 1304 } 1335 1305 else 1336 1306 { 1337 drprintf((__FUNCTION__ ": in or outbuffer too small\n"));1307 drprintf((__FUNCTION__ ": buffer too small\n")); 1338 1308 Status = STATUS_BUFFER_TOO_SMALL; 1339 1309 } -
trunk/src/VBox/Additions/WINNT/Graphics/Miniport/wddm/VBoxVideoWddm.h
r29536 r29710 75 75 76 76 77 78 79 80 77 typedef struct VBOXWDDM_ALLOCATION_SHAREDPRIMARYSURFACE 81 78 {
Note:
See TracChangeset
for help on using the changeset viewer.