Changeset 47628 in vbox for trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Timestamp:
- Aug 9, 2013 9:08:20 AM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 87829
- Location:
- trunk/src/VBox/HostServices/SharedOpenGL/crserverlib
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
r47623 r47628 421 421 422 422 void CrDpResize(PCR_DISPLAY pDisplay, int32_t xPos, int32_t yPos, uint32_t width, uint32_t height); 423 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData, uint32_t fFlags );424 void CrDpEntryCleanup(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry);423 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData, uint32_t fFlags, PFNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED pfnEntryReleased); 424 void CrDpEntryCleanup(PCR_DISPLAY_ENTRY pEntry); 425 425 int CrDpEntryRegionsSet(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions); 426 426 int CrDpEntryRegionsAdd(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions, CR_DISPLAY_ENTRY_MAP *pMap); 427 void CrDp EntryRegionsClear(PCR_DISPLAY pDisplay);427 void CrDpRegionsClear(PCR_DISPLAY pDisplay); 428 428 DECLINLINE(bool) CrDpEntryIsUsed(PCR_DISPLAY_ENTRY pEntry) 429 429 { … … 455 455 void crServerDEntryVibleRegions(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry); 456 456 void crServerDEntryCheckFBO(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry, CRContext *ctx); 457 void crServerDEntryCleanup(CR_DISPLAY_ENTRY *pDEntry);458 457 459 458 void crServerDEntryAllResized(CRMuralInfo *pMural); -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_muralfbo.c
r47623 r47628 57 57 } 58 58 59 if (pDEntry->idInvertTex) 60 { 61 cr_server.head_spu->dispatch_table.DeleteTextures(1, &pDEntry->idInvertTex); 62 pDEntry->idInvertTex = 0; 63 } 64 59 65 if (pDEntry->pvORInstance) 60 66 { … … 82 88 } 83 89 84 }85 86 void crServerDEntryCleanup(CR_DISPLAY_ENTRY *pDEntry)87 {88 if (pDEntry->pvORInstance)89 {90 cr_server.outputRedirect.CROREnd(pDEntry->pvORInstance);91 pDEntry->pvORInstance = NULL;92 }93 90 } 94 91 … … 175 172 } 176 173 } 174 175 void crServerDEntryCheckInvertTex(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry, CRContext *ctx) 176 { 177 CRContextInfo *pMuralContextInfo; 178 179 if (pDEntry->idInvertTex) 180 return; 181 182 pMuralContextInfo = cr_server.currentCtxInfo; 183 if (!pMuralContextInfo) 184 { 185 /* happens on saved state load */ 186 CRASSERT(cr_server.MainContextInfo.SpuContext); 187 pMuralContextInfo = &cr_server.MainContextInfo; 188 cr_server.head_spu->dispatch_table.MakeCurrent(pMural->spuWindow, 0, cr_server.MainContextInfo.SpuContext); 189 } 190 191 if (pMuralContextInfo->CreateInfo.visualBits != pMural->CreateInfo.visualBits) 192 { 193 crWarning("mural visual bits do not match with current context visual bits!"); 194 } 195 196 if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB)) 197 { 198 cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0); 199 } 200 201 cr_server.head_spu->dispatch_table.GenTextures(1, &pDEntry->idInvertTex); 202 CRASSERT(pDEntry->idInvertTex); 203 cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, pDEntry->idInvertTex); 204 cr_server.head_spu->dispatch_table.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 205 cr_server.head_spu->dispatch_table.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 206 cr_server.head_spu->dispatch_table.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 207 cr_server.head_spu->dispatch_table.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 208 cr_server.head_spu->dispatch_table.TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 209 CrVrScrCompositorEntryTexGet(&pDEntry->CEntry)->width, 210 CrVrScrCompositorEntryTexGet(&pDEntry->CEntry)->height, 211 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 212 213 214 /*Restore gl state*/ 215 cr_server.head_spu->dispatch_table.BindTexture(GL_TEXTURE_2D, 216 ctx->texture.unit[ctx->texture.curTextureUnit].currentTexture2D->hwid); 217 218 if (crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB)) 219 { 220 cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, ctx->bufferobject.unpackBuffer->hwid); 221 } 222 223 if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB)) 224 { 225 cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, ctx->bufferobject.packBuffer->hwid); 226 } 227 else 228 { 229 cr_server.head_spu->dispatch_table.BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); 230 } 231 } 232 233 void crServerDEntryImgRelease(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry, void*pvImg) 234 { 235 GLuint idPBO; 236 CRContext *ctx = crStateGetCurrent(); 237 238 idPBO = cr_server.bUsePBOForReadback ? pDEntry->idPBO : 0; 239 240 CrHlpFreeTexImage(ctx, idPBO, pvImg); 241 } 242 243 244 void* crServerDEntryImgAcquire(CRMuralInfo *pMural, CR_DISPLAY_ENTRY *pDEntry, GLenum enmFormat) 245 { 246 void* pvData; 247 GLuint idPBO; 248 VBOXVR_TEXTURE Tex; 249 const VBOXVR_TEXTURE * pTex; 250 CRContext *ctx = crStateGetCurrent(); 251 252 crServerDEntryCheckFBO(pMural, pDEntry, ctx); 253 254 if (cr_server.bUsePBOForReadback && !pDEntry->idPBO) 255 { 256 crWarning("Mural doesn't have PBO even though bUsePBOForReadback is set!"); 257 } 258 259 idPBO = cr_server.bUsePBOForReadback ? pDEntry->idPBO : 0; 260 261 if (!(CrVrScrCompositorEntryFlagsGet(&pDEntry->CEntry) & CRBLT_F_INVERT_SRC_YCOORDS)) 262 pTex = CrVrScrCompositorEntryTexGet(&pDEntry->CEntry); 263 else 264 { 265 CRMuralInfo *pCurrentMural = cr_server.currentMural; 266 CRContextInfo *pCurCtxInfo = cr_server.currentCtxInfo; 267 PCR_BLITTER pBlitter = crServerVBoxBlitterGet(); 268 CRMuralInfo *pBlitterMural; 269 CR_SERVER_CTX_SWITCH CtxSwitch; 270 RTRECT SrcRect, DstRect; 271 CR_BLITTER_WINDOW BlitterBltInfo, CurrentBltInfo; 272 CR_BLITTER_CONTEXT CtxBltInfo; 273 int rc; 274 275 crServerDEntryCheckInvertTex(pMural, pDEntry, ctx); 276 if (!pDEntry->idInvertTex) 277 { 278 crWarning("crServerDEntryCheckInvertTex failed"); 279 return NULL; 280 } 281 282 Tex = *CrVrScrCompositorEntryTexGet(&pDEntry->CEntry); 283 Tex.hwid = pDEntry->idInvertTex; 284 285 SrcRect.xLeft = 0; 286 SrcRect.yTop = Tex.height; 287 SrcRect.xRight = Tex.width; 288 SrcRect.yBottom = 0; 289 290 DstRect.xLeft = 0; 291 DstRect.yTop = 0; 292 DstRect.xRight = Tex.width; 293 DstRect.yBottom = Tex.height; 294 295 if (pCurrentMural && pCurrentMural->CreateInfo.visualBits == CrBltGetVisBits(pBlitter)) 296 { 297 pBlitterMural = pCurrentMural; 298 } 299 else 300 { 301 pBlitterMural = crServerGetDummyMural(pCurrentMural->CreateInfo.visualBits); 302 if (!pBlitterMural) 303 { 304 crWarning("crServerGetDummyMural failed for blitter mural"); 305 return NULL; 306 } 307 } 308 309 crServerCtxSwitchPrepare(&CtxSwitch, NULL); 310 311 crServerVBoxBlitterWinInit(&CurrentBltInfo, pCurrentMural); 312 crServerVBoxBlitterWinInit(&BlitterBltInfo, pBlitterMural); 313 crServerVBoxBlitterCtxInit(&CtxBltInfo, pCurCtxInfo); 314 315 CrBltMuralSetCurrent(pBlitter, &BlitterBltInfo); 316 317 rc = CrBltEnter(pBlitter, &CtxBltInfo, &CurrentBltInfo); 318 if (RT_SUCCESS(rc)) 319 { 320 CrBltBlitTexTex(pBlitter, CrVrScrCompositorEntryTexGet(&pDEntry->CEntry), &SrcRect, &Tex, &DstRect, 1, 0); 321 CrBltLeave(pBlitter); 322 } 323 else 324 { 325 crWarning("CrBltEnter failed rc %d", rc); 326 } 327 328 crServerCtxSwitchPostprocess(&CtxSwitch); 329 330 pTex = &Tex; 331 } 332 333 pvData = CrHlpGetTexImage(ctx, pTex, idPBO, enmFormat); 334 if (!pvData) 335 crWarning("CrHlpGetTexImage failed in crServerPresentFBO"); 336 337 return pvData; 338 } 339 177 340 178 341 /* Called when a new CRMuralInfo is created … … 990 1153 { 991 1154 char *pixels=NULL; 992 GLuint idPBO;993 CRContext *ctx = crStateGetCurrent();994 1155 995 1156 if (!pDEntry->pvORInstance) … … 1002 1163 } 1003 1164 } 1004 1005 crServerDEntryCheckFBO(pMural, pDEntry, ctx);1006 1165 1007 1166 if (pMural->fPresentMode & CR_SERVER_REDIR_F_FBO_RPW) … … 1078 1237 } 1079 1238 1080 if (cr_server.bUsePBOForReadback && !pDEntry->idPBO) 1081 { 1082 crWarning("Mural doesn't have PBO even though bUsePBOForReadback is set!"); 1083 } 1084 1085 idPBO = cr_server.bUsePBOForReadback ? pDEntry->idPBO : 0; 1086 1087 pixels = CrHlpGetTexImage(ctx, CrVrScrCompositorEntryTexGet(&pDEntry->CEntry), idPBO, GL_BGRA); 1239 pixels = crServerDEntryImgAcquire(pMural, pDEntry, GL_BGRA); 1088 1240 if (!pixels) 1089 1241 { … … 1094 1246 crServerDentryPresentVRAM(pMural, pDEntry, pixels); 1095 1247 1096 CrHlpFreeTexImage(ctx, idPBO, pixels);1248 crServerDEntryImgRelease(pMural, pDEntry, pixels); 1097 1249 } 1098 1250 -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_presenter.cpp
r47623 r47628 252 252 } 253 253 254 void CrDp EntryRegionsClear(PCR_DISPLAY pDisplay)254 void CrDpRegionsClear(PCR_DISPLAY pDisplay) 255 255 { 256 256 bool fChanged = false; … … 269 269 } 270 270 271 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData, uint32_t fFlags )272 { 273 CrVrScrCompositorEntryInit(&pEntry->CEntry, pTextureData, crDpEntryCEntryReleaseCB);271 void CrDpEntryInit(PCR_DISPLAY_ENTRY pEntry, const VBOXVR_TEXTURE *pTextureData, uint32_t fFlags, PFNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED pfnEntryReleased) 272 { 273 CrVrScrCompositorEntryInit(&pEntry->CEntry, pTextureData, pfnEntryReleased); 274 274 CrVrScrCompositorEntryFlagsSet(&pEntry->CEntry, fFlags); 275 275 CrVrScrCompositorEntryInit(&pEntry->RootVrCEntry, pTextureData, NULL); 276 276 CrVrScrCompositorEntryFlagsSet(&pEntry->RootVrCEntry, fFlags); 277 277 pEntry->pvORInstance = NULL; 278 } 279 280 void CrDpEntryCleanup(PCR_DISPLAY pDisplay, PCR_DISPLAY_ENTRY pEntry) 281 { 282 CrVrScrCompositorEntryRemove(&pDisplay->Mural.Compositor, &pEntry->CEntry); 278 pEntry->idPBO = 0; 279 pEntry->idInvertTex = 0; 280 } 281 282 void CrDpEntryCleanup(PCR_DISPLAY_ENTRY pDEntry) 283 { 284 if (pDEntry->idPBO) 285 { 286 CRASSERT(cr_server.bUsePBOForReadback); 287 cr_server.head_spu->dispatch_table.DeleteBuffersARB(1, &pDEntry->idPBO); 288 pDEntry->idPBO = 0; 289 } 290 291 if (pDEntry->idInvertTex) 292 { 293 cr_server.head_spu->dispatch_table.DeleteTextures(1, &pDEntry->idInvertTex); 294 pDEntry->idInvertTex = 0; 295 } 296 297 if (pDEntry->pvORInstance) 298 { 299 cr_server.outputRedirect.CROREnd(pDEntry->pvORInstance); 300 pDEntry->pvORInstance = NULL; 301 } 283 302 } 284 303 … … 366 385 static void crDemEntryFree(CR_DEM_ENTRY* pDemEntry) 367 386 { 368 crServerDEntryCleanup(&pDemEntry->Entry);387 CrDpEntryCleanup(&pDemEntry->Entry); 369 388 RTMemCacheFree(g_VBoxCrDemLookasideList, pDemEntry); 370 389 } … … 545 564 } 546 565 547 CrDpEntryInit(&pDemEntry->Entry, &TextureData, fFlags );566 CrDpEntryInit(&pDemEntry->Entry, &TextureData, fFlags, crDpEntryCEntryReleaseCB); 548 567 549 568 CR_DEM_ENTRY_INFO *pInfo = (CR_DEM_ENTRY_INFO*)crHashtableSearch(pMap->pTexIdToDemInfoMap, pTobj->id); … … 899 918 else 900 919 { 901 CrDp EntryRegionsClear(pDisplay);920 CrDpRegionsClear(pDisplay); 902 921 } 903 922 -
trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_window.c
r47623 r47628 116 116 { 117 117 CR_DISPLAY_ENTRY *pDEntry = CR_DENTRY_FROM_CENTRY(pEntry); 118 crServerDEntryCleanup(pDEntry);118 CrDpEntryCleanup(pDEntry); 119 119 } 120 120 … … 159 159 Tex.target = GL_TEXTURE_2D; 160 160 Tex.hwid = 0; 161 CrVrScrCompositorEntryInit(&mural->DefaultDEntry.CEntry, &Tex, crServerMuralDefaultEntryReleasedCB); 162 163 if (cr_server.fRootVrOn) 164 { 165 CrVrScrCompositorEntryInit(&mural->DefaultDEntry.RootVrCEntry, &Tex, NULL); 166 mural->fRootVrOn = GL_TRUE; 167 } 168 169 mural->DefaultDEntry.pvORInstance = NULL; 161 162 CrDpEntryInit(&mural->DefaultDEntry, &Tex, 0, crServerMuralDefaultEntryReleasedCB); 163 164 mural->fRootVrOn = cr_server.fRootVrOn; 170 165 } 171 166
Note:
See TracChangeset
for help on using the changeset viewer.