Changeset 30603 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm
- Timestamp:
- Jul 5, 2010 11:33:23 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 63329
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
r30588 r30603 2934 2934 return NULL; 2935 2935 } 2936 2937 static HRESULT vboxWddmSurfSynchMem(PVBOXWDDMDISP_RESOURCE pRc, PVBOXWDDMDISP_ALLOCATION pAllocation) 2938 { 2939 HRESULT hr = S_OK; 2940 Assert(pAllocation->enmD3DIfType == VBOXDISP_D3DIFTYPE_SURFACE); 2941 if (pRc->RcDesc.enmPool == D3DDDIPOOL_SYSTEMMEM) 2942 { 2943 Assert(pAllocation->pvMem); 2944 D3DLOCKED_RECT lockInfo; 2945 IDirect3DSurface9 *pD3D9Surf = (IDirect3DSurface9*)pAllocation->pD3DIf; 2946 hr = pD3D9Surf->LockRect(&lockInfo, NULL, D3DLOCK_DISCARD); 2947 Assert(hr == S_OK); 2948 if (hr == S_OK) 2949 { 2950 vboxWddmLockUnlockMemSynch(pAllocation, &lockInfo, NULL, true /*bool bToLockInfo*/); 2951 HRESULT tmpHr = pD3D9Surf->UnlockRect(); 2952 Assert(tmpHr == S_OK); 2953 } 2954 } 2955 else 2956 { 2957 Assert(!pAllocation->pvMem); 2958 } 2959 return hr; 2960 } 2961 2936 2962 static HRESULT APIENTRY vboxWddmDDevCreateResource(HANDLE hDevice, D3DDDIARG_CREATERESOURCE* pResource) 2937 2963 { … … 3008 3034 pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE; 3009 3035 pAllocation->pD3DIf = pD3D9Surf; 3010 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM) 3011 { 3012 Assert(pAllocation->pvMem); 3013 D3DLOCKED_RECT lockInfo; 3014 hr = pD3D9Surf->LockRect(&lockInfo, NULL, D3DLOCK_DISCARD); 3015 Assert(hr == S_OK); 3016 if (hr == S_OK) 3017 { 3018 vboxWddmLockUnlockMemSynch(pAllocation, &lockInfo, NULL, true /*bool bToLockInfo*/); 3019 HRESULT tmpHr = pD3D9Surf->UnlockRect(); 3020 Assert(tmpHr == S_OK); 3021 } 3022 } 3023 else 3024 { 3025 Assert(!pAllocation->pvMem); 3026 } 3036 hr = vboxWddmSurfSynchMem(pRc, pAllocation); 3037 Assert(hr == S_OK); 3027 3038 } 3028 3039 else … … 3210 3221 { 3211 3222 HWND hWnd = NULL; 3212 b ool bDevCreated = false;3223 bIssueCreateResource = true; 3213 3224 Assert(pResource->SurfCount); 3214 3225 if (!pDevice->pDevice9If) … … 3249 3260 pDevice->pDevice9If = pDevice9If; 3250 3261 pDevice->hWnd = hWnd; 3251 bDevCreated = true;3252 #if def VBOXDISP_TMP_NEWCREATEDEVICE3262 pDevice->pRenderTargetRc = pRc; 3263 #if 0 3253 3264 IDirect3DSwapChain9 *pSwapChain; 3254 3265 hr = pDevice->pDevice9If->GetSwapChain(0, &pSwapChain); … … 3256 3267 if (hr == S_OK) 3257 3268 { 3258 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[0];3269 UINT i = 0, iAlloc = 0; 3259 3270 IDirect3DSurface9* pD3D9Surf; 3260 hr = pSwapChain->GetFrontBufferData(&pD3D9Surf); 3261 Assert(hr == S_OK); 3262 if (hr == S_OK) 3271 for (; i < pResource->SurfCount; ++i) 3263 3272 { 3264 Assert(pD3D9Surf); 3265 pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE; 3266 pAllocation->pD3DIf = pD3D9Surf; 3267 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM) 3273 iAlloc = (i < pResource->SurfCount - 1) ? i+1 : 0; 3274 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[iAlloc]; 3275 hr = pSwapChain->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pD3D9Surf); 3276 Assert(hr == S_OK); 3277 if (hr == S_OK) 3268 3278 { 3269 Assert(pAllocation->pvMem); 3270 D3DLOCKED_RECT lockInfo; 3271 hr = pD3D9Surf->LockRect(&lockInfo, NULL, D3DLOCK_DISCARD); 3279 Assert(pD3D9Surf); 3280 pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE; 3281 pAllocation->pD3DIf = pD3D9Surf; 3282 hr = vboxWddmSurfSynchMem(pRc, pAllocation); 3272 3283 Assert(hr == S_OK); 3273 3284 if (hr == S_OK) 3274 3285 { 3275 vboxWddmLockUnlockMemSynch(pAllocation, &lockInfo, NULL, true /*bool bToLockInfo*/); 3276 HRESULT tmpHr = pD3D9Surf->UnlockRect(); 3277 Assert(tmpHr == S_OK); 3278 } 3279 } 3280 else 3281 { 3282 Assert(!pAllocation->pvMem); 3283 } 3284 3285 pD3D9Surf->Release(); 3286 3287 if (hr == S_OK) 3288 { 3289 UINT i = 1; 3290 for (; i < pResource->SurfCount; ++i) 3291 { 3292 PVBOXWDDMDISP_ALLOCATION pAllocation = &pRc->aAllocations[i]; 3293 hr = pSwapChain->GetBackBuffer(i - 1, D3DBACKBUFFER_TYPE_MONO, &pD3D9Surf); 3286 hr = pSwapChain->Present(NULL, NULL, NULL, NULL, 0); 3294 3287 Assert(hr == S_OK); 3295 3288 if (hr == S_OK) 3296 3289 { 3297 Assert(pD3D9Surf); 3298 pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE; 3299 pAllocation->pD3DIf = pD3D9Surf; 3300 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM) 3301 { 3302 Assert(pAllocation->pvMem); 3303 D3DLOCKED_RECT lockInfo; 3304 hr = pD3D9Surf->LockRect(&lockInfo, NULL, D3DLOCK_DISCARD); 3305 Assert(hr == S_OK); 3306 if (hr == S_OK) 3307 { 3308 vboxWddmLockUnlockMemSynch(pAllocation, &lockInfo, NULL, true /*bool bToLockInfo*/); 3309 HRESULT tmpHr = pD3D9Surf->UnlockRect(); 3310 Assert(tmpHr == S_OK); 3311 } 3312 } 3313 else 3314 { 3315 Assert(!pAllocation->pvMem); 3316 } 3317 pD3D9Surf->Release(); 3318 } 3319 else 3320 { 3321 for (UINT j = 0; j < i; ++j) 3322 { 3323 pRc->aAllocations[j].pD3DIf->Release(); 3324 } 3325 break; 3290 continue; 3326 3291 } 3327 3292 } 3293 pD3D9Surf->Release(); 3294 } 3295 3296 /* above we are enumerating from 1..N-1, 0, 3297 * should neve release [0], as it was released above on failure */ 3298 for (UINT j = 1; j < iAlloc ? iAlloc : pResource->SurfCount - 1; ++j) 3299 { 3300 pRc->aAllocations[j].pD3DIf->Release(); 3328 3301 } 3329 3302 } 3303 pSwapChain->Release(); 3330 3304 } 3305 3306 if (hr != S_OK) 3307 pDevice9If->Release(); 3331 3308 #endif 3332 3309 } 3310 3311 if (hr != S_OK) 3312 { 3313 HRESULT tmpHr = VBoxDispWndDestroy(pAdapter, pDevice->hWnd); 3314 Assert(tmpHr == S_OK); 3315 } 3333 3316 } 3317 } 3334 3318 #ifdef VBOXDISP_TMP_NEWCREATEDEVICE 3335 break;3336 #endif3337 }3338 3319 else 3339 { 3340 Assert(pDevice->hWnd); 3341 } 3342 3343 #ifndef VBOXDISP_TMP_NEWCREATEDEVICE 3320 #else 3344 3321 if (hr == S_OK) 3345 3322 #endif 3346 3323 { 3324 Assert(pDevice->hWnd); 3347 3325 Assert(pDevice->pDevice9If); 3348 bIssueCreateResource = true;3349 3326 for (UINT i = 0; i < pResource->SurfCount; ++i) 3350 3327 { … … 3367 3344 pAllocation->enmD3DIfType = VBOXDISP_D3DIFTYPE_SURFACE; 3368 3345 pAllocation->pD3DIf = pD3D9Surf; 3369 if (pResource->Pool == D3DDDIPOOL_SYSTEMMEM) 3370 { 3371 Assert(pAllocation->pvMem); 3372 D3DLOCKED_RECT lockInfo; 3373 hr = pD3D9Surf->LockRect(&lockInfo, NULL, D3DLOCK_DISCARD); 3374 Assert(hr == S_OK); 3375 if (hr == S_OK) 3376 { 3377 vboxWddmLockUnlockMemSynch(pAllocation, &lockInfo, NULL, true /*bool bToLockInfo*/); 3378 HRESULT tmpHr = pD3D9Surf->UnlockRect(); 3379 Assert(tmpHr == S_OK); 3380 } 3381 } 3382 else 3383 { 3384 Assert(!pAllocation->pvMem); 3385 } 3346 hr = vboxWddmSurfSynchMem(pRc, pAllocation); 3347 Assert(hr == S_OK); 3348 if (hr == S_OK) 3349 continue; 3350 3351 /* fail branch */ 3352 pD3D9Surf->Release(); 3386 3353 } 3387 else 3354 3355 for (UINT j = 0; j < i; ++j) 3388 3356 { 3389 for (UINT j = 0; j < i; ++j) 3390 { 3391 pRc->aAllocations[j].pD3DIf->Release(); 3392 } 3393 break; 3357 pRc->aAllocations[j].pD3DIf->Release(); 3394 3358 } 3359 break; 3395 3360 } 3396 3361 } 3397 #ifndef VBOXDISP_TMP_NEWCREATEDEVICE3398 if (hr != S_OK)3399 {3400 if (bDevCreated)3401 {3402 VBoxDispWndDestroy(pAdapter, hWnd);3403 pDevice->pDevice9If->Release();3404 }3405 }3406 #endif3407 3362 } 3408 3363 else … … 3597 3552 DdiDm.hPrimaryAllocation = pAlloc->hAllocation; 3598 3553 // DdiDm.PrivateDriverFormatAttribute = 0; 3554 Assert(pDevice->pRenderTargetRc == pRc); 3555 3599 3556 #if 0 3600 3557 IDirect3DSurface9 *pD3DIfSurf = (IDirect3DSurface9*)pAlloc->pD3DIf; … … 4180 4137 Assert(pRc); 4181 4138 Assert(pData->SubResourceIndex < pRc->cAllocations); 4182 IDirect3DSurface9 *pD3D9Surf = (IDirect3DSurface9*)pRc->aAllocations[pData->SubResourceIndex].pD3DIf; 4183 Assert(pD3D9Surf); 4184 HRESULT hr = pDevice->pDevice9If->SetRenderTarget(pData->RenderTargetIndex, pD3D9Surf); 4185 Assert(hr == S_OK); 4139 HRESULT hr = S_OK; 4140 #ifdef VBOXDISP_TMP_NEWCREATEDEVICE 4141 if (pRc != pDevice->pRenderTargetRc || pRc->cAllocations > 1 || pData->RenderTargetIndex) 4142 #endif 4143 { 4144 IDirect3DSurface9 *pD3D9Surf; 4145 hr = vboxWddmSurfGet(pRc, pData->SubResourceIndex, &pD3D9Surf); 4146 Assert(hr == S_OK); 4147 if (hr == S_OK) 4148 { 4149 Assert(pD3D9Surf); 4150 hr = pDevice->pDevice9If->SetRenderTarget(pData->RenderTargetIndex, pD3D9Surf); 4151 Assert(hr == S_OK); 4152 pD3D9Surf->Release(); 4153 } 4154 } 4186 4155 vboxVDbgPrintF(("<== "__FUNCTION__", hDevice(0x%p), hr(0x%x)\n", hDevice, hr)); 4187 4156 return hr; -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h
r30582 r30603 102 102 D3DDDI_CREATEDEVICEFLAGS fFlags; 103 103 HWND hWnd; 104 struct VBOXWDDMDISP_RESOURCE *pRenderTargetRc; 104 105 /* number of StreamSources set */ 105 106 UINT cStreamSources;
Note:
See TracChangeset
for help on using the changeset viewer.