Changeset 32889 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Display
- Timestamp:
- Oct 4, 2010 11:14:12 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 66372
- Location:
- trunk/src/VBox/Additions/WINNT/Graphics/Display
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Display/Makefile.kmk
r32877 r32889 88 88 VBoxDispD3D_DEFS += VBOX_WDDMDISP_WITH_PROFILE 89 89 endif 90 ifdef VBOXWDDM_TEST_UHGSMI 91 VBoxDispD3D_DEFS += VBOXWDDM_TEST_UHGSMI 92 endif 90 93 VBoxDispD3D_SOURCES = \ 91 94 wddm/VBoxDispD3D.cpp \ -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.cpp
r32877 r32889 5364 5364 return hr; 5365 5365 } 5366 5367 #ifdef VBOXWDDM_TEST_UHGSMI 5368 int vboxUhgsmiTst(PVBOXUHGSMI pUhgsmi, uint32_t cbBuf, uint32_t cNumCals, uint64_t * pTimeMs); 5369 #endif 5370 5366 5371 static HRESULT APIENTRY vboxWddmDDevPresent(HANDLE hDevice, CONST D3DDDIARG_PRESENT* pData) 5367 5372 { … … 5374 5379 if (VBOXDISPMODE_IS_3D(pDevice->pAdapter)) 5375 5380 { 5381 #ifdef VBOXWDDM_TEST_UHGSMI 5382 { 5383 Assert(0); 5384 static uint32_t cCals = 10000; 5385 static uint32_t cbData = 8 * 1024 * 1024; 5386 uint64_t TimeMs; 5387 int rc = vboxUhgsmiTst(&pDevice->Uhgsmi.Base, cbData, cCals, &TimeMs); 5388 uint32_t cCPS = (((uint64_t)cCals) * 1000ULL)/TimeMs; 5389 Assert(0); 5390 vboxVDbgDoMpPrintF(pDevice, "Time : %I64u ms, calls: %d, cps: %d\n", TimeMs, cCals, cCPS); 5391 } 5392 #endif 5376 5393 #if 1 5377 5394 PVBOXWDDMDISP_RESOURCE pRc = (PVBOXWDDMDISP_RESOURCE)pData->hSrcResource; … … 7122 7139 && !pCreateData->PatchLocationListSize) 7123 7140 { 7124 hr = vbox DispCmCtxCreate(pDevice, &pDevice->DefaultContext);7141 hr = vboxUhgsmiD3DInit(&pDevice->Uhgsmi, pDevice); 7125 7142 Assert(hr == S_OK); 7126 7143 if (hr == S_OK) 7127 7144 { 7128 #ifdef VBOXDISP_EARLYCREATEDEVICE 7129 PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(2); 7130 Assert(pRc); 7131 if (pRc) 7145 hr = vboxDispCmCtxCreate(pDevice, &pDevice->DefaultContext); 7146 Assert(hr == S_OK); 7147 if (hr == S_OK) 7132 7148 { 7133 D3DPRESENT_PARAMETERS params; 7134 memset(¶ms, 0, sizeof (params)); 7135 // params.BackBufferWidth = 640; 7136 // params.BackBufferHeight = 480; 7137 params.BackBufferWidth = 0x400; 7138 params.BackBufferHeight = 0x300; 7139 params.BackBufferFormat = D3DFMT_A8R8G8B8; 7140 // params.BackBufferCount = 0; 7141 params.BackBufferCount = 1; 7142 params.MultiSampleType = D3DMULTISAMPLE_NONE; 7143 params.SwapEffect = D3DSWAPEFFECT_DISCARD; 7144 // params.hDeviceWindow = hWnd; 7145 /* @todo: it seems there should be a way to detect this correctly since 7146 * our vboxWddmDDevSetDisplayMode will be called in case we are using full-screen */ 7147 params.Windowed = TRUE; 7148 // params.EnableAutoDepthStencil = FALSE; 7149 // params.AutoDepthStencilFormat = D3DFMT_UNKNOWN; 7150 // params.Flags; 7151 // params.FullScreen_RefreshRateInHz; 7152 // params.FullScreen_PresentationInterval; 7153 7154 hr = vboxWddmD3DDeviceCreate(pDevice, 0, pRc, ¶ms, TRUE /*BOOL bLockable*/); 7155 Assert(hr == S_OK); 7156 if (hr == S_OK) 7157 break; 7158 vboxResourceFree(pRc); 7149 #ifdef VBOXDISP_EARLYCREATEDEVICE 7150 PVBOXWDDMDISP_RESOURCE pRc = vboxResourceAlloc(2); 7151 Assert(pRc); 7152 if (pRc) 7153 { 7154 D3DPRESENT_PARAMETERS params; 7155 memset(¶ms, 0, sizeof (params)); 7156 // params.BackBufferWidth = 640; 7157 // params.BackBufferHeight = 480; 7158 params.BackBufferWidth = 0x400; 7159 params.BackBufferHeight = 0x300; 7160 params.BackBufferFormat = D3DFMT_A8R8G8B8; 7161 // params.BackBufferCount = 0; 7162 params.BackBufferCount = 1; 7163 params.MultiSampleType = D3DMULTISAMPLE_NONE; 7164 params.SwapEffect = D3DSWAPEFFECT_DISCARD; 7165 // params.hDeviceWindow = hWnd; 7166 /* @todo: it seems there should be a way to detect this correctly since 7167 * our vboxWddmDDevSetDisplayMode will be called in case we are using full-screen */ 7168 params.Windowed = TRUE; 7169 // params.EnableAutoDepthStencil = FALSE; 7170 // params.AutoDepthStencilFormat = D3DFMT_UNKNOWN; 7171 // params.Flags; 7172 // params.FullScreen_RefreshRateInHz; 7173 // params.FullScreen_PresentationInterval; 7174 7175 hr = vboxWddmD3DDeviceCreate(pDevice, 0, pRc, ¶ms, TRUE /*BOOL bLockable*/); 7176 Assert(hr == S_OK); 7177 if (hr == S_OK) 7178 break; 7179 vboxResourceFree(pRc); 7180 } 7181 else 7182 { 7183 hr = E_OUTOFMEMORY; 7184 } 7185 #else 7186 //# define VBOXDISP_TEST_SWAPCHAIN 7187 # ifdef VBOXDISP_TEST_SWAPCHAIN 7188 VBOXDISP_D3DEV(pDevice); 7189 # endif 7190 break; 7191 #endif 7192 7193 HRESULT tmpHr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext); 7194 Assert(tmpHr == S_OK); 7159 7195 } 7160 else7161 {7162 hr = E_OUTOFMEMORY;7163 }7164 #else7165 //# define VBOXDISP_TEST_SWAPCHAIN7166 # ifdef VBOXDISP_TEST_SWAPCHAIN7167 VBOXDISP_D3DEV(pDevice);7168 # endif7169 break;7170 #endif7171 7172 HRESULT tmpHr = vboxDispCmCtxDestroy(pDevice, &pDevice->DefaultContext);7173 Assert(tmpHr == S_OK);7174 7196 } 7175 7197 } -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3D.h
r32697 r32889 18 18 #include "VBoxDispD3DIf.h" 19 19 #include "../../Miniport/wddm/VBoxVideoIf.h" 20 #include "VBoxUhgsmiDisp.h" 20 21 21 22 #include <iprt/cdefs.h> … … 177 178 D3DVIEWPORT9 ViewPort; 178 179 VBOXWDDMDISP_CONTEXT DefaultContext; 180 VBOXUHGSMI_PRIVATE_D3D Uhgsmi; 179 181 180 182 CRITICAL_SECTION DirtyAllocListLock; -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispD3DCmn.h
r32739 r32889 33 33 #include "../../Miniport/wddm/VBoxVideoIf.h" 34 34 #include "VBoxDispCm.h" 35 #include "VBoxUhgsmiDisp.h" 35 36 #include "VBoxDispD3D.h" 36 37 … … 41 42 #endif 42 43 43 #if defined(VBOXWDDMDISP_DEBUG) || defined(VBOX_WDDMDISP_WITH_PROFILE) 44 #if defined(VBOXWDDMDISP_DEBUG) || defined(VBOX_WDDMDISP_WITH_PROFILE) || defined(VBOXWDDM_TEST_UHGSMI) 44 45 # define VBOXWDDMDISP_DEBUG_PRINT 45 46 #endif -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxDispMpTst.cpp
r30515 r32889 16 16 17 17 #include <iprt/thread.h> 18 #include <iprt/err.h> 18 19 19 20 #include "VBoxDispD3DCmn.h" 21 22 #include "VBoxDispProfile.h" 20 23 21 24 static RTTHREAD g_VBoxDispMpTstThread; … … 143 146 } 144 147 148 int vboxUhgsmiTst(PVBOXUHGSMI pUhgsmi, uint32_t cbBuf, uint32_t cNumCals, uint64_t * pTimeMs) 149 { 150 PVBOXUHGSMI_BUFFER pBuf; 151 int rc = pUhgsmi->pfnBufferCreate(pUhgsmi, cbBuf, VBOXUHGSMI_SYNCHOBJECT_TYPE_EVENT, NULL, &pBuf); 152 AssertRC(rc); 153 if (RT_SUCCESS(rc)) 154 { 155 uint64_t TimeMs = VBOXDISPPROFILE_GET_TIME_MILLI(); 156 do 157 { 158 VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags; 159 fFlags.Value = 0; 160 fFlags.bLockEntire = 1; 161 fFlags.bDiscard = 1; 162 163 void *pvLock; 164 rc = pBuf->pfnLock(pBuf, 0, cbBuf, fFlags, &pvLock); 165 AssertRC(rc); 166 if (!RT_SUCCESS(rc)) 167 break; 168 169 rc = pBuf->pfnUnlock(pBuf); 170 AssertRC(rc); 171 if (!RT_SUCCESS(rc)) 172 break; 173 174 VBOXUHGSMI_BUFFER_SUBMIT SubmitData; 175 SubmitData.pBuf = pBuf; 176 SubmitData.fFlags.Value = 0; 177 SubmitData.fFlags.bDoNotRetire = 1; 178 SubmitData.fFlags.bEntireBuffer = 1; 179 180 rc = pUhgsmi->pfnBufferSubmitAsynch(pUhgsmi, &SubmitData, 1); 181 AssertRC(rc); 182 if (!RT_SUCCESS(rc)) 183 break; 184 185 DWORD dw = WaitForSingleObject(pBuf->hSynch, INFINITE); 186 Assert(dw == WAIT_OBJECT_0); 187 if (dw) 188 break; 189 } while (--cNumCals); 190 191 TimeMs = VBOXDISPPROFILE_GET_TIME_MILLI() - TimeMs; 192 *pTimeMs = TimeMs; 193 194 pBuf->pfnDestroy(pBuf); 195 } 196 return rc; 197 } -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.cpp
r32877 r32889 13 13 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 14 14 */ 15 #include "VBox UhgsmiDisp.h"15 #include "VBoxDispD3DCmn.h" 16 16 17 17 #include <iprt/mem.h> … … 54 54 { 55 55 PVBOXUHGSMI_BUFFER_PRIVATE_D3D pBuffer = VBOXUHGSMID3D_GET_BUFFER(pBuf); 56 if (!cbLock)57 {58 Assert(0);59 return VERR_INVALID_PARAMETER;60 }61 if (offLock + cbLock > pBuf->cbBuffer)62 {63 Assert(0);64 return VERR_INVALID_PARAMETER;65 }66 uint32_t iFirstPage = offLock >> 0x1000;67 uint32_t iAfterLastPage = (cbLock + 0xfff) >> 0x1000;68 uint32_t cPages = iAfterLastPage - iFirstPage;69 uint32_t cBufPages = pBuf->cbBuffer >> 0x1000;70 Assert(cPages <= (cBufPages));71 56 D3DDDICB_LOCK DdiLock; 72 57 DdiLock.hAllocation = pBuffer->hAllocation; 73 58 DdiLock.PrivateDriverData = 0; 74 if (cPages == cBufPages) 75 {76 DdiLock.NumPages = 0;77 DdiLock.pPages = NULL;59 60 if (fFlags.bLockEntire) 61 { 62 offLock = 0; 78 63 DdiLock.Flags.Value = 0; 79 64 DdiLock.Flags.LockEntire = 1; … … 81 66 else 82 67 { 83 DdiLock.NumPages = cPages; 84 DdiLock.pPages = pBuffer->aLockPageIndices; 85 DdiLock.Flags.Value = 0; 86 for (UINT i = 0, j = iFirstPage; i < cPages; ++i, ++j) 87 { 88 pBuffer->aLockPageIndices[i] = j; 89 } 68 if (!cbLock) 69 { 70 Assert(0); 71 return VERR_INVALID_PARAMETER; 72 } 73 if (offLock + cbLock > pBuf->cbBuffer) 74 { 75 Assert(0); 76 return VERR_INVALID_PARAMETER; 77 } 78 79 uint32_t iFirstPage = offLock >> 0x1000; 80 uint32_t iAfterLastPage = (cbLock + 0xfff) >> 0x1000; 81 uint32_t cPages = iAfterLastPage - iFirstPage; 82 uint32_t cBufPages = pBuf->cbBuffer >> 0x1000; 83 Assert(cPages <= (cBufPages)); 84 85 if (cPages == cBufPages) 86 { 87 DdiLock.NumPages = 0; 88 DdiLock.pPages = NULL; 89 DdiLock.Flags.Value = 0; 90 DdiLock.Flags.LockEntire = 1; 91 } 92 else 93 { 94 DdiLock.NumPages = cPages; 95 DdiLock.pPages = pBuffer->aLockPageIndices; 96 DdiLock.Flags.Value = 0; 97 for (UINT i = 0, j = iFirstPage; i < cPages; ++i, ++j) 98 { 99 pBuffer->aLockPageIndices[i] = j; 100 } 101 } 102 90 103 } 91 104 DdiLock.pData = NULL; … … 93 106 DdiLock.Flags.WriteOnly = fFlags.bWriteOnly; 94 107 DdiLock.Flags.DonotWait = fFlags.bDonotWait; 95 DdiLock.Flags.Discard = fFlags.bDiscard;108 // DdiLock.Flags.Discard = fFlags.bDiscard; 96 109 97 110 HRESULT hr = pBuffer->pDevice->RtCallbacks.pfnLockCb(pBuffer->pDevice->hDevice, &DdiLock); … … 99 112 if (hr == S_OK) 100 113 { 101 *pvLock = (void*)(((uint8_t*)DdiLock.p Pages) + (offLock & 0xfff));114 *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff)); 102 115 return VINF_SUCCESS; 103 116 } … … 217 230 pBuf->pDevice = pPrivate->pDevice; 218 231 pBuf->hAllocation = Buf.DdiAllocInfo.hAllocation; 232 233 *ppBuf = &pBuf->Base; 234 219 235 return VINF_SUCCESS; 220 236 } … … 264 280 pAllocationList->DoNotRetireInstance = pBufInfo->fFlags.bDoNotRetire; 265 281 pBufSubmInfo->fSubFlags = pBufInfo->fFlags; 266 pBufSubmInfo->offData = pBufInfo->offData; 267 pBufSubmInfo->cbData = pBufInfo->cbData; 282 if (pBufInfo->fFlags.bEntireBuffer) 283 { 284 pBufSubmInfo->offData = 0; 285 pBufSubmInfo->cbData = pBuffer->Base.cbBuffer; 286 } 287 else 288 { 289 pBufSubmInfo->offData = pBufInfo->offData; 290 pBufSubmInfo->cbData = pBufInfo->cbData; 291 } 268 292 269 293 ++pAllocationList; -
trunk/src/VBox/Additions/WINNT/Graphics/Display/wddm/VBoxUhgsmiDisp.h
r32877 r32889 22 22 { 23 23 VBOXUHGSMI Base; 24 PVBOXWDDMDISP_DEVICEpDevice;24 struct VBOXWDDMDISP_DEVICE *pDevice; 25 25 } VBOXUHGSMI_PRIVATE_D3D, *PVBOXUHGSMI_PRIVATE_D3D; 26 26 27 HRESULT vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, PVBOXWDDMDISP_DEVICEpDevice);27 HRESULT vboxUhgsmiD3DInit(PVBOXUHGSMI_PRIVATE_D3D pHgsmi, struct VBOXWDDMDISP_DEVICE *pDevice); 28 28 #endif /* #ifndef ___VBoxUhgsmiDisp_h__ */
Note:
See TracChangeset
for help on using the changeset viewer.