Changeset 50095 in vbox for trunk/src/VBox/GuestHost/OpenGL
- Timestamp:
- Jan 17, 2014 4:34:07 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 91620
- Location:
- trunk/src/VBox/GuestHost/OpenGL
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/OpenGL/Makefile.kmk
r50041 r50095 85 85 util/vreg.cpp \ 86 86 util/blitter.cpp \ 87 util/compositor.cpp \ 88 util/htable.cpp \ 87 89 util/vboxhgcm.c \ 88 90 $(VBOX_PATH_CROGL_GENFILES)/debug_opcodes.c -
trunk/src/VBox/GuestHost/OpenGL/glapi_parser/APIspec.txt
r50041 r50095 8595 8595 return void 8596 8596 param win GLint 8597 param pCompositor struct VBOXVR_SCR_COMPOSITOR *8598 param pChangedEntry struct VBOXVR_SCR_COMPOSITOR_ENTRY *8597 param pCompositor const struct VBOXVR_SCR_COMPOSITOR * 8598 param pChangedEntry const struct VBOXVR_SCR_COMPOSITOR_ENTRY * 8599 8599 category VBox 8600 8600 chromium nopack -
trunk/src/VBox/GuestHost/OpenGL/include/chromium.h
r50041 r50095 727 727 #define GL_HH_SET_DEFAULT_SHARED_CTX 0x8B2D 728 728 729 #define GL_HH_SET_TMPCTX_MAKE_CURRENT 0x8B2E 730 729 731 /**********************************************************************/ 730 732 /***** Chromium-specific API *****/ -
trunk/src/VBox/GuestHost/OpenGL/include/cr_blitter.h
r48348 r50095 19 19 20 20 #include <iprt/cdefs.h> 21 #include <iprt/asm.h> 21 22 #include "cr_spu.h" 22 23 #include "cr_vreg.h" … … 74 75 uint32_t CtxCreated : 1; 75 76 uint32_t SupportsFBO : 1; 77 uint32_t SupportsPBO : 1; 76 78 uint32_t CurrentMuralChanged : 1; 77 79 uint32_t LastWasFBODraw : 1; 78 80 uint32_t ForceDrawBlit : 1; 79 81 uint32_t ShadersGloal : 1; 80 uint32_t Reserved : 25; 82 uint32_t Entered : 1; 83 uint32_t Reserved : 23; 81 84 }; 82 85 uint32_t Value; … … 125 128 CR_BLITTER_WINDOW CurrentMural; 126 129 CR_BLITTER_CONTEXT CtxInfo; 127 const CR_BLITTER_CONTEXT *pRestoreCtxInfo;128 const CR_BLITTER_WINDOW *pRestoreMural;129 130 int32_t i32MakeCurrentUserData; 130 131 SPUDispatchTable *pDispatch; … … 142 143 VBOXBLITTERDECL(void) CrBltTerm(PCR_BLITTER pBlitter); 143 144 144 VBOXBLITTERDECL(int) CrBltCleanup(PCR_BLITTER pBlitter , const CR_BLITTER_CONTEXT *pRestoreCtxInfo, const CR_BLITTER_WINDOW *pRestoreMural);145 VBOXBLITTERDECL(int) CrBltCleanup(PCR_BLITTER pBlitter); 145 146 146 147 DECLINLINE(GLboolean) CrBltSupportsTexTex(PCR_BLITTER pBlitter) … … 151 152 DECLINLINE(GLboolean) CrBltIsEntered(PCR_BLITTER pBlitter) 152 153 { 153 return !!pBlitter->pRestoreCtxInfo;154 return pBlitter->Flags.Entered; 154 155 } 155 156 … … 170 171 } 171 172 172 VBOXBLITTERDECL(int) CrBltMuralSetCurrent (PCR_BLITTER pBlitter, const CR_BLITTER_WINDOW *pMural);173 VBOXBLITTERDECL(int) CrBltMuralSetCurrentInfo(PCR_BLITTER pBlitter, const CR_BLITTER_WINDOW *pMural); 173 174 DECLINLINE(const CR_BLITTER_WINDOW *) CrBltMuralGetCurrentInfo(PCR_BLITTER pBlitter) 174 175 { … … 179 180 180 181 VBOXBLITTERDECL(void) CrBltLeave(PCR_BLITTER pBlitter); 181 VBOXBLITTERDECL(int) CrBltEnter(PCR_BLITTER pBlitter , const CR_BLITTER_CONTEXT *pRestoreCtxInfo, const CR_BLITTER_WINDOW *pRestoreMural);182 VBOXBLITTERDECL(int) CrBltEnter(PCR_BLITTER pBlitter); 182 183 VBOXBLITTERDECL(void) CrBltBlitTexMural(PCR_BLITTER pBlitter, bool fBb, const VBOXVR_TEXTURE *pSrc, const RTRECT *paSrcRects, const RTRECT *paDstRects, uint32_t cRects, uint32_t fFlags); 183 184 VBOXBLITTERDECL(void) CrBltBlitTexTex(PCR_BLITTER pBlitter, const VBOXVR_TEXTURE *pSrc, const RTRECT *pSrcRect, const VBOXVR_TEXTURE *pDst, const RTRECT *pDstRect, uint32_t cRects, uint32_t fFlags); … … 188 189 VBOXBLITTERDECL(void) CrBltPresent(PCR_BLITTER pBlitter); 189 190 /* */ 191 struct CR_TEXDATA; 192 193 typedef DECLCALLBACK(void) FNCRTEXDATA_RELEASED(struct CR_TEXDATA *pTexture); 194 typedef FNCRTEXDATA_RELEASED *PFNCRTEXDATA_RELEASED; 195 196 typedef union CR_TEXDATA_FLAGS 197 { 198 struct 199 { 200 uint32_t DataInverted : 1; 201 uint32_t Entered : 1; 202 uint32_t BltEntered : 1; 203 uint32_t Reserved : 29; 204 }; 205 uint32_t Value; 206 } CR_TEXDATA_FLAGS, *PCR_TEXDATA_FLAGS; 207 208 209 typedef struct CR_TEXDATA 210 { 211 VBOXVR_TEXTURE Tex; 212 volatile uint32_t cRefs; 213 /* fields specific to texture data download */ 214 uint32_t idInvertTex; 215 uint32_t idPBO; 216 CR_TEXDATA_FLAGS Flags; 217 PCR_BLITTER pBlitter; 218 CR_BLITTER_IMG Img; 219 /*dtor*/ 220 PFNCRTEXDATA_RELEASED pfnTextureReleased; 221 } CR_TEXDATA, *PCR_TEXDATA; 222 223 DECLINLINE(void) CrTdInit(PCR_TEXDATA pTex, const VBOXVR_TEXTURE *pVrTex, PCR_BLITTER pBlitter, PFNCRTEXDATA_RELEASED pfnTextureReleased) 224 { 225 memset(pTex, 0, sizeof (*pTex)); 226 pTex->Tex = *pVrTex; 227 pTex->cRefs = 1; 228 pTex->pBlitter = pBlitter; 229 pTex->pfnTextureReleased = pfnTextureReleased; 230 } 231 232 DECLINLINE(const VBOXVR_TEXTURE*) CrTdTexGet(const CR_TEXDATA *pTex) 233 { 234 return &pTex->Tex; 235 } 236 237 DECLINLINE(int) CrTdBltEnter(PCR_TEXDATA pTex) 238 { 239 if (pTex->Flags.Entered) 240 return VERR_INVALID_STATE; 241 if (!CrBltIsEntered(pTex->pBlitter)) 242 { 243 int rc = CrBltEnter(pTex->pBlitter); 244 if (!RT_SUCCESS(rc)) 245 { 246 crWarning("CrBltEnter failed rc %d", rc); 247 return rc; 248 } 249 pTex->Flags.BltEntered = 1; 250 } 251 pTex->Flags.Entered = 1; 252 return VINF_SUCCESS; 253 } 254 255 DECLINLINE(bool) CrTdBltIsEntered(PCR_TEXDATA pTex) 256 { 257 return pTex->Flags.Entered; 258 } 259 260 DECLINLINE(void) CrTdBltLeave(PCR_TEXDATA pTex) 261 { 262 if (!pTex->Flags.Entered) 263 { 264 crWarning("invalid Blt Leave"); 265 return; 266 } 267 268 if (pTex->Flags.BltEntered) 269 { 270 CrBltLeave(pTex->pBlitter); 271 pTex->Flags.BltEntered = 0; 272 } 273 274 pTex->Flags.Entered = 0; 275 } 276 277 /* the CrTdBltXxx calls are done with the entered blitter */ 278 /* acquire the texture data, returns the cached data in case it is cached. 279 * the data remains cached in the CR_TEXDATA object until it is discarded with CrTdBltDataDiscard or CrTdBltDataCleanup. 280 * */ 281 VBOXBLITTERDECL(int) CrTdBltDataAcquire(PCR_TEXDATA pTex, GLenum enmFormat, bool fInverted, const CR_BLITTER_IMG**ppImg); 282 /* release the texture data, the data remains cached in the CR_TEXDATA object until it is discarded with CrTdBltDataDiscard or CrTdBltDataCleanup */ 283 VBOXBLITTERDECL(void) CrTdBltDataRelease(PCR_TEXDATA pTex); 284 /* discard the texture data cached with previous CrTdBltDataAcquire. 285 * Must be called wit data released (CrTdBltDataRelease) */ 286 VBOXBLITTERDECL(void) CrTdBltDataDiscard(PCR_TEXDATA pTex); 287 /* does same as CrTdBltDataDiscard, and in addition cleans up. 288 * this is kind of a texture destructor, which clients should call on texture object destruction, e.g. from the PFNCRTEXDATA_RELEASED callback */ 289 VBOXBLITTERDECL(void) CrTdBltDataCleanup(PCR_TEXDATA pTex); 290 291 DECLINLINE(uint32_t) CrTdAddRef(PCR_TEXDATA pTex) 292 { 293 return ASMAtomicIncU32(&pTex->cRefs); 294 } 295 296 DECLINLINE(uint32_t) CrTdRelease(PCR_TEXDATA pTex) 297 { 298 uint32_t cRefs = ASMAtomicDecU32(&pTex->cRefs); 299 if (!cRefs) 300 { 301 if (pTex->pfnTextureReleased) 302 pTex->pfnTextureReleased(pTex); 303 else 304 CrTdBltDataCleanup(pTex); 305 } 306 307 return cRefs; 308 } 190 309 191 310 RT_C_DECLS_END -
trunk/src/VBox/GuestHost/OpenGL/include/cr_compositor.h
r49773 r50095 23 23 /* Compositor with Stretching & Cached Rectangles info */ 24 24 25 RT_C_DECLS_BEGIN 26 25 27 struct VBOXVR_SCR_COMPOSITOR_ENTRY; 26 28 struct VBOXVR_SCR_COMPOSITOR; … … 122 124 } 123 125 124 VBOXVREGDECL(int) CrVrScrCompositorEntryRe size(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTRECT *pRect);126 VBOXVREGDECL(int) CrVrScrCompositorEntryRectSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTRECT *pRect); 125 127 VBOXVREGDECL(int) CrVrScrCompositorEntryTexAssign(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, CR_TEXDATA *pTex); 126 128 VBOXVREGDECL(void) CrVrScrCompositorVisit(PVBOXVR_SCR_COMPOSITOR pCompositor, PFNVBOXVRSCRCOMPOSITOR_VISITOR pfnVisitor, void *pvVisitor); … … 143 145 144 146 /* regions are valid until the next CrVrScrCompositor call */ 145 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsGet( PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRYpEntry, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects);147 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsGet(const VBOXVR_SCR_COMPOSITOR *pCompositor, const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects); 146 148 VBOXVREGDECL(int) CrVrScrCompositorEntryRemove(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry); 147 149 VBOXVREGDECL(bool) CrVrScrCompositorEntryReplace(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, PVBOXVR_SCR_COMPOSITOR_ENTRY pNewEntry); 148 150 VBOXVREGDECL(void) CrVrScrCompositorEntryFlagsSet(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t fFlags); 149 VBOXVREGDECL(uint32_t) CrVrScrCompositorEntryFlagsCombinedGet( PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRYpEntry);151 VBOXVREGDECL(uint32_t) CrVrScrCompositorEntryFlagsCombinedGet(const VBOXVR_SCR_COMPOSITOR *pCompositor, const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry); 150 152 DECLINLINE(uint32_t) CrVrScrCompositorEntryFlagsGet(const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry) 151 153 { … … 166 168 typedef FNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR *PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR; 167 169 168 VBOXVREGDECL(int) CrVrScrCompositorClone( PVBOXVR_SCR_COMPOSITORpCompositor, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor);170 VBOXVREGDECL(int) CrVrScrCompositorClone(const VBOXVR_SCR_COMPOSITOR *pCompositor, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor); 169 171 VBOXVREGDECL(int) CrVrScrCompositorIntersectList(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pVr, bool *pfChanged); 170 VBOXVREGDECL(int) CrVrScrCompositorIntersectedList( PVBOXVR_SCR_COMPOSITORpCompositor, const VBOXVR_LIST *pVr, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor, bool *pfChanged);172 VBOXVREGDECL(int) CrVrScrCompositorIntersectedList(const VBOXVR_SCR_COMPOSITOR *pCompositor, const VBOXVR_LIST *pVr, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor, bool *pfChanged); 171 173 #ifndef IN_RING0 172 174 VBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY); 173 DECLINLINE(void) CrVrScrCompositorGetStretching( PVBOXVR_SCR_COMPOSITORpCompositor, float *pStretchX, float *pStretchY)175 DECLINLINE(void) CrVrScrCompositorGetStretching(const VBOXVR_SCR_COMPOSITOR *pCompositor, float *pStretchX, float *pStretchY) 174 176 { 175 177 if (pStretchX) … … 181 183 #endif 182 184 /* regions are valid until the next CrVrScrCompositor call */ 183 VBOXVREGDECL(int) CrVrScrCompositorRegionsGet( PVBOXVR_SCR_COMPOSITORpCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects);185 VBOXVREGDECL(int) CrVrScrCompositorRegionsGet(const VBOXVR_SCR_COMPOSITOR *pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects); 184 186 185 187 #define VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(_p) ((PVBOXVR_SCR_COMPOSITOR_ENTRY)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVR_SCR_COMPOSITOR_ENTRY, Ce))) 188 #define VBOXVR_SCR_COMPOSITOR_CONST_ENTRY_FROM_ENTRY(_p) ((const VBOXVR_SCR_COMPOSITOR_ENTRY*)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVR_SCR_COMPOSITOR_ENTRY, Ce))) 186 189 #define VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(_p) ((PVBOXVR_SCR_COMPOSITOR)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVR_SCR_COMPOSITOR, Compositor))) 187 190 … … 191 194 } VBOXVR_SCR_COMPOSITOR_ITERATOR ,*PVBOXVR_SCR_COMPOSITOR_ITERATOR; 192 195 196 typedef struct VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR 197 { 198 VBOXVR_COMPOSITOR_CONST_ITERATOR Base; 199 } VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR ,*PVBOXVR_SCR_COMPOSITOR_CONST_ITERATOR; 200 193 201 DECLINLINE(void) CrVrScrCompositorIterInit(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ITERATOR pIter) 194 202 { 195 203 VBoxVrCompositorIterInit(&pCompositor->Compositor, &pIter->Base); 204 } 205 206 DECLINLINE(void) CrVrScrCompositorConstIterInit(const VBOXVR_SCR_COMPOSITOR *pCompositor, PVBOXVR_SCR_COMPOSITOR_CONST_ITERATOR pIter) 207 { 208 VBoxVrCompositorConstIterInit(&pCompositor->Compositor, &pIter->Base); 196 209 } 197 210 … … 206 219 } 207 220 208 221 DECLINLINE(const VBOXVR_SCR_COMPOSITOR_ENTRY*) CrVrScrCompositorConstIterNext(PVBOXVR_SCR_COMPOSITOR_CONST_ITERATOR pIter) 222 { 223 const VBOXVR_COMPOSITOR_ENTRY *pCe = VBoxVrCompositorConstIterNext(&pIter->Base); 224 if (pCe) 225 { 226 return VBOXVR_SCR_COMPOSITOR_CONST_ENTRY_FROM_ENTRY(pCe); 227 } 228 return NULL; 229 } 230 231 RT_C_DECLS_END 209 232 210 233 #endif /* ___cr_compositor_h_ */ -
trunk/src/VBox/GuestHost/OpenGL/include/cr_error.h
r46757 r50095 25 25 #endif 26 26 27 #ifndef IN_RING0 28 #define LOG(_m) do { crDebug _m ; } while (0) 29 #define LOGREL(_m) do { crDebug _m ; } while (0) 30 #define WARN(_m) do { crWarning _m ; AssertMsgFailed(_m); } while (0) 31 #else 32 #define LOG(_m) do { } while (0) 33 #define LOGREL(_m) do { } while (0) 34 #define WARN(_m) do { AssertMsgFailed(_m); } while (0) 35 #endif 36 27 37 DECLEXPORT(void) crEnableWarnings(int onOff); 28 38 29 39 DECLEXPORT(void) crDebug(const char *format, ... ) PRINTF; 30 #if def DEBUG_misha40 #if defined(DEBUG_misha) && defined(RT_OS_WINDOWS) 31 41 typedef void FNCRDEBUG(const char *format, ... ) PRINTF; 32 42 typedef FNCRDEBUG *PFNCRDEBUG; -
trunk/src/VBox/GuestHost/OpenGL/include/cr_htable.h
r49772 r50095 21 21 #include <iprt/types.h> 22 22 #include <iprt/cdefs.h> 23 24 #include <cr_error.h> 23 25 24 26 #ifndef IN_RING0 … … 76 78 { 77 79 if (phHandle) 78 *phHandle = NULL;80 *phHandle = 0; 79 81 return NULL; 80 82 } … … 94 96 } 95 97 96 WARN(("interator concurent modification!"));98 crWarning("interator concurent modification!"); 97 99 return NULL; 98 100 } … … 102 104 { 103 105 *pDstTbl = *pSrcTbl; 104 CrHTableCreate(pSrcTbl );106 CrHTableCreate(pSrcTbl, 0); 105 107 } 106 108 VBOXHTABLEDECL(void) CrHTableEmpty(PCRHTABLE pTbl); … … 114 116 VBOXHTABLEDECL(void*) CrHTableGet(PCRHTABLE pTbl, CRHTABLE_HANDLE hHandle); 115 117 118 RT_C_DECLS_END 116 119 117 120 #endif /* #ifndef ___cr_htable_h_*/ -
trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h
r49474 r50095 27 27 #include <iprt/critsect.h> 28 28 #include <iprt/semaphore.h> 29 #include <iprt/memcache.h> 29 30 30 31 #include <VBox/vmm/ssm.h> 31 32 32 #ifdef VBOX_WITH_CRHGSMI 33 # include <VBox/VBoxVideo.h> 34 #endif 33 #include <VBox/VBoxVideo.h> 35 34 #include <VBox/Hardware/VBoxVideoVBE.h> 36 35 #include <VBox/VBoxVideo3D.h> … … 204 203 /* */ 205 204 206 /* DISPLAY */ 207 /* define display entry early so it can be used in MuralInfo */ 208 typedef struct CR_DISPLAY_ENTRY 205 /* FRAMEBUFFER */ 206 typedef struct CR_FRAMEBUFFER *HCR_FRAMEBUFFER; 207 typedef struct CR_FRAMEBUFFER_ENTRY *HCR_FRAMEBUFFER_ENTRY; 208 /* */ 209 210 typedef struct CR_FBDATA 209 211 { 210 VBOXVR_SCR_COMPOSITOR_ENTRY CEntry; 211 VBOXVR_SCR_COMPOSITOR_ENTRY RootVrCEntry; 212 void *pvORInstance; 213 GLuint idPBO; 214 GLuint idInvertTex; 215 } CR_DISPLAY_ENTRY, *PCR_DISPLAY_ENTRY; 216 /**/ 217 212 HCR_FRAMEBUFFER hFb; 213 HCR_FRAMEBUFFER_ENTRY hFbEntry; 214 CR_TEXDATA* apTexDatas[2]; 215 } CR_FBDATA; 218 216 /** 219 217 * Mural info … … 231 229 GLubyte u8Unused; /*redirect to FBO instead of real host window*/ 232 230 GLboolean bFbDraw; /*GL_FRONT buffer is drawn to directly*/ 233 GLboolean f DataPresented;231 GLboolean fReserved; 234 232 235 233 GLint cVisibleRects; /*count of visible rects*/ … … 255 253 GLuint fboWidth, fboHeight; 256 254 257 GLuint cDisabled;258 259 GLuint fPresentMode; /*redirect to FBO instead of real host window*/260 261 255 GLboolean fHasParentWindow; 262 256 263 GLboolean fR ootVrOn;257 GLboolean fRedirected; 264 258 GLboolean fForcePresentState; 265 259 GLboolean fOrPresentOnReenable; 266 260 267 GLboolean fUseDefaultDEntry;268 269 261 GLboolean fIsVisible; 270 262 271 CR_DISPLAY_ENTRY DefaultDEntry; 272 273 VBOXVR_SCR_COMPOSITOR Compositor; 274 275 /* if root Visible regions are set, these two contain actual regions being passed to render spu */ 276 VBOXVR_SCR_COMPOSITOR RootVrCompositor; 277 278 CR_SERVER_RPW_ENTRY RpwEntry; 263 CR_TEXDATA aTexs[2]; 264 uint32_t cUsedFBDatas; 265 CR_FBDATA *apUsedFBDatas[CR_MAX_GUEST_MONITORS]; 266 CR_FBDATA aFBDatas[CR_MAX_GUEST_MONITORS]; 279 267 280 268 /* bitfield representing contexts the mural has been ever current with … … 344 332 345 333 typedef struct { 346 int32_t x, y; 347 uint32_t w, h; 334 RTRECT Rect; 348 335 } CRScreenViewportInfo; 349 350 351 /* DISPLAY */352 353 #define CR_DENTRY_FROM_CENTRY(_pCentry) ((CR_DISPLAY_ENTRY*)((uint8_t*)(_pCentry) - RT_OFFSETOF(CR_DISPLAY_ENTRY, CEntry)))354 355 356 /* @todo:357 * 1. use compositor stored inside mural to use current MuralFBO and window-related API358 * 2. CR_SERVER_REDIR_F_NONE and CR_SERVER_REDIR_F_FBO should be trated identically for presented window359 * since we just need to blit the given textures to it if we are NOT in CR_SERVER_REDIR_F_FBO_RAM mode */360 typedef struct CR_DISPLAY361 {362 CRMuralInfo Mural;363 GLboolean fForcePresent;364 } CR_DISPLAY, *PCR_DISPLAY;365 366 367 typedef struct CR_DISPLAY_ENTRY_MAP368 {369 CRHashTable * pTexIdToDemInfoMap;370 uint32_t cEntered;371 RTLISTNODE ReleasedList;372 } CR_DISPLAY_ENTRY_MAP, *PCR_DISPLAY_ENTRY_MAP;373 374 336 375 337 typedef struct CRWinVisibilityInfo … … 379 341 uint32_t fVisibleChanged : 1; 380 342 } CRWinVisibilityInfo; 381 382 /* */383 384 /* helpers */385 386 void CrHlpFreeTexImage(CRContext *pCurCtx, GLuint idPBO, void *pvData);387 void* CrHlpGetTexImage(CRContext *pCurCtx, const VBOXVR_TEXTURE *pTexture, GLuint idPBO, GLenum enmFormat);388 void CrHlpPutTexImage(CRContext *pCurCtx, const VBOXVR_TEXTURE *pTexture, GLenum enmFormat, void *pvData);389 390 /* */391 343 392 344 /* BFB (BlitFramebuffer Blitter) flags … … 517 469 518 470 PFNCRSERVERPRESENTFBO pfnPresentFBO; 519 GLuint fPresentMode; /*Force server to render 3d data offscreen 520 *using callback above to update vbox framebuffers*/ 521 GLuint fPresentModeDefault; /*can be set with CR_SERVER_DEFAULT_RENDER_TYPE*/ 522 GLuint fVramPresentModeDefault; 471 472 GLuint fVisualBitsDefault; 523 473 GLboolean bUsePBOForReadback; /*Use PBO's for data readback*/ 524 474 525 GLboolean bUseOutputRedirect; /* Whether the output redirect was set. */526 475 CROutputRedirect outputRedirect; 527 476 … … 553 502 int RcToGuest; 554 503 int RcToGuestOnce; 555 556 /* @todo: should we use just one blitter?557 * we use two currently because the drawable attribs can differ*/558 CR_DISPLAY_ENTRY_MAP PresentTexturepMap;559 uint32_t DisplaysInitMap[(CR_MAX_GUEST_MONITORS + 31)/32];560 CR_DISPLAY aDispplays[CR_MAX_GUEST_MONITORS];561 504 } CRServer; 562 505 … … 582 525 extern DECLEXPORT(int32_t) crVBoxServerLoadState(PSSMHANDLE pSSM, uint32_t version); 583 526 527 extern DECLEXPORT(void) crServerVBoxCompositionSetEnableStateGlobal(GLboolean fEnable); 584 528 extern DECLEXPORT(int32_t) crVBoxServerSetScreenCount(int sCount); 585 529 extern DECLEXPORT(int32_t) crVBoxServerUnmapScreen(int sIndex); 586 530 extern DECLEXPORT(int32_t) crVBoxServerMapScreen(int sIndex, int32_t x, int32_t y, uint32_t w, uint32_t h, uint64_t winID); 587 531 extern DECLEXPORT(void) crServerVBoxCompositionSetEnableStateGlobal(GLboolean fEnable); 532 struct VBVAINFOSCREEN; 533 extern DECLEXPORT(int) crVBoxServerNotifyResize(const struct VBVAINFOSCREEN *pScreen, void *pvVRAM); 588 534 extern DECLEXPORT(int32_t) crVBoxServerSetRootVisibleRegion(GLint cRects, const RTRECT *pRects); 589 535 -
trunk/src/VBox/GuestHost/OpenGL/include/cr_version.h
r49216 r50095 39 39 #define SHCROGL_SSM_VERSION_WITH_SCREEN_INFO 40 40 40 #define SHCROGL_SSM_VERSION_WITH_ALLOCATED_KEYS 41 41 #define SHCROGL_SSM_VERSION 41 41 #define SHCROGL_SSM_VERSION_WITH_FB_INFO 42 42 #define SHCROGL_SSM_VERSION 42 42 43 43 44 /* These define the Chromium release number. -
trunk/src/VBox/GuestHost/OpenGL/include/cr_vreg.h
r48726 r50095 25 25 #include <iprt/assert.h> 26 26 #include <iprt/critsect.h> 27 #include <iprt/asm.h> 27 28 28 29 #ifndef IN_RING0 … … 50 51 DECLINLINE(void) VBoxRectStretch(PRTRECT pRect, float xStretch, float yStretch) 51 52 { 52 pRect->xLeft = pRect->xLeft * xStretch;53 pRect->yTop = pRect->yTop * yStretch;54 pRect->xRight = pRect->xRight * xStretch;55 pRect->yBottom = pRect->yBottom * yStretch;53 pRect->xLeft = (int32_t)(pRect->xLeft * xStretch); 54 pRect->yTop = (int32_t)(pRect->yTop * yStretch); 55 pRect->xRight = (int32_t)(pRect->xRight * xStretch); 56 pRect->yBottom = (int32_t)(pRect->yBottom * yStretch); 56 57 } 57 58 … … 290 291 } VBOXVR_COMPOSITOR_ITERATOR ,*PVBOXVR_COMPOSITOR_ITERATOR; 291 292 293 typedef struct VBOXVR_COMPOSITOR_CONST_ITERATOR 294 { 295 const VBOXVR_COMPOSITOR *pCompositor; 296 const RTLISTNODE *pNextEntry; 297 } VBOXVR_COMPOSITOR_CONST_ITERATOR ,*PVBOXVR_COMPOSITOR_CONST_ITERATOR; 298 292 299 DECLINLINE(void) VBoxVrCompositorIterInit(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ITERATOR pIter) 293 300 { … … 296 303 } 297 304 305 DECLINLINE(void) VBoxVrCompositorConstIterInit(const VBOXVR_COMPOSITOR *pCompositor, PVBOXVR_COMPOSITOR_CONST_ITERATOR pIter) 306 { 307 pIter->pCompositor = pCompositor; 308 pIter->pNextEntry = pCompositor->List.pNext; 309 } 310 298 311 #define VBOXVR_COMPOSITOR_ENTRY_FROM_NODE(_p) ((PVBOXVR_COMPOSITOR_ENTRY)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVR_COMPOSITOR_ENTRY, Node))) 312 #define VBOXVR_COMPOSITOR_CONST_ENTRY_FROM_NODE(_p) ((const VBOXVR_COMPOSITOR_ENTRY*)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVR_COMPOSITOR_ENTRY, Node))) 299 313 300 314 DECLINLINE(PVBOXVR_COMPOSITOR_ENTRY) VBoxVrCompositorIterNext(PVBOXVR_COMPOSITOR_ITERATOR pIter) … … 310 324 } 311 325 312 /* Compositor with Stretching & Cached Rectangles info */ 326 DECLINLINE(const VBOXVR_COMPOSITOR_ENTRY*) VBoxVrCompositorConstIterNext(PVBOXVR_COMPOSITOR_CONST_ITERATOR pIter) 327 { 328 const RTLISTNODE *pNextEntry = pIter->pNextEntry; 329 if (pNextEntry != &pIter->pCompositor->List) 330 { 331 const VBOXVR_COMPOSITOR_ENTRY *pEntry = VBOXVR_COMPOSITOR_CONST_ENTRY_FROM_NODE(pNextEntry); 332 pIter->pNextEntry = pNextEntry->pNext; 333 return pEntry; 334 } 335 return NULL; 336 } 313 337 314 338 typedef struct VBOXVR_TEXTURE … … 320 344 } VBOXVR_TEXTURE, *PVBOXVR_TEXTURE; 321 345 322 struct VBOXVR_SCR_COMPOSITOR_ENTRY;323 struct VBOXVR_SCR_COMPOSITOR;324 325 typedef DECLCALLBACK(void) FNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED(const struct VBOXVR_SCR_COMPOSITOR *pCompositor, struct VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry, struct VBOXVR_SCR_COMPOSITOR_ENTRY *pReplacingEntry);326 typedef FNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED *PFNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED;327 328 329 typedef struct VBOXVR_SCR_COMPOSITOR_ENTRY330 {331 VBOXVR_COMPOSITOR_ENTRY Ce;332 VBOXVR_TEXTURE Tex;333 RTPOINT Pos;334 uint32_t fChanged;335 uint32_t fFlags;336 uint32_t cRects;337 PRTRECT paSrcRects;338 PRTRECT paDstRects;339 PRTRECT paDstUnstretchedRects;340 PFNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED pfnEntryReleased;341 } VBOXVR_SCR_COMPOSITOR_ENTRY, *PVBOXVR_SCR_COMPOSITOR_ENTRY;342 343 typedef struct VBOXVR_SCR_COMPOSITOR344 {345 VBOXVR_COMPOSITOR Compositor;346 #ifndef IN_RING0347 float StretchX;348 float StretchY;349 #endif350 uint32_t fFlags;351 uint32_t cRects;352 uint32_t cRectsBuffer;353 PRTRECT paSrcRects;354 PRTRECT paDstRects;355 PRTRECT paDstUnstretchedRects;356 } VBOXVR_SCR_COMPOSITOR, *PVBOXVR_SCR_COMPOSITOR;357 358 359 typedef DECLCALLBACK(bool) FNVBOXVRSCRCOMPOSITOR_VISITOR(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, void *pvVisitor);360 typedef FNVBOXVRSCRCOMPOSITOR_VISITOR *PFNVBOXVRSCRCOMPOSITOR_VISITOR;361 362 DECLINLINE(void) CrVrScrCompositorEntryInit(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const VBOXVR_TEXTURE *pTex, PFNVBOXVRSCRCOMPOSITOR_ENTRY_RELEASED pfnEntryReleased)363 {364 VBoxVrCompositorEntryInit(&pEntry->Ce);365 pEntry->Tex = *pTex;366 memset(&pEntry->Pos, 0, sizeof (VBOXVR_SCR_COMPOSITOR_ENTRY) - RT_OFFSETOF(VBOXVR_SCR_COMPOSITOR_ENTRY, Pos));367 pEntry->pfnEntryReleased = pfnEntryReleased;368 }369 370 DECLINLINE(bool) CrVrScrCompositorEntryIsUsed(const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry)371 {372 return VBoxVrCompositorEntryIsInList(&pEntry->Ce);373 }374 375 DECLINLINE(void) CrVrScrCompositorEntrySetChanged(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, bool fChanged)376 {377 pEntry->fChanged = !!fChanged;378 }379 380 DECLINLINE(void) CrVrScrCompositorEntryTexNameUpdate(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t hwid)381 {382 pEntry->Tex.hwid = hwid;383 CrVrScrCompositorEntrySetChanged(pEntry, true);384 }385 386 DECLINLINE(const VBOXVR_TEXTURE *) CrVrScrCompositorEntryTexGet(const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry)387 {388 return &pEntry->Tex;389 }390 391 DECLINLINE(bool) CrVrScrCompositorEntryIsChanged(const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry)392 {393 return !!pEntry->fChanged;394 }395 396 DECLINLINE(bool) CrVrScrCompositorIsEmpty(const VBOXVR_SCR_COMPOSITOR *pCompositor)397 {398 return VBoxVrCompositorIsEmpty(&pCompositor->Compositor);399 }400 401 VBOXVREGDECL(int) CrVrScrCompositorEntryTexUpdate(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const VBOXVR_TEXTURE *pTex);402 VBOXVREGDECL(void) CrVrScrCompositorVisit(PVBOXVR_SCR_COMPOSITOR pCompositor, PFNVBOXVRSCRCOMPOSITOR_VISITOR pfnVisitor, void *pvVisitor);403 VBOXVREGDECL(void) CrVrScrCompositorEntrySetAllChanged(PVBOXVR_SCR_COMPOSITOR pCompositor, bool fChanged);404 DECLINLINE(bool) CrVrScrCompositorEntryIsInList(const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry)405 {406 return VBoxVrCompositorEntryIsInList(&pEntry->Ce);407 }408 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsAdd(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions, bool fPosRelated, VBOXVR_SCR_COMPOSITOR_ENTRY **ppReplacedScrEntry, uint32_t *pfChangeFlags);409 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions, bool fPosRelated, bool *pfChanged);410 VBOXVREGDECL(int) CrVrScrCompositorEntryListIntersect(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const VBOXVR_LIST *pList2, bool *pfChanged);411 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsIntersect(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged);412 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsIntersectAll(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged);413 VBOXVREGDECL(int) CrVrScrCompositorEntryListIntersectAll(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pList2, bool *pfChanged);414 VBOXVREGDECL(int) CrVrScrCompositorEntryPosSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos);415 DECLINLINE(const RTPOINT*) CrVrScrCompositorEntryPosGet(const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry)416 {417 return &pEntry->Pos;418 }419 420 /* regions are valid until the next CrVrScrCompositor call */421 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects);422 VBOXVREGDECL(int) CrVrScrCompositorEntryRemove(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry);423 VBOXVREGDECL(bool) CrVrScrCompositorEntryReplace(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, PVBOXVR_SCR_COMPOSITOR_ENTRY pNewEntry);424 VBOXVREGDECL(void) CrVrScrCompositorEntryFlagsSet(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t fFlags);425 VBOXVREGDECL(uint32_t) CrVrScrCompositorEntryFlagsCombinedGet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry);426 DECLINLINE(uint32_t) CrVrScrCompositorEntryFlagsGet(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)427 {428 return pEntry->fFlags;429 }430 431 VBOXVREGDECL(void) CrVrScrCompositorInit(PVBOXVR_SCR_COMPOSITOR pCompositor);432 VBOXVREGDECL(void) CrVrScrCompositorClear(PVBOXVR_SCR_COMPOSITOR pCompositor);433 VBOXVREGDECL(void) CrVrScrCompositorRegionsClear(PVBOXVR_SCR_COMPOSITOR pCompositor, bool *pfChanged);434 435 typedef DECLCALLBACK(VBOXVR_SCR_COMPOSITOR_ENTRY*) FNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR(VBOXVR_SCR_COMPOSITOR_ENTRY*pEntry, void *pvContext);436 typedef FNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR *PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR;437 438 VBOXVREGDECL(int) CrVrScrCompositorClone(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor);439 VBOXVREGDECL(int) CrVrScrCompositorIntersectList(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pVr, bool *pfChanged);440 VBOXVREGDECL(int) CrVrScrCompositorIntersectedList(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pVr, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor, bool *pfChanged);441 #ifndef IN_RING0442 VBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY);443 DECLINLINE(void) CrVrScrCompositorGetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float *pStretchX, float *pStretchY)444 {445 if (pStretchX)446 *pStretchX = pCompositor->StretchX;447 448 if (pStretchY)449 *pStretchY = pCompositor->StretchY;450 }451 #endif452 /* regions are valid until the next CrVrScrCompositor call */453 VBOXVREGDECL(int) CrVrScrCompositorRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects);454 455 #define VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(_p) ((PVBOXVR_SCR_COMPOSITOR_ENTRY)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVR_SCR_COMPOSITOR_ENTRY, Ce)))456 #define VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(_p) ((PVBOXVR_SCR_COMPOSITOR)(((uint8_t*)(_p)) - RT_OFFSETOF(VBOXVR_SCR_COMPOSITOR, Compositor)))457 458 typedef struct VBOXVR_SCR_COMPOSITOR_ITERATOR459 {460 VBOXVR_COMPOSITOR_ITERATOR Base;461 } VBOXVR_SCR_COMPOSITOR_ITERATOR ,*PVBOXVR_SCR_COMPOSITOR_ITERATOR;462 463 DECLINLINE(void) CrVrScrCompositorIterInit(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ITERATOR pIter)464 {465 VBoxVrCompositorIterInit(&pCompositor->Compositor, &pIter->Base);466 }467 468 DECLINLINE(PVBOXVR_SCR_COMPOSITOR_ENTRY) CrVrScrCompositorIterNext(PVBOXVR_SCR_COMPOSITOR_ITERATOR pIter)469 {470 PVBOXVR_COMPOSITOR_ENTRY pCe = VBoxVrCompositorIterNext(&pIter->Base);471 if (pCe)472 {473 return VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pCe);474 }475 return NULL;476 }477 478 346 RT_C_DECLS_END 479 347 -
trunk/src/VBox/GuestHost/OpenGL/state_tracker/dump.cpp
r50041 r50095 337 337 } 338 338 339 void crRecDumpBuffer(CR_RECORDER *pRec, CRContext *ctx, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin,GLint idRedirFBO, VBOXVR_TEXTURE *pRedirTex)339 void crRecDumpBuffer(CR_RECORDER *pRec, CRContext *ctx, GLint idRedirFBO, VBOXVR_TEXTURE *pRedirTex) 340 340 { 341 341 GLenum texTarget = 0; … … 412 412 pTl = &pTobj->level[0][hwTexLevel]; 413 413 414 rc = CrBltEnter(pRec->pBlitter , pCurCtx, pCurWin);414 rc = CrBltEnter(pRec->pBlitter); 415 415 if (!RT_SUCCESS(rc)) 416 416 { … … 447 447 height = pRedirTex->height; 448 448 449 rc = CrBltEnter(pRec->pBlitter , pCurCtx, pCurWin);449 rc = CrBltEnter(pRec->pBlitter); 450 450 if (!RT_SUCCESS(rc)) 451 451 { … … 1338 1338 } 1339 1339 1340 void crRecDumpTextureV(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin,const char *pszStr, va_list pArgList)1340 void crRecDumpTextureV(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, const char *pszStr, va_list pArgList) 1341 1341 { 1342 1342 CR_BLITTER_IMG Img = {0}; 1343 int rc = CrBltEnter(pRec->pBlitter , pCurCtx, pCurWin);1343 int rc = CrBltEnter(pRec->pBlitter); 1344 1344 if (RT_SUCCESS(rc)) 1345 1345 { … … 1376 1376 } 1377 1377 1378 void crRecDumpTextureF(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin,const char *pszStr, ...)1378 void crRecDumpTextureF(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, const char *pszStr, ...) 1379 1379 { 1380 1380 va_list pArgList; 1381 1381 va_start(pArgList, pszStr); 1382 crRecDumpTextureV(pRec, pTex, p CurCtx, pCurWin, pszStr, pArgList);1382 crRecDumpTextureV(pRec, pTex, pszStr, pArgList); 1383 1383 va_end(pArgList); 1384 1384 } 1385 1385 1386 void crRecDumpTextureByIdV(CR_RECORDER *pRec, CRContext *ctx, GLint id, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin,const char *pszStr, va_list pArgList)1386 void crRecDumpTextureByIdV(CR_RECORDER *pRec, CRContext *ctx, GLint id, const char *pszStr, va_list pArgList) 1387 1387 { 1388 1388 CRTextureObj *pTobj = (CRTextureObj *)crHashtableSearch(ctx->shared->textureTable, id); … … 1406 1406 } 1407 1407 1408 crRecDumpTextureV(pRec, &Tex, p CurCtx, pCurWin, pszStr, pArgList);1409 } 1410 1411 void crRecDumpTextureByIdF(CR_RECORDER *pRec, CRContext *ctx, GLint id, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin,const char *pszStr, ...)1408 crRecDumpTextureV(pRec, &Tex, pszStr, pArgList); 1409 } 1410 1411 void crRecDumpTextureByIdF(CR_RECORDER *pRec, CRContext *ctx, GLint id, const char *pszStr, ...) 1412 1412 { 1413 1413 va_list pArgList; 1414 1414 va_start(pArgList, pszStr); 1415 crRecDumpTextureByIdV(pRec, ctx, id, p CurCtx, pCurWin, pszStr, pArgList);1415 crRecDumpTextureByIdV(pRec, ctx, id, pszStr, pArgList); 1416 1416 va_end(pArgList); 1417 1417 } 1418 1418 1419 void crRecDumpTextures(CR_RECORDER *pRec, CRContext *ctx , CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin)1419 void crRecDumpTextures(CR_RECORDER *pRec, CRContext *ctx) 1420 1420 { 1421 1421 GLint maxUnits = 0; … … 1510 1510 } 1511 1511 1512 crRecDumpTextureF(pRec, &Tex, pCurCtx, pCurWin,"ctx(%d), Unit %d: TEXTURE_2D id(%d) hwid(%d), width(%d), height(%d)", ctx, i, pTobj->id, pTobj->hwid, width, height);1512 crRecDumpTextureF(pRec, &Tex, "ctx(%d), Unit %d: TEXTURE_2D id(%d) hwid(%d), width(%d), height(%d)", ctx, i, pTobj->id, pTobj->hwid, width, height); 1513 1513 } 1514 1514 // else … … 1558 1558 Tex.hwid = hwTex; 1559 1559 1560 rc = CrBltEnter(pRec->pBlitter , pCurCtx, pCurWin);1560 rc = CrBltEnter(pRec->pBlitter); 1561 1561 if (RT_SUCCESS(rc)) 1562 1562 { -
trunk/src/VBox/GuestHost/OpenGL/util/blitter.cpp
r48366 r50095 42 42 * Also note that blitter caches the current window info, and assumes the current context's values are preserved 43 43 * wrt that window before the calls, so if one uses different contexts for one blitter, 44 * the blitter current window values must be explicitly reset by doing CrBltMuralSetCurrent (pBlitter, NULL)44 * the blitter current window values must be explicitly reset by doing CrBltMuralSetCurrentInfo(pBlitter, NULL) 45 45 * @param fForceDrawBlt - if true - forces the blitter to always use glDrawXxx-based blits even if GL_EXT_framebuffer_blit. 46 46 * This is needed because BlitFramebufferEXT is known to be often buggy, and glDrawXxx-based blits appear to be more reliable … … 94 94 } 95 95 96 VBOXBLITTERDECL(int) CrBltCleanup(PCR_BLITTER pBlitter , const CR_BLITTER_CONTEXT *pRestoreCtxInfo, const CR_BLITTER_WINDOW *pRestoreMural)96 VBOXBLITTERDECL(int) CrBltCleanup(PCR_BLITTER pBlitter) 97 97 { 98 98 if (CrBltIsEntered(pBlitter)) … … 105 105 return VINF_SUCCESS; 106 106 107 int rc = CrBltEnter(pBlitter , pRestoreCtxInfo, pRestoreMural);107 int rc = CrBltEnter(pBlitter); 108 108 if (!RT_SUCCESS(rc)) 109 109 { … … 126 126 } 127 127 128 int CrBltMuralSetCurrent (PCR_BLITTER pBlitter, const CR_BLITTER_WINDOW *pMural)128 int CrBltMuralSetCurrentInfo(PCR_BLITTER pBlitter, const CR_BLITTER_WINDOW *pMural) 129 129 { 130 130 if (pMural) … … 520 520 crWarning("GL_EXT_framebuffer_object not supported, blitter can only blit to window"); 521 521 522 if (crStrstr(pszExtension, "GL_ARB_pixel_buffer_object")) 523 pBlitter->Flags.SupportsPBO = 1; 524 else 525 crWarning("GL_ARB_pixel_buffer_object not supported"); 526 522 527 /* BlitFramebuffer seems to be buggy on Intel, 523 528 * try always glDrawXxx for now */ … … 559 564 560 565 if (pBlitter->CtxInfo.Base.id) 561 { 562 if (pBlitter->pRestoreCtxInfo != &pBlitter->CtxInfo) 563 { 564 pBlitter->pDispatch->MakeCurrent(pBlitter->pRestoreMural->Base.id, 0, pBlitter->pRestoreCtxInfo->Base.id); 565 } 566 else 567 { 568 pBlitter->pDispatch->MakeCurrent(0, 0, 0); 569 } 570 } 571 572 pBlitter->pRestoreCtxInfo = NULL; 573 } 574 575 int CrBltEnter(PCR_BLITTER pBlitter, const CR_BLITTER_CONTEXT *pRestoreCtxInfo, const CR_BLITTER_WINDOW *pRestoreMural) 566 pBlitter->pDispatch->MakeCurrent(0, 0, 0); 567 568 pBlitter->Flags.Entered = 0; 569 } 570 571 int CrBltEnter(PCR_BLITTER pBlitter) 576 572 { 577 573 if (!pBlitter->CurrentMural.Base.id && pBlitter->CtxInfo.Base.id) … … 589 585 if (pBlitter->CurrentMural.Base.id) /* <- pBlitter->CurrentMural.Base.id can be null if the blitter is in a "no-context" mode (see comments to BltInit for detail)*/ 590 586 { 591 if (pRestoreCtxInfo)592 pBlitter->pDispatch->Flush();593 587 pBlitter->pDispatch->MakeCurrent(pBlitter->CurrentMural.Base.id, pBlitter->i32MakeCurrentUserData, pBlitter->CtxInfo.Base.id); 594 588 } 595 else 596 { 597 if (pRestoreCtxInfo) 598 { 599 crWarning("pRestoreCtxInfo is not NULL for \"no-context\" blitter"); 600 pRestoreCtxInfo = NULL; 601 } 602 } 603 604 if (pRestoreCtxInfo) 605 { 606 pBlitter->pRestoreCtxInfo = pRestoreCtxInfo; 607 pBlitter->pRestoreMural = pRestoreMural; 608 } 609 else 610 { 611 pBlitter->pRestoreCtxInfo = &pBlitter->CtxInfo; 612 } 589 590 pBlitter->Flags.Entered = 1; 613 591 614 592 if (pBlitter->Flags.Initialized) … … 718 696 } 719 697 720 static int crBltImg CreateForTex(const VBOXVR_TEXTURE *pSrc, CR_BLITTER_IMG *pDst, GLenum enmFormat)698 static int crBltImgInitBaseForTex(const VBOXVR_TEXTURE *pSrc, CR_BLITTER_IMG *pDst, GLenum enmFormat) 721 699 { 722 700 memset(pDst, 0, sizeof (*pDst)); … … 732 710 uint32_t pitch = ((bpp * pSrc->width) + 7) >> 3; 733 711 uint32_t cbData = pitch * pSrc->height; 734 pDst->pvData = RTMemAllocZ(cbData);735 if (!pDst->pvData)736 {737 crWarning("RTMemAlloc failed");738 return VERR_NO_MEMORY;739 }740 741 #ifdef DEBUG_misha742 {743 char *pTmp = (char*)pDst->pvData;744 for (uint32_t i = 0; i < cbData; ++i)745 {746 pTmp[i] = (char)((1 << i) % 255);747 }748 }749 #endif750 751 712 pDst->cbData = cbData; 752 713 pDst->enmFormat = enmFormat; … … 755 716 pDst->bpp = bpp; 756 717 pDst->pitch = pitch; 718 return VINF_SUCCESS; 719 } 720 721 static int crBltImgCreateForTex(const VBOXVR_TEXTURE *pSrc, CR_BLITTER_IMG *pDst, GLenum enmFormat) 722 { 723 int rc = crBltImgInitBaseForTex(pSrc, pDst, enmFormat); 724 if (!RT_SUCCESS(rc)) 725 { 726 crWarning("crBltImgInitBaseForTex failed rc %d", rc); 727 return rc; 728 } 729 730 uint32_t cbData = pDst->cbData; 731 pDst->pvData = RTMemAllocZ(cbData); 732 if (!pDst->pvData) 733 { 734 crWarning("RTMemAlloc failed"); 735 return VERR_NO_MEMORY; 736 } 737 738 #ifdef DEBUG_misha 739 { 740 char *pTmp = (char*)pDst->pvData; 741 for (uint32_t i = 0; i < cbData; ++i) 742 { 743 pTmp[i] = (char)((1 << i) % 255); 744 } 745 } 746 #endif 757 747 return VINF_SUCCESS; 758 748 } … … 1134 1124 memset(pCache, 0, sizeof (*pCache)); 1135 1125 } 1126 1127 1128 /*TdBlt*/ 1129 1130 static void crTdBltCheckPBO(PCR_TEXDATA pTex) 1131 { 1132 if (pTex->idPBO) 1133 return; 1134 1135 PCR_BLITTER pBlitter = pTex->pBlitter; 1136 1137 if (!pBlitter->Flags.SupportsPBO) 1138 return; 1139 1140 pBlitter->pDispatch->GenBuffersARB(1, &pTex->idPBO); 1141 if (!pTex->idPBO) 1142 { 1143 crWarning("PBO create failed"); 1144 return; 1145 } 1146 1147 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pTex->idPBO); 1148 pBlitter->pDispatch->BufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, 1149 pTex->Tex.width*pTex->Tex.height*4, 1150 0, GL_STREAM_READ_ARB); 1151 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); 1152 } 1153 1154 static uint32_t crTdBltTexCreate(PCR_TEXDATA pTex) 1155 { 1156 PCR_BLITTER pBlitter = pTex->pBlitter; 1157 uint32_t tex = 0; 1158 pBlitter->pDispatch->GenTextures(1, &tex); 1159 if (!tex) 1160 { 1161 crWarning("Tex create failed"); 1162 return 0; 1163 } 1164 1165 pBlitter->pDispatch->BindTexture(GL_TEXTURE_2D, tex); 1166 pBlitter->pDispatch->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1167 pBlitter->pDispatch->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1168 pBlitter->pDispatch->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 1169 pBlitter->pDispatch->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 1170 pBlitter->pDispatch->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1171 pTex->Tex.width, 1172 pTex->Tex.height, 1173 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); 1174 1175 1176 /*Restore gl state*/ 1177 pBlitter->pDispatch->BindTexture(GL_TEXTURE_2D, 0); 1178 1179 return tex; 1180 } 1181 1182 int crTdBltCheckInvertTex(PCR_TEXDATA pTex) 1183 { 1184 if (pTex->idInvertTex) 1185 return VINF_SUCCESS; 1186 1187 pTex->idInvertTex = crTdBltTexCreate(pTex); 1188 if (!pTex->idInvertTex) 1189 { 1190 crWarning("Invert Tex create failed"); 1191 return VERR_GENERAL_FAILURE; 1192 } 1193 return VINF_SUCCESS; 1194 } 1195 1196 void crTdBltImgFree(PCR_TEXDATA pTex) 1197 { 1198 if (!pTex->Img.pvData) 1199 return; 1200 1201 PCR_BLITTER pBlitter = pTex->pBlitter; 1202 1203 if (pTex->idPBO) 1204 { 1205 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pTex->idPBO); 1206 pBlitter->pDispatch->UnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB); 1207 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); 1208 } 1209 else 1210 RTMemFree(pTex->Img.pvData); 1211 1212 pTex->Img.pvData = NULL; 1213 } 1214 1215 int crTdBltImgAcquire(PCR_TEXDATA pTex, GLenum enmFormat, bool fInverted) 1216 { 1217 int rc = crBltImgInitBaseForTex(&pTex->Tex, &pTex->Img, enmFormat); 1218 if (!RT_SUCCESS(rc)) 1219 { 1220 crWarning("crBltImgInitBaseForTex failed rc %d", rc); 1221 return rc; 1222 } 1223 1224 PCR_BLITTER pBlitter = pTex->pBlitter; 1225 void *pvData = NULL; 1226 pBlitter->pDispatch->BindTexture(pTex->Tex.target, fInverted ? pTex->idInvertTex : pTex->Tex.hwid); 1227 1228 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pTex->idPBO); 1229 1230 if (!pTex->idPBO) 1231 { 1232 pvData = RTMemAlloc(4*pTex->Tex.width*pTex->Tex.height); 1233 if (!pvData) 1234 { 1235 crWarning("Out of memory in crTdBltImgAcquire"); 1236 return VERR_NO_MEMORY; 1237 } 1238 } 1239 1240 /*read the texture, note pixels are NULL for PBO case as it's offset in the buffer*/ 1241 pBlitter->pDispatch->GetTexImage(GL_TEXTURE_2D, 0, enmFormat, GL_UNSIGNED_BYTE, pvData); 1242 1243 /*restore gl state*/ 1244 pBlitter->pDispatch->BindTexture(pTex->Tex.target, 0); 1245 1246 if (pTex->idPBO) 1247 { 1248 pvData = pBlitter->pDispatch->MapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY); 1249 if (!pvData) 1250 { 1251 crWarning("Failed to MapBuffer in CrHlpGetTexImage"); 1252 return VERR_GENERAL_FAILURE; 1253 } 1254 1255 pBlitter->pDispatch->BindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0); 1256 } 1257 1258 CRASSERT(pvData); 1259 pTex->Img.pvData = pvData; 1260 pTex->Flags.DataInverted = fInverted; 1261 return VINF_SUCCESS; 1262 } 1263 1264 /* release the texture data, the data remains cached in the CR_TEXDATA object until it is discarded with CrTdBltDataDiscard or CrTdBltDataCleanup */ 1265 VBOXBLITTERDECL(void) CrTdBltDataRelease(PCR_TEXDATA pTex) 1266 { 1267 Assert(pTex->Img.pvData); 1268 } 1269 1270 /* discard the texture data cached with previous CrTdBltDataAcquire. 1271 * Must be called wit data released (CrTdBltDataRelease) */ 1272 VBOXBLITTERDECL(void) CrTdBltDataDiscard(PCR_TEXDATA pTex) 1273 { 1274 crTdBltImgFree(pTex); 1275 } 1276 /* does same as CrTdBltDataDiscard, and in addition cleans up */ 1277 VBOXBLITTERDECL(void) CrTdBltDataCleanup(PCR_TEXDATA pTex) 1278 { 1279 crTdBltImgFree(pTex); 1280 1281 PCR_BLITTER pBlitter = pTex->pBlitter; 1282 1283 if (pTex->idPBO) 1284 { 1285 pBlitter->pDispatch->DeleteBuffersARB(1, &pTex->idPBO); 1286 pTex->idPBO = 0; 1287 } 1288 1289 if (pTex->idInvertTex) 1290 { 1291 pBlitter->pDispatch->DeleteTextures(1, &pTex->idInvertTex); 1292 pTex->idInvertTex = 0; 1293 } 1294 } 1295 1296 /* acquire the texture data, returns the cached data in case it is cached. 1297 * the data remains cached in the CR_TEXDATA object until it is discarded with CrTdBltDataDiscard or CrTdBltDataCleanup. 1298 * */ 1299 VBOXBLITTERDECL(int) CrTdBltDataAcquire(PCR_TEXDATA pTex, GLenum enmFormat, bool fInverted, const CR_BLITTER_IMG**ppImg) 1300 { 1301 if (pTex->Img.pvData && pTex->Img.enmFormat == enmFormat && !pTex->Flags.DataInverted == !fInverted) 1302 { 1303 *ppImg = &pTex->Img; 1304 return VINF_SUCCESS; 1305 } 1306 1307 crTdBltImgFree(pTex); 1308 1309 crTdBltCheckPBO(pTex); 1310 1311 int rc; 1312 1313 if (fInverted) 1314 { 1315 rc = crTdBltCheckInvertTex(pTex); 1316 if (!RT_SUCCESS(rc)) 1317 { 1318 crWarning("crTdBltCheckInvertTex failed rc %d", rc); 1319 return rc; 1320 } 1321 1322 RTRECT SrcRect, DstRect; 1323 VBOXVR_TEXTURE InvertTex; 1324 1325 InvertTex = pTex->Tex; 1326 InvertTex.hwid = pTex->idInvertTex; 1327 1328 SrcRect.xLeft = 0; 1329 SrcRect.yTop = InvertTex.height; 1330 SrcRect.xRight = InvertTex.width; 1331 SrcRect.yBottom = 0; 1332 1333 DstRect.xLeft = 0; 1334 DstRect.yTop = 0; 1335 DstRect.xRight = InvertTex.width; 1336 DstRect.yBottom = InvertTex.height; 1337 1338 CrBltBlitTexTex(pTex->pBlitter, &pTex->Tex, &SrcRect, &InvertTex, &DstRect, 1, 0); 1339 } 1340 1341 rc = crTdBltImgAcquire(pTex, enmFormat, fInverted); 1342 if (!RT_SUCCESS(rc)) 1343 { 1344 crWarning("crTdBltImgAcquire failed rc %d", rc); 1345 return rc; 1346 } 1347 1348 *ppImg = &pTex->Img; 1349 1350 return VINF_SUCCESS; 1351 } -
trunk/src/VBox/GuestHost/OpenGL/util/compositor.cpp
r49773 r50095 20 20 #define VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED UINT32_MAX 21 21 22 22 23 static int crVrScrCompositorRectsAssignBuffer(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t cRects) 23 24 { … … 119 120 AssertRC(rc); 120 121 121 if (!pEntry-> Pos.x && !pEntry->Pos.y)122 if (!pEntry->Rect.xLeft && !pEntry->Rect.yTop) 122 123 { 123 124 memcpy(pEntry->paSrcRects, pEntry->paDstUnstretchedRects, cRects * sizeof (*pEntry->paSrcRects)); … … 127 128 for (uint32_t i = 0; i < cRects; ++i) 128 129 { 129 pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstUnstretchedRects[i].xLeft - pEntry-> Pos.x));130 pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstUnstretchedRects[i].yTop - pEntry-> Pos.y));131 pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstUnstretchedRects[i].xRight - pEntry-> Pos.x));132 pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstUnstretchedRects[i].yBottom - pEntry-> Pos.y));130 pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstUnstretchedRects[i].xLeft - pEntry->Rect.xLeft)); 131 pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstUnstretchedRects[i].yTop - pEntry->Rect.yTop)); 132 pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstUnstretchedRects[i].xRight - pEntry->Rect.xLeft)); 133 pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstUnstretchedRects[i].yBottom - pEntry->Rect.yTop)); 133 134 } 134 135 } … … 200 201 } 201 202 202 static int crVrScrCompositorRectsCheckInit(PVBOXVR_SCR_COMPOSITOR pCompositor) 203 { 203 static int crVrScrCompositorRectsCheckInit(const VBOXVR_SCR_COMPOSITOR *pcCompositor) 204 { 205 VBOXVR_SCR_COMPOSITOR *pCompositor = const_cast<VBOXVR_SCR_COMPOSITOR*>(pcCompositor); 206 204 207 if (pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED) 205 208 return VINF_SUCCESS; … … 248 251 else if (fChangedFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED) 249 252 { 250 Assert(!CrVrScrCompositorEntryIsInList(pReplacedScrEntry)); 251 Assert(CrVrScrCompositorEntryIsInList(pEntry)); 252 pEntry->cRects = pReplacedScrEntry->cRects; 253 pEntry->paSrcRects = pReplacedScrEntry->paSrcRects; 254 pEntry->paDstRects = pReplacedScrEntry->paDstRects; 255 pEntry->paDstUnstretchedRects = pReplacedScrEntry->paDstUnstretchedRects; 253 Assert(pReplacedScrEntry); 256 254 } 257 255 … … 321 319 } 322 320 323 pEntry->Pos = *pPos;321 VBoxRectMove(&pEntry->Rect, pPos->x, pPos->y); 324 322 CrVrScrCompositorEntrySetChanged(pEntry, true); 325 323 … … 335 333 Rect.xLeft = RT_MAX(pCompositor->Rect.xLeft, pEntry->Rect.xLeft); 336 334 Rect.yTop = RT_MAX(pCompositor->Rect.yTop, pEntry->Rect.yTop); 337 Rect.xRight = RT_MIN(pCompositor->Rect.xRight, pEntry->Rect.x Left + pEntry->Rect.xRight);338 Rect.yBottom = RT_MIN(pCompositor->Rect.yBottom, pEntry->Rect.y Top + pEntry->Rect.yBottom);335 Rect.xRight = RT_MIN(pCompositor->Rect.xRight, pEntry->Rect.xRight); 336 Rect.yBottom = RT_MIN(pCompositor->Rect.yBottom, pEntry->Rect.yBottom); 339 337 bool fChanged = false; 340 338 … … 375 373 } 376 374 377 if (cRegions && (pEntry-> Pos.x || pEntry->Pos.y))375 if (cRegions && (pEntry->Rect.xLeft || pEntry->Rect.yTop)) 378 376 { 379 377 paTranslatedRects = (RTRECT*)RTMemAlloc(sizeof (RTRECT) * cRegions); … … 386 384 for (uint32_t i = 0; i < cRegions; ++i) 387 385 { 388 VBoxRectTranslate(&paTranslatedRects[i], pEntry-> Pos.x, pEntry->Pos.y);386 VBoxRectTranslate(&paTranslatedRects[i], pEntry->Rect.xLeft, pEntry->Rect.yTop); 389 387 paRegions = paTranslatedRects; 390 388 } … … 440 438 } 441 439 442 VBOXVREGDECL(int) CrVrScrCompositorEntryResize(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTRECT *pRect) 443 { 440 VBOXVREGDECL(int) CrVrScrCompositorEntryRectSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTRECT *pRect) 441 { 442 if (!memcmp(&pEntry->Rect, pRect, sizeof (*pRect))) 443 { 444 return VINF_SUCCESS; 445 } 444 446 RTPOINT Point = {pRect->xLeft, pRect->yTop}; 445 447 bool fChanged = false; … … 469 471 { 470 472 if (pEntry->pTex == pTex) 471 return VINF )SUCCESS;473 return VINF_SUCCESS; 472 474 473 475 if (pEntry->pTex) … … 476 478 CrTdAddRef(pTex); 477 479 pEntry->pTex = pTex; 478 return VINF )SUCCESS;480 return VINF_SUCCESS; 479 481 } 480 482 … … 510 512 } 511 513 512 if (cRegions && (pEntry-> Pos.x || pEntry->Pos.y))514 if (cRegions && (pEntry->Rect.xLeft || pEntry->Rect.yTop)) 513 515 { 514 516 paTranslatedRects = (RTRECT*)RTMemAlloc(sizeof (RTRECT) * cRegions); … … 521 523 for (uint32_t i = 0; i < cRegions; ++i) 522 524 { 523 VBoxRectTranslate(&paTranslatedRects[i], pEntry-> Pos.x, pEntry->Pos.y);525 VBoxRectTranslate(&paTranslatedRects[i], pEntry->Rect.xLeft, pEntry->Rect.yTop); 524 526 paRegions = paTranslatedRects; 525 527 } … … 583 585 584 586 if (fChanged) 585 {586 CrVrScrCompositorEntrySetChanged(pEntry, true);587 587 crVrScrCompositorRectsInvalidate(pCompositor); 588 }589 588 590 589 if (pfChanged) … … 672 671 673 672 /* regions are valid until the next CrVrScrCompositor call */ 674 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsGet( PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRYpEntry, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects)673 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsGet(const VBOXVR_SCR_COMPOSITOR *pCompositor, const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects) 675 674 { 676 675 if (CrVrScrCompositorEntryIsUsed(pEntry)) … … 697 696 } 698 697 699 VBOXVREGDECL(uint32_t) CrVrScrCompositorEntryFlagsCombinedGet( PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRYpEntry)698 VBOXVREGDECL(uint32_t) CrVrScrCompositorEntryFlagsCombinedGet(const VBOXVR_SCR_COMPOSITOR *pCompositor, const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry) 700 699 { 701 700 return CRBLT_FOP_COMBINE(pCompositor->fFlags, pEntry->fFlags); … … 757 756 { 758 757 PVBOXVR_SCR_COMPOSITOR_ENTRY pCEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pEntry); 758 759 759 CrVrScrCompositorEntrySetChanged(pCEntry, true); 760 761 Assert(!CrVrScrCompositorEntryIsInList(pCEntry)); 762 763 if (pReplacingEntry) 764 { 765 PVBOXVR_SCR_COMPOSITOR_ENTRY pCReplacingEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pReplacingEntry); 766 Assert(CrVrScrCompositorEntryIsInList(pCReplacingEntry)); 767 pCReplacingEntry->cRects = pCEntry->cRects; 768 pCReplacingEntry->paSrcRects = pCEntry->paSrcRects; 769 pCReplacingEntry->paDstRects = pCEntry->paDstRects; 770 pCReplacingEntry->paDstUnstretchedRects = pCEntry->paDstUnstretchedRects; 771 } 760 772 761 773 if (pCEntry->pfnEntryReleased) … … 769 781 VBOXVREGDECL(int) CrVrScrCompositorRectSet(PVBOXVR_SCR_COMPOSITOR pCompositor, const RTRECT *pRect, bool *pfChanged) 770 782 { 771 if (!memcmp(&pCompositor->Rect, pRect, sizeof (pCompositor->Rect)) 783 if (!memcmp(&pCompositor->Rect, pRect, sizeof (pCompositor->Rect))) 772 784 { 773 785 if (pfChanged) 774 *pfChanged = false 786 *pfChanged = false; 775 787 return VINF_SUCCESS; 776 788 } … … 799 811 VBoxVrCompositorInit(&pCompositor->Compositor, crVrScrCompositorEntryReleasedCB); 800 812 pCompositor->fFlags = CRBLT_F_LINEAR | CRBLT_F_INVERT_YCOORDS; 801 pCompositor->Rect = *pRect; 813 if (pRect) 814 pCompositor->Rect = *pRect; 802 815 #ifndef IN_RING0 803 816 pCompositor->StretchX = 1.0; … … 863 876 864 877 /* regions are valid until the next CrVrScrCompositor call */ 865 VBOXVREGDECL(int) CrVrScrCompositorRegionsGet( PVBOXVR_SCR_COMPOSITORpCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects)878 VBOXVREGDECL(int) CrVrScrCompositorRegionsGet(const VBOXVR_SCR_COMPOSITOR *pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects) 866 879 { 867 880 int rc = crVrScrCompositorRectsCheckInit(pCompositor); … … 907 920 } 908 921 909 VBOXVREGDECL(int) CrVrScrCompositorClone( PVBOXVR_SCR_COMPOSITORpCompositor, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor)922 VBOXVREGDECL(int) CrVrScrCompositorClone(const VBOXVR_SCR_COMPOSITOR *pCompositor, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor) 910 923 { 911 924 /* for simplicity just copy from one to another */ 912 CrVrScrCompositorInit(pDstCompositor );913 VBOXVR_SCR_COMPOSITOR_ ITERATOR CIter;914 PVBOXVR_SCR_COMPOSITOR_ENTRYpEntry;915 CrVrScrCompositor IterInit(pCompositor, &CIter);925 CrVrScrCompositorInit(pDstCompositor, CrVrScrCompositorRectGet(pCompositor)); 926 VBOXVR_SCR_COMPOSITOR_CONST_ITERATOR CIter; 927 const VBOXVR_SCR_COMPOSITOR_ENTRY *pEntry; 928 CrVrScrCompositorConstIterInit(pCompositor, &CIter); 916 929 int rc = VINF_SUCCESS; 917 930 uint32_t cRects; 918 931 const RTRECT *pRects; 919 932 920 while ((pEntry = CrVrScrCompositor IterNext(&CIter)) != NULL)933 while ((pEntry = CrVrScrCompositorConstIterNext(&CIter)) != NULL) 921 934 { 922 935 /* get source rects, that will be non-stretched and entry pos - pased */ … … 935 948 } 936 949 937 rc = CrVrScrCompositorEntryRegionsSet(pDstCompositor, pDstEntry, CrVrScrCompositorEntryPosGet(pEntry), cRects, pRects, false, NULL);950 rc = CrVrScrCompositorEntryRegionsSet(pDstCompositor, pDstEntry, NULL, cRects, pRects, false, NULL); 938 951 if (!RT_SUCCESS(rc)) 939 952 { … … 974 987 } 975 988 976 VBOXVREGDECL(int) CrVrScrCompositorIntersectedList( PVBOXVR_SCR_COMPOSITORpCompositor, const VBOXVR_LIST *pVr, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor, bool *pfChanged)989 VBOXVREGDECL(int) CrVrScrCompositorIntersectedList(const VBOXVR_SCR_COMPOSITOR *pCompositor, const VBOXVR_LIST *pVr, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor, bool *pfChanged) 977 990 { 978 991 int rc = CrVrScrCompositorClone(pCompositor, pDstCompositor, pfnEntryFor, pvEntryFor); -
trunk/src/VBox/GuestHost/OpenGL/util/error.c
r47487 r50095 499 499 #else 500 500 if (!output 501 #ifndef DEBUG_misha 501 502 || output==stderr 503 #endif 502 504 ) 503 505 { -
trunk/src/VBox/GuestHost/OpenGL/util/htable.cpp
r49772 r50095 16 16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. 17 17 */ 18 #include <cr_htable.h> 18 #include <iprt/cdefs.h> 19 #include <iprt/asm.h> 20 #include "cr_spu.h" 21 #include "cr_vreg.h" 22 23 #include "cr_htable.h" 24 #include "cr_spu.h" 25 #include "chromium.h" 26 #include "cr_error.h" 27 #include "cr_net.h" 28 #include "cr_rand.h" 29 #include "cr_mem.h" 30 #include "cr_string.h" 31 32 #include <iprt/cdefs.h> 33 #include <iprt/types.h> 19 34 #include <iprt/mem.h> 20 21 #include <cr_error.h> 22 #define WARN(_m) do { crWarning _m ; } while (0) 35 #include <iprt/err.h> 23 36 24 37 VBOXHTABLEDECL(int) CrHTableCreate(PCRHTABLE pTbl, uint32_t cSize) … … 37 50 } 38 51 39 VBOXHTABLEDECL(void) CrHTableDestroy(PCRHTABLE pTbl) ;52 VBOXHTABLEDECL(void) CrHTableDestroy(PCRHTABLE pTbl) 40 53 { 41 54 if (!pTbl->paData) 42 55 return; 43 56 44 RTMem MemFree(pTbl->paData);57 RTMemFree(pTbl->paData); 45 58 } 46 59 … … 50 63 if (cNewSize > pTbl->cSize) 51 64 { 52 void **pvNewData = ( PVOID*)RTMemAllocZ(sizeof (pTbl->paData[0]) * cNewSize);65 void **pvNewData = (void**)RTMemAllocZ(sizeof (pTbl->paData[0]) * cNewSize); 53 66 if (!pvNewData) 54 67 { … … 86 99 static void* crHTablePutToSlot(PCRHTABLE pTbl, uint32_t iSlot, void* pvData) 87 100 { 88 void* pvOld = pTbl->paData[i ];89 pTbl->paData[i ] = pvData;101 void* pvOld = pTbl->paData[iSlot]; 102 pTbl->paData[iSlot] = pvData; 90 103 if (!pvOld) 91 104 ++pTbl->cData; 92 105 Assert(pTbl->cData <= pTbl->cSize); 93 106 return pvOld; 94 107 } 95 108 … … 112 125 } 113 126 114 VBOXHTABLEDECL(CRHTABLE_HANDLE) CrHTablePut(PCRHTABLE pTbl, PVOIDpvData)127 VBOXHTABLEDECL(CRHTABLE_HANDLE) CrHTablePut(PCRHTABLE pTbl, void* pvData) 115 128 { 116 129 if (pTbl->cSize == pTbl->cData) … … 123 136 } 124 137 } 125 for ( UINTi = pTbl->iNext2Search; ; ++i, i %= pTbl->cSize)138 for (uint32_t i = pTbl->iNext2Search; ; ++i, i %= pTbl->cSize) 126 139 { 127 140 Assert(i < pTbl->cSize); … … 145 158 if (iIndex < pTbl->cSize) 146 159 { 147 PVOIDpvData = pTbl->paData[iIndex];160 void* pvData = pTbl->paData[iIndex]; 148 161 pTbl->paData[iIndex] = NULL; 149 162 --pTbl->cData; -
trunk/src/VBox/GuestHost/OpenGL/util/vreg.cpp
r48733 r50095 22 22 23 23 #include <cr_error.h> 24 #define WARN(_m) do { crWarning _m ; } while (0) 24 25 #ifdef DEBUG_misha 26 # define VBOXVDBG_VR_LAL_DISABLE 27 #endif 25 28 26 29 #ifndef IN_RING0 … … 119 122 #endif 120 123 121 #ifdef DEBUG_misha122 //# define VBOXVDBG_VR_LAL_DISABLE123 #endif124 125 #ifndef VBOXVDBG_VR_LAL_DISABLE126 124 static volatile int32_t g_cVBoxVrInits = 0; 127 #endif128 125 129 126 static PVBOXVR_REG vboxVrRegCreate() … … 1158 1155 RTListForEach(&pList->ListHead, pReg, const VBOXVR_REG, ListEntry) 1159 1156 { 1160 PVBOXVR_REG pDstReg = (PVBOXVR_REG)vboxVrRegLaAlloc(g_VBoxVrLookasideList);1157 PVBOXVR_REG pDstReg = vboxVrRegCreate(); 1161 1158 if (!pDstReg) 1162 1159 { … … 1213 1210 } 1214 1211 1215 DECLINLINE(void) vboxVrCompositorEntryA cquire(PVBOXVR_COMPOSITOR_ENTRY pEntry)1212 DECLINLINE(void) vboxVrCompositorEntryAddRef(PVBOXVR_COMPOSITOR_ENTRY pEntry) 1216 1213 { 1217 1214 ++pEntry->cRefs; … … 1221 1218 { 1222 1219 RTListPrepend(&pCompositor->List, &pEntry->Node); 1223 vboxVrCompositorEntryA cquire(pEntry);1220 vboxVrCompositorEntryAddRef(pEntry); 1224 1221 } 1225 1222 … … 1240 1237 pEntry->Node.pPrev = NULL; 1241 1238 1242 vboxVrCompositorEntryA cquire(pReplacingEntry);1239 vboxVrCompositorEntryAddRef(pReplacingEntry); 1243 1240 vboxVrCompositorEntryRelease(pCompositor, pEntry, pReplacingEntry); 1244 1241 } … … 1257 1254 return false; 1258 1255 1259 vboxVrCompositorEntryA cquire(pEntry);1256 vboxVrCompositorEntryAddRef(pEntry); 1260 1257 1261 1258 VBoxVrListClear(&pEntry->Vr); … … 1278 1275 { 1279 1276 bool fChanged; 1280 vboxVrCompositorEntryA cquire(pEntry);1277 vboxVrCompositorEntryAddRef(pEntry); 1281 1278 1282 1279 int rc = VBoxVrListRectsSubst(&pEntry->Vr, cRects, paRects, &fChanged); … … 1300 1297 VBOXVREGDECL(int) VBoxVrCompositorEntryRegionsAdd(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, uint32_t cRects, const RTRECT *paRects, PVBOXVR_COMPOSITOR_ENTRY *ppReplacedEntry, uint32_t *pfChangeFlags) 1301 1298 { 1302 bool fOthersChanged = false, fCurChanged = false, fEntryChanged = false, fEntryWasInList = false , fEntryReplaced = false;1303 PVBOXVR_COMPOSITOR_ENTRY pCur, pNext ;1299 bool fOthersChanged = false, fCurChanged = false, fEntryChanged = false, fEntryWasInList = false; 1300 PVBOXVR_COMPOSITOR_ENTRY pCur, pNext, pReplacedEntry = NULL; 1304 1301 int rc = VINF_SUCCESS; 1305 1302 1306 1303 if (pEntry) 1307 vboxVrCompositorEntryA cquire(pEntry);1304 vboxVrCompositorEntryAddRef(pEntry); 1308 1305 1309 1306 if (!cRects) … … 1348 1345 { 1349 1346 Assert(!VBoxVrListIsEmpty(&pCur->Vr)); 1350 if (pCur == pEntry) 1351 { 1352 Assert(fEntryWasInList); 1353 } 1354 else 1347 if (pCur != pEntry) 1355 1348 { 1356 1349 if (pEntry && !VBoxVrListCmp(&pCur->Vr, &pEntry->Vr)) 1357 1350 { 1358 1351 VBoxVrListClear(&pCur->Vr); 1352 pReplacedEntry = pCur; 1353 vboxVrCompositorEntryAddRef(pReplacedEntry); 1359 1354 vboxVrCompositorEntryRemove(pCompositor, pCur, pEntry); 1360 1355 if (ppReplacedEntry) 1361 *ppReplacedEntry = pCur; 1362 fEntryReplaced = true; 1356 *ppReplacedEntry = pReplacedEntry; 1363 1357 break; 1364 1358 } … … 1389 1383 } 1390 1384 1385 uint32_t fFlags = 0; 1386 if (fOthersChanged) 1387 { 1388 Assert(!pReplacedEntry); 1389 fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED; 1390 } 1391 else if (pReplacedEntry) 1392 { 1393 vboxVrCompositorEntryRelease(pCompositor, pReplacedEntry, pEntry); 1394 Assert(fEntryChanged); 1395 fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED; 1396 } 1397 else if (fEntryChanged) 1398 { 1399 Assert(!pReplacedEntry); 1400 fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED; 1401 } 1402 else 1403 { 1404 Assert(!pReplacedEntry); 1405 } 1406 1407 if (!fEntryWasInList) 1408 Assert(fEntryChanged); 1409 1391 1410 if (pfChangeFlags) 1392 {1393 uint32_t fFlags = 0;1394 if (fOthersChanged)1395 fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED;1396 else if (fEntryReplaced)1397 {1398 Assert(fEntryChanged);1399 fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED;1400 }1401 else if (fEntryChanged)1402 fFlags = VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED;1403 1404 if (!fEntryWasInList)1405 Assert(fEntryChanged);1406 1407 1411 *pfChangeFlags = fFlags; 1408 }1409 1412 1410 1413 return VINF_SUCCESS; … … 1421 1424 } 1422 1425 1423 vboxVrCompositorEntryA cquire(pEntry);1426 vboxVrCompositorEntryAddRef(pEntry); 1424 1427 1425 1428 if (VBoxVrListIsEmpty(&pEntry->Vr)) … … 1429 1432 vboxVrCompositorEntryRelease(pCompositor, pEntry, NULL); 1430 1433 return VINF_SUCCESS; 1431 1432 1434 } 1433 1435 … … 1451 1453 } 1452 1454 1453 vboxVrCompositorEntryA cquire(pEntry);1455 vboxVrCompositorEntryAddRef(pEntry); 1454 1456 1455 1457 bool fChanged = false, fCurChanged = false; … … 1479 1481 bool fChanged = false; 1480 1482 1481 vboxVrCompositorEntryA cquire(pEntry);1483 vboxVrCompositorEntryAddRef(pEntry); 1482 1484 1483 1485 if (VBoxVrCompositorEntryIsInList(pEntry)) … … 1511 1513 bool fChanged = false; 1512 1514 1513 vboxVrCompositorEntryA cquire(pEntry);1515 vboxVrCompositorEntryAddRef(pEntry); 1514 1516 1515 1517 if (VBoxVrCompositorEntryIsInList(pEntry)) … … 1606 1608 } 1607 1609 1608 vboxVrCompositorEntryA cquire(pEntry);1610 vboxVrCompositorEntryAddRef(pEntry); 1609 1611 1610 1612 if ((!x && !y) … … 1681 1683 } 1682 1684 } 1683 1684 1685 1686 #define VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED UINT32_MAX1687 1688 static int crVrScrCompositorRectsAssignBuffer(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t cRects)1689 {1690 Assert(cRects);1691 1692 if (pCompositor->cRectsBuffer >= cRects)1693 {1694 pCompositor->cRects = cRects;1695 return VINF_SUCCESS;1696 }1697 1698 if (pCompositor->cRectsBuffer)1699 {1700 Assert(pCompositor->paSrcRects);1701 RTMemFree(pCompositor->paSrcRects);1702 pCompositor->paSrcRects = NULL;1703 Assert(pCompositor->paDstRects);1704 RTMemFree(pCompositor->paDstRects);1705 pCompositor->paDstRects = NULL;1706 Assert(pCompositor->paDstUnstretchedRects);1707 RTMemFree(pCompositor->paDstUnstretchedRects);1708 pCompositor->paDstUnstretchedRects = NULL;1709 }1710 else1711 {1712 Assert(!pCompositor->paSrcRects);1713 Assert(!pCompositor->paDstRects);1714 Assert(!pCompositor->paDstUnstretchedRects);1715 }1716 1717 pCompositor->paSrcRects = (PRTRECT)RTMemAlloc(sizeof (*pCompositor->paSrcRects) * cRects);1718 if (pCompositor->paSrcRects)1719 {1720 pCompositor->paDstRects = (PRTRECT)RTMemAlloc(sizeof (*pCompositor->paDstRects) * cRects);1721 if (pCompositor->paDstRects)1722 {1723 pCompositor->paDstUnstretchedRects = (PRTRECT)RTMemAlloc(sizeof (*pCompositor->paDstUnstretchedRects) * cRects);1724 if (pCompositor->paDstUnstretchedRects)1725 {1726 pCompositor->cRects = cRects;1727 pCompositor->cRectsBuffer = cRects;1728 return VINF_SUCCESS;1729 }1730 1731 RTMemFree(pCompositor->paDstRects);1732 pCompositor->paDstRects = NULL;1733 }1734 else1735 {1736 WARN(("RTMemAlloc failed!"));1737 }1738 RTMemFree(pCompositor->paSrcRects);1739 pCompositor->paSrcRects = NULL;1740 }1741 else1742 {1743 WARN(("RTMemAlloc failed!"));1744 }1745 1746 pCompositor->cRects = VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED;1747 pCompositor->cRectsBuffer = 0;1748 1749 return VERR_NO_MEMORY;1750 }1751 1752 static void crVrScrCompositorRectsInvalidate(PVBOXVR_SCR_COMPOSITOR pCompositor)1753 {1754 pCompositor->cRects = VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED;1755 }1756 1757 static DECLCALLBACK(bool) crVrScrCompositorRectsCounterCb(PVBOXVR_COMPOSITOR pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, void *pvVisitor)1758 {1759 uint32_t* pCounter = (uint32_t*)pvVisitor;1760 Assert(VBoxVrListRectsCount(&pEntry->Vr));1761 *pCounter += VBoxVrListRectsCount(&pEntry->Vr);1762 return true;1763 }1764 1765 typedef struct VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER1766 {1767 PRTRECT paSrcRects;1768 PRTRECT paDstRects;1769 PRTRECT paDstUnstretchedRects;1770 uint32_t cRects;1771 } VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER, *PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER;1772 1773 static DECLCALLBACK(bool) crVrScrCompositorRectsAssignerCb(PVBOXVR_COMPOSITOR pCCompositor, PVBOXVR_COMPOSITOR_ENTRY pCEntry, void *pvVisitor)1774 {1775 PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER pData = (PVBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER)pvVisitor;1776 PVBOXVR_SCR_COMPOSITOR pCompositor = VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(pCCompositor);1777 PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pCEntry);1778 pEntry->paSrcRects = pData->paSrcRects;1779 pEntry->paDstRects = pData->paDstRects;1780 pEntry->paDstUnstretchedRects = pData->paDstUnstretchedRects;1781 uint32_t cRects = VBoxVrListRectsCount(&pCEntry->Vr);1782 Assert(cRects);1783 Assert(cRects <= pData->cRects);1784 int rc = VBoxVrListRectsGet(&pCEntry->Vr, cRects, pEntry->paDstUnstretchedRects);1785 AssertRC(rc);1786 1787 if (!pEntry->Pos.x && !pEntry->Pos.y)1788 {1789 memcpy(pEntry->paSrcRects, pEntry->paDstUnstretchedRects, cRects * sizeof (*pEntry->paSrcRects));1790 }1791 else1792 {1793 for (uint32_t i = 0; i < cRects; ++i)1794 {1795 pEntry->paSrcRects[i].xLeft = (int32_t)((pEntry->paDstUnstretchedRects[i].xLeft - pEntry->Pos.x));1796 pEntry->paSrcRects[i].yTop = (int32_t)((pEntry->paDstUnstretchedRects[i].yTop - pEntry->Pos.y));1797 pEntry->paSrcRects[i].xRight = (int32_t)((pEntry->paDstUnstretchedRects[i].xRight - pEntry->Pos.x));1798 pEntry->paSrcRects[i].yBottom = (int32_t)((pEntry->paDstUnstretchedRects[i].yBottom - pEntry->Pos.y));1799 }1800 }1801 1802 #ifndef IN_RING01803 if (pCompositor->StretchX != 1. || pCompositor->StretchY != 1.)1804 {1805 for (uint32_t i = 0; i < cRects; ++i)1806 {1807 if (pCompositor->StretchX != 1.)1808 {1809 pEntry->paDstRects[i].xLeft = (int32_t)(pEntry->paDstUnstretchedRects[i].xLeft * pCompositor->StretchX);1810 pEntry->paDstRects[i].xRight = (int32_t)(pEntry->paDstUnstretchedRects[i].xRight * pCompositor->StretchX);1811 }1812 if (pCompositor->StretchY != 1.)1813 {1814 pEntry->paDstRects[i].yTop = (int32_t)(pEntry->paDstUnstretchedRects[i].yTop * pCompositor->StretchY);1815 pEntry->paDstRects[i].yBottom = (int32_t)(pEntry->paDstUnstretchedRects[i].yBottom * pCompositor->StretchY);1816 }1817 }1818 }1819 else1820 #endif1821 {1822 memcpy(pEntry->paDstRects, pEntry->paDstUnstretchedRects, cRects * sizeof (*pEntry->paDstUnstretchedRects));1823 }1824 1825 #if 0//ndef IN_RING01826 bool canZeroX = (pCompositor->StretchX < 1.);1827 bool canZeroY = (pCompositor->StretchY < 1.);1828 if (canZeroX && canZeroY)1829 {1830 /* filter out zero rectangles*/1831 uint32_t iOrig, iNew;1832 for (iOrig = 0, iNew = 0; iOrig < cRects; ++iOrig)1833 {1834 PRTRECT pOrigRect = &pEntry->paDstRects[iOrig];1835 if (pOrigRect->xLeft != pOrigRect->xRight1836 && pOrigRect->yTop != pOrigRect->yBottom)1837 continue;1838 1839 if (iNew != iOrig)1840 {1841 PRTRECT pNewRect = &pEntry->paSrcRects[iNew];1842 *pNewRect = *pOrigRect;1843 }1844 1845 ++iNew;1846 }1847 1848 Assert(iNew <= iOrig);1849 1850 uint32_t cDiff = iOrig - iNew;1851 1852 if (cDiff)1853 {1854 pCompositor->cRects -= cDiff;1855 cRects -= cDiff;1856 }1857 }1858 #endif1859 1860 pEntry->cRects = cRects;1861 pData->paDstRects += cRects;1862 pData->paSrcRects += cRects;1863 pData->paDstUnstretchedRects += cRects;1864 pData->cRects -= cRects;1865 return true;1866 }1867 1868 static int crVrScrCompositorRectsCheckInit(PVBOXVR_SCR_COMPOSITOR pCompositor)1869 {1870 if (pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED)1871 return VINF_SUCCESS;1872 1873 uint32_t cRects = 0;1874 VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorRectsCounterCb, &cRects);1875 1876 if (!cRects)1877 {1878 pCompositor->cRects = 0;1879 return VINF_SUCCESS;1880 }1881 1882 int rc = crVrScrCompositorRectsAssignBuffer(pCompositor, cRects);1883 if (!RT_SUCCESS(rc))1884 return rc;1885 1886 VBOXVR_SCR_COMPOSITOR_RECTS_ASSIGNER AssignerData;1887 AssignerData.paSrcRects = pCompositor->paSrcRects;1888 AssignerData.paDstRects = pCompositor->paDstRects;1889 AssignerData.paDstUnstretchedRects = pCompositor->paDstUnstretchedRects;1890 AssignerData.cRects = pCompositor->cRects;1891 VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorRectsAssignerCb, &AssignerData);1892 Assert(!AssignerData.cRects);1893 return VINF_SUCCESS;1894 }1895 1896 1897 static int crVrScrCompositorEntryRegionsAdd(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t cRegions, const RTRECT *paRegions, VBOXVR_SCR_COMPOSITOR_ENTRY **ppReplacedScrEntry, uint32_t *pfChangedFlags)1898 {1899 uint32_t fChangedFlags = 0;1900 PVBOXVR_COMPOSITOR_ENTRY pReplacedEntry;1901 int rc = VBoxVrCompositorEntryRegionsAdd(&pCompositor->Compositor, pEntry ? &pEntry->Ce : NULL, cRegions, paRegions, &pReplacedEntry, &fChangedFlags);1902 if (!RT_SUCCESS(rc))1903 {1904 WARN(("VBoxVrCompositorEntryRegionsAdd failed, rc %d", rc));1905 return rc;1906 }1907 1908 VBOXVR_SCR_COMPOSITOR_ENTRY *pReplacedScrEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pReplacedEntry);1909 1910 if (fChangedFlags & VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED)1911 {1912 crVrScrCompositorRectsInvalidate(pCompositor);1913 }1914 else if (fChangedFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED)1915 {1916 Assert(!CrVrScrCompositorEntryIsInList(pReplacedScrEntry));1917 Assert(CrVrScrCompositorEntryIsInList(pEntry));1918 pEntry->cRects = pReplacedScrEntry->cRects;1919 pEntry->paSrcRects = pReplacedScrEntry->paSrcRects;1920 pEntry->paDstRects = pReplacedScrEntry->paDstRects;1921 pEntry->paDstUnstretchedRects = pReplacedScrEntry->paDstUnstretchedRects;1922 }1923 1924 if (fChangedFlags & VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED)1925 {1926 CrVrScrCompositorEntrySetAllChanged(pCompositor, true);1927 }1928 else if ((fChangedFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED) && pEntry)1929 {1930 CrVrScrCompositorEntrySetChanged(pEntry, true);1931 }1932 1933 if (pfChangedFlags)1934 *pfChangedFlags = fChangedFlags;1935 1936 if (ppReplacedScrEntry)1937 *ppReplacedScrEntry = pReplacedScrEntry;1938 1939 return VINF_SUCCESS;1940 }1941 1942 static int crVrScrCompositorEntryRegionsSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged)1943 {1944 bool fChanged;1945 CrVrScrCompositorEntryIsInList(pEntry);1946 int rc = VBoxVrCompositorEntryRegionsSet(&pCompositor->Compositor, &pEntry->Ce, cRegions, paRegions, &fChanged);1947 if (!RT_SUCCESS(rc))1948 {1949 WARN(("VBoxVrCompositorEntryRegionsSet failed, rc %d", rc));1950 return rc;1951 }1952 1953 if (fChanged)1954 {1955 CrVrScrCompositorEntrySetAllChanged(pCompositor, true);1956 if (!CrVrScrCompositorEntryIsInList(pEntry))1957 {1958 pEntry->cRects = 0;1959 pEntry->paSrcRects = NULL;1960 pEntry->paDstRects = NULL;1961 pEntry->paDstUnstretchedRects = NULL;1962 }1963 crVrScrCompositorRectsInvalidate(pCompositor);1964 }1965 1966 1967 if (pfChanged)1968 *pfChanged = fChanged;1969 return VINF_SUCCESS;1970 }1971 1972 static int crVrScrCompositorEntryPositionSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos, bool *pfChanged)1973 {1974 if (pfChanged)1975 *pfChanged = false;1976 if (pEntry && (pEntry->Pos.x != pPos->x || pEntry->Pos.y != pPos->y))1977 {1978 if (VBoxVrCompositorEntryIsInList(&pEntry->Ce))1979 {1980 int rc = VBoxVrCompositorEntryRegionsTranslate(&pCompositor->Compositor, &pEntry->Ce, pPos->x - pEntry->Pos.x, pPos->y - pEntry->Pos.y, pfChanged);1981 if (!RT_SUCCESS(rc))1982 {1983 WARN(("VBoxVrCompositorEntryRegionsTranslate failed rc %d", rc));1984 return rc;1985 }1986 1987 crVrScrCompositorRectsInvalidate(pCompositor);1988 }1989 1990 pEntry->Pos = *pPos;1991 CrVrScrCompositorEntrySetChanged(pEntry, true);1992 1993 if (pfChanged)1994 *pfChanged = true;1995 }1996 return VINF_SUCCESS;1997 }1998 1999 static int crVrScrCompositorEntryEnsureRegionsInTex(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, bool *pfChanged)2000 {2001 RTRECT Rect;2002 Rect.xLeft = pEntry->Pos.x;2003 Rect.yTop = pEntry->Pos.y;2004 Rect.xRight = pEntry->Pos.x + pEntry->Tex.width;2005 Rect.yBottom = pEntry->Pos.y + pEntry->Tex.height;2006 bool fChanged = false;2007 2008 if (pfChanged)2009 *pfChanged = false;2010 2011 int rc = CrVrScrCompositorEntryRegionsIntersect(pCompositor, pEntry, 1, &Rect, &fChanged);2012 if (!RT_SUCCESS(rc))2013 WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", rc));2014 2015 if (fChanged)2016 {2017 CrVrScrCompositorEntrySetChanged(pEntry, true);2018 crVrScrCompositorRectsInvalidate(pCompositor);2019 }2020 2021 if (pfChanged)2022 *pfChanged = fChanged;2023 return rc;2024 }2025 2026 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsAdd(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions, bool fPosRelated, VBOXVR_SCR_COMPOSITOR_ENTRY **ppReplacedScrEntry, uint32_t *pfChangeFlags)2027 {2028 int rc;2029 uint32_t fChangeFlags = 0;2030 bool fPosChanged = false;2031 RTRECT *paTranslatedRects = NULL;2032 if (pPos)2033 {2034 rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, &fPosChanged);2035 if (!RT_SUCCESS(rc))2036 {2037 WARN(("RegionsAdd: crVrScrCompositorEntryPositionSet failed rc %d", rc));2038 return rc;2039 }2040 }2041 2042 if (fPosRelated)2043 {2044 if (!pEntry)2045 {2046 WARN(("Entry is expected to be specified for pos-related regions"));2047 return VERR_INVALID_PARAMETER;2048 }2049 2050 if (cRegions && (pEntry->Pos.x || pEntry->Pos.y))2051 {2052 paTranslatedRects = (RTRECT*)RTMemAlloc(sizeof (RTRECT) * cRegions);2053 if (!paTranslatedRects)2054 {2055 WARN(("RTMemAlloc failed"));2056 return VERR_NO_MEMORY;2057 }2058 memcpy (paTranslatedRects, paRegions, sizeof (RTRECT) * cRegions);2059 for (uint32_t i = 0; i < cRegions; ++i)2060 {2061 VBoxRectTranslate(&paTranslatedRects[i], pEntry->Pos.x, pEntry->Pos.y);2062 paRegions = paTranslatedRects;2063 }2064 }2065 }2066 2067 rc = crVrScrCompositorEntryRegionsAdd(pCompositor, pEntry, cRegions, paRegions, ppReplacedScrEntry, &fChangeFlags);2068 if (!RT_SUCCESS(rc))2069 {2070 WARN(("crVrScrCompositorEntryRegionsAdd failed, rc %d", rc));2071 goto done;2072 }2073 2074 if ((fPosChanged || (fChangeFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED)) && pEntry)2075 {2076 bool fAdjusted = false;2077 rc = crVrScrCompositorEntryEnsureRegionsInTex(pCompositor, pEntry, &fAdjusted);2078 if (!RT_SUCCESS(rc))2079 {2080 WARN(("crVrScrCompositorEntryEnsureRegionsInTex failed, rc %d", rc));2081 goto done;2082 }2083 2084 if (fAdjusted)2085 {2086 fChangeFlags &= ~VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED;2087 fChangeFlags |= VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED;2088 }2089 }2090 2091 if (fChangeFlags & VBOXVR_COMPOSITOR_CF_ENTRY_REPLACED)2092 fPosChanged = false;2093 else if (ppReplacedScrEntry)2094 *ppReplacedScrEntry = NULL;2095 2096 if (pfChangeFlags)2097 {2098 if (fPosChanged)2099 {2100 /* means entry was in list and was moved, so regions changed */2101 *pfChangeFlags = VBOXVR_COMPOSITOR_CF_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_ENTRY_REGIONS_CHANGED | VBOXVR_COMPOSITOR_CF_OTHER_ENTRIES_REGIONS_CHANGED;2102 }2103 else2104 *pfChangeFlags = fChangeFlags;2105 }2106 2107 done:2108 2109 if (paTranslatedRects)2110 RTMemFree(paTranslatedRects);2111 2112 return rc;2113 }2114 2115 VBOXVREGDECL(int) CrVrScrCompositorEntryTexUpdate(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const VBOXVR_TEXTURE *pTex)2116 {2117 bool fCompositorChanged = CrVrScrCompositorEntryIsUsed(pEntry) && (pEntry->Tex.width != pTex->width || pEntry->Tex.height != pTex->height);2118 pEntry->Tex = *pTex;2119 CrVrScrCompositorEntrySetChanged(pEntry, true);2120 if (fCompositorChanged)2121 {2122 int rc = crVrScrCompositorEntryEnsureRegionsInTex(pCompositor, pEntry, NULL);2123 if (!RT_SUCCESS(rc))2124 {2125 WARN(("crVrScrCompositorEntryEnsureRegionsInTex failed rc %d", rc));2126 return rc;2127 }2128 }2129 return VINF_SUCCESS;2130 }2131 2132 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos, uint32_t cRegions, const RTRECT *paRegions, bool fPosRelated, bool *pfChanged)2133 {2134 /* @todo: the fChanged sate calculation is really rough now, this is enough for now though */2135 bool fChanged = false, fPosChanged = false;2136 bool fWasInList = CrVrScrCompositorEntryIsInList(pEntry);2137 RTRECT *paTranslatedRects = NULL;2138 int rc = CrVrScrCompositorEntryRemove(pCompositor, pEntry);2139 if (!RT_SUCCESS(rc))2140 {2141 WARN(("RegionsSet: CrVrScrCompositorEntryRemove failed rc %d", rc));2142 return rc;2143 }2144 2145 if (pPos)2146 {2147 rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, &fPosChanged);2148 if (!RT_SUCCESS(rc))2149 {2150 WARN(("RegionsSet: crVrScrCompositorEntryPositionSet failed rc %d", rc));2151 return rc;2152 }2153 }2154 2155 if (fPosRelated)2156 {2157 if (!pEntry)2158 {2159 WARN(("Entry is expected to be specified for pos-related regions"));2160 return VERR_INVALID_PARAMETER;2161 }2162 2163 if (cRegions && (pEntry->Pos.x || pEntry->Pos.y))2164 {2165 paTranslatedRects = (RTRECT*)RTMemAlloc(sizeof (RTRECT) * cRegions);2166 if (!paTranslatedRects)2167 {2168 WARN(("RTMemAlloc failed"));2169 return VERR_NO_MEMORY;2170 }2171 memcpy (paTranslatedRects, paRegions, sizeof (RTRECT) * cRegions);2172 for (uint32_t i = 0; i < cRegions; ++i)2173 {2174 VBoxRectTranslate(&paTranslatedRects[i], pEntry->Pos.x, pEntry->Pos.y);2175 paRegions = paTranslatedRects;2176 }2177 }2178 }2179 2180 rc = crVrScrCompositorEntryRegionsSet(pCompositor, pEntry, cRegions, paRegions, &fChanged);2181 if (!RT_SUCCESS(rc))2182 {2183 WARN(("crVrScrCompositorEntryRegionsSet failed, rc %d", rc));2184 return rc;2185 }2186 2187 if (fChanged && CrVrScrCompositorEntryIsUsed(pEntry))2188 {2189 rc = crVrScrCompositorEntryEnsureRegionsInTex(pCompositor, pEntry, NULL);2190 if (!RT_SUCCESS(rc))2191 {2192 WARN(("crVrScrCompositorEntryEnsureRegionsInTex failed, rc %d", rc));2193 return rc;2194 }2195 }2196 2197 if (pfChanged)2198 *pfChanged = fPosChanged || fChanged || fWasInList;2199 2200 return VINF_SUCCESS;2201 }2202 2203 VBOXVREGDECL(int) CrVrScrCompositorEntryListIntersect(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const VBOXVR_LIST *pList2, bool *pfChanged)2204 {2205 bool fChanged = false;2206 int rc = VBoxVrCompositorEntryListIntersect(&pCompositor->Compositor, &pEntry->Ce, pList2, &fChanged);2207 if (!RT_SUCCESS(rc))2208 {2209 WARN(("RegionsIntersect: VBoxVrCompositorEntryRegionsIntersect failed rc %d", rc));2210 return rc;2211 }2212 2213 if (fChanged)2214 {2215 CrVrScrCompositorEntrySetChanged(pEntry, true);2216 crVrScrCompositorRectsInvalidate(pCompositor);2217 }2218 2219 if (pfChanged)2220 *pfChanged = fChanged;2221 2222 return VINF_SUCCESS;2223 }2224 2225 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsIntersect(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged)2226 {2227 bool fChanged = false;2228 int rc = VBoxVrCompositorEntryRegionsIntersect(&pCompositor->Compositor, &pEntry->Ce, cRegions, paRegions, &fChanged);2229 if (!RT_SUCCESS(rc))2230 {2231 WARN(("RegionsIntersect: VBoxVrCompositorEntryRegionsIntersect failed rc %d", rc));2232 return rc;2233 }2234 2235 if (fChanged)2236 {2237 CrVrScrCompositorEntrySetChanged(pEntry, true);2238 crVrScrCompositorRectsInvalidate(pCompositor);2239 }2240 2241 if (pfChanged)2242 *pfChanged = fChanged;2243 2244 return VINF_SUCCESS;2245 }2246 2247 VBOXVREGDECL(int) CrVrScrCompositorEntryListIntersectAll(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pList2, bool *pfChanged)2248 {2249 VBOXVR_SCR_COMPOSITOR_ITERATOR Iter;2250 CrVrScrCompositorIterInit(pCompositor, &Iter);2251 PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;2252 int rc = VINF_SUCCESS;2253 bool fChanged = false;2254 2255 while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL)2256 {2257 bool fTmpChanged = false;2258 int tmpRc = CrVrScrCompositorEntryListIntersect(pCompositor, pEntry, pList2, &fTmpChanged);2259 if (RT_SUCCESS(tmpRc))2260 {2261 fChanged |= fTmpChanged;2262 }2263 else2264 {2265 WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));2266 rc = tmpRc;2267 }2268 }2269 2270 if (pfChanged)2271 *pfChanged = fChanged;2272 2273 return rc;2274 }2275 2276 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsIntersectAll(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t cRegions, const RTRECT *paRegions, bool *pfChanged)2277 {2278 VBOXVR_SCR_COMPOSITOR_ITERATOR Iter;2279 CrVrScrCompositorIterInit(pCompositor, &Iter);2280 PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;2281 int rc = VINF_SUCCESS;2282 bool fChanged = false;2283 2284 while ((pEntry = CrVrScrCompositorIterNext(&Iter)) != NULL)2285 {2286 bool fTmpChanged = false;2287 int tmpRc = CrVrScrCompositorEntryRegionsIntersect(pCompositor, pEntry, cRegions, paRegions, &fTmpChanged);2288 if (RT_SUCCESS(tmpRc))2289 {2290 fChanged |= fTmpChanged;2291 }2292 else2293 {2294 WARN(("CrVrScrCompositorEntryRegionsIntersect failed, rc %d", tmpRc));2295 rc = tmpRc;2296 }2297 }2298 2299 if (pfChanged)2300 *pfChanged = fChanged;2301 2302 return rc;2303 }2304 2305 VBOXVREGDECL(int) CrVrScrCompositorEntryPosSet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, const RTPOINT *pPos)2306 {2307 int rc = crVrScrCompositorEntryPositionSet(pCompositor, pEntry, pPos, NULL);2308 if (!RT_SUCCESS(rc))2309 {2310 WARN(("RegionsSet: crVrScrCompositorEntryPositionSet failed rc %d", rc));2311 return rc;2312 }2313 return VINF_SUCCESS;2314 }2315 2316 /* regions are valid until the next CrVrScrCompositor call */2317 VBOXVREGDECL(int) CrVrScrCompositorEntryRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects)2318 {2319 int rc = crVrScrCompositorRectsCheckInit(pCompositor);2320 if (!RT_SUCCESS(rc))2321 {2322 WARN(("crVrScrCompositorRectsCheckInit failed, rc %d", rc));2323 return rc;2324 }2325 2326 Assert(pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED);2327 2328 *pcRegions = pEntry->cRects;2329 if (ppaSrcRegions)2330 *ppaSrcRegions = pEntry->paSrcRects;2331 if (ppaDstRegions)2332 *ppaDstRegions = pEntry->paDstRects;2333 if (ppaDstUnstretchedRects)2334 *ppaDstUnstretchedRects = pEntry->paDstUnstretchedRects;2335 2336 return VINF_SUCCESS;2337 }2338 2339 VBOXVREGDECL(uint32_t) CrVrScrCompositorEntryFlagsCombinedGet(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)2340 {2341 return CRBLT_FOP_COMBINE(pCompositor->fFlags, pEntry->fFlags);2342 }2343 2344 VBOXVREGDECL(void) CrVrScrCompositorEntryFlagsSet(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, uint32_t fFlags)2345 {2346 if (pEntry->fFlags == fFlags)2347 return;2348 2349 pEntry->fFlags = fFlags;2350 CrVrScrCompositorEntrySetChanged(pEntry, true);2351 }2352 2353 static void crVrScrCompositorEntryDataCleanup(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)2354 {2355 pEntry->cRects = 0;2356 pEntry->paSrcRects = NULL;2357 pEntry->paDstRects = NULL;2358 pEntry->paDstUnstretchedRects = NULL;2359 }2360 2361 static void crVrScrCompositorEntryDataCopy(PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, PVBOXVR_SCR_COMPOSITOR_ENTRY pToEntry)2362 {2363 pToEntry->cRects = pEntry->cRects;2364 pToEntry->paSrcRects = pEntry->paSrcRects;2365 pToEntry->paDstRects = pEntry->paDstRects;2366 pToEntry->paDstUnstretchedRects = pEntry->paDstUnstretchedRects;2367 crVrScrCompositorEntryDataCleanup(pEntry);2368 }2369 2370 VBOXVREGDECL(int) CrVrScrCompositorEntryRemove(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry)2371 {2372 if (!VBoxVrCompositorEntryRemove(&pCompositor->Compositor, &pEntry->Ce))2373 return VINF_SUCCESS;2374 2375 CrVrScrCompositorEntrySetChanged(pEntry, true);2376 crVrScrCompositorEntryDataCleanup(pEntry);2377 2378 crVrScrCompositorRectsInvalidate(pCompositor);2379 return VINF_SUCCESS;2380 }2381 2382 VBOXVREGDECL(bool) CrVrScrCompositorEntryReplace(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry, PVBOXVR_SCR_COMPOSITOR_ENTRY pNewEntry)2383 {2384 Assert(!CrVrScrCompositorEntryIsUsed(pNewEntry));2385 2386 if (!VBoxVrCompositorEntryReplace(&pCompositor->Compositor, &pEntry->Ce, &pNewEntry->Ce))2387 return false;2388 2389 CrVrScrCompositorEntrySetChanged(pEntry, true);2390 crVrScrCompositorEntryDataCopy(pEntry, pNewEntry);2391 CrVrScrCompositorEntrySetChanged(pNewEntry, true);2392 2393 return true;2394 }2395 2396 static DECLCALLBACK(void) crVrScrCompositorEntryReleasedCB(const struct VBOXVR_COMPOSITOR *pCompositor, PVBOXVR_COMPOSITOR_ENTRY pEntry, PVBOXVR_COMPOSITOR_ENTRY pReplacingEntry)2397 {2398 PVBOXVR_SCR_COMPOSITOR_ENTRY pCEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pEntry);2399 CrVrScrCompositorEntrySetChanged(pCEntry, true);2400 2401 if (pCEntry->pfnEntryReleased)2402 {2403 PVBOXVR_SCR_COMPOSITOR_ENTRY pCReplacingEntry = pReplacingEntry ? VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pReplacingEntry) : NULL;2404 PVBOXVR_SCR_COMPOSITOR pCConpositor = VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(pCompositor);2405 pCEntry->pfnEntryReleased(pCConpositor, pCEntry, pCReplacingEntry);2406 }2407 }2408 2409 VBOXVREGDECL(void) CrVrScrCompositorInit(PVBOXVR_SCR_COMPOSITOR pCompositor)2410 {2411 memset(pCompositor, 0, sizeof (*pCompositor));2412 VBoxVrCompositorInit(&pCompositor->Compositor, crVrScrCompositorEntryReleasedCB);2413 pCompositor->fFlags = CRBLT_F_LINEAR | CRBLT_F_INVERT_YCOORDS;2414 #ifndef IN_RING02415 pCompositor->StretchX = 1.0;2416 pCompositor->StretchY = 1.0;2417 #endif2418 }2419 2420 VBOXVREGDECL(void) CrVrScrCompositorRegionsClear(PVBOXVR_SCR_COMPOSITOR pCompositor, bool *pfChanged)2421 {2422 /* set changed flag first, while entries are in the list and we have them */2423 CrVrScrCompositorEntrySetAllChanged(pCompositor, true);2424 VBoxVrCompositorRegionsClear(&pCompositor->Compositor, pfChanged);2425 crVrScrCompositorRectsInvalidate(pCompositor);2426 }2427 2428 VBOXVREGDECL(void) CrVrScrCompositorClear(PVBOXVR_SCR_COMPOSITOR pCompositor)2429 {2430 CrVrScrCompositorRegionsClear(pCompositor, NULL);2431 if (pCompositor->paDstRects)2432 {2433 RTMemFree(pCompositor->paDstRects);2434 pCompositor->paDstRects = NULL;2435 }2436 if (pCompositor->paSrcRects)2437 {2438 RTMemFree(pCompositor->paSrcRects);2439 pCompositor->paSrcRects = NULL;2440 }2441 if (pCompositor->paDstUnstretchedRects)2442 {2443 RTMemFree(pCompositor->paDstUnstretchedRects);2444 pCompositor->paDstUnstretchedRects = NULL;2445 }2446 2447 pCompositor->cRects = 0;2448 pCompositor->cRectsBuffer = 0;2449 }2450 2451 VBOXVREGDECL(void) CrVrScrCompositorEntrySetAllChanged(PVBOXVR_SCR_COMPOSITOR pCompositor, bool fChanged)2452 {2453 VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;2454 PVBOXVR_SCR_COMPOSITOR_ENTRY pCurEntry;2455 CrVrScrCompositorIterInit(pCompositor, &CIter);2456 2457 while ((pCurEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)2458 {2459 CrVrScrCompositorEntrySetChanged(pCurEntry, fChanged);2460 }2461 }2462 2463 #ifndef IN_RING02464 VBOXVREGDECL(void) CrVrScrCompositorSetStretching(PVBOXVR_SCR_COMPOSITOR pCompositor, float StretchX, float StretchY)2465 {2466 if (pCompositor->StretchX == StretchX && pCompositor->StretchY == StretchY)2467 return;2468 2469 pCompositor->StretchX = StretchX;2470 pCompositor->StretchY = StretchY;2471 crVrScrCompositorRectsInvalidate(pCompositor);2472 CrVrScrCompositorEntrySetAllChanged(pCompositor, true);2473 }2474 #endif2475 2476 /* regions are valid until the next CrVrScrCompositor call */2477 VBOXVREGDECL(int) CrVrScrCompositorRegionsGet(PVBOXVR_SCR_COMPOSITOR pCompositor, uint32_t *pcRegions, const RTRECT **ppaSrcRegions, const RTRECT **ppaDstRegions, const RTRECT **ppaDstUnstretchedRects)2478 {2479 int rc = crVrScrCompositorRectsCheckInit(pCompositor);2480 if (!RT_SUCCESS(rc))2481 {2482 WARN(("crVrScrCompositorRectsCheckInit failed, rc %d", rc));2483 return rc;2484 }2485 2486 Assert(pCompositor->cRects != VBOXVR_SCR_COMPOSITOR_RECTS_UNDEFINED);2487 2488 *pcRegions = pCompositor->cRects;2489 if (ppaSrcRegions)2490 *ppaSrcRegions = pCompositor->paSrcRects;2491 if (ppaDstRegions)2492 *ppaDstRegions = pCompositor->paDstRects;2493 if (ppaDstUnstretchedRects)2494 *ppaDstUnstretchedRects = pCompositor->paDstUnstretchedRects;2495 2496 return VINF_SUCCESS;2497 }2498 2499 typedef struct VBOXVR_SCR_COMPOSITOR_VISITOR_CB2500 {2501 PFNVBOXVRSCRCOMPOSITOR_VISITOR pfnVisitor;2502 void *pvVisitor;2503 } VBOXVR_SCR_COMPOSITOR_VISITOR_CB, *PVBOXVR_SCR_COMPOSITOR_VISITOR_CB;2504 2505 static DECLCALLBACK(bool) crVrScrCompositorVisitCb(PVBOXVR_COMPOSITOR pCCompositor, PVBOXVR_COMPOSITOR_ENTRY pCEntry, void *pvVisitor)2506 {2507 PVBOXVR_SCR_COMPOSITOR_VISITOR_CB pData = (PVBOXVR_SCR_COMPOSITOR_VISITOR_CB)pvVisitor;2508 PVBOXVR_SCR_COMPOSITOR pCompositor = VBOXVR_SCR_COMPOSITOR_FROM_COMPOSITOR(pCCompositor);2509 PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry = VBOXVR_SCR_COMPOSITOR_ENTRY_FROM_ENTRY(pCEntry);2510 return pData->pfnVisitor(pCompositor, pEntry, pData->pvVisitor);2511 }2512 2513 VBOXVREGDECL(void) CrVrScrCompositorVisit(PVBOXVR_SCR_COMPOSITOR pCompositor, PFNVBOXVRSCRCOMPOSITOR_VISITOR pfnVisitor, void *pvVisitor)2514 {2515 VBOXVR_SCR_COMPOSITOR_VISITOR_CB Data;2516 Data.pfnVisitor = pfnVisitor;2517 Data.pvVisitor = pvVisitor;2518 VBoxVrCompositorVisit(&pCompositor->Compositor, crVrScrCompositorVisitCb, &Data);2519 }2520 2521 VBOXVREGDECL(int) CrVrScrCompositorClone(PVBOXVR_SCR_COMPOSITOR pCompositor, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor)2522 {2523 /* for simplicity just copy from one to another */2524 CrVrScrCompositorInit(pDstCompositor);2525 VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;2526 PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;2527 CrVrScrCompositorIterInit(pCompositor, &CIter);2528 int rc = VINF_SUCCESS;2529 uint32_t cRects;2530 const RTRECT *pRects;2531 2532 while ((pEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)2533 {2534 /* get source rects, that will be non-stretched and entry pos - pased */2535 rc = CrVrScrCompositorEntryRegionsGet(pCompositor, pEntry, &cRects, NULL, NULL, &pRects);2536 if (!RT_SUCCESS(rc))2537 {2538 WARN(("CrVrScrCompositorEntryRegionsGet failed, rc %d", rc));2539 return rc;2540 }2541 2542 PVBOXVR_SCR_COMPOSITOR_ENTRY pDstEntry = pfnEntryFor(pEntry, pvEntryFor);2543 if (!pDstEntry)2544 {2545 WARN(("pfnEntryFor failed"));2546 return VERR_INVALID_STATE;2547 }2548 2549 rc = CrVrScrCompositorEntryRegionsSet(pDstCompositor, pDstEntry, CrVrScrCompositorEntryPosGet(pEntry), cRects, pRects, false, NULL);2550 if (!RT_SUCCESS(rc))2551 {2552 crWarning("CrVrScrCompositorEntryRegionsSet failed, rc %d", rc);2553 return rc;2554 }2555 }2556 2557 return rc;2558 }2559 2560 VBOXVREGDECL(int) CrVrScrCompositorIntersectList(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pVr, bool *pfChanged)2561 {2562 VBOXVR_SCR_COMPOSITOR_ITERATOR CIter;2563 PVBOXVR_SCR_COMPOSITOR_ENTRY pEntry;2564 CrVrScrCompositorIterInit(pCompositor, &CIter);2565 int rc = VINF_SUCCESS;2566 bool fChanged = false;2567 2568 while ((pEntry = CrVrScrCompositorIterNext(&CIter)) != NULL)2569 {2570 bool fCurChanged = false;2571 2572 rc = CrVrScrCompositorEntryListIntersect(pCompositor, pEntry, pVr, &fCurChanged);2573 if (!RT_SUCCESS(rc))2574 {2575 crWarning("CrVrScrCompositorEntryRegionsSet failed, rc %d", rc);2576 break;2577 }2578 2579 fChanged |= fCurChanged;2580 }2581 2582 if (pfChanged)2583 *pfChanged = fChanged;2584 2585 return rc;2586 }2587 2588 VBOXVREGDECL(int) CrVrScrCompositorIntersectedList(PVBOXVR_SCR_COMPOSITOR pCompositor, const VBOXVR_LIST *pVr, PVBOXVR_SCR_COMPOSITOR pDstCompositor, PFNVBOXVR_SCR_COMPOSITOR_ENTRY_FOR pfnEntryFor, void* pvEntryFor, bool *pfChanged)2589 {2590 int rc = CrVrScrCompositorClone(pCompositor, pDstCompositor, pfnEntryFor, pvEntryFor);2591 if (!RT_SUCCESS(rc))2592 {2593 WARN(("CrVrScrCompositorClone failed, rc %d", rc));2594 return rc;2595 }2596 2597 rc = CrVrScrCompositorIntersectList(pDstCompositor, pVr, pfChanged);2598 if (!RT_SUCCESS(rc))2599 {2600 WARN(("CrVrScrCompositorIntersectList failed, rc %d", rc));2601 CrVrScrCompositorClear(pDstCompositor);2602 return rc;2603 }2604 2605 return VINF_SUCCESS;2606 }
Note:
See TracChangeset
for help on using the changeset viewer.